cocos2d的资源压缩主要介绍的是图片的压缩算法,最近刚好在弄,所以贴出源代码供大家去学习。

  1. bool CCTexture2D::initPremultipliedATextureWithImage(CCImage *image, unsigned int width, unsigned int height)  
  2. {  
  3.     unsigned char*            tempData = image->getData();  
  4.     unsigned int*             inPixel32 = NULL;  
  5.     unsigned char*            inPixel8 = NULL;  
  6.     unsigned short*           outPixel16 = NULL;  
  7.     bool                      hasAlpha = image->hasAlpha();  
  8.     CCSize                    imageSize = CCSizeMake((float)(image->getWidth()), (float)(image->getHeight()));  
  9.     CCTexture2DPixelFormat    pixelFormat;  
  10.     size_t                    bpp = image->getBitsPerComponent();  
  11.   
  12.     // compute pixel format  
  13.     if(hasAlpha)  
  14.     {  
  15.         pixelFormat = g_defaultAlphaPixelFormat;  
  16.     }  
  17.     else  
  18.     {  
  19.         if (bpp >= 8)  
  20.         {  
  21.             pixelFormat = kCCTexture2DPixelFormat_RGB888;  
  22.         }  
  23.         else   
  24.         {  
  25.             pixelFormat = kCCTexture2DPixelFormat_RGB565;  
  26.         }  
  27.           
  28.     }  
  29.       
  30.     // Repack the pixel data into the right format  
  31.     unsigned int length = width * height;  
  32.       
  33.     if (pixelFormat == kCCTexture2DPixelFormat_RGB565)  
  34.     {  
  35.         if (hasAlpha)  
  36.         {  
  37.             // Convert "RRRRRRRRRGGGGGGGGBBBBBBBBAAAAAAAA" to "RRRRRGGGGGGBBBBB"  
  38.               
  39.             tempData = new unsigned char[width * height * 2];  
  40.             outPixel16 = (unsigned short*)tempData;  
  41.             inPixel32 = (unsigned int*)image->getData();  
  42.               
  43.             for(unsigned int i = 0; i < length; ++i, ++inPixel32)  
  44.             {  
  45.                 *outPixel16++ =   
  46.                 ((((*inPixel32 >>  0) & 0xFF) >> 3) << 11) |  // R  
  47.                 ((((*inPixel32 >>  8) & 0xFF) >> 2) << 5)  |  // G  
  48.                 ((((*inPixel32 >> 16) & 0xFF) >> 3) << 0);    // B  
  49.             }  
  50.         }  
  51.         else   
  52.         {  
  53.             // Convert "RRRRRRRRRGGGGGGGGBBBBBBBB" to "RRRRRGGGGGGBBBBB"  
  54.               
  55.             tempData = new unsigned char[width * height * 2];  
  56.             outPixel16 = (unsigned short*)tempData;  
  57.             inPixel8 = (unsigned char*)image->getData();  
  58.               
  59.             for(unsigned int i = 0; i < length; ++i)  
  60.             {  
  61.                 *outPixel16++ =   
  62.                 (((*inPixel8++ & 0xFF) >> 3) << 11) |  // R  
  63.                 (((*inPixel8++ & 0xFF) >> 2) << 5)  |  // G  
  64.                 (((*inPixel8++ & 0xFF) >> 3) << 0);    // B  
  65.             }  
  66.         }      
  67.     }  
  68.     else if (pixelFormat == kCCTexture2DPixelFormat_RGBA4444)  
  69.     {  
  70.         // Convert "RRRRRRRRRGGGGGGGGBBBBBBBBAAAAAAAA" to "RRRRGGGGBBBBAAAA"  
  71.           
  72.         inPixel32 = (unsigned int*)image->getData();    
  73.         tempData = new unsigned char[width * height * 2];  
  74.         outPixel16 = (unsigned short*)tempData;  
  75.           
  76.         for(unsigned int i = 0; i < length; ++i, ++inPixel32)  
  77.         {  
  78.             *outPixel16++ =   
  79.             ((((*inPixel32 >> 0) & 0xFF) >> 4) << 12) | // R  
  80.             ((((*inPixel32 >> 8) & 0xFF) >> 4) <<  8) | // G  
  81.             ((((*inPixel32 >> 16) & 0xFF) >> 4) << 4) | // B  
  82.             ((((*inPixel32 >> 24) & 0xFF) >> 4) << 0);  // A  
  83.         }  
  84.     }  
  85.     else if (pixelFormat == kCCTexture2DPixelFormat_RGB5A1)  
  86.     {  
  87.         // Convert "RRRRRRRRRGGGGGGGGBBBBBBBBAAAAAAAA" to "RRRRRGGGGGBBBBBA"  
  88.         inPixel32 = (unsigned int*)image->getData();     
  89.         tempData = new unsigned char[width * height * 2];  
  90.         outPixel16 = (unsigned short*)tempData;  
  91.           
  92.         for(unsigned int i = 0; i < length; ++i, ++inPixel32)  
  93.         {  
  94.             *outPixel16++ =   
  95.             ((((*inPixel32 >> 0) & 0xFF) >> 3) << 11) | // R  
  96.             ((((*inPixel32 >> 8) & 0xFF) >> 3) <<  6) | // G  
  97.             ((((*inPixel32 >> 16) & 0xFF) >> 3) << 1) | // B  
  98.             ((((*inPixel32 >> 24) & 0xFF) >> 7) << 0);  // A  
  99.         }  
  100.     }  
  101.     else if (pixelFormat == kCCTexture2DPixelFormat_A8)  
  102.     {  
  103.         // Convert "RRRRRRRRRGGGGGGGGBBBBBBBBAAAAAAAA" to "AAAAAAAA"  
  104.         inPixel32 = (unsigned int*)image->getData();  
  105.         tempData = new unsigned char[width * height];  
  106.         unsigned char *outPixel8 = tempData;  
  107.           
  108.         for(unsigned int i = 0; i < length; ++i, ++inPixel32)  
  109.         {  
  110.             *outPixel8++ = (*inPixel32 >> 24) & 0xFF;  // A  
  111.         }  
  112.     }  
  113.       
  114.     if (hasAlpha && pixelFormat == kCCTexture2DPixelFormat_RGB888)  
  115.     {  
  116.         // Convert "RRRRRRRRRGGGGGGGGBBBBBBBBAAAAAAAA" to "RRRRRRRRGGGGGGGGBBBBBBBB"  
  117.         inPixel32 = (unsigned int*)image->getData();  
  118.         tempData = new unsigned char[width * height * 3];  
  119.         unsigned char *outPixel8 = tempData;  
  120.           
  121.         for(unsigned int i = 0; i < length; ++i, ++inPixel32)  
  122.         {  
  123.             *outPixel8++ = (*inPixel32 >> 0) & 0xFF; // R  
  124.             *outPixel8++ = (*inPixel32 >> 8) & 0xFF; // G  
  125.             *outPixel8++ = (*inPixel32 >> 16) & 0xFF; // B  
  126.         }  
  127.     }  
  128.       
  129.     initWithData(tempData, pixelFormat, width, height, imageSize);  
  130.       
  131.     if (tempData != image->getData())  
  132.     {  
  133.         delete [] tempData;  
  134.     }  
  135.   
  136.     m_bHasPremultipliedAlpha = image->isPremultipliedAlpha();  
  137.     return true;  
  138. }