winex11.drv: Avoid some direct accesses to the PALETTEOBJ structure.
This commit is contained in:
parent
ed4f22ab5f
commit
385ceeb8bc
|
@ -855,8 +855,9 @@ int X11DRV_PALETTE_ToPhysical( X11DRV_PDEVICE *physDev, COLORREF color )
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 1: /* PALETTEINDEX */
|
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);
|
WARN("PALETTEINDEX(%x) : idx %d is out of bounds, assuming black\n", color, idx);
|
||||||
GDI_ReleaseObj( hPal );
|
GDI_ReleaseObj( hPal );
|
||||||
|
@ -869,8 +870,9 @@ int X11DRV_PALETTE_ToPhysical( X11DRV_PDEVICE *physDev, COLORREF color )
|
||||||
GDI_ReleaseObj( hPal );
|
GDI_ReleaseObj( hPal );
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
color = *(COLORREF*)(palPtr->logpalette.palPalEntry + idx);
|
color = RGB( entry.peRed, entry.peGreen, entry.peBlue );
|
||||||
break;
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
default:
|
default:
|
||||||
color &= 0xffffff;
|
color &= 0xffffff;
|
||||||
|
@ -1048,10 +1050,9 @@ static BOOL X11DRV_PALETTE_CheckSysColor( const PALETTEENTRY *sys_pal_template,
|
||||||
/***********************************************************************
|
/***********************************************************************
|
||||||
* X11DRV_LookupSysPaletteExact
|
* X11DRV_LookupSysPaletteExact
|
||||||
*/
|
*/
|
||||||
static int X11DRV_LookupSysPaletteExact( COLORREF col )
|
static int X11DRV_LookupSysPaletteExact( BYTE r, BYTE g, BYTE b )
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
BYTE r = GetRValue(col), g = GetGValue(col), b = GetBValue(col);
|
|
||||||
for( i = 0; i < palette_size; i++ )
|
for( i = 0; i < palette_size; i++ )
|
||||||
{
|
{
|
||||||
if( COLOR_sysPal[i].peFlags & PC_SYS_USED ) /* skips gap */
|
if( COLOR_sysPal[i].peFlags & PC_SYS_USED ) /* skips gap */
|
||||||
|
@ -1070,13 +1071,17 @@ static int X11DRV_LookupSysPaletteExact( COLORREF col )
|
||||||
* Set the color-mapping table for selected palette.
|
* Set the color-mapping table for selected palette.
|
||||||
* Return number of entries which mapping has changed.
|
* 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;
|
char flag;
|
||||||
int prevMapping = (palPtr->mapping) ? 1 : 0;
|
int prevMapping = (palPtr->mapping) ? 1 : 0;
|
||||||
int index;
|
int index;
|
||||||
UINT iRemapped = 0;
|
UINT i, iRemapped = 0;
|
||||||
int* mapping;
|
int* mapping;
|
||||||
|
PALETTEENTRY entries[256];
|
||||||
|
WORD num_entries;
|
||||||
|
|
||||||
|
if (!GetObjectW( hpal, sizeof(num_entries), &num_entries )) return 0;
|
||||||
|
|
||||||
/* reset dynamic system palette entries */
|
/* reset dynamic system palette entries */
|
||||||
|
|
||||||
|
@ -1085,11 +1090,9 @@ static UINT X11DRV_PALETTE_SetMapping( PALETTEOBJ* palPtr, UINT uStart, UINT uNu
|
||||||
|
|
||||||
/* initialize palette mapping table */
|
/* initialize palette mapping table */
|
||||||
if (palPtr->mapping)
|
if (palPtr->mapping)
|
||||||
mapping = HeapReAlloc( GetProcessHeap(), 0, palPtr->mapping,
|
mapping = HeapReAlloc( GetProcessHeap(), 0, palPtr->mapping, sizeof(int)*num_entries);
|
||||||
sizeof(int)*palPtr->logpalette.palNumEntries);
|
|
||||||
else
|
else
|
||||||
mapping = HeapAlloc( GetProcessHeap(), 0,
|
mapping = HeapAlloc( GetProcessHeap(), 0, sizeof(int)*num_entries);
|
||||||
sizeof(int)*palPtr->logpalette.palNumEntries);
|
|
||||||
|
|
||||||
if(mapping == NULL) {
|
if(mapping == NULL) {
|
||||||
ERR("Unable to allocate new mapping -- memory exhausted!\n");
|
ERR("Unable to allocate new mapping -- memory exhausted!\n");
|
||||||
|
@ -1097,12 +1100,14 @@ static UINT X11DRV_PALETTE_SetMapping( PALETTEOBJ* palPtr, UINT uStart, UINT uNu
|
||||||
}
|
}
|
||||||
palPtr->mapping = mapping;
|
palPtr->mapping = mapping;
|
||||||
|
|
||||||
if (uStart >= palPtr->logpalette.palNumEntries) return 0;
|
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;
|
||||||
|
|
||||||
if (uStart + uNum > palPtr->logpalette.palNumEntries)
|
for (i = 0; i < num_entries; i++)
|
||||||
uNum = palPtr->logpalette.palNumEntries - uStart;
|
|
||||||
|
|
||||||
for( uNum += uStart; uStart < uNum; uStart++ )
|
|
||||||
{
|
{
|
||||||
index = -1;
|
index = -1;
|
||||||
flag = PC_SYS_USED;
|
flag = PC_SYS_USED;
|
||||||
|
@ -1110,9 +1115,9 @@ static UINT X11DRV_PALETTE_SetMapping( PALETTEOBJ* palPtr, UINT uStart, UINT uNu
|
||||||
/* Even though the docs say that only one flag is to be set,
|
/* 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
|
* they are a bitmask. At least one app sets more than one at
|
||||||
* the same time. */
|
* the same time. */
|
||||||
if ( palPtr->logpalette.palPalEntry[uStart].peFlags & PC_EXPLICIT ) {
|
if ( entries[i].peFlags & PC_EXPLICIT ) {
|
||||||
/* palette entries are indices into system palette */
|
/* 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) )
|
if( index > 255 || (index >= COLOR_gapStart && index <= COLOR_gapEnd) )
|
||||||
{
|
{
|
||||||
WARN("PC_EXPLICIT: idx %d out of system palette, assuming black.\n", index);
|
WARN("PC_EXPLICIT: idx %d out of system palette, assuming black.\n", index);
|
||||||
|
@ -1120,14 +1125,14 @@ static UINT X11DRV_PALETTE_SetMapping( PALETTEOBJ* palPtr, UINT uStart, UINT uNu
|
||||||
}
|
}
|
||||||
if( X11DRV_PALETTE_PaletteToXPixel ) index = X11DRV_PALETTE_PaletteToXPixel[index];
|
if( X11DRV_PALETTE_PaletteToXPixel ) index = X11DRV_PALETTE_PaletteToXPixel[index];
|
||||||
} else {
|
} else {
|
||||||
if ( palPtr->logpalette.palPalEntry[uStart].peFlags & PC_RESERVED ) {
|
if ( entries[i].peFlags & PC_RESERVED ) {
|
||||||
/* forbid future mappings to this entry */
|
/* forbid future mappings to this entry */
|
||||||
flag |= PC_SYS_RESERVED;
|
flag |= PC_SYS_RESERVED;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (! (palPtr->logpalette.palPalEntry[uStart].peFlags & PC_NOCOLLAPSE) ) {
|
if (! (entries[i].peFlags & PC_NOCOLLAPSE) ) {
|
||||||
/* try to collapse identical colors */
|
/* 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 )
|
if( index < 0 )
|
||||||
|
@ -1139,15 +1144,15 @@ static UINT X11DRV_PALETTE_SetMapping( PALETTEOBJ* palPtr, UINT uStart, UINT uNu
|
||||||
X11DRV_PALETTE_firstFree = X11DRV_PALETTE_freeList[index];
|
X11DRV_PALETTE_firstFree = X11DRV_PALETTE_freeList[index];
|
||||||
|
|
||||||
color.pixel = (X11DRV_PALETTE_PaletteToXPixel) ? X11DRV_PALETTE_PaletteToXPixel[index] : index;
|
color.pixel = (X11DRV_PALETTE_PaletteToXPixel) ? X11DRV_PALETTE_PaletteToXPixel[index] : index;
|
||||||
color.red = palPtr->logpalette.palPalEntry[uStart].peRed << 8;
|
color.red = entries[i].peRed << 8;
|
||||||
color.green = palPtr->logpalette.palPalEntry[uStart].peGreen << 8;
|
color.green = entries[i].peGreen << 8;
|
||||||
color.blue = palPtr->logpalette.palPalEntry[uStart].peBlue << 8;
|
color.blue = entries[i].peBlue << 8;
|
||||||
color.flags = DoRed | DoGreen | DoBlue;
|
color.flags = DoRed | DoGreen | DoBlue;
|
||||||
wine_tsx11_lock();
|
wine_tsx11_lock();
|
||||||
XStoreColor(gdi_display, X11DRV_PALETTE_PaletteXColormap, &color);
|
XStoreColor(gdi_display, X11DRV_PALETTE_PaletteXColormap, &color);
|
||||||
wine_tsx11_unlock();
|
wine_tsx11_unlock();
|
||||||
|
|
||||||
COLOR_sysPal[index] = palPtr->logpalette.palPalEntry[uStart];
|
COLOR_sysPal[index] = entries[i];
|
||||||
COLOR_sysPal[index].peFlags = flag;
|
COLOR_sysPal[index].peFlags = flag;
|
||||||
X11DRV_PALETTE_freeList[index] = 0;
|
X11DRV_PALETTE_freeList[index] = 0;
|
||||||
|
|
||||||
|
@ -1155,23 +1160,23 @@ static UINT X11DRV_PALETTE_SetMapping( PALETTEOBJ* palPtr, UINT uStart, UINT uNu
|
||||||
}
|
}
|
||||||
else if ( X11DRV_PALETTE_PaletteFlags & X11DRV_PALETTE_VIRTUAL )
|
else if ( X11DRV_PALETTE_PaletteFlags & X11DRV_PALETTE_VIRTUAL )
|
||||||
{
|
{
|
||||||
index = X11DRV_PALETTE_ToPhysical( NULL, 0x00ffffff &
|
index = X11DRV_PALETTE_ToPhysical( NULL,
|
||||||
*(COLORREF*)(palPtr->logpalette.palPalEntry + uStart));
|
RGB( entries[i].peRed, entries[i].peGreen, entries[i].peBlue ));
|
||||||
}
|
}
|
||||||
|
|
||||||
/* we have to map to existing entry in the system palette */
|
/* 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( X11DRV_PALETTE_PaletteToXPixel ) index = X11DRV_PALETTE_PaletteToXPixel[index];
|
||||||
}
|
}
|
||||||
|
|
||||||
if( !prevMapping || palPtr->mapping[uStart] != index ) iRemapped++;
|
if( !prevMapping || palPtr->mapping[i] != index ) iRemapped++;
|
||||||
palPtr->mapping[uStart] = index;
|
palPtr->mapping[i] = index;
|
||||||
|
|
||||||
TRACE("entry %i (%x) -> pixel %i\n", uStart,
|
TRACE("entry %i (%x) -> pixel %i\n", i, *(COLORREF*)&entries[i], index);
|
||||||
*(COLORREF*)(palPtr->logpalette.palPalEntry + uStart), index);
|
|
||||||
|
|
||||||
}
|
}
|
||||||
return iRemapped;
|
return iRemapped;
|
||||||
|
@ -1252,7 +1257,7 @@ UINT X11DRV_RealizePalette( X11DRV_PDEVICE *physDev, HPALETTE hpal, BOOL primary
|
||||||
if (X11DRV_PALETTE_PaletteFlags & X11DRV_PALETTE_VIRTUAL) return 0;
|
if (X11DRV_PALETTE_PaletteFlags & X11DRV_PALETTE_VIRTUAL) return 0;
|
||||||
|
|
||||||
if (!(palPtr = GDI_GetObjPtr( hpal, PALETTE_MAGIC ))) 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 );
|
GDI_ReleaseObj( hpal );
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
@ -1272,10 +1277,14 @@ UINT X11DRV_RealizeDefaultPalette( X11DRV_PDEVICE *physDev )
|
||||||
{
|
{
|
||||||
/* lookup is needed to account for SetSystemPaletteUse() stuff */
|
/* lookup is needed to account for SetSystemPaletteUse() stuff */
|
||||||
int i, index;
|
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() */
|
/* mapping is allocated in COLOR_InitPalette() */
|
||||||
if( index != palPtr->mapping[i] )
|
if( index != palPtr->mapping[i] )
|
||||||
{
|
{
|
||||||
|
|
Loading…
Reference in New Issue