Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <IImgCtx.h>
- void imgctx_load_bitmap(IN PCWSTR Path, OUT PUCHAR *Bits, OUT HBITMAP *Bitmap, OUT PULONG Width, OUT PULONG Height, HDC hScreen, BOOL AlphaFix)
- {
- CoInitializeEx(0, COINIT_DISABLE_OLE1DDE|COINIT_APARTMENTTHREADED|COINIT_SPEED_OVER_MEMORY);
- // CoInitialize(0);
- IImgCtx *pImgCtx = 0;
- HRESULT hr = CoCreateInstance(CLSID_IImgCtx, NULL, CLSCTX_INPROC_SERVER, IID_IImgCtx, (LPVOID*)&pImgCtx);
- if(SUCCEEDED(hr) && pImgCtx)
- {
- hr = pImgCtx->Load(Path, 0);
- if(SUCCEEDED(hr))
- {
- ULONG State;
- SIZE Size;
- for( ;; NtSleep(0) )
- {
- State = 0;
- hr = pImgCtx->GetStateInfo(&State, &Size, FALSE);
- if(!SUCCEEDED(hr))
- break;
- if( State & IMGLOAD_LOADING )
- continue;
- if( State & IMGLOAD_COMPLETE )
- break;
- if( State & IMGLOAD_STOPPED )
- break;
- if( State & IMGLOAD_ERROR )
- break;
- }
- if( State & IMGLOAD_COMPLETE )
- {
- LONG W = Size.cx;
- LONG H = Size.cy;
- if(Width) *Width = W;
- if(Height) *Height = H;
- HDC hTmpDC = 0;
- if(!hScreen)
- hScreen = hTmpDC = CreateCompatibleDC(0);
- BITMAPV5HEADER bi;
- memset0(&bi, sizeof(BITMAPV5HEADER));
- bi.bV5Size = sizeof(BITMAPV5HEADER);
- bi.bV5Width = W;
- bi.bV5Height = -H;
- bi.bV5Planes = 1;
- bi.bV5BitCount = 32;
- bi.bV5Compression = BI_BITFIELDS;
- bi.bV5AlphaMask = 0xFF000000;
- bi.bV5RedMask = 0x00FF0000;
- bi.bV5GreenMask = 0x0000FF00;
- bi.bV5BlueMask = 0x000000FF;
- PUCHAR BitmapBits = 0;
- HBITMAP hBitmap = CreateDIBSection(hScreen, (BITMAPINFO *)&bi, DIB_RGB_COLORS, (void **)&BitmapBits, 0, 0);
- HBITMAP hOldBitmap = (HBITMAP)SelectObject(hScreen, hBitmap);
- //HPALETTE hPal;
- //if(SUCCEEDED(pImgCtx->GetPalette(&hPal)))
- //{
- // SelectPalette(hScreen, hPal, TRUE);
- // RealizePalette(hScreen);
- //}
- // SetMapMode(hBDC, MM_TEXT);
- RECT rc = { 0,0,W,H };
- hr = pImgCtx->Draw(hScreen, &rc);
- SelectObject(hScreen, hOldBitmap);
- if( Bits || BitmapBits )
- {
- PUCHAR pBits = BitmapBits, pSrc, pDst;
- PUCHAR pBuff = Bitmap ? BitmapBits : new UCHAR [ W * H * 4 ];
- if(pBuff)
- {
- for(ULONG y = 0; y < H; y++)
- {
- pSrc = &pBits[ W * 4 * y ];
- pDst = &pBuff[ W * 4 * y ];
- for(ULONG x = 0; x < W; x++)
- {
- if(AlphaFix)
- {
- pDst[0] = pSrc[0] * pSrc[3] / 255;
- pDst[1] = pSrc[1] * pSrc[3] / 255;
- pDst[2] = pSrc[2] * pSrc[3] / 255;
- pDst[3] = pSrc[3];
- }
- else
- {
- *(PULONG)pDst = *(PULONG)pSrc;
- }
- pSrc += 4;
- pDst += 4;
- }
- }
- if(Bits)
- *Bits = pBuff;
- }
- }
- if(Bitmap)
- *Bitmap = hBitmap;
- else
- DeleteObject(hBitmap);
- if(hTmpDC)
- ReleaseDC(0, hTmpDC);
- }
- }
- ULONG o = pImgCtx->Release();
- //__debugbreak();
- }
- CoUninitialize();
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement