winex11: Verify that the color map matches in PutImage for 4 and 8 bpp.
This commit is contained in:
parent
476a1fa1fb
commit
be835e2d9b
|
@ -1659,6 +1659,60 @@ static void set_color_info( PHYSDEV dev, const ColorShifts *color_shifts, BITMAP
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* check if the specified color info is suitable for PutImage */
|
||||||
|
static BOOL matching_color_info( PHYSDEV dev, const ColorShifts *color_shifts, const BITMAPINFO *info )
|
||||||
|
{
|
||||||
|
DWORD *colors = (DWORD *)((char *)info + info->bmiHeader.biSize);
|
||||||
|
|
||||||
|
switch (info->bmiHeader.biBitCount)
|
||||||
|
{
|
||||||
|
case 1:
|
||||||
|
if (info->bmiHeader.biCompression != BI_RGB) return FALSE;
|
||||||
|
return !info->bmiHeader.biClrUsed; /* color map not allowed */
|
||||||
|
case 4:
|
||||||
|
case 8:
|
||||||
|
{
|
||||||
|
RGBQUAD *rgb = (RGBQUAD *)colors;
|
||||||
|
PALETTEENTRY palette[256];
|
||||||
|
UINT i, count;
|
||||||
|
|
||||||
|
if (info->bmiHeader.biCompression != BI_RGB) return FALSE;
|
||||||
|
count = X11DRV_GetSystemPaletteEntries( dev, 0, 1 << info->bmiHeader.biBitCount, palette );
|
||||||
|
if (count != info->bmiHeader.biClrUsed) return FALSE;
|
||||||
|
for (i = 0; i < count; i++)
|
||||||
|
{
|
||||||
|
if (rgb[i].rgbRed != palette[i].peRed ||
|
||||||
|
rgb[i].rgbGreen != palette[i].peGreen ||
|
||||||
|
rgb[i].rgbBlue != palette[i].peBlue) return FALSE;
|
||||||
|
}
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
case 16:
|
||||||
|
if (info->bmiHeader.biCompression == BI_BITFIELDS)
|
||||||
|
return (color_shifts->logicalRed.max << color_shifts->logicalRed.shift == colors[0] &&
|
||||||
|
color_shifts->logicalGreen.max << color_shifts->logicalGreen.shift == colors[1] &&
|
||||||
|
color_shifts->logicalBlue.max << color_shifts->logicalBlue.shift == colors[2]);
|
||||||
|
if (info->bmiHeader.biCompression == BI_RGB)
|
||||||
|
return (color_shifts->logicalRed.max << color_shifts->logicalRed.shift == 0x7c00 &&
|
||||||
|
color_shifts->logicalGreen.max << color_shifts->logicalGreen.shift == 0x03e0 &&
|
||||||
|
color_shifts->logicalBlue.max << color_shifts->logicalBlue.shift == 0x001f);
|
||||||
|
break;
|
||||||
|
case 32:
|
||||||
|
if (info->bmiHeader.biCompression == BI_BITFIELDS)
|
||||||
|
return (color_shifts->logicalRed.max << color_shifts->logicalRed.shift == colors[0] &&
|
||||||
|
color_shifts->logicalGreen.max << color_shifts->logicalGreen.shift == colors[1] &&
|
||||||
|
color_shifts->logicalBlue.max << color_shifts->logicalBlue.shift == colors[2]);
|
||||||
|
/* fall through */
|
||||||
|
case 24:
|
||||||
|
if (info->bmiHeader.biCompression == BI_RGB)
|
||||||
|
return (color_shifts->logicalRed.max << color_shifts->logicalRed.shift == 0xff0000 &&
|
||||||
|
color_shifts->logicalGreen.max << color_shifts->logicalGreen.shift == 0x00ff00 &&
|
||||||
|
color_shifts->logicalBlue.max << color_shifts->logicalBlue.shift == 0x0000ff);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
/* copy the image bits, fixing up alignment and byte swapping as necessary */
|
/* copy the image bits, fixing up alignment and byte swapping as necessary */
|
||||||
static DWORD copy_image_bits( BITMAPINFO *info, const ColorShifts *color_shifts, XImage *image,
|
static DWORD copy_image_bits( BITMAPINFO *info, const ColorShifts *color_shifts, XImage *image,
|
||||||
const struct gdi_image_bits *src_bits, struct gdi_image_bits *dst_bits,
|
const struct gdi_image_bits *src_bits, struct gdi_image_bits *dst_bits,
|
||||||
|
@ -1814,7 +1868,7 @@ DWORD X11DRV_PutImage( PHYSDEV dev, HBITMAP hbitmap, BITMAPINFO *info, const str
|
||||||
{
|
{
|
||||||
X11DRV_PDEVICE *physdev;
|
X11DRV_PDEVICE *physdev;
|
||||||
X_PHYSBITMAP *bitmap;
|
X_PHYSBITMAP *bitmap;
|
||||||
DWORD ret = ERROR_SUCCESS;
|
DWORD ret;
|
||||||
XImage *image;
|
XImage *image;
|
||||||
int depth;
|
int depth;
|
||||||
struct gdi_image_bits dst_bits;
|
struct gdi_image_bits dst_bits;
|
||||||
|
@ -1842,37 +1896,8 @@ DWORD X11DRV_PutImage( PHYSDEV dev, HBITMAP hbitmap, BITMAPINFO *info, const str
|
||||||
if (info->bmiHeader.biPlanes != 1) goto update_format;
|
if (info->bmiHeader.biPlanes != 1) goto update_format;
|
||||||
if (info->bmiHeader.biBitCount != format->bits_per_pixel) goto update_format;
|
if (info->bmiHeader.biBitCount != format->bits_per_pixel) goto update_format;
|
||||||
/* FIXME: could try to handle 1-bpp using XCopyPlane */
|
/* FIXME: could try to handle 1-bpp using XCopyPlane */
|
||||||
|
if (!matching_color_info( dev, color_shifts, info )) goto update_format;
|
||||||
if (info->bmiHeader.biCompression == BI_BITFIELDS)
|
if (!bits) return ERROR_SUCCESS; /* just querying the format */
|
||||||
{
|
|
||||||
DWORD *masks = (DWORD *)((char *)info + info->bmiHeader.biSize);
|
|
||||||
if (color_shifts->logicalRed.max << color_shifts->logicalRed.shift != masks[0] ||
|
|
||||||
color_shifts->logicalGreen.max << color_shifts->logicalGreen.shift != masks[1] ||
|
|
||||||
color_shifts->logicalBlue.max << color_shifts->logicalBlue.shift != masks[2])
|
|
||||||
goto update_format;
|
|
||||||
}
|
|
||||||
else if (info->bmiHeader.biCompression == BI_RGB)
|
|
||||||
{
|
|
||||||
switch (info->bmiHeader.biBitCount)
|
|
||||||
{
|
|
||||||
case 16:
|
|
||||||
if (color_shifts->logicalRed.max << color_shifts->logicalRed.shift != 0x7c00 ||
|
|
||||||
color_shifts->logicalGreen.max << color_shifts->logicalGreen.shift != 0x03e0 ||
|
|
||||||
color_shifts->logicalBlue.max << color_shifts->logicalBlue.shift != 0x001f)
|
|
||||||
goto update_format;
|
|
||||||
break;
|
|
||||||
case 24:
|
|
||||||
case 32:
|
|
||||||
if (color_shifts->logicalRed.max << color_shifts->logicalRed.shift != 0xff0000 ||
|
|
||||||
color_shifts->logicalGreen.max << color_shifts->logicalGreen.shift != 0x00ff00 ||
|
|
||||||
color_shifts->logicalBlue.max << color_shifts->logicalBlue.shift != 0x0000ff)
|
|
||||||
goto update_format;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else goto update_format;
|
|
||||||
|
|
||||||
if (!bits) return ret; /* just querying the format */
|
|
||||||
|
|
||||||
wine_tsx11_lock();
|
wine_tsx11_lock();
|
||||||
image = XCreateImage( gdi_display, visual, depth, ZPixmap, 0, NULL,
|
image = XCreateImage( gdi_display, visual, depth, ZPixmap, 0, NULL,
|
||||||
|
|
Loading…
Reference in New Issue