Jacek Caban : gdi32: Use ntgdi functions to create stock objects.

Alexandre Julliard julliard at winehq.org
Fri Sep 3 16:25:29 CDT 2021


Module: wine
Branch: master
Commit: c33b7b583b4067639ce8e4bbea2965cb2bf091de
URL:    https://source.winehq.org/git/wine.git/?a=commit;h=c33b7b583b4067639ce8e4bbea2965cb2bf091de

Author: Jacek Caban <jacek at codeweavers.com>
Date:   Fri Sep  3 13:59:49 2021 +0100

gdi32: Use ntgdi functions to create stock objects.

Signed-off-by: Jacek Caban <jacek at codeweavers.com>
Signed-off-by: Huw Davies <huw at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

 dlls/gdi32/gdiobj.c        | 40 ++++++++++++++++++++++------------------
 dlls/gdi32/ntgdi_private.h |  3 +++
 dlls/gdi32/palette.c       |  2 +-
 dlls/gdi32/pen.c           | 18 +++++++++++-------
 4 files changed, 37 insertions(+), 26 deletions(-)

diff --git a/dlls/gdi32/gdiobj.c b/dlls/gdi32/gdiobj.c
index 14b65429d4a..ffb42ab88e2 100644
--- a/dlls/gdi32/gdiobj.c
+++ b/dlls/gdi32/gdiobj.c
@@ -80,12 +80,7 @@ static const LOGBRUSH LtGrayBrush = { BS_SOLID, RGB(192,192,192), 0 };
 static const LOGBRUSH GrayBrush   = { BS_SOLID, RGB(128,128,128), 0 };
 static const LOGBRUSH DkGrayBrush = { BS_SOLID, RGB(64,64,64), 0 };
 
-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 const LOGBRUSH DCBrush = { BS_SOLID, RGB(255,255,255), 0 };
-static const LOGPEN DCPen     = { PS_SOLID, { 0, 0 }, RGB(0,0,0) };
 
 /* reserve one extra entry for the stock default bitmap */
 /* this is what Windows does too */
@@ -582,6 +577,15 @@ DWORD get_system_dpi(void)
     return pGetDpiForSystem ? pGetDpiForSystem() : 96;
 }
 
+static HFONT create_font( const LOGFONTW *deffont )
+{
+    ENUMLOGFONTEXDVW lf;
+
+    memset( &lf, 0, sizeof(lf) );
+    lf.elfEnumLogfontEx.elfLogFont = *deffont;
+    return NtGdiHfontCreate( &lf, sizeof(lf), 0, 0, NULL );
+}
+
 static HFONT create_scaled_font( const LOGFONTW *deffont )
 {
     LOGFONTW lf;
@@ -595,7 +599,7 @@ static HFONT create_scaled_font( const LOGFONTW *deffont )
 
     lf = *deffont;
     lf.lfHeight = MulDiv( lf.lfHeight, dpi, 96 );
-    return CreateFontIndirectW( &lf );
+    return create_font( &lf );
 }
 
 static void set_gdi_shared(void)
@@ -648,24 +652,24 @@ BOOL WINAPI DllMain( HINSTANCE inst, DWORD reason, LPVOID reserved )
     stock_objects[BLACK_BRUSH]  = create_brush( &BlackBrush );
     stock_objects[NULL_BRUSH]   = create_brush( &NullBrush );
 
-    stock_objects[WHITE_PEN]    = CreatePenIndirect( &WhitePen );
-    stock_objects[BLACK_PEN]    = CreatePenIndirect( &BlackPen );
-    stock_objects[NULL_PEN]     = CreatePenIndirect( &NullPen );
+    stock_objects[WHITE_PEN]    = create_pen( PS_SOLID, 0, RGB(255,255,255) );
+    stock_objects[BLACK_PEN]    = create_pen( PS_SOLID, 0, RGB(0,0,0) );
+    stock_objects[NULL_PEN]     = create_pen( PS_NULL, 0, RGB(0,0,0) );
 
     stock_objects[DEFAULT_PALETTE] = PALETTE_Init();
-    stock_objects[DEFAULT_BITMAP]  = CreateBitmap( 1, 1, 1, 1, NULL );
+    stock_objects[DEFAULT_BITMAP]  = NtGdiCreateBitmap( 1, 1, 1, 1, NULL );
 
     /* language-independent stock fonts */
-    stock_objects[OEM_FIXED_FONT]      = CreateFontIndirectW( &OEMFixedFont );
-    stock_objects[ANSI_FIXED_FONT]     = CreateFontIndirectW( &AnsiFixedFont );
-    stock_objects[ANSI_VAR_FONT]       = CreateFontIndirectW( &AnsiVarFont );
+    stock_objects[OEM_FIXED_FONT]      = create_font( &OEMFixedFont );
+    stock_objects[ANSI_FIXED_FONT]     = create_font( &AnsiFixedFont );
+    stock_objects[ANSI_VAR_FONT]       = create_font( &AnsiVarFont );
 
     /* language-dependent stock fonts */
     deffonts = get_default_fonts(get_default_charset());
