Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- xp::GdipImagePtr EmoticonExManager::_LoadImage(const eva::StringA & strEmoticonExName)
- {
- eva::StringW strFile = m_strCacheDir + L"\\" + eva::UTF8_to_UTF16(strEmoticonExName);
- eva::RefMemData mem;
- if( !eva::util::ReadFileData(strFile, mem) )
- return NULL;
- // 11,33:EmoticonEx, 22:Sticker, 2201:Avatar
- eva::StringA strEmoticonType = strEmoticonExName.Left(2);
- if ( strEmoticonType == "11" || strEmoticonType == "33" || strEmoticonType == "44")
- {
- int nEncryptedLen = min( mem.m_uDataLen, 128 );
- char crypto_key[] = "a271730728cbe141e47fd9d677e9006d";
- decryptData( (byte*)mem.m_pMem, nEncryptedLen, (byte*)crypto_key, strlen(crypto_key), CRYPT_MODE_BINARY );
- }
- #ifdef _DEBUG
- eva::util::CreateAndWriteFile( m_strCacheDir + L"\\_decrypted_" + eva::UTF8_to_UTF16(strEmoticonExName), mem );
- #endif
- #if 1
- if ( strEmoticonType == "44" )
- {
- WebPData webp_data;
- webp_data.bytes = (const uint8_t *)mem.m_pMem;
- webp_data.size = mem.m_uDataLen;
- WebPDemuxer* demux = WebPDemux(&webp_data);
- uint32_t width = WebPDemuxGetI(demux, WEBP_FF_CANVAS_WIDTH);
- uint32_t height = WebPDemuxGetI(demux, WEBP_FF_CANVAS_HEIGHT);
- uint32_t flags = WebPDemuxGetI(demux, WEBP_FF_FORMAT_FLAGS);
- WebPIterator iter;
- if (WebPDemuxGetFrame(demux, 1, &iter))
- {
- do {
- // ... (Consume 'iter'; e.g. Decode 'iter.fragment' with WebPDecode(),
- // ... and get other frame properties like width, height, offsets etc.
- // ... see 'struct WebPIterator' below for more info).
- #if 1
- // webp decoding
- WebPData fragment = iter.fragment;
- int newWidth, newHeight;
- uint8_t* decodedMem = NULL;
- decodedMem = WebPDecodeBGRA((const uint8_t *)fragment.bytes, fragment.size, &newWidth, &newHeight);
- BITMAPINFO bmi;
- ZeroMemory(&bmi, sizeof(BITMAPINFO));
- bmi.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
- bmi.bmiHeader.biWidth = newWidth;
- bmi.bmiHeader.biHeight = -newHeight;
- bmi.bmiHeader.biPlanes = 1;
- bmi.bmiHeader.biBitCount = 32;
- bmi.bmiHeader.biCompression = BI_RGB; //BI_BITFIELDS
- bmi.bmiHeader.biSizeImage = newWidth * newHeight * 4;
- //BYTE *pvBits;
- //HBITMAP hBitmap = CreateDIBSection(NULL, &bmi, DIB_RGB_COLORS, (void **)&pvBits, NULL, 0);
- //if(hBitmap)
- //{
- Gdiplus::Bitmap * bitmap = Gdiplus::Bitmap::FromBITMAPINFO(&bmi, (void*)decodedMem);
- // memcpy(pvBits, (const void*) decodedMem, bmi.bmiHeader.biSizeImage);
- // }
- // for test
- xp::GdipImagePtr spImage = xp::GdipImage::createFromBitmap(bitmap);
- return spImage;
- } while (WebPDemuxNextFrame(&iter));
- WebPDemuxReleaseIterator(&iter);
- }
- }
- #endif
- xp::GdipImagePtr spImage = xp::GdipImage::createFromFileData( (void*)mem.GetDataPtr(), mem.m_uDataLen );
- if( spImage == NULL )
- {
- TRACE(L"image file load fail. [%s]\n", strFile);
- }
- return spImage;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement