Advertisement
Guest User

Untitled

a guest
Dec 8th, 2019
129
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 2.95 KB | None | 0 0
  1. #include <IImgCtx.h>
  2.  
  3. void imgctx_load_bitmap(IN PCWSTR Path, OUT PUCHAR *Bits, OUT HBITMAP *Bitmap, OUT PULONG Width, OUT PULONG Height, HDC hScreen, BOOL AlphaFix)
  4. {
  5.     CoInitializeEx(0, COINIT_DISABLE_OLE1DDE|COINIT_APARTMENTTHREADED|COINIT_SPEED_OVER_MEMORY);
  6. //  CoInitialize(0);
  7.  
  8.     IImgCtx *pImgCtx = 0;
  9.  
  10.     HRESULT hr = CoCreateInstance(CLSID_IImgCtx, NULL, CLSCTX_INPROC_SERVER, IID_IImgCtx, (LPVOID*)&pImgCtx);
  11.     if(SUCCEEDED(hr) && pImgCtx)
  12.     {
  13.         hr = pImgCtx->Load(Path, 0);
  14.  
  15.         if(SUCCEEDED(hr))
  16.         {
  17.             ULONG State;
  18.             SIZE  Size;
  19.  
  20.             for( ;; NtSleep(0) )
  21.             {
  22.                 State = 0;
  23.                 hr = pImgCtx->GetStateInfo(&State, &Size, FALSE);
  24.  
  25.                 if(!SUCCEEDED(hr))
  26.                     break;
  27.  
  28.                 if( State & IMGLOAD_LOADING )
  29.                     continue;
  30.  
  31.                 if( State & IMGLOAD_COMPLETE )
  32.                     break;
  33.  
  34.                 if( State & IMGLOAD_STOPPED )
  35.                     break;
  36.  
  37.                 if( State & IMGLOAD_ERROR )
  38.                     break;
  39.             }
  40.  
  41.             if( State & IMGLOAD_COMPLETE )
  42.             {
  43.                 LONG W = Size.cx;
  44.                 LONG H = Size.cy;
  45.  
  46.                 if(Width)   *Width = W;
  47.                 if(Height)  *Height = H;
  48.  
  49.                 HDC hTmpDC = 0;
  50.                 if(!hScreen)
  51.                     hScreen = hTmpDC = CreateCompatibleDC(0);
  52.  
  53.                 BITMAPV5HEADER bi;
  54.                 memset0(&bi, sizeof(BITMAPV5HEADER));
  55.                 bi.bV5Size = sizeof(BITMAPV5HEADER);
  56.                 bi.bV5Width = W;
  57.                 bi.bV5Height = -H;
  58.                 bi.bV5Planes = 1;
  59.                 bi.bV5BitCount = 32;
  60.                 bi.bV5Compression = BI_BITFIELDS;
  61.                 bi.bV5AlphaMask = 0xFF000000;
  62.                 bi.bV5RedMask   = 0x00FF0000;
  63.                 bi.bV5GreenMask = 0x0000FF00;
  64.                 bi.bV5BlueMask  = 0x000000FF;
  65.  
  66.                 PUCHAR BitmapBits = 0;
  67.  
  68.                 HBITMAP hBitmap = CreateDIBSection(hScreen, (BITMAPINFO *)&bi, DIB_RGB_COLORS, (void **)&BitmapBits, 0, 0);
  69.                 HBITMAP hOldBitmap = (HBITMAP)SelectObject(hScreen, hBitmap);
  70.  
  71.                 //HPALETTE hPal;
  72.                 //if(SUCCEEDED(pImgCtx->GetPalette(&hPal)))
  73.                 //{
  74.                 //  SelectPalette(hScreen, hPal, TRUE);
  75.                 //  RealizePalette(hScreen);
  76.                 //}
  77.  
  78.             //  SetMapMode(hBDC, MM_TEXT);
  79.  
  80.                 RECT rc = { 0,0,W,H };
  81.                 hr = pImgCtx->Draw(hScreen, &rc);
  82.    
  83.                 SelectObject(hScreen, hOldBitmap);
  84.  
  85.                 if( Bits || BitmapBits )
  86.                 {
  87.                     PUCHAR pBits = BitmapBits, pSrc, pDst;
  88.                     PUCHAR pBuff = Bitmap ? BitmapBits : new UCHAR [ W * H * 4 ];
  89.  
  90.                     if(pBuff)
  91.                     {
  92.                         for(ULONG y = 0; y < H; y++)
  93.                         {
  94.                             pSrc = &pBits[ W * 4 * y ];
  95.                             pDst = &pBuff[ W * 4 * y ];
  96.  
  97.                             for(ULONG x = 0; x < W; x++)
  98.                             {
  99.                                 if(AlphaFix)
  100.                                 {
  101.                                     pDst[0] = pSrc[0] * pSrc[3] / 255;
  102.                                     pDst[1] = pSrc[1] * pSrc[3] / 255;
  103.                                     pDst[2] = pSrc[2] * pSrc[3] / 255;
  104.                                     pDst[3] = pSrc[3];
  105.                                 }
  106.                                 else
  107.                                 {
  108.                                     *(PULONG)pDst = *(PULONG)pSrc;
  109.                                 }
  110.  
  111.                                 pSrc += 4;
  112.                                 pDst += 4;
  113.                             }
  114.                         }
  115.  
  116.                         if(Bits)
  117.                             *Bits = pBuff;
  118.                     }
  119.                 }
  120.  
  121.                 if(Bitmap)
  122.                     *Bitmap = hBitmap;
  123.                 else
  124.                     DeleteObject(hBitmap);
  125.  
  126.                 if(hTmpDC)
  127.                     ReleaseDC(0, hTmpDC);
  128.             }
  129.         }
  130.  
  131.         ULONG o = pImgCtx->Release();
  132.         //__debugbreak();
  133.     }
  134.  
  135.     CoUninitialize();
  136. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement