@@ -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