- Fix palette creation.
- Fix upside down Gif.
- Add support for transparent Gif.
diff --git a/dlls/oleaut32/olepicture.c b/dlls/oleaut32/olepicture.c
index e86bb63..7046399 100644
--- a/dlls/oleaut32/olepicture.c
+++ b/dlls/oleaut32/olepicture.c
@@ -118,6 +118,10 @@
BOOL keepOrigFormat;
HDC hDCCur;
+ /* Bitmap transparency mask */
+ HBITMAP hbmMask;
+ COLORREF rgbTrans;
+
/* data */
void* data;
int datalen;
@@ -212,6 +216,8 @@
/* dunno about original value */
newObject->keepOrigFormat = TRUE;
+ newObject->hbmMask = NULL;
+
if (pictDesc) {
if(pictDesc->cbSizeofstruct != sizeof(PICTDESC)) {
FIXME("struct size = %d\n", pictDesc->cbSizeofstruct);
@@ -541,7 +547,25 @@
hbmpOld = SelectObject(hdcBmp, This->desc.u.bmp.hbitmap);
- StretchBlt(hdc, x, y, cx, cy, hdcBmp, xSrc, ySrc, cxSrc, cySrc, SRCCOPY);
+ if (This->hbmMask) {
+ HDC hdcMask = CreateCompatibleDC(0);
+ HBITMAP hOldbm = SelectObject(hdcMask, This->hbmMask);
+
+ SetMapMode(hdcMask, MM_ANISOTROPIC);
+ SetWindowOrgEx(hdcMask, 0, 0, NULL);
+ SetWindowExtEx(hdcMask, This->himetricWidth, This->himetricHeight, NULL);
+ SetViewportOrgEx(hdcMask, 0, This->origHeight, NULL);
+ SetViewportExtEx(hdcMask, This->origWidth, -This->origHeight, NULL);
+
+ SetBkColor(hdc, RGB(255, 255, 255));
+ SetTextColor(hdc, RGB(0, 0, 0));
+ StretchBlt(hdc, x, y, cx, cy, hdcMask, xSrc, ySrc, cxSrc, cySrc, SRCAND);
+ StretchBlt(hdc, x, y, cx, cy, hdcBmp, xSrc, ySrc, cxSrc, cySrc, SRCPAINT);
+
+ SelectObject(hdcMask, hOldbm);
+ DeleteDC(hdcMask);
+ } else
+ StretchBlt(hdc, x, y, cx, cy, hdcBmp, xSrc, ySrc, cxSrc, cySrc, SRCCOPY);
SelectObject(hdcBmp, hbmpOld);
DeleteDC(hdcBmp);
@@ -916,6 +940,8 @@
GifImageDesc *gid;
SavedImage *si;
ColorMapObject *cm;
+ int transparent = -1;
+ ExtensionBlock *eb;
gd.data = xbuf;
gd.curoff = 0;
@@ -945,15 +971,32 @@
gid = &(si->ImageDesc);
cm = gid->ColorMap;
if (!cm) cm = gif->SColorMap;
+
+ /* look for the transparent color extension */
+ for (i = 0; i < si->ExtensionBlockCount; ++i) {
+ eb = si->ExtensionBlocks + i;
+ if (eb->Function == 0xF9 && eb->ByteCount == 4) {
+ if ((eb->Bytes[0] & 1) == 1) {
+ transparent = eb->Bytes[3];
+ }
+ }
+ }
+
for (i=0;i<(1<<gif->SColorResolution);i++) {
bmi->bmiColors[i].rgbRed = cm->Colors[i].Red;
bmi->bmiColors[i].rgbGreen = cm->Colors[i].Green;
bmi->bmiColors[i].rgbBlue = cm->Colors[i].Blue;
+ if (i == transparent) {
+ This->rgbTrans = RGB(bmi->bmiColors[i].rgbRed,
+ bmi->bmiColors[i].rgbGreen,
+ bmi->bmiColors[i].rgbBlue);
+ }
}
+
/* Map to in picture coordinates */
for (i=0;i<gid->Height;i++)
for (j=0;j<gid->Width;j++)
- bytes[(gid->Top+i)*gif->SWidth+gid->Left+j]=si->RasterBits[i*gid->Width+j];
+ bytes[(gid->Top+(gif->SHeight-i-1))*gif->SWidth+gid->Left+j]=si->RasterBits[i*gid->Width+j];
bmi->bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
bmi->bmiHeader.biWidth = gif->SWidth;
bmi->bmiHeader.biHeight = gif->SHeight;
@@ -973,8 +1016,36 @@
CBM_INIT,
bytes,
bmi,
- DIB_PAL_COLORS
+ DIB_RGB_COLORS
);
+
+ if (transparent > -1) {
+ /* Create the Mask */
+ HDC hdc = CreateCompatibleDC(0);
+ HDC hdcMask = CreateCompatibleDC(0);
+ HBITMAP hOldbitmap;
+ HBITMAP hOldbitmapmask;
+
+ This->hbmMask = CreateBitmap(bmi->bmiHeader.biWidth, bmi->bmiHeader.biHeight, 1, 1, NULL);
+
+ hOldbitmap = SelectObject(hdc,This->desc.u.bmp.hbitmap);
+ hOldbitmapmask = SelectObject(hdcMask, This->hbmMask);
+ SetBkColor(hdc, This->rgbTrans);
+ BitBlt(hdcMask, 0, 0, bmi->bmiHeader.biWidth, bmi->bmiHeader.biHeight, hdc, 0, 0, SRCCOPY);
+
+ /* We no longer need the original bitmap, so we apply the first
+ transformation with the mask to speed up the rendering */
+ SetBkColor(hdc, RGB(0,0,0));
+ SetTextColor(hdc, RGB(255,255,255));
+ BitBlt(hdc, 0, 0, bmi->bmiHeader.biWidth, bmi->bmiHeader.biHeight,
+ hdcMask, 0, 0, SRCAND);
+
+ SelectObject(hdc, hOldbitmap);
+ SelectObject(hdcMask, hOldbitmapmask);
+ DeleteDC(hdcMask);
+ DeleteDC(hdc);
+ }
+
DeleteDC(hdcref);
This->desc.picType = PICTYPE_BITMAP;
OLEPictureImpl_SetBitmap(This);