Some more minor GDI fixes.

oldstable
Karl Lessard 1999-09-19 14:15:41 +00:00 committed by Alexandre Julliard
parent 274925980d
commit c73a1fd62d
2 changed files with 55 additions and 81 deletions

View File

@ -299,7 +299,7 @@ static void X11DRV_DIB_GetImageBits_1( int lines, BYTE *dstbits,
/* ==== monochrome bitmap to monochrome dib ==== */
case 4:
/* ==== 4 colormap bitmap to monochrome dib ==== */
if (bmpImage->red_mask == bmpImage->green_mask == bmpImage->blue_mask == 0)
if (bmpImage->red_mask==0 && bmpImage->green_mask==0 && bmpImage->blue_mask==0 && srccolors)
{
PALETTEENTRY val;
@ -322,7 +322,7 @@ static void X11DRV_DIB_GetImageBits_1( int lines, BYTE *dstbits,
case 8:
/* ==== 8 colormap bitmap to monochrome dib ==== */
if ( bmpImage->red_mask == bmpImage->green_mask == bmpImage->blue_mask == 0 )
if ( bmpImage->red_mask==0 && bmpImage->green_mask==0 && bmpImage->blue_mask==0 && srccolors)
{
BYTE *srcpixel;
PALETTEENTRY val;
@ -473,9 +473,9 @@ static void X11DRV_DIB_GetImageBits_1( int lines, BYTE *dstbits,
srcpixel = bmpImage->data + h*bmpImage->bytes_per_line;
for (x = 0; x < dstwidth; x++, srcpixel+=4) {
if (!(x & 7)) *bits = 0;
*bits |= (X11DRV_DIB_GetNearestIndex(colors, 2, srcpixel[0] , srcpixel[1], srcpixel[2]) << (7-(x&7)) );
*bits |= (X11DRV_DIB_GetNearestIndex(colors, 2, srcpixel[0] , srcpixel[1], srcpixel[2]) << (7-(x&7)) );
if ((x & 7) == 7) bits++;
}
}
bits = (dstbits += linebytes);
}
}
@ -483,13 +483,27 @@ static void X11DRV_DIB_GetImageBits_1( int lines, BYTE *dstbits,
}
break;
default: /* ? bit bmp -> 4 bit DIB */
default: /* ? bit bmp -> monochrome DIB */
notsupported:
FIXME_(bitmap)("from %d bit bitmap with mask R,G,B %x,%x,%x to 4 bit DIB\n",
{
unsigned long white = (1 << bmpImage->bits_per_pixel) - 1;
FIXME_(bitmap)("from %d bit bitmap with mask R,G,B %x,%x,%x to 1 bit DIB\n",
bmpImage->bits_per_pixel, (int)bmpImage->red_mask,
(int)bmpImage->green_mask, (int)bmpImage->blue_mask );
for( h = lines - 1; h >= 0; h-- ) {
for( x = 0; x < dstwidth; x++ ) {
if (!(x&7)) *bits = 0;
*bits |= (XGetPixel( bmpImage, x, h) >= white)
<< (7 - (x&7));
if ((x&7)==7) bits++;
}
bits = (dstbits += linebytes);
}
}
break;
}
}
}
/***********************************************************************
@ -574,7 +588,7 @@ static void X11DRV_DIB_GetImageBits_4( int lines, BYTE *dstbits,
/* ==== monochrome bitmap to 4 colormap dib ==== */
case 4:
/* ==== 4 colormap bitmap to 4 colormap dib ==== */
if (bmpImage->red_mask == bmpImage->green_mask == bmpImage->blue_mask == 0)
if (bmpImage->red_mask==0 && bmpImage->green_mask==0 && bmpImage->blue_mask==0 && srccolors)
{
PALETTEENTRY val;
@ -597,7 +611,7 @@ static void X11DRV_DIB_GetImageBits_4( int lines, BYTE *dstbits,
case 8:
/* ==== 8 colormap bitmap to 4 colormap dib ==== */
if ( bmpImage->red_mask == bmpImage->green_mask == bmpImage->blue_mask == 0 )
if ( bmpImage->red_mask==0 && bmpImage->green_mask==0 && bmpImage->blue_mask==0 && srccolors)
{
PALETTEENTRY val;
@ -920,13 +934,21 @@ static void X11DRV_DIB_GetImageBits_8( int lines, BYTE *dstbits,
bits = dstbits;
/*
Hack for now
This condition is true when GetImageBits has been called by UpdateDIBSection.
For now, GetNearestIndex is too slow to support 256 colormaps, so we'll just use for
for GetDIBits calls. (In somes cases, in a updateDIBSection, the returned colors are bad too)
*/
if (!srccolors) goto updatesection;
switch(bmpImage->depth) {
case 1:
/* ==== monochrome bitmap to 8 colormap dib ==== */
case 4:
/* ==== 4 colormap bitmap to 8 colormap dib ==== */
if (bmpImage->red_mask == bmpImage->green_mask == bmpImage->blue_mask == 0)
if (bmpImage->red_mask==0 && bmpImage->green_mask==0 && bmpImage->blue_mask==0 && srccolors)
{
PALETTEENTRY val;
@ -945,7 +967,7 @@ static void X11DRV_DIB_GetImageBits_8( int lines, BYTE *dstbits,
case 8:
/* ==== 8 colormap bitmap to 8 colormap dib ==== */
if (bmpImage->red_mask == bmpImage->green_mask == bmpImage->blue_mask == 0)
if (bmpImage->red_mask==0 && bmpImage->green_mask==0 && bmpImage->blue_mask==0 && srccolors)
{
BYTE *srcpixel;
PALETTEENTRY val;
@ -1101,6 +1123,7 @@ static void X11DRV_DIB_GetImageBits_8( int lines, BYTE *dstbits,
FIXME_(bitmap)("from %d bit bitmap with mask R,G,B %x,%x,%x to 8 bit DIB\n",
bmpImage->depth, (int)bmpImage->red_mask,
(int)bmpImage->green_mask, (int)bmpImage->blue_mask );
updatesection:
for (h = lines - 1; h >= 0; h--) {
for (x = 0; x < dstwidth; x++, bits++) {
*bits = X11DRV_DIB_MapColor((int *)colors, 256,
@ -1578,7 +1601,7 @@ static void X11DRV_DIB_GetImageBits_16( int lines, BYTE *dstbits,
/* ==== monochrome bitmap to 16 BGR dib ==== */
case 4:
/* ==== 4 colormap bitmap to 16 BGR dib ==== */
if (bmpImage->red_mask == bmpImage->green_mask == bmpImage->blue_mask == 0)
if (bmpImage->red_mask==0 && bmpImage->green_mask==0 && bmpImage->blue_mask==0 && srccolors)
{
LPWORD ptr = (LPWORD)dstbits;
PALETTEENTRY val;
@ -1599,7 +1622,7 @@ static void X11DRV_DIB_GetImageBits_16( int lines, BYTE *dstbits,
case 8:
/* ==== 8 colormap bitmap to 16 BGR dib ==== */
if (bmpImage->red_mask == bmpImage->green_mask == bmpImage->blue_mask == 0)
if (bmpImage->red_mask==0 && bmpImage->green_mask==0 && bmpImage->blue_mask==0 && srccolors)
{
LPWORD ptr = (LPWORD)dstbits;
BYTE *srcpixel;
@ -2036,7 +2059,7 @@ static void X11DRV_DIB_GetImageBits_24( int lines, BYTE *dstbits,
/* ==== monochrome bitmap to 24 BGR dib ==== */
case 4:
/* ==== 4 colormap bitmap to 24 BGR dib ==== */
if (bmpImage->red_mask == bmpImage->green_mask == bmpImage->blue_mask == 0)
if (bmpImage->red_mask==0 && bmpImage->green_mask==0 && bmpImage->blue_mask==0 && srccolors)
{
LPBYTE bits = dstbits;
PALETTEENTRY val;
@ -2057,7 +2080,7 @@ static void X11DRV_DIB_GetImageBits_24( int lines, BYTE *dstbits,
case 8:
/* ==== 8 colormap bitmap to 24 BGR dib ==== */
if (bmpImage->red_mask == bmpImage->green_mask == bmpImage->blue_mask == 0)
if (bmpImage->red_mask==0 && bmpImage->green_mask==0 && bmpImage->blue_mask == 0 && srccolors)
{
BYTE *srcpixel;
LPBYTE bits = dstbits;
@ -2091,9 +2114,9 @@ static void X11DRV_DIB_GetImageBits_24( int lines, BYTE *dstbits,
for (x = 0; x < dstwidth; x++, bits += 3)
{
COLORREF pixel = X11DRV_PALETTE_ToLogical( XGetPixel( bmpImage, x, h ) );
bits[0] = GetRValue(pixel);
bits[0] = GetBValue(pixel);
bits[1] = GetGValue(pixel);
bits[2] = GetBValue(pixel);
bits[2] = GetRValue(pixel);
}
bits = (dstbits += linebytes);
}
@ -2370,7 +2393,7 @@ static void X11DRV_DIB_GetImageBits_32( int lines, BYTE *dstbits,
/* ==== monochrome bitmap to 32 BGR dib ==== */
case 4:
/* ==== 4 colormap bitmap to 32 BGR dib ==== */
if (bmpImage->red_mask == bmpImage->green_mask == bmpImage->blue_mask == 0)
if (bmpImage->red_mask==0 && bmpImage->green_mask==0 && bmpImage->blue_mask==0 && srccolors)
{
PALETTEENTRY val;
@ -2391,7 +2414,7 @@ static void X11DRV_DIB_GetImageBits_32( int lines, BYTE *dstbits,
case 8:
/* ==== 8 colormap bitmap to 32 BGR dib ==== */
if (bmpImage->red_mask == bmpImage->green_mask == bmpImage->blue_mask == 0)
if (bmpImage->red_mask==0 && bmpImage->green_mask==0 && bmpImage->blue_mask==0 && srccolors)
{
BYTE *srcpixel;
PALETTEENTRY val;
@ -2421,9 +2444,9 @@ static void X11DRV_DIB_GetImageBits_32( int lines, BYTE *dstbits,
for (x = 0; x < dstwidth; x++, bits += 4)
{
COLORREF pixel = X11DRV_PALETTE_ToLogical( XGetPixel( bmpImage, x, h ) );
bits[0] = GetRValue(pixel);
bits[0] = GetBValue(pixel);
bits[1] = GetGValue(pixel);
bits[2] = GetBValue(pixel);
bits[2] = GetRValue(pixel);
}
bits = (dstbits += linebytes);
}
@ -2457,31 +2480,6 @@ int X11DRV_DIB_SetImageBits( const X11DRV_DIB_IMAGEBITS_DESCR *descr )
bmpImage->data = xcalloc( bmpImage->bytes_per_line * lines );
}
/* Hack for now */
if (bmpImage->red_mask == bmpImage->blue_mask == bmpImage->green_mask == 0)
{
switch(bmpImage->depth) {
case 15:
bmpImage->red_mask = 0x7c00;
bmpImage->green_mask = 0x03e0;
bmpImage->blue_mask = 0x001f;
break;
case 16:
bmpImage->red_mask = 0xf800;
bmpImage->green_mask = 0x07e0;
bmpImage->blue_mask = 0x001f;
break;
case 24:
case 32:
bmpImage->red_mask = 0xff0000;
bmpImage->green_mask = 0xff00;
bmpImage->blue_mask = 0xff;
break;
}
}
/* Transfer the pixels */
switch(descr->infoBpp)
{
@ -2579,30 +2577,6 @@ int X11DRV_DIB_GetImageBits( const X11DRV_DIB_IMAGEBITS_DESCR *descr )
descr->width, descr->height, AllPlanes, ZPixmap,
bmpImage, descr->xSrc, descr->ySrc );
/* Hack for now */
if (bmpImage->red_mask == bmpImage->blue_mask == bmpImage->green_mask == 0)
{
switch(bmpImage->depth) {
case 15:
bmpImage->red_mask = 0x7c00;
bmpImage->green_mask = 0x03e0;
bmpImage->blue_mask = 0x001f;
break;
case 16:
bmpImage->red_mask = 0xf800;
bmpImage->green_mask = 0x07e0;
bmpImage->blue_mask = 0x001f;
break;
case 24:
case 32:
bmpImage->red_mask = 0xff0000;
bmpImage->green_mask = 0xff00;
bmpImage->blue_mask = 0xff;
break;
}
}
/* Transfer the pixels */
switch(descr->infoBpp)
{
@ -2728,6 +2702,7 @@ INT X11DRV_SetDIBitsToDevice( DC *dc, INT xDest, INT yDest, DWORD cx,
descr.dc = dc;
descr.bits = bits;
descr.image = NULL;
descr.palentry = NULL;
descr.lines = tmpheight >= 0 ? lines : -lines;
descr.infoWidth = width;
descr.depth = dc->w.bitsPerPixel;
@ -2820,6 +2795,7 @@ INT X11DRV_DIB_SetDIBits(
descr.bits = bits;
descr.image = NULL;
descr.palentry = NULL;
descr.lines = tmpheight >= 0 ? lines : -lines;
descr.depth = bmp->bitmap.bmBitsPixel;
descr.drawable = pbitmap->pixmap;
@ -2961,6 +2937,7 @@ static void X11DRV_DIB_DoUpdateDIBSection(BITMAPOBJ *bmp, BOOL toDIB)
return;
descr.dc = NULL;
descr.palentry = NULL;
descr.image = dib->image;
descr.colorMap = (RGBQUAD *)dib->colorMap;
descr.nColorMap = dib->nColorMap;

View File

@ -592,8 +592,8 @@ INT WINAPI GetDIBits(
for( y = 0; y < lines; y++) {
for( x = 0; x < srcwidth; x++ ) {
val = *srcbits++;
*dstbits++ = (WORD)(((val >> 19) & bmask) | ((val >> 6) & gmask) |
((val << 7) & rmask));
*dstbits++ = (WORD)(((val >> 3) & bmask) | ((val >> 6) & gmask) |
((val >> 9) & rmask));
}
dstbits = (LPWORD)(dbits+=dstwidthb);
srcbits = (LPDWORD)(sbits+=srcwidthb);
@ -624,9 +624,9 @@ INT WINAPI GetDIBits(
for( y = 0; y < lines; y++) {
for( x = 0; x < srcwidth; x++ ) {
val = *srcbits++;
*dstbits++ = (BYTE)(((val >> 7) & 0xf8) | ((val >> 12) & 0x07));
*dstbits++ = (BYTE)(((val >> 2) & 0xf8) | ((val >> 7) & 0x07));
*dstbits++ = (BYTE)(((val << 3) & 0xf8) | ((val >> 2) & 0x07));
*dstbits++ = (BYTE)(((val >> 2) & 0xf8) | ((val >> 7) & 0x07));
*dstbits++ = (BYTE)(((val >> 7) & 0xf8) | ((val >> 12) & 0x07));
}
dstbits = (LPBYTE)(dbits+=dstwidthb);
srcbits = (LPWORD)(sbits+=srcwidthb);
@ -668,7 +668,6 @@ INT WINAPI GetDIBits(
case 32: /* 32 bpp dstDIB */
{
LPDWORD dstbits = (LPDWORD)dbits;
DWORD rmask = 0xff, gmask = 0xff00, bmask = 0xff0000;
/* FIXME: BI_BITFIELDS not supported yet */
@ -682,9 +681,9 @@ INT WINAPI GetDIBits(
for( y = 0; y < lines; y++) {
for( x = 0; x < srcwidth; x++ ) {
val = (DWORD)*srcbits++;
*dstbits++ = ((val >> 7) & 0xf8) | ((val >> 12) & 0x07) |
*dstbits++ = ((val << 3) & 0xf8) | ((val >> 2) & 0x07) |
((val << 6) & 0xf800) | ((val << 1) & 0x0700) |
((val << 19) & 0xf800) | ((val << 14) & 0x070000);
((val << 9) & 0xf80000) | ((val << 4) & 0x070000);
}
dstbits=(LPDWORD)(dbits+=dstwidthb);
srcbits=(LPWORD)(sbits+=srcwidthb);
@ -697,10 +696,8 @@ INT WINAPI GetDIBits(
LPBYTE srcbits = sbits;
for( y = 0; y < lines; y++) {
for( x = 0; x < srcwidth; x++ )
*dstbits++ = ((DWORD)*srcbits++ & rmask) |
(((DWORD)*srcbits++ << 8) & gmask) |
(((DWORD)*srcbits++ << 7) & bmask);
for( x = 0; x < srcwidth; x++, srcbits+=3 )
*dstbits++ = ((DWORD)*srcbits) & 0x00ffffff;
dstbits=(LPDWORD)(dbits+=dstwidthb);
srcbits=(sbits+=srcwidthb);
}