Skip to content

Commit bf13e9c

Browse files
committed
Add halfsize support
1 parent 7fcd56c commit bf13e9c

2 files changed

Lines changed: 51 additions & 3 deletions

File tree

cocos2dx/platform/CCImage.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -71,6 +71,7 @@ class CC_DLL Image : public Object
7171
TIFF,
7272
//! WebP
7373
WEBP,
74+
WEBP_HALF,
7475
//! PVR
7576
PVR,
7677
//! ETC
@@ -186,7 +187,7 @@ class CC_DLL Image : public Object
186187
bool initWithJpgData(const void *data, int dataLen);
187188
bool initWithPngData(const void *data, int dataLen);
188189
bool initWithTiffData(const void *data, int dataLen);
189-
bool initWithWebpData(const void *data, int dataLen);
190+
bool initWithWebpData(const void *data, int dataLen, bool halfsize = false);
190191
bool initWithPVRData(const void *data, int dataLen);
191192
bool initWithPVRv2Data(const void *data, int dataLen);
192193
bool initWithPVRv3Data(const void *data, int dataLen);

cocos2dx/platform/CCImageCommon_cpp.h

Lines changed: 49 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -363,7 +363,8 @@ bool Image::initWithImageData(const void * data, int dataLen)
363363
case Format::TIFF:
364364
return initWithTiffData(data, dataLen);
365365
case Format::WEBP:
366-
return initWithWebpData(data, dataLen);
366+
case Format::WEBP_HALF:
367+
return initWithWebpData(data, dataLen, _fileType == Format::WEBP_HALF);
367368
case Format::PVR:
368369
return initWithPVRData(data, dataLen);
369370
case Format::ETC:
@@ -462,6 +463,10 @@ Image::Format Image::detectFormat(const void* data, int dataLen)
462463
return Format::TIFF;
463464
}else if (isWebp(data, dataLen))
464465
{
466+
if (((const char*) data)[dataLen - 2] == 'h' &&
467+
((const char*) data)[dataLen - 1] == 's') {
468+
return Format::WEBP_HALF;
469+
}
465470
return Format::WEBP;
466471
}else if (isPvr(data, dataLen))
467472
{
@@ -1286,7 +1291,7 @@ bool Image::initWithPVRData(const void *data, int dataLen)
12861291
return initWithPVRv2Data(data, dataLen) || initWithPVRv3Data(data, dataLen);
12871292
}
12881293

1289-
bool Image::initWithWebpData(const void *data, int dataLen)
1294+
bool Image::initWithWebpData(const void *data, int dataLen, bool halfsize)
12901295
{
12911296
bool bRet = false;
12921297
do
@@ -1318,6 +1323,48 @@ bool Image::initWithWebpData(const void *data, int dataLen)
13181323

13191324
bRet = true;
13201325
} while (0);
1326+
1327+
if (bRet && halfsize) {
1328+
int _nwidth = _width * 2;
1329+
int _nheight = _height * 2;
1330+
unsigned char* _ndata = new unsigned char[_nwidth * _nheight * 4];
1331+
uint32_t* rawOutput = reinterpret_cast<uint32_t*>(_ndata);
1332+
const uint32_t* rawInput = reinterpret_cast<const uint32_t*>(_data);
1333+
1334+
// YD compensates for the x loop by subtracting the width back out
1335+
int YD = (_height / _nheight) * _width - _width;
1336+
int YR = _height % _nheight;
1337+
int XD = _width / _nwidth;
1338+
int XR = _width % _nwidth;
1339+
int outOffset = 0;
1340+
int inOffset = 0;
1341+
1342+
for (int y = _nheight, YE = 0; y > 0; y--) {
1343+
for (int x = _nwidth, XE = 0; x > 0; x--) {
1344+
rawOutput[outOffset++]= rawInput[inOffset];
1345+
inOffset+=XD;
1346+
XE+=XR;
1347+
if (XE >= _nwidth) {
1348+
XE-= _nwidth;
1349+
inOffset++;
1350+
}
1351+
}
1352+
inOffset+= YD;
1353+
YE+= YR;
1354+
if (YE >= _nheight) {
1355+
YE -= _nheight;
1356+
inOffset+=_width;
1357+
}
1358+
}
1359+
1360+
delete []_data;
1361+
_data = NULL;
1362+
1363+
_width = _nwidth;
1364+
_height = _nheight;
1365+
_data = _ndata;
1366+
}
1367+
13211368
return bRet;
13221369
}
13231370

0 commit comments

Comments
 (0)