Build the correct colour map when the mode is DIB_PAL_COLORS.

This commit is contained in:
Huw Davies 2004-03-27 01:37:09 +00:00 committed by Alexandre Julliard
parent 89b6080152
commit caab4c6f39
1 changed files with 20 additions and 1 deletions

View File

@ -3823,12 +3823,30 @@ INT X11DRV_GetDIBits( X11DRV_PDEVICE *physDev, HBITMAP hbitmap, UINT startscan,
goto done; goto done;
} }
descr.colorMap = NULL;
switch (descr.infoBpp) switch (descr.infoBpp)
{ {
case 1: case 1:
case 4: case 4:
case 8: case 8:
descr.rMask= descr.gMask = descr.bMask = 0; descr.rMask= descr.gMask = descr.bMask = 0;
if(coloruse == DIB_RGB_COLORS)
descr.colorMap = info->bmiColors;
else {
int num_colors = 1 << descr.infoBpp, i;
RGBQUAD *rgb;
COLORREF colref;
WORD *index = (WORD*)info->bmiColors;
descr.colorMap = rgb = HeapAlloc(GetProcessHeap(), 0, num_colors * sizeof(RGBQUAD));
for(i = 0; i < num_colors; i++, rgb++, index++) {
colref = X11DRV_PALETTE_ToLogical(X11DRV_PALETTE_ToPhysical(physDev, PALETTEINDEX(*index)));
rgb->rgbRed = GetRValue(colref);
rgb->rgbGreen = GetGValue(colref);
rgb->rgbBlue = GetBValue(colref);
rgb->rgbReserved = 0;
}
}
break; break;
case 15: case 15:
case 16: case 16:
@ -3854,7 +3872,6 @@ INT X11DRV_GetDIBits( X11DRV_PDEVICE *physDev, HBITMAP hbitmap, UINT startscan,
descr.gc = BITMAP_GC(bmp); descr.gc = BITMAP_GC(bmp);
descr.width = bmp->bitmap.bmWidth; descr.width = bmp->bitmap.bmWidth;
descr.height = bmp->bitmap.bmHeight; descr.height = bmp->bitmap.bmHeight;
descr.colorMap = info->bmiColors;
descr.xDest = 0; descr.xDest = 0;
descr.yDest = 0; descr.yDest = 0;
descr.xSrc = 0; descr.xSrc = 0;
@ -3897,6 +3914,8 @@ INT X11DRV_GetDIBits( X11DRV_PDEVICE *physDev, HBITMAP hbitmap, UINT startscan,
info->bmiHeader.biCompression = 0; info->bmiHeader.biCompression = 0;
} }
if(descr.colorMap && descr.colorMap != info->bmiColors)
HeapFree(GetProcessHeap(), 0, descr.colorMap);
done: done:
GDI_ReleaseObj( hbitmap ); GDI_ReleaseObj( hbitmap );
return lines; return lines;