Alexandre Julliard : winex11.drv:
Avoid some direct accesses to the PALETTEOBJ structure.
Alexandre Julliard
julliard at wine.codeweavers.com
Fri Nov 17 11:48:56 CST 2006
Module: wine
Branch: master
Commit: 385ceeb8bcb0250ac04b586440c7577b840c2a2b
URL: http://source.winehq.org/git/wine.git/?a=commit;h=385ceeb8bcb0250ac04b586440c7577b840c2a2b
Author: Alexandre Julliard <julliard at winehq.org>
Date: Fri Nov 17 13:47:39 2006 +0100
winex11.drv: Avoid some direct accesses to the PALETTEOBJ structure.
---
dlls/winex11.drv/palette.c | 79 ++++++++++++++++++++++++-------------------
1 files changed, 44 insertions(+), 35 deletions(-)
diff --git a/dlls/winex11.drv/palette.c b/dlls/winex11.drv/palette.c
index 1bf3ec8..519dfe9 100644
--- a/dlls/winex11.drv/palette.c
+++ b/dlls/winex11.drv/palette.c
@@ -855,8 +855,9 @@ int X11DRV_PALETTE_ToPhysical( X11DRV_PD
break;
case 1: /* PALETTEINDEX */
-
- if( idx >= palPtr->logpalette.palNumEntries)
+ {
+ PALETTEENTRY entry;
+ if (!GetPaletteEntries( hPal, idx, 1, &entry ))
{
WARN("PALETTEINDEX(%x) : idx %d is out of bounds, assuming black\n", color, idx);
GDI_ReleaseObj( hPal );
@@ -869,8 +870,9 @@ int X11DRV_PALETTE_ToPhysical( X11DRV_PD
GDI_ReleaseObj( hPal );
return ret;
}
- color = *(COLORREF*)(palPtr->logpalette.palPalEntry + idx);
+ color = RGB( entry.peRed, entry.peGreen, entry.peBlue );
break;
+ }
default:
color &= 0xffffff;
@@ -1048,10 +1050,9 @@ static BOOL X11DRV_PALETTE_CheckSysColor
/***********************************************************************
* X11DRV_LookupSysPaletteExact
*/
-static int X11DRV_LookupSysPaletteExact( COLORREF col )
+static int X11DRV_LookupSysPaletteExact( BYTE r, BYTE g, BYTE b )
{
int i;
- BYTE r = GetRValue(col), g = GetGValue(col), b = GetBValue(col);
for( i = 0; i < palette_size; i++ )
{
if( COLOR_sysPal[i].peFlags & PC_SYS_USED ) /* skips gap */
@@ -1070,13 +1071,17 @@ static int X11DRV_LookupSysPaletteExact(
* Set the color-mapping table for selected palette.
* Return number of entries which mapping has changed.
*/
-static UINT X11DRV_PALETTE_SetMapping( PALETTEOBJ* palPtr, UINT uStart, UINT uNum, BOOL mapOnly )
+static UINT X11DRV_PALETTE_SetMapping( HPALETTE hpal, PALETTEOBJ* palPtr, BOOL mapOnly )
{
char flag;
int prevMapping = (palPtr->mapping) ? 1 : 0;
int index;
- UINT iRemapped = 0;
+ UINT i, iRemapped = 0;
int* mapping;
+ PALETTEENTRY entries[256];
+ WORD num_entries;
+
+ if (!GetObjectW( hpal, sizeof(num_entries), &num_entries )) return 0;
/* reset dynamic system palette entries */
@@ -1085,11 +1090,9 @@ static UINT X11DRV_PALETTE_SetMapping( P
/* initialize palette mapping table */
if (palPtr->mapping)
- mapping = HeapReAlloc( GetProcessHeap(), 0, palPtr->mapping,
- sizeof(int)*palPtr->logpalette.palNumEntries);
+ mapping = HeapReAlloc( GetProcessHeap(), 0, palPtr->mapping, sizeof(int)*num_entries);
else
- mapping = HeapAlloc( GetProcessHeap(), 0,
- sizeof(int)*palPtr->logpalette.palNumEntries);
+ mapping = HeapAlloc( GetProcessHeap(), 0, sizeof(int)*num_entries);
if(mapping == NULL) {
ERR("Unable to allocate new mapping -- memory exhausted!\n");
@@ -1097,12 +1100,14 @@ static UINT X11DRV_PALETTE_SetMapping( P
}
palPtr->mapping = mapping;
- if (uStart >= palPtr->logpalette.palNumEntries) return 0;
-
- if (uStart + uNum > palPtr->logpalette.palNumEntries)
- uNum = palPtr->logpalette.palNumEntries - uStart;
+ if (num_entries > 256)
+ {
+ FIXME( "more than 256 entries not supported\n" );
+ num_entries = 256;
+ }
+ if (!(num_entries = GetPaletteEntries( hpal, 0, num_entries, entries ))) return 0;
- for( uNum += uStart; uStart < uNum; uStart++ )
+ for (i = 0; i < num_entries; i++)
{
index = -1;
flag = PC_SYS_USED;
@@ -1110,9 +1115,9 @@ static UINT X11DRV_PALETTE_SetMapping( P
/* Even though the docs say that only one flag is to be set,
* they are a bitmask. At least one app sets more than one at
* the same time. */
- if ( palPtr->logpalette.palPalEntry[uStart].peFlags & PC_EXPLICIT ) {
+ if ( entries[i].peFlags & PC_EXPLICIT ) {
/* palette entries are indices into system palette */
- index = *(WORD*)(palPtr->logpalette.palPalEntry + uStart);
+ index = *(WORD*)&entries[i];
if( index > 255 || (index >= COLOR_gapStart && index <= COLOR_gapEnd) )
{
WARN("PC_EXPLICIT: idx %d out of system palette, assuming black.\n", index);
@@ -1120,14 +1125,14 @@ static UINT X11DRV_PALETTE_SetMapping( P
}
if( X11DRV_PALETTE_PaletteToXPixel ) index = X11DRV_PALETTE_PaletteToXPixel[index];
} else {
- if ( palPtr->logpalette.palPalEntry[uStart].peFlags & PC_RESERVED ) {
+ if ( entries[i].peFlags & PC_RESERVED ) {
/* forbid future mappings to this entry */
flag |= PC_SYS_RESERVED;
}
- if (! (palPtr->logpalette.palPalEntry[uStart].peFlags & PC_NOCOLLAPSE) ) {
+ if (! (entries[i].peFlags & PC_NOCOLLAPSE) ) {
/* try to collapse identical colors */
- index = X11DRV_LookupSysPaletteExact(*(COLORREF*)(palPtr->logpalette.palPalEntry + uStart));
+ index = X11DRV_LookupSysPaletteExact( entries[i].peRed, entries[i].peGreen, entries[i].peBlue );
}
if( index < 0 )
@@ -1139,15 +1144,15 @@ static UINT X11DRV_PALETTE_SetMapping( P
X11DRV_PALETTE_firstFree = X11DRV_PALETTE_freeList[index];
color.pixel = (X11DRV_PALETTE_PaletteToXPixel) ? X11DRV_PALETTE_PaletteToXPixel[index] : index;
- color.red = palPtr->logpalette.palPalEntry[uStart].peRed << 8;
- color.green = palPtr->logpalette.palPalEntry[uStart].peGreen << 8;
- color.blue = palPtr->logpalette.palPalEntry[uStart].peBlue << 8;
+ color.red = entries[i].peRed << 8;
+ color.green = entries[i].peGreen << 8;
+ color.blue = entries[i].peBlue << 8;
color.flags = DoRed | DoGreen | DoBlue;
wine_tsx11_lock();
XStoreColor(gdi_display, X11DRV_PALETTE_PaletteXColormap, &color);
wine_tsx11_unlock();
- COLOR_sysPal[index] = palPtr->logpalette.palPalEntry[uStart];
+ COLOR_sysPal[index] = entries[i];
COLOR_sysPal[index].peFlags = flag;
X11DRV_PALETTE_freeList[index] = 0;
@@ -1155,23 +1160,23 @@ static UINT X11DRV_PALETTE_SetMapping( P
}
else if ( X11DRV_PALETTE_PaletteFlags & X11DRV_PALETTE_VIRTUAL )
{
- index = X11DRV_PALETTE_ToPhysical( NULL, 0x00ffffff &
- *(COLORREF*)(palPtr->logpalette.palPalEntry + uStart));
+ index = X11DRV_PALETTE_ToPhysical( NULL,
+ RGB( entries[i].peRed, entries[i].peGreen, entries[i].peBlue ));
}
/* we have to map to existing entry in the system palette */
- index = X11DRV_SysPaletteLookupPixel( *(COLORREF*)(palPtr->logpalette.palPalEntry + uStart), TRUE);
+ index = X11DRV_SysPaletteLookupPixel( RGB( entries[i].peRed, entries[i].peGreen, entries[i].peBlue ),
+ TRUE );
}
if( X11DRV_PALETTE_PaletteToXPixel ) index = X11DRV_PALETTE_PaletteToXPixel[index];
}
- if( !prevMapping || palPtr->mapping[uStart] != index ) iRemapped++;
- palPtr->mapping[uStart] = index;
+ if( !prevMapping || palPtr->mapping[i] != index ) iRemapped++;
+ palPtr->mapping[i] = index;
- TRACE("entry %i (%x) -> pixel %i\n", uStart,
- *(COLORREF*)(palPtr->logpalette.palPalEntry + uStart), index);
+ TRACE("entry %i (%x) -> pixel %i\n", i, *(COLORREF*)&entries[i], index);
}
return iRemapped;
@@ -1252,7 +1257,7 @@ UINT X11DRV_RealizePalette( X11DRV_PDEVI
if (X11DRV_PALETTE_PaletteFlags & X11DRV_PALETTE_VIRTUAL) return 0;
if (!(palPtr = GDI_GetObjPtr( hpal, PALETTE_MAGIC ))) return 0;
- ret = X11DRV_PALETTE_SetMapping( palPtr, 0, palPtr->logpalette.palNumEntries, !primary );
+ ret = X11DRV_PALETTE_SetMapping( hpal, palPtr, !primary );
GDI_ReleaseObj( hpal );
return ret;
}
@@ -1272,10 +1277,14 @@ UINT X11DRV_RealizeDefaultPalette( X11DR
{
/* lookup is needed to account for SetSystemPaletteUse() stuff */
int i, index;
+ PALETTEENTRY entries[NB_RESERVED_COLORS];
- for( i = 0; i < 20; i++ )
+ GetPaletteEntries( GetStockObject(DEFAULT_PALETTE), 0, NB_RESERVED_COLORS, entries );
+ for( i = 0; i < NB_RESERVED_COLORS; i++ )
{
- index = X11DRV_PALETTE_LookupSystemXPixel(*(COLORREF*)(palPtr->logpalette.palPalEntry + i));
+ index = X11DRV_PALETTE_LookupSystemXPixel( RGB(entries[i].peRed,
+ entries[i].peGreen,
+ entries[i].peBlue) );
/* mapping is allocated in COLOR_InitPalette() */
if( index != palPtr->mapping[i] )
{
More information about the wine-cvs
mailing list