-    stock_objects[SYSTEM_FONT]         = CreateFontIndirectW( &deffonts->SystemFont );
-    stock_objects[DEVICE_DEFAULT_FONT] = CreateFontIndirectW( &deffonts->DeviceDefaultFont );
-    stock_objects[SYSTEM_FIXED_FONT]   = CreateFontIndirectW( &deffonts->SystemFixedFont );
-    stock_objects[DEFAULT_GUI_FONT]    = CreateFontIndirectW( &deffonts->DefaultGuiFont );
+    stock_objects[SYSTEM_FONT]         = create_font( &deffonts->SystemFont );
+    stock_objects[DEVICE_DEFAULT_FONT] = create_font( &deffonts->DeviceDefaultFont );
+    stock_objects[SYSTEM_FIXED_FONT]   = create_font( &deffonts->SystemFixedFont );
+    stock_objects[DEFAULT_GUI_FONT]    = create_font( &deffonts->DefaultGuiFont );
 
     scaled_stock_objects[OEM_FIXED_FONT]    = create_scaled_font( &OEMFixedFont );
     scaled_stock_objects[SYSTEM_FONT]       = create_scaled_font( &deffonts->SystemFont );
@@ -673,7 +677,7 @@ BOOL WINAPI DllMain( HINSTANCE inst, DWORD reason, LPVOID reserved )
     scaled_stock_objects[DEFAULT_GUI_FONT]  = create_scaled_font( &deffonts->DefaultGuiFont );
 
     stock_objects[DC_BRUSH]     = create_brush( &DCBrush );
-    stock_objects[DC_PEN]       = CreatePenIndirect( &DCPen );
+    stock_objects[DC_PEN]       = create_pen( PS_SOLID, 0, RGB(0,0,0) );
 
     /* clear the NOSYSTEM bit on all stock objects*/
     for (i = 0; i < NB_STOCK_OBJECTS; i++)
diff --git a/dlls/gdi32/ntgdi_private.h b/dlls/gdi32/ntgdi_private.h
index a438a3f93ae..73870fcd2f8 100644
--- a/dlls/gdi32/ntgdi_private.h
+++ b/dlls/gdi32/ntgdi_private.h
@@ -453,6 +453,9 @@ extern HPALETTE PALETTE_Init(void) DECLSPEC_HIDDEN;
 extern UINT get_palette_entries( HPALETTE hpalette, UINT start, UINT count,
                                  PALETTEENTRY *entries ) DECLSPEC_HIDDEN;
 
+/* pen.c */
+extern HPEN create_pen( INT style, INT width, COLORREF color ) DECLSPEC_HIDDEN;
+
 /* region.c */
 extern BOOL add_rect_to_region( HRGN rgn, const RECT *rect ) DECLSPEC_HIDDEN;
 extern INT mirror_region( HRGN dst, HRGN src, INT width ) DECLSPEC_HIDDEN;
diff --git a/dlls/gdi32/palette.c b/dlls/gdi32/palette.c
index aa7745dc65f..0451adbdf80 100644
--- a/dlls/gdi32/palette.c
+++ b/dlls/gdi32/palette.c
@@ -89,7 +89,7 @@ HPALETTE PALETTE_Init(void)
         palPtr->palPalEntry[i].peBlue  = entries[i < 10 ? i : 236 + i].rgbBlue;
         palPtr->palPalEntry[i].peFlags = 0;
     }
-    return CreatePalette( palPtr );
+    return NtGdiCreatePaletteInternal( palPtr, palPtr->palNumEntries );
 }
 
 
diff --git a/dlls/gdi32/pen.c b/dlls/gdi32/pen.c
index ff2a766d40c..f79eaca4185 100644
--- a/dlls/gdi32/pen.c
+++ b/dlls/gdi32/pen.c
@@ -50,17 +50,12 @@ static const struct gdi_obj_funcs pen_funcs =
     PEN_DeleteObject   /* pDeleteObject */
 };
 
-
-/***********************************************************************
- *           NtGdiCreatePen    (win32u.@)
- */
-HPEN WINAPI NtGdiCreatePen( INT style, INT width, COLORREF color, HBRUSH brush )
+HPEN create_pen( INT style, INT width, COLORREF color )
 {
     PENOBJ *penPtr;
     HPEN hpen;
 
     TRACE( "%d %d %06x\n", style, width, color );
-    if (brush) FIXME( "brush not supported\n" );
 
     switch (style)
     {
@@ -72,7 +67,6 @@ HPEN WINAPI NtGdiCreatePen( INT style, INT width, COLORREF color, HBRUSH brush )
     case PS_INSIDEFRAME:
         break;
     case PS_NULL:
-        if ((hpen = GetStockObject( NULL_PEN ))) return hpen;
         width = 1;
         color = 0;
         break;
@@ -92,6 +86,16 @@ HPEN WINAPI NtGdiCreatePen( INT style, INT width, COLORREF color, HBRUSH brush )
     return hpen;
 }
 
+/***********************************************************************
+ *           NtGdiCreatePen    (win32u.@)
+ */
+HPEN WINAPI NtGdiCreatePen( INT style, INT width, COLORREF color, HBRUSH brush )
+{
+    if (brush) FIXME( "brush not supported\n" );
+    if (style == PS_NULL) return GetStockObject( NULL_PEN );
+    return create_pen( style, width, color );
+}
+
 /***********************************************************************
  *           NtGdiExtCreatePen    (win32u.@)
  */




More information about the wine-cvs mailing list