2 * PROJECT: ReactOS win32 kernel mode subsystem
3 * LICENSE: GPL - See COPYING in the top level directory
4 * FILE: win32ss/gdi/ntgdi/stockobj.c
5 * PURPOSE: Stock objects functions
6 * PROGRAMMERS: Colin Finck <colin@reactos.org>
7 * Katayama Hirofumi MZ <katayama.hirofumi.mz@gmail.com>
16 static const COLORREF SysColors
[] =
18 RGB(212, 208, 200), /* COLOR_SCROLLBAR */
19 RGB(58, 110, 165), /* COLOR_BACKGROUND */
20 RGB(10, 36, 106), /* COLOR_ACTIVECAPTION */
21 RGB(128, 128, 128), /* COLOR_INACTIVECAPTION */
22 RGB(212, 208, 200), /* COLOR_MENU */
23 RGB(255, 255, 255), /* COLOR_WINDOW */
24 RGB(0, 0, 0), /* COLOR_WINDOWFRAME */
25 RGB(0, 0, 0), /* COLOR_MENUTEXT */
26 RGB(0, 0, 0), /* COLOR_WINDOWTEXT */
27 RGB(255, 255, 255), /* COLOR_CAPTIONTEXT */
28 RGB(212, 208, 200), /* COLOR_ACTIVEBORDER */
29 RGB(212, 208, 200), /* COLOR_INACTIVEBORDER */
30 RGB(128, 128, 128), /* COLOR_APPWORKSPACE */
31 RGB(10, 36, 106), /* COLOR_HIGHLIGHT */
32 RGB(255, 255, 255), /* COLOR_HIGHLIGHTTEXT */
33 RGB(212, 208, 200), /* COLOR_BTNFACE */
34 RGB(128, 128, 128), /* COLOR_BTNSHADOW */
35 RGB(128, 128, 128), /* COLOR_GRAYTEXT */
36 RGB(0, 0, 0), /* COLOR_BTNTEXT */
37 RGB(212, 208, 200), /* COLOR_INACTIVECAPTIONTEXT */
38 RGB(255, 255, 255), /* COLOR_BTNHIGHLIGHT */
39 RGB(64, 64, 64), /* COLOR_3DDKSHADOW */
40 RGB(212, 208, 200), /* COLOR_3DLIGHT */
41 RGB(0, 0, 0), /* COLOR_INFOTEXT */
42 RGB(255, 255, 225), /* COLOR_INFOBK */
43 RGB(181, 181, 181), /* COLOR_UNKNOWN */
44 RGB(0, 0, 128), /* COLOR_HOTLIGHT */
45 RGB(166, 202, 240), /* COLOR_GRADIENTACTIVECAPTION */
46 RGB(192, 192, 192), /* COLOR_GRADIENTINACTIVECAPTION */
47 RGB(49, 106, 197), /* COLOR_MENUHILIGHT */
48 RGB(236, 233, 216) /* COLOR_MENUBAR */
54 /* GDI stock objects */
56 static LOGPEN WhitePen
=
57 { PS_SOLID
, { 0, 0 }, RGB(255,255,255) };
59 static LOGPEN BlackPen
=
60 { PS_SOLID
, { 0, 0 }, RGB(0,0,0) };
62 static LOGPEN NullPen
=
63 { PS_NULL
, { 0, 0 }, 0 };
65 static LOGFONTW OEMFixedFont
=
66 { 12, 0, 0, 0, FW_NORMAL
, FALSE
, FALSE
, FALSE
, OEM_CHARSET
,
67 OUT_DEFAULT_PRECIS
, CLIP_DEFAULT_PRECIS
, DEFAULT_QUALITY
, FF_DONTCARE
| FIXED_PITCH
, L
"Terminal"
70 static LOGFONTW AnsiFixedFont
=
71 { 12, 0, 0, 0, FW_NORMAL
, FALSE
, FALSE
, FALSE
, ANSI_CHARSET
,
72 OUT_DEFAULT_PRECIS
, /*CLIP_DEFAULT_PRECIS*/ CLIP_STROKE_PRECIS
, /*DEFAULT_QUALITY*/ PROOF_QUALITY
, FF_DONTCARE
| FIXED_PITCH
, L
"Courier"
75 static LOGFONTW AnsiVarFont
=
76 { 12, 0, 0, 0, FW_NORMAL
, FALSE
, FALSE
, FALSE
, ANSI_CHARSET
,
77 OUT_DEFAULT_PRECIS
, /*CLIP_DEFAULT_PRECIS*/ CLIP_STROKE_PRECIS
, /*DEFAULT_QUALITY*/ PROOF_QUALITY
, FF_DONTCARE
| VARIABLE_PITCH
, L
"MS Sans Serif"
80 static LOGFONTW SystemFont
=
81 { 16, 0, 0, 0, FW_BOLD
, FALSE
, FALSE
, FALSE
, DEFAULT_CHARSET
,
82 OUT_DEFAULT_PRECIS
, CLIP_DEFAULT_PRECIS
, DEFAULT_QUALITY
, FF_DONTCARE
| VARIABLE_PITCH
, L
"System"
85 static LOGFONTW DeviceDefaultFont
=
86 { 16, 0, 0, 0, FW_BOLD
, FALSE
, FALSE
, FALSE
, ANSI_CHARSET
,
87 OUT_DEFAULT_PRECIS
, CLIP_DEFAULT_PRECIS
, DEFAULT_QUALITY
, FF_SWISS
| VARIABLE_PITCH
, L
"System"
90 static LOGFONTW SystemFixedFont
=
91 { 15, 0, 0, 0, FW_NORMAL
, FALSE
, FALSE
, FALSE
, DEFAULT_CHARSET
,
92 OUT_DEFAULT_PRECIS
, CLIP_DEFAULT_PRECIS
, DEFAULT_QUALITY
, FF_DONTCARE
| FIXED_PITCH
, L
"Fixedsys"
95 static LOGFONTW DefaultGuiFont
=
96 { -11, 0, 0, 0, FW_NORMAL
, FALSE
, FALSE
, FALSE
, DEFAULT_CHARSET
,
97 OUT_DEFAULT_PRECIS
, CLIP_DEFAULT_PRECIS
, /*DEFAULT_QUALITY*/ PROOF_QUALITY
, DEFAULT_PITCH
| FF_DONTCARE
, L
"MS Shell Dlg"
100 HGDIOBJ StockObjects
[NB_STOCK_OBJECTS
];
105 IntCreateStockPen(DWORD dwPenStyle
,
113 pbrushPen
= PEN_AllocPenWithHandle();
114 if (pbrushPen
== NULL
) return NULL
;
116 if ((dwPenStyle
& PS_STYLE_MASK
) == PS_NULL
) dwWidth
= 1;
118 pbrushPen
->iHatch
= 0;
119 pbrushPen
->lWidth
= abs(dwWidth
);
120 FLOATOBJ_SetLong(&pbrushPen
->eWidth
, pbrushPen
->lWidth
);
121 pbrushPen
->ulPenStyle
= dwPenStyle
;
122 pbrushPen
->BrushAttr
.lbColor
= ulColor
;
123 pbrushPen
->iBrushStyle
= ulBrushStyle
;
124 pbrushPen
->hbmClient
= (HANDLE
)NULL
;
125 pbrushPen
->dwStyleCount
= 0;
126 pbrushPen
->pStyle
= 0;
127 pbrushPen
->flAttrs
= BR_IS_OLDSTYLEPEN
;
129 switch (dwPenStyle
& PS_STYLE_MASK
)
132 pbrushPen
->flAttrs
|= BR_IS_NULL
;
136 pbrushPen
->flAttrs
|= BR_IS_SOLID
;
139 hPen
= pbrushPen
->BaseObject
.hHmgr
;
140 PEN_UnlockPen(pbrushPen
);
145 CreateStockFonts(void)
147 USHORT ActiveCodePage
, OemCodePage
;
148 BYTE bActiveCharSet
, bOemCharSet
;
150 static const WCHAR SimSun
[] = { 0x5B8B, 0x4F53, 0 };
151 static const WCHAR MingLiU
[] = { 0x7D30, 0x660E, 0x9AD4, 0 };
152 static const WCHAR Batang
[] = { 0xBC14, 0xD0D5, 0 };
154 RtlGetDefaultCodePage(&ActiveCodePage
, &OemCodePage
);
155 bActiveCharSet
= IntCharSetFromCodePage(ActiveCodePage
);
156 bOemCharSet
= IntCharSetFromCodePage(OemCodePage
);
158 if (bOemCharSet
== DEFAULT_CHARSET
)
159 bOemCharSet
= OEM_CHARSET
;
161 switch (ActiveCodePage
)
164 /* Simplified Chinese */
166 wcscpy(DefaultGuiFont
.lfFaceName
, SimSun
);
170 /* Traditional Chinese */
172 wcscpy(DefaultGuiFont
.lfFaceName
, MingLiU
);
178 wcscpy(DefaultGuiFont
.lfFaceName
, L
"MS UI Gothic");
185 wcscpy(DefaultGuiFont
.lfFaceName
, Batang
);
191 wcscpy(DefaultGuiFont
.lfFaceName
, L
"MS Shell Dlg");
197 OEMFixedFont
.lfHeight
= 18;
198 OEMFixedFont
.lfPitchAndFamily
= FF_DONTCARE
| FIXED_PITCH
;
199 SystemFont
.lfHeight
= 18;
200 SystemFont
.lfPitchAndFamily
= FF_DONTCARE
| VARIABLE_PITCH
;
201 DeviceDefaultFont
.lfHeight
= 18;
202 DeviceDefaultFont
.lfPitchAndFamily
= FF_DONTCARE
| VARIABLE_PITCH
;
203 SystemFixedFont
.lfHeight
= 18;
204 SystemFixedFont
.lfPitchAndFamily
= FF_DONTCARE
| FIXED_PITCH
;
205 DefaultGuiFont
.lfHeight
= -12;
209 OEMFixedFont
.lfHeight
= 12;
210 OEMFixedFont
.lfPitchAndFamily
= FF_MODERN
| FIXED_PITCH
;
211 SystemFont
.lfHeight
= 16;
212 SystemFont
.lfPitchAndFamily
= FF_SWISS
| VARIABLE_PITCH
;
213 DeviceDefaultFont
.lfHeight
= 16;
214 DeviceDefaultFont
.lfPitchAndFamily
= FF_SWISS
| VARIABLE_PITCH
;
215 if (bActiveCharSet
== RUSSIAN_CHARSET
)
217 SystemFixedFont
.lfHeight
= 16;
218 SystemFixedFont
.lfPitchAndFamily
= FF_SWISS
| FIXED_PITCH
;
222 SystemFixedFont
.lfHeight
= 15;
223 SystemFixedFont
.lfPitchAndFamily
= FF_MODERN
| FIXED_PITCH
;
225 DefaultGuiFont
.lfHeight
= -11;
228 OEMFixedFont
.lfCharSet
= bOemCharSet
;
229 SystemFont
.lfCharSet
= bActiveCharSet
;
230 DeviceDefaultFont
.lfCharSet
= bActiveCharSet
;
231 SystemFixedFont
.lfCharSet
= bActiveCharSet
;
232 DefaultGuiFont
.lfCharSet
= bActiveCharSet
;
234 TextIntCreateFontIndirect(&OEMFixedFont
, (HFONT
*)&StockObjects
[OEM_FIXED_FONT
]);
235 TextIntCreateFontIndirect(&AnsiFixedFont
, (HFONT
*)&StockObjects
[ANSI_FIXED_FONT
]);
236 TextIntCreateFontIndirect(&AnsiVarFont
, (HFONT
*)&StockObjects
[ANSI_VAR_FONT
]);
237 TextIntCreateFontIndirect(&SystemFont
, (HFONT
*)&StockObjects
[SYSTEM_FONT
]);
238 TextIntCreateFontIndirect(&DeviceDefaultFont
, (HFONT
*)&StockObjects
[DEVICE_DEFAULT_FONT
]);
239 TextIntCreateFontIndirect(&SystemFixedFont
, (HFONT
*)&StockObjects
[SYSTEM_FIXED_FONT
]);
240 TextIntCreateFontIndirect(&DefaultGuiFont
, (HFONT
*)&StockObjects
[DEFAULT_GUI_FONT
]);
244 * Creates a bunch of stock objects: brushes, pens, fonts.
247 CreateStockObjects(void)
251 DPRINT("Beginning creation of stock objects\n");
253 /* Create GDI Stock Objects from the logical structures we've defined */
255 StockObjects
[WHITE_BRUSH
] = IntGdiCreateSolidBrush(RGB(255,255,255));
256 StockObjects
[DC_BRUSH
] = IntGdiCreateSolidBrush(RGB(255,255,255));
257 StockObjects
[LTGRAY_BRUSH
] = IntGdiCreateSolidBrush(RGB(192,192,192));
258 StockObjects
[GRAY_BRUSH
] = IntGdiCreateSolidBrush(RGB(128,128,128));
259 StockObjects
[DKGRAY_BRUSH
] = IntGdiCreateSolidBrush(RGB(64,64,64));
260 StockObjects
[BLACK_BRUSH
] = IntGdiCreateSolidBrush(RGB(0,0,0));
261 StockObjects
[NULL_BRUSH
] = IntGdiCreateNullBrush();
263 StockObjects
[WHITE_PEN
] = IntCreateStockPen(WhitePen
.lopnStyle
, WhitePen
.lopnWidth
.x
, BS_SOLID
, WhitePen
.lopnColor
);
264 StockObjects
[BLACK_PEN
] = IntCreateStockPen(BlackPen
.lopnStyle
, BlackPen
.lopnWidth
.x
, BS_SOLID
, BlackPen
.lopnColor
);
265 StockObjects
[DC_PEN
] = IntCreateStockPen(BlackPen
.lopnStyle
, BlackPen
.lopnWidth
.x
, BS_SOLID
, BlackPen
.lopnColor
);
266 StockObjects
[NULL_PEN
] = IntCreateStockPen(NullPen
.lopnStyle
, NullPen
.lopnWidth
.x
, BS_SOLID
, NullPen
.lopnColor
);
268 StockObjects
[20] = NULL
; /* TODO: Unknown internal stock object */
269 StockObjects
[DEFAULT_BITMAP
] = GreCreateBitmap(1, 1, 1, 1, NULL
);
273 StockObjects
[DEFAULT_PALETTE
] = (HGDIOBJ
)gppalDefault
->BaseObject
.hHmgr
;
275 for (Object
= 0; Object
< NB_STOCK_OBJECTS
; Object
++)
277 if (NULL
!= StockObjects
[Object
])
279 GDIOBJ_ConvertToStockObj(&StockObjects
[Object
]);
283 DPRINT("Completed creation of stock objects\n");
287 * Return stock object.
288 * \param Object - stock object id.
289 * \return Handle to the object.
292 NtGdiGetStockObject(INT Object
)
294 DPRINT("NtGdiGetStockObject index %d\n", Object
);
296 return ((Object
< 0) || (NB_STOCK_OBJECTS
<= Object
)) ? NULL
: StockObjects
[Object
];
300 IntSetSysColors(UINT nColors
, CONST INT
*Elements
, CONST COLORREF
*Colors
)
304 for (i
= 0; i
< nColors
; i
++)
306 if ((UINT
)(*Elements
) < NUM_SYSCOLORS
)
308 gpsi
->argbSystem
[*Elements
] = *Colors
;
309 IntGdiSetSolidBrushColor(gpsi
->ahbrSystem
[*Elements
], *Colors
);
317 IntGetSysColorBrush(INT Object
)
319 return ((Object
< 0) || (NUM_SYSCOLORS
<= Object
)) ? NULL
: gpsi
->ahbrSystem
[Object
];
323 IntGetSysColor(INT nIndex
)
325 return (NUM_SYSCOLORS
<= (UINT
)nIndex
) ? 0 : gpsi
->argbSystem
[nIndex
];
329 CreateSysColorObjects(VOID
)
333 for (i
= 0; i
< NUM_SYSCOLORS
; i
++)
335 gpsi
->argbSystem
[i
] = SysColors
[i
];
338 /* Create the syscolor brushes */
339 for (i
= 0; i
< NUM_SYSCOLORS
; i
++)
341 if (gpsi
->ahbrSystem
[i
] == NULL
)
343 gpsi
->ahbrSystem
[i
] = IntGdiCreateSolidBrush(SysColors
[i
]);
344 if (gpsi
->ahbrSystem
[i
] != NULL
)
346 GDIOBJ_ConvertToStockObj((HGDIOBJ
*)&gpsi
->ahbrSystem
[i
]);