Fix for BI_BITFIELDS: The color masks are at the same position in all
the bitmap headers that support this flag (BITMAPINFO: The first color mask is in bmiColors[0], that's the same position as bV4RedMask in BITMAPV4HEADER).
This commit is contained in:
parent
a04b77ddc2
commit
0f2c2b8426
|
@ -42,6 +42,10 @@
|
||||||
|
|
||||||
- BITMAPV4HEADER: Introduced in Windows 95 / NT 4.0
|
- BITMAPV4HEADER: Introduced in Windows 95 / NT 4.0
|
||||||
- BITMAPV5HEADER: Introduced in Windows 98 / 2000
|
- BITMAPV5HEADER: Introduced in Windows 98 / 2000
|
||||||
|
|
||||||
|
If biCompression is BI_BITFIELDS, the color masks are at the same position
|
||||||
|
in all the headers (they start at bmiColors of BITMAPINFOHEADER), because
|
||||||
|
the new headers have structure members for the masks.
|
||||||
|
|
||||||
|
|
||||||
* You should never access the color table using the bmiColors member,
|
* You should never access the color table using the bmiColors member,
|
||||||
|
@ -1118,7 +1122,6 @@ HBITMAP DIB_CreateDIBSection(HDC hdc, const BITMAPINFO *bmi, UINT usage,
|
||||||
LONG width, height;
|
LONG width, height;
|
||||||
WORD planes, bpp;
|
WORD planes, bpp;
|
||||||
DWORD compression, sizeImage;
|
DWORD compression, sizeImage;
|
||||||
const DWORD *colorPtr;
|
|
||||||
void *mapBits = NULL;
|
void *mapBits = NULL;
|
||||||
|
|
||||||
if (((bitmap_type = DIB_GetBitmapInfo( &bmi->bmiHeader, &width, &height,
|
if (((bitmap_type = DIB_GetBitmapInfo( &bmi->bmiHeader, &width, &height,
|
||||||
|
@ -1167,7 +1170,6 @@ HBITMAP DIB_CreateDIBSection(HDC hdc, const BITMAPINFO *bmi, UINT usage,
|
||||||
|
|
||||||
|
|
||||||
/* set dsBitfields values */
|
/* set dsBitfields values */
|
||||||
colorPtr = (const DWORD *)((const char *)bmi + (WORD) bmi->bmiHeader.biSize);
|
|
||||||
if (usage == DIB_PAL_COLORS || bpp <= 8)
|
if (usage == DIB_PAL_COLORS || bpp <= 8)
|
||||||
{
|
{
|
||||||
dib->dsBitfields[0] = dib->dsBitfields[1] = dib->dsBitfields[2] = 0;
|
dib->dsBitfields[0] = dib->dsBitfields[1] = dib->dsBitfields[2] = 0;
|
||||||
|
@ -1176,15 +1178,15 @@ HBITMAP DIB_CreateDIBSection(HDC hdc, const BITMAPINFO *bmi, UINT usage,
|
||||||
{
|
{
|
||||||
case 15:
|
case 15:
|
||||||
case 16:
|
case 16:
|
||||||
dib->dsBitfields[0] = (compression == BI_BITFIELDS) ? colorPtr[0] : 0x7c00;
|
dib->dsBitfields[0] = (compression == BI_BITFIELDS) ? *(const DWORD *)bmi->bmiColors : 0x7c00;
|
||||||
dib->dsBitfields[1] = (compression == BI_BITFIELDS) ? colorPtr[1] : 0x03e0;
|
dib->dsBitfields[1] = (compression == BI_BITFIELDS) ? *((const DWORD *)bmi->bmiColors + 1) : 0x03e0;
|
||||||
dib->dsBitfields[2] = (compression == BI_BITFIELDS) ? colorPtr[2] : 0x001f;
|
dib->dsBitfields[2] = (compression == BI_BITFIELDS) ? *((const DWORD *)bmi->bmiColors + 2) : 0x001f;
|
||||||
break;
|
break;
|
||||||
case 24:
|
case 24:
|
||||||
case 32:
|
case 32:
|
||||||
dib->dsBitfields[0] = (compression == BI_BITFIELDS) ? colorPtr[0] : 0xff0000;
|
dib->dsBitfields[0] = (compression == BI_BITFIELDS) ? *(const DWORD *)bmi->bmiColors : 0xff0000;
|
||||||
dib->dsBitfields[1] = (compression == BI_BITFIELDS) ? colorPtr[1] : 0x00ff00;
|
dib->dsBitfields[1] = (compression == BI_BITFIELDS) ? *((const DWORD *)bmi->bmiColors + 1) : 0x00ff00;
|
||||||
dib->dsBitfields[2] = (compression == BI_BITFIELDS) ? colorPtr[2] : 0x0000ff;
|
dib->dsBitfields[2] = (compression == BI_BITFIELDS) ? *((const DWORD *)bmi->bmiColors + 2) : 0x0000ff;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -3761,7 +3761,6 @@ INT X11DRV_SetDIBitsToDevice( X11DRV_PDEVICE *physDev, INT xDest, INT yDest, DWO
|
||||||
LONG width, height;
|
LONG width, height;
|
||||||
BOOL top_down;
|
BOOL top_down;
|
||||||
POINT pt;
|
POINT pt;
|
||||||
const void* colorPtr;
|
|
||||||
|
|
||||||
if (DIB_GetBitmapInfo( &info->bmiHeader, &width, &height,
|
if (DIB_GetBitmapInfo( &info->bmiHeader, &width, &height,
|
||||||
&descr.infoBpp, &descr.compression ) == -1)
|
&descr.infoBpp, &descr.compression ) == -1)
|
||||||
|
@ -3817,8 +3816,6 @@ INT X11DRV_SetDIBitsToDevice( X11DRV_PDEVICE *physDev, INT xDest, INT yDest, DWO
|
||||||
XSetFunction(gdi_display, physDev->gc, X11DRV_XROPfunction[GetROP2(physDev->hdc) - 1]);
|
XSetFunction(gdi_display, physDev->gc, X11DRV_XROPfunction[GetROP2(physDev->hdc) - 1]);
|
||||||
wine_tsx11_unlock();
|
wine_tsx11_unlock();
|
||||||
|
|
||||||
colorPtr = (const BYTE*) info + (WORD) info->bmiHeader.biSize;
|
|
||||||
|
|
||||||
switch (descr.infoBpp)
|
switch (descr.infoBpp)
|
||||||
{
|
{
|
||||||
case 1:
|
case 1:
|
||||||
|
@ -3832,17 +3829,17 @@ INT X11DRV_SetDIBitsToDevice( X11DRV_PDEVICE *physDev, INT xDest, INT yDest, DWO
|
||||||
break;
|
break;
|
||||||
case 15:
|
case 15:
|
||||||
case 16:
|
case 16:
|
||||||
descr.rMask = (descr.compression == BI_BITFIELDS) ? *((const DWORD *)colorPtr ) : 0x7c00;
|
descr.rMask = (descr.compression == BI_BITFIELDS) ? *(const DWORD *)info->bmiColors : 0x7c00;
|
||||||
descr.gMask = (descr.compression == BI_BITFIELDS) ? *((const DWORD *)colorPtr + 1) : 0x03e0;
|
descr.gMask = (descr.compression == BI_BITFIELDS) ? *((const DWORD *)info->bmiColors + 1) : 0x03e0;
|
||||||
descr.bMask = (descr.compression == BI_BITFIELDS) ? *((const DWORD *)colorPtr + 2) : 0x001f;
|
descr.bMask = (descr.compression == BI_BITFIELDS) ? *((const DWORD *)info->bmiColors + 2) : 0x001f;
|
||||||
descr.colorMap = 0;
|
descr.colorMap = 0;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 24:
|
case 24:
|
||||||
case 32:
|
case 32:
|
||||||
descr.rMask = (descr.compression == BI_BITFIELDS) ? *((const DWORD *)colorPtr ) : 0xff0000;
|
descr.rMask = (descr.compression == BI_BITFIELDS) ? *(const DWORD *)info->bmiColors : 0xff0000;
|
||||||
descr.gMask = (descr.compression == BI_BITFIELDS) ? *((const DWORD *)colorPtr + 1) : 0x00ff00;
|
descr.gMask = (descr.compression == BI_BITFIELDS) ? *((const DWORD *)info->bmiColors + 1) : 0x00ff00;
|
||||||
descr.bMask = (descr.compression == BI_BITFIELDS) ? *((const DWORD *)colorPtr + 2) : 0x0000ff;
|
descr.bMask = (descr.compression == BI_BITFIELDS) ? *((const DWORD *)info->bmiColors + 2) : 0x0000ff;
|
||||||
descr.colorMap = 0;
|
descr.colorMap = 0;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@ -3887,7 +3884,6 @@ INT X11DRV_SetDIBits( X11DRV_PDEVICE *physDev, HBITMAP hbitmap, UINT startscan,
|
||||||
BITMAP bitmap;
|
BITMAP bitmap;
|
||||||
LONG height, tmpheight;
|
LONG height, tmpheight;
|
||||||
INT result;
|
INT result;
|
||||||
const void* colorPtr;
|
|
||||||
|
|
||||||
descr.physDev = physDev;
|
descr.physDev = physDev;
|
||||||
|
|
||||||
|
@ -3906,8 +3902,6 @@ INT X11DRV_SetDIBits( X11DRV_PDEVICE *physDev, HBITMAP hbitmap, UINT startscan,
|
||||||
|
|
||||||
if (startscan + lines > height) lines = height - startscan;
|
if (startscan + lines > height) lines = height - startscan;
|
||||||
|
|
||||||
colorPtr = (const BYTE*) info + (WORD) info->bmiHeader.biSize;
|
|
||||||
|
|
||||||
switch (descr.infoBpp)
|
switch (descr.infoBpp)
|
||||||
{
|
{
|
||||||
case 1:
|
case 1:
|
||||||
|
@ -3922,17 +3916,17 @@ INT X11DRV_SetDIBits( X11DRV_PDEVICE *physDev, HBITMAP hbitmap, UINT startscan,
|
||||||
break;
|
break;
|
||||||
case 15:
|
case 15:
|
||||||
case 16:
|
case 16:
|
||||||
descr.rMask = (descr.compression == BI_BITFIELDS) ? *((const DWORD*)colorPtr ) : 0x7c00;
|
descr.rMask = (descr.compression == BI_BITFIELDS) ? *(const DWORD *)info->bmiColors : 0x7c00;
|
||||||
descr.gMask = (descr.compression == BI_BITFIELDS) ? *((const DWORD*)colorPtr + 1) : 0x03e0;
|
descr.gMask = (descr.compression == BI_BITFIELDS) ? *((const DWORD *)info->bmiColors + 1) : 0x03e0;
|
||||||
descr.bMask = (descr.compression == BI_BITFIELDS) ? *((const DWORD*)colorPtr + 2) : 0x001f;
|
descr.bMask = (descr.compression == BI_BITFIELDS) ? *((const DWORD *)info->bmiColors + 2) : 0x001f;
|
||||||
descr.colorMap = 0;
|
descr.colorMap = 0;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 24:
|
case 24:
|
||||||
case 32:
|
case 32:
|
||||||
descr.rMask = (descr.compression == BI_BITFIELDS) ? *((const DWORD*)colorPtr ) : 0xff0000;
|
descr.rMask = (descr.compression == BI_BITFIELDS) ? *(const DWORD *)info->bmiColors : 0xff0000;
|
||||||
descr.gMask = (descr.compression == BI_BITFIELDS) ? *((const DWORD*)colorPtr + 1) : 0x00ff00;
|
descr.gMask = (descr.compression == BI_BITFIELDS) ? *((const DWORD *)info->bmiColors + 1) : 0x00ff00;
|
||||||
descr.bMask = (descr.compression == BI_BITFIELDS) ? *((const DWORD*)colorPtr + 2) : 0x0000ff;
|
descr.bMask = (descr.compression == BI_BITFIELDS) ? *((const DWORD *)info->bmiColors + 2) : 0x0000ff;
|
||||||
descr.colorMap = 0;
|
descr.colorMap = 0;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
@ -4040,15 +4034,15 @@ INT X11DRV_GetDIBits( X11DRV_PDEVICE *physDev, HBITMAP hbitmap, UINT startscan,
|
||||||
break;
|
break;
|
||||||
case 15:
|
case 15:
|
||||||
case 16:
|
case 16:
|
||||||
descr.rMask = (descr.compression == BI_BITFIELDS) ? *((DWORD *)colorPtr ) : 0x7c00;
|
descr.rMask = (descr.compression == BI_BITFIELDS) ? *(const DWORD *)info->bmiColors : 0x7c00;
|
||||||
descr.gMask = (descr.compression == BI_BITFIELDS) ? *((DWORD *)colorPtr + 1) : 0x03e0;
|
descr.gMask = (descr.compression == BI_BITFIELDS) ? *((const DWORD *)info->bmiColors + 1) : 0x03e0;
|
||||||
descr.bMask = (descr.compression == BI_BITFIELDS) ? *((DWORD *)colorPtr + 2) : 0x001f;
|
descr.bMask = (descr.compression == BI_BITFIELDS) ? *((const DWORD *)info->bmiColors + 2) : 0x001f;
|
||||||
break;
|
break;
|
||||||
case 24:
|
case 24:
|
||||||
case 32:
|
case 32:
|
||||||
descr.rMask = (descr.compression == BI_BITFIELDS) ? *((DWORD *)colorPtr ) : 0xff0000;
|
descr.rMask = (descr.compression == BI_BITFIELDS) ? *(const DWORD *)info->bmiColors : 0xff0000;
|
||||||
descr.gMask = (descr.compression == BI_BITFIELDS) ? *((DWORD *)colorPtr + 1) : 0x00ff00;
|
descr.gMask = (descr.compression == BI_BITFIELDS) ? *((const DWORD *)info->bmiColors + 1) : 0x00ff00;
|
||||||
descr.bMask = (descr.compression == BI_BITFIELDS) ? *((DWORD *)colorPtr + 2) : 0x0000ff;
|
descr.bMask = (descr.compression == BI_BITFIELDS) ? *((const DWORD *)info->bmiColors + 2) : 0x0000ff;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -4094,9 +4088,9 @@ INT X11DRV_GetDIBits( X11DRV_PDEVICE *physDev, HBITMAP hbitmap, UINT startscan,
|
||||||
|
|
||||||
if (descr.compression == BI_BITFIELDS)
|
if (descr.compression == BI_BITFIELDS)
|
||||||
{
|
{
|
||||||
*(DWORD *) colorPtr = descr.rMask;
|
*(DWORD *)info->bmiColors = descr.rMask;
|
||||||
*((DWORD *)colorPtr + 1) = descr.gMask;
|
*((DWORD *)info->bmiColors + 1) = descr.gMask;
|
||||||
*((DWORD *)colorPtr + 2) = descr.bMask;
|
*((DWORD *)info->bmiColors + 2) = descr.bMask;
|
||||||
}
|
}
|
||||||
else if (!core_header)
|
else if (!core_header)
|
||||||
{
|
{
|
||||||
|
|
Loading…
Reference in New Issue