fixing a memory overwrite bug I miskate intrudes
[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 * $Id$
23 *
24 */
25
26 #include <w32k.h>
27
28 #define NDEBUG
29 #include <debug.h>
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 static HPEN SysColorPens[NUM_SYSCOLORS];
68 static HBRUSH SysColorBrushes[NUM_SYSCOLORS];
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 *{ 10, 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 /* Comments from reserve two extra entry for the stock default bitmap this is what Windows does too
111 * and verify if it is true it is not. in XP/2003 it is 22 stockobjects for each bitmap
112 */
113 #define NB_STOCK_OBJECTS (PRV_STOCK_LAST)
114
115 static HGDIOBJ StockObjects[NB_STOCK_OBJECTS];
116
117 /*!
118 * Creates a bunch of stock objects: brushes, pens, fonts.
119 */
120 VOID FASTCALL
121 CreateStockObjects(void)
122 {
123 UINT Object;
124
125 DPRINT("Beginning creation of stock objects\n");
126
127 /* Create GDI Stock Objects from the logical structures we've defined */
128
129 StockObjects[WHITE_BRUSH] = IntGdiCreateSolidBrush(RGB(255,255,255));
130 StockObjects[DC_BRUSH] = IntGdiCreateSolidBrush(RGB(255,255,255));
131 StockObjects[LTGRAY_BRUSH] = IntGdiCreateSolidBrush(RGB(192,192,192));
132 StockObjects[GRAY_BRUSH] = IntGdiCreateSolidBrush(RGB(128,128,128));
133 StockObjects[DKGRAY_BRUSH] = IntGdiCreateSolidBrush(RGB(64,64,64));
134 StockObjects[BLACK_BRUSH] = IntGdiCreateSolidBrush(RGB(0,0,0));
135 StockObjects[NULL_BRUSH] = IntGdiCreateNullBrush();
136
137 StockObjects[WHITE_PEN] = IntGdiExtCreatePen(WhitePen.lopnStyle, WhitePen.lopnWidth.x, BS_SOLID, WhitePen.lopnColor, 0, 0, 0, NULL, 0, TRUE, NULL);
138 StockObjects[BLACK_PEN] = IntGdiExtCreatePen(BlackPen.lopnStyle, BlackPen.lopnWidth.x, BS_SOLID, BlackPen.lopnColor, 0, 0, 0, NULL, 0, TRUE, NULL);
139 StockObjects[DC_PEN] = IntGdiExtCreatePen(BlackPen.lopnStyle, BlackPen.lopnWidth.x, BS_SOLID, BlackPen.lopnColor, 0, 0, 0, NULL, 0, TRUE, NULL);
140 StockObjects[NULL_PEN] = IntGdiExtCreatePen(NullPen.lopnStyle, NullPen.lopnWidth.x, BS_SOLID, NullPen.lopnColor, 0, 0, 0, NULL, 0, TRUE, NULL);
141
142 StockObjects[20] = NULL;
143 StockObjects[DC_BITMAP] = IntGdiCreateBitmap (1, 1, 1, 1, NULL);
144
145 (void) TextIntCreateFontIndirect(&OEMFixedFont, (HFONT*)&StockObjects[OEM_FIXED_FONT]);
146 (void) TextIntCreateFontIndirect(&AnsiFixedFont, (HFONT*)&StockObjects[ANSI_FIXED_FONT]);
147 (void) TextIntCreateFontIndirect(&SystemFont, (HFONT*)&StockObjects[SYSTEM_FONT]);
148 (void) TextIntCreateFontIndirect(&DeviceDefaultFont, (HFONT*)&StockObjects[DEVICE_DEFAULT_FONT]);
149 (void) TextIntCreateFontIndirect(&SystemFixedFont, (HFONT*)&StockObjects[SYSTEM_FIXED_FONT]);
150 (void) TextIntCreateFontIndirect(&DefaultGuiFont, (HFONT*)&StockObjects[DEFAULT_GUI_FONT]);
151
152 StockObjects[DEFAULT_PALETTE] = (HGDIOBJ*)PALETTE_Init();
153
154 for (Object = 0; Object < NB_STOCK_OBJECTS; Object++)
155 {
156 if (NULL != StockObjects[Object])
157 {
158 GDIOBJ_ConvertToStockObj(&StockObjects[Object]);
159 }
160 }
161
162 DPRINT("Completed creation of stock objects\n");
163 }
164
165 /*!
166 * Return stock object.
167 * \param Object - stock object id.
168 * \return Handle to the object.
169 */
170 HGDIOBJ STDCALL
171 NtGdiGetStockObject(INT Object)
172 {
173 DPRINT("NtGdiGetStockObject index %d\n", Object);
174
175 return ((Object < 0) || (NB_STOCK_OBJECTS <= Object)) ? NULL : StockObjects[Object];
176 }
177
178 BOOL FASTCALL
179 IntSetSysColors(UINT nColors, INT *Elements, COLORREF *Colors)
180 {
181 UINT i;
182
183 ASSERT(Elements);
184 ASSERT(Colors);
185
186 for(i = 0; i < nColors; i++)
187 {
188 if((UINT)(*Elements) < NUM_SYSCOLORS)
189 {
190 SysColors[*Elements] = *Colors;
191 IntGdiSetSolidBrushColor(SysColorBrushes[*Elements], *Colors);
192 IntGdiSetSolidPenColor(SysColorPens[*Elements], *Colors);
193 }
194 Elements++;
195 Colors++;
196 }
197 UserPostMessage(HWND_BROADCAST, WM_SYSCOLORCHANGE, 0, 0);
198
199 return nColors > 0;
200 }
201
202 BOOL FASTCALL
203 IntGetSysColorBrushes(HBRUSH *Brushes, UINT nBrushes)
204 {
205 UINT i;
206
207 ASSERT(Brushes);
208
209 if(nBrushes > NUM_SYSCOLORS)
210 {
211 SetLastWin32Error(ERROR_INVALID_PARAMETER);
212 return FALSE;
213 }
214
215 for(i = 0; i < nBrushes; i++)
216 {
217 *(Brushes++) = SysColorBrushes[i];
218 }
219
220 return nBrushes > 0;
221 }
222
223 HGDIOBJ FASTCALL
224 IntGetSysColorBrush(INT Object)
225 {
226 return ((Object < 0) || (NUM_SYSCOLORS <= Object)) ? NULL : SysColorBrushes[Object];
227 }
228
229 BOOL FASTCALL
230 IntGetSysColorPens(HPEN *Pens, UINT nPens)
231 {
232 UINT i;
233
234 ASSERT(Pens);
235
236 if(nPens > NUM_SYSCOLORS)
237 {
238 SetLastWin32Error(ERROR_INVALID_PARAMETER);
239 return FALSE;
240 }
241
242 for(i = 0; i < nPens; i++)
243 {
244 *(Pens++) = SysColorPens[i];
245 }
246
247 return nPens > 0;
248 }
249
250 BOOL FASTCALL
251 IntGetSysColors(COLORREF *Colors, UINT nColors)
252 {
253 UINT i;
254 COLORREF *col;
255
256 ASSERT(Colors);
257
258 if(nColors > NUM_SYSCOLORS)
259 {
260 SetLastWin32Error(ERROR_INVALID_PARAMETER);
261 return FALSE;
262 }
263
264 col = &SysColors[0];
265 for(i = 0; i < nColors; i++)
266 {
267 *(Colors++) = *(col++);
268 }
269
270 return nColors > 0;
271 }
272
273 DWORD FASTCALL
274 IntGetSysColor(INT nIndex)
275 {
276 return (NUM_SYSCOLORS <= (UINT)nIndex) ? 0 : SysColors[nIndex];
277 }
278
279 VOID FASTCALL
280 CreateSysColorObjects(VOID)
281 {
282 UINT i;
283 LOGPEN Pen;
284
285 /* Create the syscolor brushes */
286 for(i = 0; i < NUM_SYSCOLORS; i++)
287 {
288 if(SysColorBrushes[i] == NULL)
289 {
290 SysColorBrushes[i] = IntGdiCreateSolidBrush(SysColors[i]);
291 if(SysColorBrushes[i] != NULL)
292 {
293 GDIOBJ_ConvertToStockObj((HGDIOBJ*)&SysColorBrushes[i]);
294 }
295 }
296 }
297
298 /* Create the syscolor pens */
299 Pen.lopnStyle = PS_SOLID;
300 Pen.lopnWidth.x = 0;
301 Pen.lopnWidth.y = 0;
302 for(i = 0; i < NUM_SYSCOLORS; i++)
303 {
304 if(SysColorPens[i] == NULL)
305 {
306 Pen.lopnColor = SysColors[i];
307 SysColorPens[i] = IntGdiExtCreatePen(Pen.lopnStyle, Pen.lopnWidth.x, BS_SOLID, Pen.lopnColor, 0, 0, 0, NULL, 0, TRUE, NULL);
308 if(SysColorPens[i] != NULL)
309 {
310 GDIOBJ_ConvertToStockObj((HGDIOBJ*)&SysColorPens[i]);
311 }
312 }
313 }
314 }
315
316 /* EOF */