Alexandre Julliard : gdi32: Avoid calling GetObject16 from 32-bit code.

Alexandre Julliard julliard at winehq.org
Tue Feb 19 08:05:11 CST 2008


Module: wine
Branch: master
Commit: 1fa9e526ff0931991aa547c8137327f6143307bc
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=1fa9e526ff0931991aa547c8137327f6143307bc

Author: Alexandre Julliard <julliard at winehq.org>
Date:   Mon Feb 18 18:07:51 2008 +0100

gdi32: Avoid calling GetObject16 from 32-bit code.

---

 dlls/gdi32/mfdrv/objects.c |   51 +++++++++++++++++++++++++++++++++----------
 1 files changed, 39 insertions(+), 12 deletions(-)

diff --git a/dlls/gdi32/mfdrv/objects.c b/dlls/gdi32/mfdrv/objects.c
index a43598b..c6dbb87 100644
--- a/dlls/gdi32/mfdrv/objects.c
+++ b/dlls/gdi32/mfdrv/objects.c
@@ -354,14 +354,32 @@ HBRUSH MFDRV_SelectBrush( PHYSDEV dev, HBRUSH hbrush )
  *         MFDRV_CreateFontIndirect
  */
 
-static UINT16 MFDRV_CreateFontIndirect(PHYSDEV dev, HFONT hFont, LOGFONT16 *logfont)
+static UINT16 MFDRV_CreateFontIndirect(PHYSDEV dev, HFONT hFont, LOGFONTW *logfont)
 {
     char buffer[sizeof(METARECORD) - 2 + sizeof(LOGFONT16)];
     METARECORD *mr = (METARECORD *)&buffer;
+    LOGFONT16 *font16;
 
     mr->rdSize = (sizeof(METARECORD) + sizeof(LOGFONT16) - 2) / 2;
     mr->rdFunction = META_CREATEFONTINDIRECT;
-    memcpy(&(mr->rdParm), logfont, sizeof(LOGFONT16));
+    font16 = (LOGFONT16 *)&mr->rdParm;
+
+    font16->lfHeight         = logfont->lfHeight;
+    font16->lfWidth          = logfont->lfWidth;
+    font16->lfEscapement     = logfont->lfEscapement;
+    font16->lfOrientation    = logfont->lfOrientation;
+    font16->lfWeight         = logfont->lfWeight;
+    font16->lfItalic         = logfont->lfItalic;
+    font16->lfUnderline      = logfont->lfUnderline;
+    font16->lfStrikeOut      = logfont->lfStrikeOut;
+    font16->lfCharSet        = logfont->lfCharSet;
+    font16->lfOutPrecision   = logfont->lfOutPrecision;
+    font16->lfClipPrecision  = logfont->lfClipPrecision;
+    font16->lfQuality        = logfont->lfQuality;
+    font16->lfPitchAndFamily = logfont->lfPitchAndFamily;
+    WideCharToMultiByte( CP_ACP, 0, logfont->lfFaceName, -1, font16->lfFaceName, LF_FACESIZE, NULL, NULL );
+    font16->lfFaceName[LF_FACESIZE-1] = 0;
+
     if (!(MFDRV_WriteRecord( dev, mr, mr->rdSize * 2)))
         return 0;
     return MFDRV_AddHandle( dev, hFont );
@@ -374,15 +392,15 @@ static UINT16 MFDRV_CreateFontIndirect(PHYSDEV dev, HFONT hFont, LOGFONT16 *logf
 HFONT MFDRV_SelectFont( PHYSDEV dev, HFONT hfont, HANDLE gdiFont )
 {
     METAFILEDRV_PDEVICE *physDev = (METAFILEDRV_PDEVICE *)dev;
-    LOGFONT16 lf16;
+    LOGFONTW font;
     INT16 index;
 
     index = MFDRV_FindObject(dev, hfont);
     if( index < 0 )
     {
-        if (!GetObject16( HFONT_16(hfont), sizeof(lf16), &lf16 ))
+        if (!GetObjectW( hfont, sizeof(font), &font ))
             return HGDI_ERROR;
-        index = MFDRV_CreateFontIndirect(dev, hfont, &lf16);
+        index = MFDRV_CreateFontIndirect(dev, hfont, &font);
         if( index < 0 )
             return HGDI_ERROR;
         GDI_hdc_using_object(hfont, physDev->hdc);
@@ -419,15 +437,24 @@ HPEN MFDRV_SelectPen( PHYSDEV dev, HPEN hpen )
     index = MFDRV_FindObject(dev, hpen);
     if( index < 0 )
     {
-        if (!GetObject16( HPEN_16(hpen), sizeof(logpen), &logpen ))
-        {
-            /* must be an extended pen */
-            EXTLOGPEN *elp;
-            INT size = GetObjectW( hpen, 0, NULL );
+        /* must be an extended pen */
+        INT size = GetObjectW( hpen, 0, NULL );
+
+        if (!size) return 0;
 
-            if (!size) return 0;
+        if (size == sizeof(LOGPEN))
+        {
+            LOGPEN pen;
 
-            elp = HeapAlloc( GetProcessHeap(), 0, size );
+            GetObjectW( hpen, sizeof(pen), &pen );
+            logpen.lopnStyle   = pen.lopnStyle;
+            logpen.lopnWidth.x = pen.lopnWidth.x;
+            logpen.lopnWidth.y = pen.lopnWidth.y;
+            logpen.lopnColor   = pen.lopnColor;
+        }
+        else  /* must be an extended pen */
+        {
+            EXTLOGPEN *elp = HeapAlloc( GetProcessHeap(), 0, size );
 
             GetObjectW( hpen, size, elp );
             /* FIXME: add support for user style pens */




More information about the wine-cvs mailing list