@@ -248,29 +248,36 @@ HBITMAP GetPSDThumbnail(IStream* stream) {
248248 thumbWidth = width * thumbHeight / height;
249249 }
250250
251- BLENDFUNCTION fnc;
252- fnc.BlendOp = AC_SRC_OVER ;
253- fnc.BlendFlags = 0 ;
254- fnc.SourceConstantAlpha = 0xFF ;
255- fnc.AlphaFormat = AC_SRC_ALPHA ;
256-
257- HDC dc = GetDC (NULL );
258- HDC srcDC = CreateCompatibleDC (dc);
259- HDC memDC = CreateCompatibleDC (dc);
260- result = CreateCompatibleBitmap (dc, thumbWidth, thumbHeight);
261- SelectObject (memDC, result);
262- SelectObject (srcDC, fullBitmap);
263-
264- RECT rect = {};
265- rect.right = thumbWidth;
266- rect.bottom = thumbHeight;
267- FillRect (memDC, &rect, (HBRUSH )GetStockObject (NULL_BRUSH ));
268- AlphaBlend (memDC, 0 , 0 , thumbWidth, thumbHeight, srcDC, 0 , 0 , width, height, fnc);
251+ BITMAPINFO bmi = {};
252+ bmi.bmiHeader .biSize = sizeof (BITMAPINFOHEADER );
253+ bmi.bmiHeader .biWidth = thumbWidth;
254+ bmi.bmiHeader .biHeight = -thumbHeight;
255+ bmi.bmiHeader .biPlanes = 1 ;
256+ bmi.bmiHeader .biBitCount = 32 ;
257+ bmi.bmiHeader .biCompression = BI_RGB ;
258+
259+ void * pBits = nullptr ;
260+ result = CreateDIBSection (NULL , &bmi, DIB_RGB_COLORS , &pBits, NULL , 0 );
261+
262+ if (result) {
263+ HDC srcDC = CreateCompatibleDC (NULL );
264+ HDC memDC = CreateCompatibleDC (NULL );
265+ SelectObject (memDC, result);
266+ SelectObject (srcDC, fullBitmap);
267+
268+ BLENDFUNCTION fnc;
269+ fnc.BlendOp = AC_SRC_OVER ;
270+ fnc.BlendFlags = 0 ;
271+ fnc.SourceConstantAlpha = 0xFF ;
272+ fnc.AlphaFormat = AC_SRC_ALPHA ;
273+
274+ AlphaBlend (memDC, 0 , 0 , thumbWidth, thumbHeight, srcDC, 0 , 0 , width, height, fnc);
275+
276+ DeleteDC (srcDC);
277+ DeleteDC (memDC);
278+ }
269279
270280 DeleteObject (fullBitmap);
271- DeleteDC (srcDC);
272- DeleteDC (memDC);
273- ReleaseDC (NULL , dc);
274281 } else {
275282 result = CreateBitmap (width, height, 1 , 32 , data);
276283 }
0 commit comments