diff --git a/dlls/wineps/font.c b/dlls/wineps/font.c index 6cf9b2a733f..994d8d76764 100644 --- a/dlls/wineps/font.c +++ b/dlls/wineps/font.c @@ -18,9 +18,15 @@ DEFAULT_DEBUG_CHANNEL(psdrv); */ inline static BOOL is_stock_font( HFONT font ) { - return (font >= FIRST_STOCK_FONT && font <= LAST_STOCK_FONT); + int i; + for (i = OEM_FIXED_FONT; i <= DEFAULT_GUI_FONT; i++) + { + if (i != DEFAULT_PALETTE && font == GetStockObject(i)) return TRUE; + } + return FALSE; } + /******************************************************************************* * ScaleFont * diff --git a/graphics/enhmetafiledrv/objects.c b/graphics/enhmetafiledrv/objects.c index 166816c4d4e..f6f0d602430 100644 --- a/graphics/enhmetafiledrv/objects.c +++ b/graphics/enhmetafiledrv/objects.c @@ -101,25 +101,24 @@ static HBRUSH EMFDRV_BRUSH_SelectObject(DC *dc, HBRUSH hBrush ) EMRSELECTOBJECT emr; DWORD index; HBRUSH hOldBrush; - + int i; + /* If the object is a stock brush object, do not need to create it. * See definitions in wingdi.h for range of stock brushes. * We do however have to handle setting the higher order bit to * designate that this is a stock object. */ - if (hBrush >= FIRST_STOCK_HANDLE && - hBrush <= FIRST_STOCK_HANDLE+HOLLOW_BRUSH ) + for (i = WHITE_BRUSH; i <= NULL_BRUSH; i++) { - DWORD brush_index = hBrush - FIRST_STOCK_HANDLE; - index = brush_index | 0x80000000; + if (hBrush == GetStockObject(i)) + { + index = i | 0x80000000; + goto found; + } } - else - { - index = EMFDRV_CreateBrushIndirect(dc, hBrush ); - } - - if(!index) return FALSE; + if (!(index = EMFDRV_CreateBrushIndirect(dc, hBrush ))) return 0; + found: emr.emr.iType = EMR_SELECTOBJECT; emr.emr.nSize = sizeof(emr); emr.ihObject = index; @@ -180,6 +179,7 @@ static HFONT EMFDRV_FONT_SelectObject( DC * dc, HFONT hFont ) EMRSELECTOBJECT emr; DWORD index; HFONT hOldFont; + int i; /* If the object is a stock font object, do not need to create it. * See definitions in wingdi.h for range of stock fonts. @@ -187,20 +187,16 @@ static HFONT EMFDRV_FONT_SelectObject( DC * dc, HFONT hFont ) * designate that this is a stock object. */ - if (hFont >= STOCK_OEM_FIXED_FONT && - hFont <= STOCK_DEFAULT_GUI_FONT && - hFont != STOCK_DEFAULT_PALETTE) + for (i = OEM_FIXED_FONT; i <= DEFAULT_GUI_FONT; i++) { - DWORD font_index = hFont - FIRST_STOCK_HANDLE; - index = font_index | 0x80000000; + if (i != DEFAULT_PALETTE && hFont == GetStockObject(i)) + { + index = i | 0x80000000; + goto found; + } } - else - { - index = EMFDRV_CreateFontIndirect(dc, hFont ); - } - - if(!index) return FALSE; - + if (!(index = EMFDRV_CreateFontIndirect(dc, hFont ))) return 0; + found: emr.emr.iType = EMR_SELECTOBJECT; emr.emr.nSize = sizeof(emr); emr.ihObject = index; @@ -241,6 +237,7 @@ static HPEN EMFDRV_PEN_SelectObject(DC *dc, HPEN hPen ) EMRSELECTOBJECT emr; DWORD index; HPEN hOldPen; + int i; /* If the object is a stock pen object, do not need to create it. * See definitions in wingdi.h for range of stock pens. @@ -248,19 +245,16 @@ static HPEN EMFDRV_PEN_SelectObject(DC *dc, HPEN hPen ) * designate that this is a stock object. */ - if (hPen >= STOCK_WHITE_PEN && - hPen <= STOCK_NULL_PEN ) + for (i = WHITE_PEN; i <= NULL_PEN; i++) { - DWORD pen_index = hPen - FIRST_STOCK_HANDLE; - index = pen_index | 0x80000000; + if (hPen == GetStockObject(i)) + { + index = i | 0x80000000; + goto found; + } } - else - { - index = EMFDRV_CreatePenIndirect(dc, hPen ); - } - - if(!index) return FALSE; - + if (!(index = EMFDRV_CreatePenIndirect(dc, hPen ))) return 0; + found: emr.emr.iType = EMR_SELECTOBJECT; emr.emr.nSize = sizeof(emr); emr.ihObject = index; diff --git a/graphics/x11drv/xfont.c b/graphics/x11drv/xfont.c index 17a980c2e82..79bdbf258d2 100644 --- a/graphics/x11drv/xfont.c +++ b/graphics/x11drv/xfont.c @@ -350,7 +350,12 @@ static Atom RAW_DESCENT; */ inline static BOOL is_stock_font( HFONT font ) { - return (font >= FIRST_STOCK_FONT && font <= LAST_STOCK_FONT); + int i; + for (i = OEM_FIXED_FONT; i <= DEFAULT_GUI_FONT; i++) + { + if (i != DEFAULT_PALETTE && font == GetStockObject(i)) return TRUE; + } + return FALSE; } diff --git a/include/gdi.h b/include/gdi.h index 704c094d1b4..5af26646979 100644 --- a/include/gdi.h +++ b/include/gdi.h @@ -246,41 +246,10 @@ typedef struct tagDC_FUNCS #define DC_DIRTY 0x0004 /* hVisRgn has to be updated */ #define DC_THUNKHOOK 0x0008 /* DC hook is in the 16-bit code */ - /* Last 32 bytes are reserved for stock object handles */ -#define GDI_HEAP_SIZE 0xffe0 +#define GDI_HEAP_SIZE 0xffe0 - /* First handle possible for stock objects (must be >= GDI_HEAP_SIZE) */ -#define FIRST_STOCK_HANDLE GDI_HEAP_SIZE - - /* Stock objects handles */ - -#define NB_STOCK_OBJECTS (DEFAULT_GUI_FONT + 1) - -#define STOCK_WHITE_BRUSH ((HBRUSH16)(FIRST_STOCK_HANDLE+WHITE_BRUSH)) -#define STOCK_LTGRAY_BRUSH ((HBRUSH16)(FIRST_STOCK_HANDLE+LTGRAY_BRUSH)) -#define STOCK_GRAY_BRUSH ((HBRUSH16)(FIRST_STOCK_HANDLE+GRAY_BRUSH)) -#define STOCK_DKGRAY_BRUSH ((HBRUSH16)(FIRST_STOCK_HANDLE+DKGRAY_BRUSH)) -#define STOCK_BLACK_BRUSH ((HBRUSH16)(FIRST_STOCK_HANDLE+BLACK_BRUSH)) -#define STOCK_NULL_BRUSH ((HBRUSH16)(FIRST_STOCK_HANDLE+NULL_BRUSH)) -#define STOCK_HOLLOW_BRUSH ((HBRUSH16)(FIRST_STOCK_HANDLE+HOLLOW_BRUSH)) -#define STOCK_WHITE_PEN ((HPEN16)(FIRST_STOCK_HANDLE+WHITE_PEN)) -#define STOCK_BLACK_PEN ((HPEN16)(FIRST_STOCK_HANDLE+BLACK_PEN)) -#define STOCK_NULL_PEN ((HPEN16)(FIRST_STOCK_HANDLE+NULL_PEN)) -#define STOCK_OEM_FIXED_FONT ((HFONT16)(FIRST_STOCK_HANDLE+OEM_FIXED_FONT)) -#define STOCK_ANSI_FIXED_FONT ((HFONT16)(FIRST_STOCK_HANDLE+ANSI_FIXED_FONT)) -#define STOCK_ANSI_VAR_FONT ((HFONT16)(FIRST_STOCK_HANDLE+ANSI_VAR_FONT)) -#define STOCK_SYSTEM_FONT ((HFONT16)(FIRST_STOCK_HANDLE+SYSTEM_FONT)) -#define STOCK_DEVICE_DEFAULT_FONT ((HFONT16)(FIRST_STOCK_HANDLE+DEVICE_DEFAULT_FONT)) -#define STOCK_DEFAULT_PALETTE ((HPALETTE16)(FIRST_STOCK_HANDLE+DEFAULT_PALETTE)) -#define STOCK_SYSTEM_FIXED_FONT ((HFONT16)(FIRST_STOCK_HANDLE+SYSTEM_FIXED_FONT)) -#define STOCK_DEFAULT_GUI_FONT ((HFONT16)(FIRST_STOCK_HANDLE+DEFAULT_GUI_FONT)) - -#define FIRST_STOCK_FONT STOCK_OEM_FIXED_FONT -#define LAST_STOCK_FONT STOCK_DEFAULT_GUI_FONT - -#define LAST_STOCK_HANDLE ((DWORD)STOCK_DEFAULT_GUI_FONT) - -extern HBITMAP hPseudoStockBitmap; +/* extra stock object: default 1x1 bitmap for memory DCs */ +#define DEFAULT_BITMAP (STOCK_LAST+1) /* Device <-> logical coords conversion */ diff --git a/objects/dc.c b/objects/dc.c index d73dbbf4f54..22993616890 100644 --- a/objects/dc.c +++ b/objects/dc.c @@ -681,7 +681,7 @@ HDC WINAPI CreateCompatibleDC( HDC hdc ) dc->flags = DC_MEMORY; dc->bitsPerPixel = 1; - dc->hBitmap = hPseudoStockBitmap; + dc->hBitmap = GetStockObject( DEFAULT_BITMAP ); /* Copy the driver-specific physical device info into * the new DC. The driver may use this read-only info diff --git a/objects/gdiobj.c b/objects/gdiobj.c index ff69b03201d..1a2b621851e 100644 --- a/objects/gdiobj.c +++ b/objects/gdiobj.c @@ -34,247 +34,116 @@ DEFAULT_DEBUG_CHANNEL(gdi); * GDI stock objects */ -static BRUSHOBJ WhiteBrush = -{ - { 0, BRUSH_MAGIC, 1 }, /* header */ - { BS_SOLID, RGB(255,255,255), 0 } /* logbrush */ -}; +static const LOGBRUSH WhiteBrush = { BS_SOLID, RGB(255,255,255), 0 }; +static const LOGBRUSH BlackBrush = { BS_SOLID, RGB(0,0,0), 0 }; +static const LOGBRUSH NullBrush = { BS_NULL, 0, 0 }; -static BRUSHOBJ LtGrayBrush = -{ - { 0, BRUSH_MAGIC, 1 }, /* header */ -/* FIXME : this should perhaps be BS_HATCHED, at least for 1 bitperpixel */ - { BS_SOLID, RGB(192,192,192), 0 } /* logbrush */ -}; +/* FIXME: these should perhaps be BS_HATCHED, at least for 1 bitperpixel */ +static const LOGBRUSH LtGrayBrush = { BS_SOLID, RGB(192,192,192), 0 }; +static const LOGBRUSH GrayBrush = { BS_SOLID, RGB(128,128,128), 0 }; -static BRUSHOBJ GrayBrush = -{ - { 0, BRUSH_MAGIC, 1 }, /* header */ -/* FIXME : this should perhaps be BS_HATCHED, at least for 1 bitperpixel */ - { BS_SOLID, RGB(128,128,128), 0 } /* logbrush */ -}; - -static BRUSHOBJ DkGrayBrush = -{ - { 0, BRUSH_MAGIC, 1 }, /* header */ /* This is BS_HATCHED, for 1 bitperpixel. This makes the spray work in pbrush */ /* NB_HATCH_STYLES is an index into HatchBrushes */ - { BS_HATCHED, RGB(0,0,0), NB_HATCH_STYLES } /* logbrush */ -}; +static const LOGBRUSH DkGrayBrush = { BS_HATCHED, RGB(0,0,0), NB_HATCH_STYLES }; -static BRUSHOBJ BlackBrush = -{ - { 0, BRUSH_MAGIC, 1 }, /* header */ - { BS_SOLID, RGB(0,0,0), 0 } /* logbrush */ -}; +static const LOGPEN WhitePen = { PS_SOLID, { 0, 0 }, RGB(255,255,255) }; +static const LOGPEN BlackPen = { PS_SOLID, { 0, 0 }, RGB(0,0,0) }; +static const LOGPEN NullPen = { PS_NULL, { 0, 0 }, 0 }; -static BRUSHOBJ NullBrush = -{ - { 0, BRUSH_MAGIC, 1 }, /* header */ - { BS_NULL, 0, 0 } /* logbrush */ -}; +static const LOGFONTW OEMFixedFont = +{ 12, 0, 0, 0, FW_NORMAL, FALSE, FALSE, FALSE, OEM_CHARSET, + 0, 0, DEFAULT_QUALITY, FIXED_PITCH | FF_MODERN, {'\0'} }; -static PENOBJ WhitePen = -{ - { 0, PEN_MAGIC, 1 }, /* header */ - { PS_SOLID, { 0, 0 }, RGB(255,255,255) } /* logpen */ -}; +static const LOGFONTW AnsiFixedFont = +{ 12, 0, 0, 0, FW_NORMAL, FALSE, FALSE, FALSE, ANSI_CHARSET, + 0, 0, DEFAULT_QUALITY, FIXED_PITCH | FF_MODERN, {'\0'} }; -static PENOBJ BlackPen = -{ - { 0, PEN_MAGIC, 1 }, /* header */ - { PS_SOLID, { 0, 0 }, RGB(0,0,0) } /* logpen */ -}; +static const LOGFONTW AnsiVarFont = +{ 12, 0, 0, 0, FW_NORMAL, FALSE, FALSE, FALSE, ANSI_CHARSET, + 0, 0, DEFAULT_QUALITY, VARIABLE_PITCH | FF_SWISS, + {'M','S',' ','S','a','n','s',' ','S','e','r','i','f','\0'} }; -static PENOBJ NullPen = -{ - { 0, PEN_MAGIC, 1 }, /* header */ - { PS_NULL, { 0, 0 }, 0 } /* logpen */ -}; +static const LOGFONTW SystemFont = +{ 16, 0, 0, 0, FW_NORMAL, FALSE, FALSE, FALSE, ANSI_CHARSET, + 0, 0, DEFAULT_QUALITY, VARIABLE_PITCH | FF_SWISS, + {'S','y','s','t','e','m','\0'} }; -static FONTOBJ OEMFixedFont = -{ - { 0, FONT_MAGIC, 1 }, /* header */ - { 0, 0, 0, 0, FW_NORMAL, FALSE, FALSE, FALSE, OEM_CHARSET, - 0, 0, DEFAULT_QUALITY, FIXED_PITCH | FF_MODERN, {'\0'} } -}; +static const LOGFONTW DeviceDefaultFont = +{ 16, 0, 0, 0, FW_NORMAL, FALSE, FALSE, FALSE, ANSI_CHARSET, + 0, 0, DEFAULT_QUALITY, VARIABLE_PITCH | FF_SWISS, {'\0'} }; -static FONTOBJ AnsiFixedFont = -{ - { 0, FONT_MAGIC, 1 }, /* header */ - { 0, 0, 0, 0, FW_NORMAL, FALSE, FALSE, FALSE, ANSI_CHARSET, - 0, 0, DEFAULT_QUALITY, FIXED_PITCH | FF_MODERN, {'\0'} } -}; - -static FONTOBJ AnsiVarFont = -{ - { 0, FONT_MAGIC, 1 }, /* header */ - { 0, 0, 0, 0, FW_NORMAL, FALSE, FALSE, FALSE, ANSI_CHARSET, - 0, 0, DEFAULT_QUALITY, VARIABLE_PITCH | FF_SWISS, - {'M','S',' ','S','a','n','s',' ','S','e','r','i','f','\0'} } -}; - -static FONTOBJ SystemFont = -{ - { 0, FONT_MAGIC, 1 }, - { 0, 0, 0, 0, FW_NORMAL, FALSE, FALSE, FALSE, ANSI_CHARSET, - 0, 0, DEFAULT_QUALITY, VARIABLE_PITCH | FF_SWISS, - {'S','y','s','t','e','m','\0'} } -}; - -static FONTOBJ DeviceDefaultFont = -{ - { 0, FONT_MAGIC, 1 }, /* header */ - { 0, 0, 0, 0, FW_NORMAL, FALSE, FALSE, FALSE, ANSI_CHARSET, - 0, 0, DEFAULT_QUALITY, VARIABLE_PITCH | FF_SWISS, {'\0'} } -}; - -static FONTOBJ SystemFixedFont = -{ - { 0, FONT_MAGIC, 1 }, /* header */ - { 0, 0, 0, 0, FW_NORMAL, FALSE, FALSE, FALSE, ANSI_CHARSET, - 0, 0, DEFAULT_QUALITY, FIXED_PITCH | FF_MODERN, {'\0'} } -}; +static const LOGFONTW SystemFixedFont = +{ 16, 0, 0, 0, FW_NORMAL, FALSE, FALSE, FALSE, ANSI_CHARSET, + 0, 0, DEFAULT_QUALITY, FIXED_PITCH | FF_MODERN, {'\0'} }; /* FIXME: Is this correct? */ -static FONTOBJ DefaultGuiFont = -{ - { 0, FONT_MAGIC, 1 }, /* header */ - { 0, 0, 0, 0, FW_NORMAL, FALSE, FALSE, FALSE, ANSI_CHARSET, - 0, 0, DEFAULT_QUALITY, VARIABLE_PITCH | FF_SWISS, - {'M','S',' ','S','a','n','s',' ','S','e','r','i','f','\0'} } -}; +static const LOGFONTW DefaultGuiFont = +{ -11, 0, 0, 0, FW_NORMAL, FALSE, FALSE, FALSE, ANSI_CHARSET, + 0, 0, DEFAULT_QUALITY, VARIABLE_PITCH | FF_SWISS, + {'M','S',' ','S','a','n','s',' ','S','e','r','i','f','\0'} }; +/* reserve one extra entry for the stock default bitmap */ +/* this is what Windows does too */ +#define NB_STOCK_OBJECTS (STOCK_LAST+2) -static GDIOBJHDR * StockObjects[NB_STOCK_OBJECTS] = -{ - (GDIOBJHDR *) &WhiteBrush, - (GDIOBJHDR *) &LtGrayBrush, - (GDIOBJHDR *) &GrayBrush, - (GDIOBJHDR *) &DkGrayBrush, - (GDIOBJHDR *) &BlackBrush, - (GDIOBJHDR *) &NullBrush, - (GDIOBJHDR *) &WhitePen, - (GDIOBJHDR *) &BlackPen, - (GDIOBJHDR *) &NullPen, - NULL, - (GDIOBJHDR *) &OEMFixedFont, - (GDIOBJHDR *) &AnsiFixedFont, - (GDIOBJHDR *) &AnsiVarFont, - (GDIOBJHDR *) &SystemFont, - (GDIOBJHDR *) &DeviceDefaultFont, - NULL, /* DEFAULT_PALETTE created by PALETTE_Init */ - (GDIOBJHDR *) &SystemFixedFont, - (GDIOBJHDR *) &DefaultGuiFont -}; - -HBITMAP hPseudoStockBitmap; /* 1x1 bitmap for memory DCs */ +static HGDIOBJ stock_objects[NB_STOCK_OBJECTS]; static SYSLEVEL GDI_level = { CRITICAL_SECTION_INIT("GDI_level"), 3 }; static WORD GDI_HeapSel; -static BOOL get_bool(char *buffer, BOOL def_value) +inline static BOOL get_bool(char *buffer) { - switch(buffer[0]) - { - case 'n': - case 'N': - case 'f': - case 'F': - case '0': - return FALSE; - - case 'y': - case 'Y': - case 't': - case 'T': - case '1': - return TRUE; - - default: - return def_value; - } + return (buffer[0] == 'y' || buffer[0] == 'Y' || + buffer[0] == 't' || buffer[0] == 'T' || + buffer[0] == '1'); } -/****************************************************************************** - * - * void ReadFontInformation( - * char const *fontName, - * FONTOBJ *font, - * int defHeight, - * int defBold, - * int defItalic, - * int defUnderline, - * int defStrikeOut ) - * - * ReadFontInformation() checks the Wine configuration file's Tweak.Fonts - * section for entries containing fontName.Height, fontName.Bold, etc., - * where fontName is the name specified in the call (e.g., "System"). It - * attempts to be user friendly by accepting 'n', 'N', 'f', 'F', or '0' as - * the first character in the boolean attributes (bold, italic, and - * underline). - *****************************************************************************/ -static void ReadFontInformation( - char const *fontName, - FONTOBJ *font, - int defHeight, - int defBold, - int defItalic, - int defUnderline, - int defStrikeOut ) +/****************************************************************************** + * create_stock_font + */ +static HFONT create_stock_font( char const *fontName, const LOGFONTW *font, HKEY hkey ) { + LOGFONTW lf; char key[256]; char buffer[MAX_PATH]; - HKEY hkey; DWORD type, count; - /* In order for the stock fonts to be independent of - * mapping mode, the height (& width) must be 0 - */ - - /* assign defaults */ - font->logfont.lfHeight = defHeight; - font->logfont.lfWeight = defBold; - font->logfont.lfItalic = defItalic; - font->logfont.lfUnderline = defUnderline; - font->logfont.lfStrikeOut = defStrikeOut; - - if(RegOpenKeyA(HKEY_LOCAL_MACHINE, "Software\\Wine\\Wine\\Config\\Tweak.Fonts", &hkey)) - return; + if (!hkey) return CreateFontIndirectW( font ); + lf = *font; sprintf(key, "%s.Height", fontName); count = sizeof(buffer); if(!RegQueryValueExA(hkey, key, 0, &type, buffer, &count)) - font->logfont.lfHeight = atoi(buffer); + lf.lfHeight = atoi(buffer); sprintf(key, "%s.Bold", fontName); count = sizeof(buffer); if(!RegQueryValueExA(hkey, key, 0, &type, buffer, &count)) - font->logfont.lfWeight = get_bool(buffer, defBold) ? FW_BOLD : FW_NORMAL; + lf.lfWeight = get_bool(buffer) ? FW_BOLD : FW_NORMAL; sprintf(key, "%s.Italic", fontName); count = sizeof(buffer); if(!RegQueryValueExA(hkey, key, 0, &type, buffer, &count)) - font->logfont.lfItalic = get_bool(buffer, defItalic); + lf.lfItalic = get_bool(buffer); sprintf(key, "%s.Underline", fontName); count = sizeof(buffer); if(!RegQueryValueExA(hkey, key, 0, &type, buffer, &count)) - font->logfont.lfUnderline = get_bool(buffer, defUnderline); + lf.lfUnderline = get_bool(buffer); sprintf(key, "%s.StrikeOut", fontName); count = sizeof(buffer); if(!RegQueryValueExA(hkey, key, 0, &type, buffer, &count)) - font->logfont.lfStrikeOut = get_bool(buffer, defStrikeOut); - - RegCloseKey(hkey); + lf.lfStrikeOut = get_bool(buffer); + return CreateFontIndirectW( &lf ); } #define TRACE_SEC(handle,text) \ TRACE("(%04x): " text " %ld\n", (handle), GDI_level.crst.RecursionCount) + /*********************************************************************** * GDI_Init * @@ -282,30 +151,57 @@ static void ReadFontInformation( */ BOOL GDI_Init(void) { - HPALETTE16 hpalette; HINSTANCE16 instance; + HKEY hkey; + GDIOBJHDR *ptr; + int i; + + if (RegOpenKeyA(HKEY_LOCAL_MACHINE, "Software\\Wine\\Wine\\Config\\Tweak.Fonts", &hkey)) + hkey = 0; /* create GDI heap */ if ((instance = LoadLibrary16( "GDI.EXE" )) < 32) return FALSE; GDI_HeapSel = instance | 7; - /* TWEAK: Initialize font hints */ - ReadFontInformation("OEMFixed", &OEMFixedFont, 12, 0, 0, 0, 0); - ReadFontInformation("AnsiFixed", &AnsiFixedFont, 12, 0, 0, 0, 0); - ReadFontInformation("AnsiVar", &AnsiVarFont, 12, 0, 0, 0, 0); - ReadFontInformation("System", &SystemFont, 16, 0, 0, 0, 0); - ReadFontInformation("DeviceDefault", &DeviceDefaultFont, 16, 0, 0, 0, 0); - ReadFontInformation("SystemFixed", &SystemFixedFont, 16, 0, 0, 0, 0); - ReadFontInformation("DefaultGui", &DefaultGuiFont, -11, 0, 0, 0, 0); + /* create stock objects */ + stock_objects[WHITE_BRUSH] = CreateBrushIndirect( &WhiteBrush ); + stock_objects[LTGRAY_BRUSH] = CreateBrushIndirect( &LtGrayBrush ); + stock_objects[GRAY_BRUSH] = CreateBrushIndirect( &GrayBrush ); + stock_objects[DKGRAY_BRUSH] = CreateBrushIndirect( &DkGrayBrush ); + stock_objects[BLACK_BRUSH] = CreateBrushIndirect( &BlackBrush ); + stock_objects[NULL_BRUSH] = CreateBrushIndirect( &NullBrush ); - /* Create default palette */ + stock_objects[WHITE_PEN] = CreatePenIndirect( &WhitePen ); + stock_objects[BLACK_PEN] = CreatePenIndirect( &BlackPen ); + stock_objects[NULL_PEN] = CreatePenIndirect( &NullPen ); - /* DR well *this* palette can't be moveable (?) */ - hpalette = PALETTE_Init(); - if( !hpalette ) return FALSE; - StockObjects[DEFAULT_PALETTE] = (GDIOBJHDR *)LOCAL_Lock( GDI_HeapSel, hpalette ); + stock_objects[DEFAULT_PALETTE] = PALETTE_Init(); + stock_objects[DEFAULT_BITMAP] = CreateBitmap( 1, 1, 1, 1, NULL ); - hPseudoStockBitmap = CreateBitmap( 1, 1, 1, 1, NULL ); + stock_objects[OEM_FIXED_FONT] = create_stock_font( "OEMFixed", &OEMFixedFont, hkey ); + stock_objects[ANSI_FIXED_FONT] = create_stock_font( "AnsiFixed", &AnsiFixedFont, hkey ); + stock_objects[ANSI_VAR_FONT] = create_stock_font( "AnsiVar", &AnsiVarFont, hkey ); + stock_objects[SYSTEM_FONT] = create_stock_font( "System", &SystemFont, hkey ); + stock_objects[DEVICE_DEFAULT_FONT] = create_stock_font( "DeviceDefault", &DeviceDefaultFont, hkey ); + stock_objects[SYSTEM_FIXED_FONT] = create_stock_font( "SystemFixed", &SystemFixedFont, hkey ); + stock_objects[DEFAULT_GUI_FONT] = create_stock_font( "DefaultGui", &DefaultGuiFont, hkey ); + + + /* clear the NOSYSTEM bit on all stock objects*/ + for (i = 0; i < NB_STOCK_OBJECTS; i++) + { + if (!stock_objects[i]) + { + if (i == 9) continue; /* there's no stock object 9 */ + ERR( "could not create stock object %d\n", i ); + return FALSE; + } + ptr = GDI_GetObjPtr( stock_objects[i], MAGIC_DONTCARE ); + ptr->wMagic &= ~OBJECT_NOSYSTEM; + GDI_ReleaseObj( stock_objects[i] ); + } + + if (hkey) RegCloseKey( hkey ); return TRUE; } @@ -415,23 +311,19 @@ BOOL GDI_FreeObject( HGDIOBJ handle, void *ptr ) { GDIOBJHDR *object = ptr; - /* can't free stock objects */ - if (handle < FIRST_STOCK_HANDLE) + object->wMagic = 0; /* Mark it as invalid */ + if (handle & 2) /* GDI heap handle */ { - object->wMagic = 0; /* Mark it as invalid */ - if (handle & 2) /* GDI heap handle */ + LOCAL_Unlock( GDI_HeapSel, handle ); + LOCAL_Free( GDI_HeapSel, handle ); + } + else /* large heap handle */ + { + int i = (handle >> 2) - FIRST_LARGE_HANDLE; + if (i >= 0 && large_handles[i]) { - LOCAL_Unlock( GDI_HeapSel, handle ); - LOCAL_Free( GDI_HeapSel, handle ); - } - else /* large heap handle */ - { - int i = (handle >> 2) - FIRST_LARGE_HANDLE; - if (i >= 0 && large_handles[i]) - { - HeapFree( GetProcessHeap(), 0, large_handles[i] ); - large_handles[i] = NULL; - } + HeapFree( GetProcessHeap(), 0, large_handles[i] ); + large_handles[i] = NULL; } } TRACE_SEC( handle, "leave" ); @@ -453,17 +345,10 @@ void *GDI_GetObjPtr( HGDIOBJ handle, WORD magic ) _EnterSysLevel( &GDI_level ); - if (handle >= FIRST_STOCK_HANDLE) - { - if (handle <= LAST_STOCK_HANDLE) ptr = StockObjects[handle - FIRST_STOCK_HANDLE]; - if (ptr && (magic != MAGIC_DONTCARE) - && (GDIMAGIC(ptr->wMagic) != magic)) ptr = NULL; - } - else if (handle & 2) /* GDI heap handle */ + if (handle & 2) /* GDI heap handle */ { ptr = (GDIOBJHDR *)LOCAL_Lock( GDI_HeapSel, handle ); - if (ptr && - (magic != MAGIC_DONTCARE) && (GDIMAGIC(ptr->wMagic) != magic)) + if (ptr && (magic != MAGIC_DONTCARE) && (GDIMAGIC(ptr->wMagic) != magic)) { LOCAL_Unlock( GDI_HeapSel, handle ); ptr = NULL; @@ -496,7 +381,7 @@ void *GDI_GetObjPtr( HGDIOBJ handle, WORD magic ) */ void GDI_ReleaseObj( HGDIOBJ handle ) { - if (handle < FIRST_STOCK_HANDLE && (handle & 2)) LOCAL_Unlock( GDI_HeapSel, handle ); + if (handle & 2) LOCAL_Unlock( GDI_HeapSel, handle ); TRACE_SEC( handle, "leave" ); _LeaveSysLevel( &GDI_level ); } @@ -530,12 +415,7 @@ BOOL WINAPI DeleteObject( HGDIOBJ obj ) GDIOBJHDR * header; if (HIWORD(obj)) return FALSE; - if ((obj >= FIRST_STOCK_HANDLE) && (obj <= LAST_STOCK_HANDLE)) { - TRACE("Preserving Stock object %04x\n", obj ); - /* NOTE: No GDI_Release is necessary */ - return TRUE; - } - if (obj == hPseudoStockBitmap) return TRUE; + if (!(header = GDI_GetObjPtr( obj, MAGIC_DONTCARE ))) return FALSE; if (!(header->wMagic & OBJECT_NOSYSTEM) @@ -587,8 +467,7 @@ HGDIOBJ WINAPI GetStockObject( INT obj ) { HGDIOBJ ret; if ((obj < 0) || (obj >= NB_STOCK_OBJECTS)) return 0; - if (!StockObjects[obj]) return 0; - ret = (HGDIOBJ16)(FIRST_STOCK_HANDLE + obj); + ret = stock_objects[obj]; TRACE("returning %4x\n", ret ); return ret; } diff --git a/windows/syscolor.c b/windows/syscolor.c index c43a9ce80a6..6f69389c5b8 100644 --- a/windows/syscolor.c +++ b/windows/syscolor.c @@ -98,9 +98,6 @@ static COLORREF SysColors[NUM_SYS_COLORS]; static HBRUSH SysColorBrushes[NUM_SYS_COLORS]; static HPEN SysColorPens[NUM_SYS_COLORS]; -#define MAKE_SOLID(color) \ - (PALETTEINDEX(GetNearestPaletteIndex(STOCK_DEFAULT_PALETTE,(color)))) - /************************************************************************* * SYSCOLOR_MakeObjectSystem