Advertisement
Guest User

Untitled

a guest
Oct 17th, 2013
406
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.87 KB | None | 0 0
  1.  
  2. xp::GdipImagePtr EmoticonExManager::_LoadImage(const eva::StringA & strEmoticonExName)
  3. {
  4. eva::StringW strFile = m_strCacheDir + L"\\" + eva::UTF8_to_UTF16(strEmoticonExName);
  5.  
  6. eva::RefMemData mem;
  7. if( !eva::util::ReadFileData(strFile, mem) )
  8. return NULL;
  9.  
  10. // 11,33:EmoticonEx, 22:Sticker, 2201:Avatar
  11. eva::StringA strEmoticonType = strEmoticonExName.Left(2);
  12. if ( strEmoticonType == "11" || strEmoticonType == "33" || strEmoticonType == "44")
  13. {
  14. int nEncryptedLen = min( mem.m_uDataLen, 128 );
  15. char crypto_key[] = "a271730728cbe141e47fd9d677e9006d";
  16. decryptData( (byte*)mem.m_pMem, nEncryptedLen, (byte*)crypto_key, strlen(crypto_key), CRYPT_MODE_BINARY );
  17. }
  18.  
  19. #ifdef _DEBUG
  20. eva::util::CreateAndWriteFile( m_strCacheDir + L"\\_decrypted_" + eva::UTF8_to_UTF16(strEmoticonExName), mem );
  21. #endif
  22.  
  23. #if 1
  24. if ( strEmoticonType == "44" )
  25. {
  26. WebPData webp_data;
  27. webp_data.bytes = (const uint8_t *)mem.m_pMem;
  28. webp_data.size = mem.m_uDataLen;
  29.  
  30. WebPDemuxer* demux = WebPDemux(&webp_data);
  31.  
  32. uint32_t width = WebPDemuxGetI(demux, WEBP_FF_CANVAS_WIDTH);
  33. uint32_t height = WebPDemuxGetI(demux, WEBP_FF_CANVAS_HEIGHT);
  34. uint32_t flags = WebPDemuxGetI(demux, WEBP_FF_FORMAT_FLAGS);
  35.  
  36. WebPIterator iter;
  37. if (WebPDemuxGetFrame(demux, 1, &iter))
  38. {
  39. do {
  40. // ... (Consume 'iter'; e.g. Decode 'iter.fragment' with WebPDecode(),
  41. // ... and get other frame properties like width, height, offsets etc.
  42. // ... see 'struct WebPIterator' below for more info).
  43.  
  44. #if 1
  45. // webp decoding
  46. WebPData fragment = iter.fragment;
  47.  
  48. int newWidth, newHeight;
  49. uint8_t* decodedMem = NULL;
  50.  
  51. decodedMem = WebPDecodeBGRA((const uint8_t *)fragment.bytes, fragment.size, &newWidth, &newHeight);
  52.  
  53. BITMAPINFO bmi;
  54. ZeroMemory(&bmi, sizeof(BITMAPINFO));
  55. bmi.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
  56. bmi.bmiHeader.biWidth = newWidth;
  57. bmi.bmiHeader.biHeight = -newHeight;
  58. bmi.bmiHeader.biPlanes = 1;
  59. bmi.bmiHeader.biBitCount = 32;
  60. bmi.bmiHeader.biCompression = BI_RGB; //BI_BITFIELDS
  61. bmi.bmiHeader.biSizeImage = newWidth * newHeight * 4;
  62.  
  63. //BYTE *pvBits;
  64. //HBITMAP hBitmap = CreateDIBSection(NULL, &bmi, DIB_RGB_COLORS, (void **)&pvBits, NULL, 0);
  65.  
  66. //if(hBitmap)
  67. //{
  68. Gdiplus::Bitmap * bitmap = Gdiplus::Bitmap::FromBITMAPINFO(&bmi, (void*)decodedMem);
  69. // memcpy(pvBits, (const void*) decodedMem, bmi.bmiHeader.biSizeImage);
  70. // }
  71.  
  72. // for test
  73. xp::GdipImagePtr spImage = xp::GdipImage::createFromBitmap(bitmap);
  74. return spImage;
  75.  
  76. } while (WebPDemuxNextFrame(&iter));
  77.  
  78. WebPDemuxReleaseIterator(&iter);
  79. }
  80. }
  81. #endif
  82.  
  83. xp::GdipImagePtr spImage = xp::GdipImage::createFromFileData( (void*)mem.GetDataPtr(), mem.m_uDataLen );
  84. if( spImage == NULL )
  85. {
  86. TRACE(L"image file load fail. [%s]\n", strFile);
  87. }
  88.  
  89. return spImage;
  90. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement