4 * Copyright 1993,1994 Alexandre Julliard
7 static char Copyright
[] = "Copyright Alexandre Julliard, 1993,1994";
15 #define MAXINT INT_MAX
21 /* #define DEBUG_PALETTE */
22 /* #undef DEBUG_PALETTE */
25 extern void COLOR_SetMapping( DC
*dc
, HANDLE map
, WORD size
); /* color.c */
27 extern Colormap COLOR_WinColormap
;
30 /***********************************************************************
31 * CreatePalette (GDI.360)
33 HPALETTE
CreatePalette( LOGPALETTE
* palette
)
35 PALETTEOBJ
* palettePtr
;
39 size
= sizeof(LOGPALETTE
) + (palette
->palNumEntries
- 1) * sizeof(PALETTEENTRY
);
40 hpalette
= GDI_AllocObject( sizeof(GDIOBJHDR
) + size
, PALETTE_MAGIC
);
41 if (!hpalette
) return 0;
42 palettePtr
= (PALETTEOBJ
*) GDI_HEAP_ADDR( hpalette
);
43 memcpy( &palettePtr
->logpalette
, palette
, size
);
48 /***********************************************************************
49 * GetPaletteEntries (GDI.363)
51 WORD
GetPaletteEntries( HPALETTE hpalette
, WORD start
, WORD count
,
52 LPPALETTEENTRY entries
)
57 palPtr
= (PALETTEOBJ
*) GDI_GetObjPtr( hpalette
, PALETTE_MAGIC
);
58 if (!palPtr
) return 0;
59 numEntries
= palPtr
->logpalette
.palNumEntries
;
60 if (start
>= numEntries
) return 0;
61 if (start
+count
> numEntries
) count
= numEntries
- start
;
62 memcpy( entries
, &palPtr
->logpalette
.palPalEntry
[start
],
63 count
* sizeof(PALETTEENTRY
) );
68 /***********************************************************************
69 * SetPaletteEntries (GDI.364)
71 WORD
SetPaletteEntries( HPALETTE hpalette
, WORD start
, WORD count
,
72 LPPALETTEENTRY entries
)
77 palPtr
= (PALETTEOBJ
*) GDI_GetObjPtr( hpalette
, PALETTE_MAGIC
);
78 if (!palPtr
) return 0;
79 numEntries
= palPtr
->logpalette
.palNumEntries
;
80 if (start
>= numEntries
) return 0;
81 if (start
+count
> numEntries
) count
= numEntries
- start
;
82 memcpy( &palPtr
->logpalette
.palPalEntry
[start
], entries
,
83 count
* sizeof(PALETTEENTRY
) );
88 /***********************************************************************
89 * GetSystemPaletteEntries (GDI.375)
91 WORD
GetSystemPaletteEntries( HDC hdc
, WORD start
, WORD count
,
92 LPPALETTEENTRY entries
)
98 if (!(dc
= (DC
*) GDI_GetObjPtr( hdc
, DC_MAGIC
))) return 0;
99 if (start
>= dc
->w
.devCaps
->sizePalette
) return 0;
100 if (start
+count
>= dc
->w
.devCaps
->sizePalette
)
101 count
= dc
->w
.devCaps
->sizePalette
- start
;
102 for (i
= 0; i
< count
; i
++)
104 color
.pixel
= start
+ i
;
105 XQueryColor( display
, COLOR_WinColormap
, &color
);
106 entries
[i
].peRed
= color
.red
>> 8;
107 entries
[i
].peGreen
= color
.green
>> 8;
108 entries
[i
].peBlue
= color
.blue
>> 8;
109 entries
[i
].peFlags
= 0;
115 /***********************************************************************
116 * GetNearestPaletteIndex (GDI.370)
118 WORD
GetNearestPaletteIndex( HPALETTE hpalette
, COLORREF color
)
120 int i
, minDist
, dist
;
123 PALETTEENTRY
* entry
;
126 palPtr
= (PALETTEOBJ
*) GDI_GetObjPtr( hpalette
, PALETTE_MAGIC
);
127 if (!palPtr
) return 0;
129 if ((COLOR_WinColormap
!= DefaultColormapOfScreen(screen
)) &&
130 (hpalette
== STOCK_DEFAULT_PALETTE
))
132 if ((color
& 0xffffff) == 0) return 0; /* Entry 0 is black */
133 if ((color
& 0xffffff) == 0xffffff) /* Max entry is white */
134 return palPtr
->logpalette
.palNumEntries
- 1;
137 r
= GetRValue(color
);
138 g
= GetGValue(color
);
139 b
= GetBValue(color
);
141 entry
= palPtr
->logpalette
.palPalEntry
;
142 for (i
= 0, minDist
= MAXINT
; minDist
!=0 &&
143 i
< palPtr
->logpalette
.palNumEntries
; i
++)
145 if (entry
->peFlags
!= 0xff)
147 dist
= (r
- entry
->peRed
) * (r
- entry
->peRed
) +
148 (g
- entry
->peGreen
) * (g
- entry
->peGreen
) +
149 (b
- entry
->peBlue
) * (b
- entry
->peBlue
);
158 dprintf_palette(stddeb
,"GetNearestPaletteIndex(%x,%06lx): returning %d\n",
159 hpalette
, color
, index
);
164 /***********************************************************************
167 int PALETTE_GetObject( PALETTEOBJ
* palette
, int count
, LPSTR buffer
)
169 if (count
> sizeof(WORD
)) count
= sizeof(WORD
);
170 memcpy( buffer
, &palette
->logpalette
.palNumEntries
, count
);
175 /***********************************************************************
176 * GDISelectPalette (GDI.361)
178 HPALETTE
GDISelectPalette( HDC hdc
, HPALETTE hpal
)
183 dprintf_palette(stddeb
, "GDISelectPalette: %d %d\n", hdc
, hpal
);
184 if (!(dc
= (DC
*) GDI_GetObjPtr( hdc
, DC_MAGIC
))) return 0;
185 prev
= dc
->w
.hPalette
;
186 dc
->w
.hPalette
= hpal
;
187 if (hpal
!= STOCK_DEFAULT_PALETTE
) COLOR_SetMapping( dc
, 0, 0 );
188 else RealizeDefaultPalette( hdc
); /* Always realize default palette */
193 /***********************************************************************
194 * GDIRealizePalette (GDI.362)
196 UINT
GDIRealizePalette( HDC hdc
)
198 dprintf_palette(stdnimp
, "GDIRealizePalette: %d\n", hdc
);
203 /***********************************************************************
204 * SelectPalette (USER.282)
206 HPALETTE
SelectPalette(HDC hDC
, HPALETTE hPal
, BOOL bForceBackground
)
208 return GDISelectPalette( hDC
, hPal
);
212 /***********************************************************************
213 * RealizePalette (USER.283)
215 UINT
RealizePalette(HDC hDC
)
217 return GDIRealizePalette( hDC
);