- Less STDCALL, more WINAPI/NTAPI/APIENTRY
[reactos.git] / reactos / subsystems / win32 / win32k / objects / stockobj.c
1 /*
2 * ReactOS W32 Subsystem
3 * Copyright (C) 1998 - 2004 ReactOS Team
4 *
5 * This program is free software; you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License as published by
7 * the Free Software Foundation; either version 2 of the License, or
8 * (at your option) any later version.
9 *
10 * This program is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 * GNU General Public License for more details.
14 *
15 * You should have received a copy of the GNU General Public License
16 * along with this program; if not, write to the Free Software
17 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
18 */
19 /*
20 * STOCKOBJ.C - GDI Stock Objects
21 *
22 *
23 */
24
25 #include <w32k.h>
26
27 #define NDEBUG
28 #include <debug.h>
29
30
31 static COLORREF SysColors[] =
32 {
33 RGB(212, 208, 200), /* COLOR_SCROLLBAR */
34 RGB(58, 110, 165), /* COLOR_BACKGROUND */
35 RGB(10, 36, 106), /* COLOR_ACTIVECAPTION */
36 RGB(128, 128, 128), /* COLOR_INACTIVECAPTION */
37 RGB(212, 208, 200), /* COLOR_MENU */
38 RGB(255, 255, 255), /* COLOR_WINDOW */
39 RGB(0, 0, 0), /* COLOR_WINDOWFRAME */
40 RGB(0, 0, 0), /* COLOR_MENUTEXT */
41 RGB(0, 0, 0), /* COLOR_WINDOWTEXT */
42 RGB(255, 255, 255), /* COLOR_CAPTIONTEXT */
43 RGB(212, 208, 200), /* COLOR_ACTIVEBORDER */
44 RGB(212, 208, 200), /* COLOR_INACTIVEBORDER */
45 RGB(128, 128, 128), /* COLOR_APPWORKSPACE */
46 RGB(10, 36, 106), /* COLOR_HIGHLIGHT */
47 RGB(255, 255, 255), /* COLOR_HIGHLIGHTTEXT */
48 RGB(212, 208, 200), /* COLOR_BTNFACE */
49 RGB(128, 128, 128), /* COLOR_BTNSHADOW */
50 RGB(128, 128, 128), /* COLOR_GRAYTEXT */
51 RGB(0, 0, 0), /* COLOR_BTNTEXT */
52 RGB(212, 208, 200), /* COLOR_INACTIVECAPTIONTEXT */
53 RGB(255, 255, 255), /* COLOR_BTNHIGHLIGHT */
54 RGB(64, 64, 64), /* COLOR_3DDKSHADOW */
55 RGB(212, 208, 200), /* COLOR_3DLIGHT */
56 RGB(0, 0, 0), /* COLOR_INFOTEXT */
57 RGB(255, 255, 225), /* COLOR_INFOBK */
58 RGB(181, 181, 181), /* COLOR_UNKNOWN */
59 RGB(0, 0, 128), /* COLOR_HOTLIGHT */
60 RGB(166, 202, 240), /* COLOR_GRADIENTACTIVECAPTION */
61 RGB(192, 192, 192), /* COLOR_GRADIENTINACTIVECAPTION */
62 RGB(49, 106, 197), /* COLOR_MENUHILIGHT */
63 RGB(236, 233, 216) /* COLOR_MENUBAR */
64 };
65 #define NUM_SYSCOLORS (sizeof(SysColors) / sizeof(SysColors[0]))
66
67 // System Bitmap DC
68 HDC hSystemBM;
69
70 /* GDI stock objects */
71
72 static LOGPEN WhitePen =
73 { PS_SOLID, { 0, 0 }, RGB(255,255,255) };
74
75 static LOGPEN BlackPen =
76 { PS_SOLID, { 0, 0 }, RGB(0,0,0) };
77
78 static LOGPEN NullPen =
79 { PS_NULL, { 0, 0 }, 0 };
80
81 static LOGFONTW OEMFixedFont =
82 { 11, 0, 0, 0, FW_NORMAL, FALSE, FALSE, FALSE, OEM_CHARSET,
83 0, 0, DEFAULT_QUALITY, FIXED_PITCH | FF_MODERN, L"Courier New" }; //Bitstream Vera Sans Mono
84
85 static LOGFONTW AnsiFixedFont =
86 { 11, 0, 0, 0, FW_NORMAL, FALSE, FALSE, FALSE, ANSI_CHARSET,
87 0, 0, DEFAULT_QUALITY, FIXED_PITCH | FF_MODERN, L"Courier New" }; //Bitstream Vera Sans Mono
88
89 static LOGFONTW AnsiVarFont =
90 { 11, 0, 0, 0, FW_NORMAL, FALSE, FALSE, FALSE, ANSI_CHARSET,
91 0, 0, DEFAULT_QUALITY, VARIABLE_PITCH | FF_SWISS, L"MS Sans Serif" };
92
93 static LOGFONTW SystemFont =
94 { 11, 0, 0, 0, FW_NORMAL, FALSE, FALSE, FALSE, ANSI_CHARSET,
95 0, 0, DEFAULT_QUALITY, VARIABLE_PITCH | FF_SWISS, L"Courier New" }; //Bitstream Vera Sans
96
97 static LOGFONTW DeviceDefaultFont =
98 { 11, 0, 0, 0, FW_NORMAL, FALSE, FALSE, FALSE, ANSI_CHARSET,
99 0, 0, DEFAULT_QUALITY, VARIABLE_PITCH | FF_SWISS, L"MS Sans Serif" }; //Bitstream Vera Sans
100
101 static LOGFONTW SystemFixedFont =
102 { 11, 0, 0, 0, FW_NORMAL, FALSE, FALSE, FALSE, ANSI_CHARSET,
103 0, 0, DEFAULT_QUALITY, FIXED_PITCH | FF_MODERN, L"Courier New" }; //Bitstream Vera Sans Mono
104
105 /* FIXME: Is this correct? */
106 static LOGFONTW DefaultGuiFont =
107 { 11, 0, 0, 0, FW_NORMAL, FALSE, FALSE, FALSE, ANSI_CHARSET,
108 0, 0, DEFAULT_QUALITY, VARIABLE_PITCH | FF_SWISS, L"MS Sans Serif" }; //Bitstream Vera Sans
109
110 HGDIOBJ StockObjects[NB_STOCK_OBJECTS];
111
112 static
113 HPEN
114 FASTCALL
115 IntCreateStockPen( DWORD dwPenStyle,
116 DWORD dwWidth,
117 ULONG ulBrushStyle,
118 ULONG ulColor)
119 {
120 HPEN hPen;
121 PGDIBRUSHOBJ PenObject = PENOBJ_AllocPenWithHandle();
122
123 if ((dwPenStyle & PS_STYLE_MASK) == PS_NULL) dwWidth = 1;
124
125 PenObject->ptPenWidth.x = abs(dwWidth);
126 PenObject->ptPenWidth.y = 0;
127 PenObject->ulPenStyle = dwPenStyle;
128 PenObject->BrushAttr.lbColor = ulColor;
129 PenObject->ulStyle = ulBrushStyle;
130 PenObject->hbmClient = (HANDLE)NULL;
131 PenObject->dwStyleCount = 0;
132 PenObject->pStyle = 0;
133 PenObject->flAttrs = GDIBRUSH_IS_OLDSTYLEPEN;
134
135 switch (dwPenStyle & PS_STYLE_MASK)
136 {
137 case PS_NULL:
138 PenObject->flAttrs |= GDIBRUSH_IS_NULL;
139 break;
140
141 case PS_SOLID:
142 PenObject->flAttrs |= GDIBRUSH_IS_SOLID;
143 break;
144 }
145 hPen = PenObject->BaseObject.hHmgr;
146 PENOBJ_UnlockPen(PenObject);
147 return hPen;
148 }
149
150 /*!
151 * Creates a bunch of stock objects: brushes, pens, fonts.
152 */
153 VOID FASTCALL
154 CreateStockObjects(void)
155 {
156 UINT Object;
157
158 DPRINT("Beginning creation of stock objects\n");
159
160 /* Create GDI Stock Objects from the logical structures we've defined */
161
162 StockObjects[WHITE_BRUSH] = IntGdiCreateSolidBrush(RGB(255,255,255));
163 StockObjects[DC_BRUSH] = IntGdiCreateSolidBrush(RGB(255,255,255));
164 StockObjects[LTGRAY_BRUSH] = IntGdiCreateSolidBrush(RGB(192,192,192));
165 StockObjects[GRAY_BRUSH] = IntGdiCreateSolidBrush(RGB(128,128,128));
166 StockObjects[DKGRAY_BRUSH] = IntGdiCreateSolidBrush(RGB(64,64,64));
167 StockObjects[BLACK_BRUSH] = IntGdiCreateSolidBrush(RGB(0,0,0));
168 StockObjects[NULL_BRUSH] = IntGdiCreateNullBrush();
169
170 StockObjects[WHITE_PEN] = IntCreateStockPen(WhitePen.lopnStyle, WhitePen.lopnWidth.x, BS_SOLID, WhitePen.lopnColor);
171 StockObjects[BLACK_PEN] = IntCreateStockPen(BlackPen.lopnStyle, BlackPen.lopnWidth.x, BS_SOLID, BlackPen.lopnColor);
172 StockObjects[DC_PEN] = IntCreateStockPen(BlackPen.lopnStyle, BlackPen.lopnWidth.x, BS_SOLID, BlackPen.lopnColor);
173 StockObjects[NULL_PEN] = IntCreateStockPen(NullPen.lopnStyle, NullPen.lopnWidth.x, BS_SOLID, NullPen.lopnColor);
174
175 StockObjects[20] = NULL; /* TODO: Unknown internal stock object */
176 StockObjects[DEFAULT_BITMAP] = IntGdiCreateBitmap(1, 1, 1, 1, NULL);
177
178 (void) TextIntCreateFontIndirect(&OEMFixedFont, (HFONT*)&StockObjects[OEM_FIXED_FONT]);
179 (void) TextIntCreateFontIndirect(&AnsiFixedFont, (HFONT*)&StockObjects[ANSI_FIXED_FONT]);
180 (void) TextIntCreateFontIndirect(&AnsiVarFont, (HFONT*)&StockObjects[ANSI_VAR_FONT]);
181 (void) TextIntCreateFontIndirect(&SystemFont, (HFONT*)&StockObjects[SYSTEM_FONT]);
182 (void) TextIntCreateFontIndirect(&DeviceDefaultFont, (HFONT*)&StockObjects[DEVICE_DEFAULT_FONT]);
183 (void) TextIntCreateFontIndirect(&SystemFixedFont, (HFONT*)&StockObjects[SYSTEM_FIXED_FONT]);
184 (void) TextIntCreateFontIndirect(&DefaultGuiFont, (HFONT*)&StockObjects[DEFAULT_GUI_FONT]);
185
186 StockObjects[DEFAULT_PALETTE] = (HGDIOBJ)PALETTE_Init();
187
188 for (Object = 0; Object < NB_STOCK_OBJECTS; Object++)
189 {
190 if (NULL != StockObjects[Object])
191 {
192 GDIOBJ_ConvertToStockObj(&StockObjects[Object]);
193 }
194 }
195
196 DPRINT("Completed creation of stock objects\n");
197 }
198
199 /*!
200 * Return stock object.
201 * \param Object - stock object id.
202 * \return Handle to the object.
203 */
204 HGDIOBJ APIENTRY
205 NtGdiGetStockObject(INT Object)
206 {
207 DPRINT("NtGdiGetStockObject index %d\n", Object);
208
209 return ((Object < 0) || (NB_STOCK_OBJECTS <= Object)) ? NULL : StockObjects[Object];
210 }
211
212 BOOL FASTCALL
213 IntSetSysColors(UINT nColors, INT *Elements, COLORREF *Colors)
214 {
215 UINT i;
216
217 ASSERT(Elements);
218 ASSERT(Colors);
219
220 for(i = 0; i < nColors; i++)
221 {
222 if((UINT)(*Elements) < NUM_SYSCOLORS)
223 {
224 gpsi->SysColors[*Elements] = *Colors;
225 IntGdiSetSolidBrushColor(gpsi->SysColorBrushes[*Elements], *Colors);
226 IntGdiSetSolidPenColor(gpsi->SysColorPens[*Elements], *Colors);
227 }
228 Elements++;
229 Colors++;
230 }
231 return nColors > 0;
232 }
233
234 BOOL FASTCALL
235 IntGetSysColorBrushes(HBRUSH *Brushes, UINT nBrushes)
236 {
237 UINT i;
238
239 ASSERT(Brushes);
240
241 if(nBrushes > NUM_SYSCOLORS)
242 {
243 SetLastWin32Error(ERROR_INVALID_PARAMETER);
244 return FALSE;
245 }
246
247 for(i = 0; i < nBrushes; i++)
248 {
249 *(Brushes++) = gpsi->SysColorBrushes[i];
250 }
251
252 return nBrushes > 0;
253 }
254
255 HGDIOBJ FASTCALL
256 IntGetSysColorBrush(INT Object)
257 {
258 return ((Object < 0) || (NUM_SYSCOLORS <= Object)) ? NULL : gpsi->SysColorBrushes[Object];
259 }
260
261 BOOL FASTCALL
262 IntGetSysColorPens(HPEN *Pens, UINT nPens)
263 {
264 UINT i;
265
266 ASSERT(Pens);
267
268 if(nPens > NUM_SYSCOLORS)
269 {
270 SetLastWin32Error(ERROR_INVALID_PARAMETER);
271 return FALSE;
272 }
273
274 for(i = 0; i < nPens; i++)
275 {
276 *(Pens++) = gpsi->SysColorPens[i];
277 }
278
279 return nPens > 0;
280 }
281
282 BOOL FASTCALL
283 IntGetSysColors(COLORREF *Colors, UINT nColors)
284 {
285 UINT i;
286 COLORREF *col;
287
288 ASSERT(Colors);
289
290 if(nColors > NUM_SYSCOLORS)
291 {
292 SetLastWin32Error(ERROR_INVALID_PARAMETER);
293 return FALSE;
294 }
295
296 col = &gpsi->SysColors[0];
297 for(i = 0; i < nColors; i++)
298 {
299 *(Colors++) = *(col++);
300 }
301
302 return nColors > 0;
303 }
304
305 DWORD FASTCALL
306 IntGetSysColor(INT nIndex)
307 {
308 return (NUM_SYSCOLORS <= (UINT)nIndex) ? 0 : gpsi->SysColors[nIndex];
309 }
310
311 VOID FASTCALL
312 CreateSysColorObjects(VOID)
313 {
314 UINT i;
315 LOGPEN Pen;
316
317 for(i = 0; i < NUM_SYSCOLORS; i++)
318 {
319 gpsi->SysColors[i] = SysColors[i];
320 }
321
322 /* Create the syscolor brushes */
323 for(i = 0; i < NUM_SYSCOLORS; i++)
324 {
325 if(gpsi->SysColorBrushes[i] == NULL)
326 {
327 gpsi->SysColorBrushes[i] = IntGdiCreateSolidBrush(SysColors[i]);
328 if(gpsi->SysColorBrushes[i] != NULL)
329 {
330 GDIOBJ_ConvertToStockObj((HGDIOBJ*)&gpsi->SysColorBrushes[i]);
331 }
332 }
333 }
334
335 /* Create the syscolor pens */
336 Pen.lopnStyle = PS_SOLID;
337 Pen.lopnWidth.x = 0;
338 Pen.lopnWidth.y = 0;
339 for(i = 0; i < NUM_SYSCOLORS; i++)
340 {
341 if(gpsi->SysColorPens[i] == NULL)
342 {
343 Pen.lopnColor = SysColors[i];
344 gpsi->SysColorPens[i] = IntCreateStockPen(Pen.lopnStyle, Pen.lopnWidth.x, BS_SOLID, Pen.lopnColor);
345 if(gpsi->SysColorPens[i] != NULL)
346 {
347 GDIOBJ_ConvertToStockObj((HGDIOBJ*)&gpsi->SysColorPens[i]);
348 }
349 }
350 }
351 }
352
353 /* EOF */