From 3cb51cd3c43db22b888a2ef7b0b4da4dd5af575e Mon Sep 17 00:00:00 2001 From: Alexandre Julliard Date: Wed, 8 Nov 2006 19:57:37 +0100 Subject: [PATCH] winex11.drv: Get rid of the DIB color table now that it's stored in gdi32. --- dlls/winex11.drv/dib.c | 118 +++--------------------------- dlls/winex11.drv/palette.c | 13 ++-- dlls/winex11.drv/winex11.drv.spec | 1 - dlls/winex11.drv/x11drv.h | 2 - 4 files changed, 17 insertions(+), 117 deletions(-) diff --git a/dlls/winex11.drv/dib.c b/dlls/winex11.drv/dib.c index 77fa03c0470..1c0c7c27454 100644 --- a/dlls/winex11.drv/dib.c +++ b/dlls/winex11.drv/dib.c @@ -299,11 +299,11 @@ static int *X11DRV_DIB_GenColorMap( X11DRV_PDEVICE *physDev, int *colorMapping, if (depth == 1) /* Monochrome */ { BOOL invert = FALSE; - if(physDev && physDev->bitmap && physDev->bitmap->colorTable) - { - if(!colour_is_brighter(physDev->bitmap->colorTable[1], physDev->bitmap->colorTable[0])) - invert = TRUE; - } + RGBQUAD table[2]; + + if (GetDIBColorTable( physDev->hdc, 0, 2, table ) == 2) + invert = !colour_is_brighter(table[1], table[0]); + for (i = start; i < end; i++, rgb++) colorMapping[i] = ((rgb->rgbRed + rgb->rgbGreen + rgb->rgbBlue > 255*3/2 && !invert) || @@ -323,11 +323,11 @@ static int *X11DRV_DIB_GenColorMap( X11DRV_PDEVICE *physDev, int *colorMapping, if (depth == 1) /* Monochrome */ { BOOL invert = FALSE; - if(physDev && physDev->bitmap && physDev->bitmap->colorTable) - { - if(!colour_is_brighter(physDev->bitmap->colorTable[1], physDev->bitmap->colorTable[0])) - invert = TRUE; - } + RGBQUAD table[2]; + + if (GetDIBColorTable( physDev->hdc, 0, 2, table ) == 2) + invert = !colour_is_brighter(table[1], table[0]); + for (i = start; i < end; i++, rgb++) colorMapping[i] = ((rgb->rgbtRed + rgb->rgbtGreen + rgb->rgbtBlue > 255*3/2 && !invert) || @@ -402,84 +402,6 @@ static int *X11DRV_DIB_BuildColorMap( X11DRV_PDEVICE *physDev, WORD coloruse, WO isInfo, colorPtr, 0, colors); } -/*********************************************************************** - * X11DRV_DIB_BuildColorTable - * - * Build the dib color table. This either keeps a copy of the bmiColors array if - * usage is DIB_RGB_COLORS, or looks up the palette indices if usage is - * DIB_PAL_COLORS. - * Should not be called for a >8-bit deep bitmap. - */ -static RGBQUAD *X11DRV_DIB_BuildColorTable( X11DRV_PDEVICE *physDev, WORD coloruse, WORD depth, - const BITMAPINFO *info ) -{ - RGBQUAD *colorTable; - unsigned int colors; - int i; - BOOL core_info = info->bmiHeader.biSize == sizeof(BITMAPCOREHEADER); - - if (core_info) - { - colors = 1 << ((const BITMAPCOREINFO*) info)->bmciHeader.bcBitCount; - } - else - { - colors = info->bmiHeader.biClrUsed; - if (!colors) colors = 1 << info->bmiHeader.biBitCount; - } - - if (colors > 256) { - ERR("called with >256 colors!\n"); - return NULL; - } - - if (!(colorTable = HeapAlloc(GetProcessHeap(), 0, colors * sizeof(RGBQUAD) ))) - return NULL; - - if(coloruse == DIB_RGB_COLORS) - { - if (core_info) - { - /* Convert RGBTRIPLEs to RGBQUADs */ - for (i=0; i < colors; i++) - { - colorTable[i].rgbRed = ((const BITMAPCOREINFO*) info)->bmciColors[i].rgbtRed; - colorTable[i].rgbGreen = ((const BITMAPCOREINFO*) info)->bmciColors[i].rgbtGreen; - colorTable[i].rgbBlue = ((const BITMAPCOREINFO*) info)->bmciColors[i].rgbtBlue; - colorTable[i].rgbReserved = 0; - } - } - else - { - memcpy(colorTable, (const BYTE*) info + (WORD) info->bmiHeader.biSize, colors * sizeof(RGBQUAD)); - } - } - else - { - HPALETTE hpal = GetCurrentObject(physDev->hdc, OBJ_PAL); - PALETTEENTRY * pal_ents; - const WORD *index = (const WORD*) ((const BYTE*) info + (WORD) info->bmiHeader.biSize); - int logcolors, entry; - - logcolors = GetPaletteEntries( hpal, 0, 0, NULL ); - pal_ents = HeapAlloc(GetProcessHeap(), 0, logcolors * sizeof(*pal_ents)); - logcolors = GetPaletteEntries( hpal, 0, logcolors, pal_ents ); - - for(i = 0; i < colors; i++, index++) - { - entry = *index % logcolors; - colorTable[i].rgbRed = pal_ents[entry].peRed; - colorTable[i].rgbGreen = pal_ents[entry].peGreen; - colorTable[i].rgbBlue = pal_ents[entry].peBlue; - colorTable[i].rgbReserved = 0; - } - - HeapFree(GetProcessHeap(), 0, pal_ents); - } - return colorTable; -} - - /*********************************************************************** * X11DRV_DIB_MapColor */ @@ -4663,7 +4585,6 @@ HBITMAP X11DRV_CreateDIBSection( X11DRV_PDEVICE *physDev, HBITMAP hbitmap, /* create color map */ if (dib.dsBm.bmBitsPixel <= 8) { - physBitmap->colorTable = X11DRV_DIB_BuildColorTable( physDev, usage, dib.dsBm.bmBitsPixel, bmi ); physBitmap->colorMap = X11DRV_DIB_BuildColorMap( physDev, usage, dib.dsBm.bmBitsPixel, bmi, &physBitmap->nColorMap ); @@ -4742,7 +4663,6 @@ void X11DRV_DIB_DeleteDIBSection(X_PHYSBITMAP *physBitmap, DIBSECTION *dib) } HeapFree(GetProcessHeap(), 0, physBitmap->colorMap); - HeapFree(GetProcessHeap(), 0, physBitmap->colorTable); DeleteCriticalSection(&physBitmap->lock); } @@ -4771,7 +4691,6 @@ UINT X11DRV_SetDIBColorTable( X11DRV_PDEVICE *physDev, UINT start, UINT count, c * at least for a 1 bpp dibsection */ X11DRV_DIB_Lock( physBitmap, DIB_Status_AppMod, FALSE ); - memcpy(physBitmap->colorTable + start, colors, (end - start) * sizeof(RGBQUAD)); X11DRV_DIB_GenColorMap( physDev, physBitmap->colorMap, DIB_RGB_COLORS, dib.dsBm.bmBitsPixel, TRUE, colors, start, end ); @@ -4781,23 +4700,6 @@ UINT X11DRV_SetDIBColorTable( X11DRV_PDEVICE *physDev, UINT start, UINT count, c return ret; } -/*********************************************************************** - * GetDIBColorTable (X11DRV.@) - */ -UINT X11DRV_GetDIBColorTable( X11DRV_PDEVICE *physDev, UINT start, UINT count, RGBQUAD *colors ) -{ - UINT ret = 0; - X_PHYSBITMAP *physBitmap = physDev->bitmap; - - if (physBitmap && physBitmap->colorTable && start < physBitmap->nColorMap) { - if (start + count > physBitmap->nColorMap) count = physBitmap->nColorMap - start; - memcpy(colors, physBitmap->colorTable + start, count * sizeof(RGBQUAD)); - ret = count; - } - return ret; -} - - /*********************************************************************** * X11DRV_DIB_CreateDIBFromBitmap diff --git a/dlls/winex11.drv/palette.c b/dlls/winex11.drv/palette.c index 3db9e2ef822..f7ec7adec91 100644 --- a/dlls/winex11.drv/palette.c +++ b/dlls/winex11.drv/palette.c @@ -843,7 +843,7 @@ int X11DRV_PALETTE_ToPhysical( X11DRV_PDEVICE *physDev, COLORREF color ) switch(spec_type) { case 0x10: /* DIBINDEX */ - if( X11DRV_GetDIBColorTable( physDev, idx, 1, &quad ) != 1 ) { + if( GetDIBColorTable( physDev->hdc, idx, 1, &quad ) != 1 ) { WARN("DIBINDEX(%x) : idx %d is out of bounds, assuming black\n", color , idx); GDI_ReleaseObj( hPal ); return 0; @@ -877,12 +877,12 @@ int X11DRV_PALETTE_ToPhysical( X11DRV_PDEVICE *physDev, COLORREF color ) if (physDev && (physDev->depth == 1) ) { int white = 1; + RGBQUAD table[2]; GDI_ReleaseObj( hPal ); - if (physDev->bitmap && physDev->bitmap->colorTable) + if (GetDIBColorTable( physDev->hdc, 0, 2, table ) == 2) { - if(!colour_is_brighter(physDev->bitmap->colorTable[1], physDev->bitmap->colorTable[0])) - white = 0; + if(!colour_is_brighter(table[1], table[0])) white = 0; } return (((color >> 16) & 0xff) + ((color >> 8) & 0xff) + (color & 0xff) > 255*3/2) ? white : 1 - white; @@ -937,11 +937,12 @@ int X11DRV_PALETTE_ToPhysical( X11DRV_PDEVICE *physDev, COLORREF color ) if (physDev && (physDev->depth == 1) ) { int white = 1; + RGBQUAD table[2]; GDI_ReleaseObj( hPal ); - if (physDev->bitmap && physDev->bitmap->colorTable) + if (GetDIBColorTable( physDev->hdc, 0, 2, table ) == 2) { - if(!colour_is_brighter(physDev->bitmap->colorTable[1], physDev->bitmap->colorTable[0])) + if(!colour_is_brighter(table[1], table[0])) white = 0; } return (((color >> 16) & 0xff) + diff --git a/dlls/winex11.drv/winex11.drv.spec b/dlls/winex11.drv/winex11.drv.spec index 7d6214e9799..e6dc14195a3 100644 --- a/dlls/winex11.drv/winex11.drv.spec +++ b/dlls/winex11.drv/winex11.drv.spec @@ -19,7 +19,6 @@ @ cdecl GetBitmapBits(long ptr long) X11DRV_GetBitmapBits @ cdecl GetCharWidth(ptr long long ptr) X11DRV_GetCharWidth @ cdecl GetDCOrgEx(ptr ptr) X11DRV_GetDCOrgEx -@ cdecl GetDIBColorTable(ptr long long ptr) X11DRV_GetDIBColorTable @ cdecl GetDIBits(ptr long long long ptr ptr long) X11DRV_GetDIBits @ cdecl GetDeviceCaps(ptr long) X11DRV_GetDeviceCaps @ cdecl GetDeviceGammaRamp(ptr ptr) X11DRV_GetDeviceGammaRamp diff --git a/dlls/winex11.drv/x11drv.h b/dlls/winex11.drv/x11drv.h index 97eaefab1dc..087f7e1f8c8 100644 --- a/dlls/winex11.drv/x11drv.h +++ b/dlls/winex11.drv/x11drv.h @@ -103,7 +103,6 @@ typedef struct XImage *image; /* cached XImage */ int *colorMap; /* color map info */ int nColorMap; - RGBQUAD *colorTable; /* original dib color table converted to rgb values if usage was DIB_PAL_COLORS */ CRITICAL_SECTION lock; /* GDI access lock */ #ifdef HAVE_LIBXXSHM XShmSegmentInfo shminfo; /* shared memory segment info */ @@ -422,7 +421,6 @@ extern INT X11DRV_LockDIBSection(X11DRV_PDEVICE *physDev,INT,BOOL); extern void X11DRV_UnlockDIBSection(X11DRV_PDEVICE *physDev,BOOL); extern void X11DRV_DIB_DeleteDIBSection(X_PHYSBITMAP *physBitmap, DIBSECTION *dib); -extern UINT X11DRV_GetDIBColorTable( X11DRV_PDEVICE *physDev, UINT start, UINT count, RGBQUAD *colors ); extern void X11DRV_DIB_CopyDIBSection(X11DRV_PDEVICE *physDevSrc, X11DRV_PDEVICE *physDevDst, DWORD xSrc, DWORD ySrc, DWORD xDest, DWORD yDest, DWORD width, DWORD height);