1 /* 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> 8 */ 9 10 #include <win32k.h> 11 12 #define NDEBUG 13 #include <debug.h> 14 15 16 static const COLORREF SysColors[] = 17 { 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 */ 49 }; 50 51 // System Bitmap DC 52 HDC hSystemBM; 53 54 /* GDI stock objects */ 55 56 static LOGPEN WhitePen = 57 { PS_SOLID, { 0, 0 }, RGB(255,255,255) }; 58 59 static LOGPEN BlackPen = 60 { PS_SOLID, { 0, 0 }, RGB(0,0,0) }; 61 62 static LOGPEN NullPen = 63 { PS_NULL, { 0, 0 }, 0 }; 64 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" 68 }; 69 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" 73 }; 74 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" 78 }; 79 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" 83 }; 84 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" 88 }; 89 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" 93 }; 94 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" 98 }; 99 100 HGDIOBJ StockObjects[NB_STOCK_OBJECTS]; 101 102 static 103 HPEN 104 FASTCALL 105 IntCreateStockPen(DWORD dwPenStyle, 106 DWORD dwWidth, 107 ULONG ulBrushStyle, 108 ULONG ulColor) 109 { 110 HPEN hPen; 111 PBRUSH pbrushPen; 112 113 pbrushPen = PEN_AllocPenWithHandle(); 114 if (pbrushPen == NULL) return NULL; 115 116 if ((dwPenStyle & PS_STYLE_MASK) == PS_NULL) dwWidth = 1; 117 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; 128 129 switch (dwPenStyle & PS_STYLE_MASK) 130 { 131 case PS_NULL: 132 pbrushPen->flAttrs |= BR_IS_NULL; 133 break; 134 135 case PS_SOLID: 136 pbrushPen->flAttrs |= BR_IS_SOLID; 137 break; 138 } 139 hPen = pbrushPen->BaseObject.hHmgr; 140 PEN_UnlockPen(pbrushPen); 141 return hPen; 142 } 143 144 static VOID FASTCALL 145 CreateStockFonts(void) 146 { 147 USHORT ActiveCodePage, OemCodePage; 148 BYTE bActiveCharSet, bOemCharSet; 149 BOOL bIsCJK; 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 }; 153 154 RtlGetDefaultCodePage(&ActiveCodePage, &OemCodePage); 155 bActiveCharSet = IntCharSetFromCodePage(ActiveCodePage); 156 bOemCharSet = IntCharSetFromCodePage(OemCodePage); 157 158 if (bOemCharSet == DEFAULT_CHARSET) 159 bOemCharSet = OEM_CHARSET; 160 161 switch (ActiveCodePage) 162 { 163 case 936: 164 /* Simplified Chinese */ 165 bIsCJK = TRUE; 166 wcscpy(DefaultGuiFont.lfFaceName, SimSun); 167 break; 168 169 case 950: 170 /* Traditional Chinese */ 171 bIsCJK = TRUE; 172 wcscpy(DefaultGuiFont.lfFaceName, MingLiU); 173 break; 174 175 case 932: 176 /* Japanese */ 177 bIsCJK = TRUE; 178 wcscpy(DefaultGuiFont.lfFaceName, L"MS UI Gothic"); 179 break; 180 181 case 949: 182 case 1361: 183 /* Korean */ 184 bIsCJK = TRUE; 185 wcscpy(DefaultGuiFont.lfFaceName, Batang); 186 break; 187 188 default: 189 /* Otherwise */ 190 bIsCJK = FALSE; 191 wcscpy(DefaultGuiFont.lfFaceName, L"MS Shell Dlg"); 192 break; 193 } 194 195 if (bIsCJK) 196 { 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; 206 } 207 else 208 { 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) 216 { 217 SystemFixedFont.lfHeight = 16; 218 SystemFixedFont.lfPitchAndFamily = FF_SWISS | FIXED_PITCH; 219 } 220 else 221 { 222 SystemFixedFont.lfHeight = 15; 223 SystemFixedFont.lfPitchAndFamily = FF_MODERN | FIXED_PITCH; 224 } 225 DefaultGuiFont.lfHeight = -11; 226 } 227 228 OEMFixedFont.lfCharSet = bOemCharSet; 229 SystemFont.lfCharSet = bActiveCharSet; 230 DeviceDefaultFont.lfCharSet = bActiveCharSet; 231 SystemFixedFont.lfCharSet = bActiveCharSet; 232 DefaultGuiFont.lfCharSet = bActiveCharSet; 233 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]); 241 } 242 243 /*! 244 * Creates a bunch of stock objects: brushes, pens, fonts. 245 */ 246 VOID FASTCALL 247 CreateStockObjects(void) 248 { 249 UINT Object; 250 251 DPRINT("Beginning creation of stock objects\n"); 252 253 /* Create GDI Stock Objects from the logical structures we've defined */ 254 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(); 262 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); 267 268 StockObjects[20] = NULL; /* TODO: Unknown internal stock object */ 269 StockObjects[DEFAULT_BITMAP] = GreCreateBitmap(1, 1, 1, 1, NULL); 270 271 CreateStockFonts(); 272 273 StockObjects[DEFAULT_PALETTE] = (HGDIOBJ)gppalDefault->BaseObject.hHmgr; 274 275 for (Object = 0; Object < NB_STOCK_OBJECTS; Object++) 276 { 277 if (NULL != StockObjects[Object]) 278 { 279 GDIOBJ_ConvertToStockObj(&StockObjects[Object]); 280 } 281 } 282 283 DPRINT("Completed creation of stock objects\n"); 284 } 285 286 /*! 287 * Return stock object. 288 * \param Object - stock object id. 289 * \return Handle to the object. 290 */ 291 HGDIOBJ APIENTRY 292 NtGdiGetStockObject(INT Object) 293 { 294 DPRINT("NtGdiGetStockObject index %d\n", Object); 295 296 return ((Object < 0) || (NB_STOCK_OBJECTS <= Object)) ? NULL : StockObjects[Object]; 297 } 298 299 VOID FASTCALL 300 IntSetSysColors(UINT nColors, CONST INT *Elements, CONST COLORREF *Colors) 301 { 302 UINT i; 303 304 for (i = 0; i < nColors; i++) 305 { 306 if ((UINT)(*Elements) < NUM_SYSCOLORS) 307 { 308 gpsi->argbSystem[*Elements] = *Colors; 309 IntGdiSetSolidBrushColor(gpsi->ahbrSystem[*Elements], *Colors); 310 } 311 Elements++; 312 Colors++; 313 } 314 } 315 316 HGDIOBJ FASTCALL 317 IntGetSysColorBrush(INT Object) 318 { 319 return ((Object < 0) || (NUM_SYSCOLORS <= Object)) ? NULL : gpsi->ahbrSystem[Object]; 320 } 321 322 DWORD FASTCALL 323 IntGetSysColor(INT nIndex) 324 { 325 return (NUM_SYSCOLORS <= (UINT)nIndex) ? 0 : gpsi->argbSystem[nIndex]; 326 } 327 328 VOID FASTCALL 329 CreateSysColorObjects(VOID) 330 { 331 UINT i; 332 333 for (i = 0; i < NUM_SYSCOLORS; i++) 334 { 335 gpsi->argbSystem[i] = SysColors[i]; 336 } 337 338 /* Create the syscolor brushes */ 339 for (i = 0; i < NUM_SYSCOLORS; i++) 340 { 341 if (gpsi->ahbrSystem[i] == NULL) 342 { 343 gpsi->ahbrSystem[i] = IntGdiCreateSolidBrush(SysColors[i]); 344 if (gpsi->ahbrSystem[i] != NULL) 345 { 346 GDIOBJ_ConvertToStockObj((HGDIOBJ*)&gpsi->ahbrSystem[i]); 347 } 348 } 349 } 350 } 351 352 /* EOF */ 353