Jacek Caban : gdi32: Separate EMFDRV_PDEVICE and struct emf.

Alexandre Julliard julliard at winehq.org
Mon Aug 23 16:24:14 CDT 2021


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

Author: Jacek Caban <jacek at codeweavers.com>
Date:   Mon Aug 23 13:52:57 2021 +0200

gdi32: Separate EMFDRV_PDEVICE and struct emf.

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/emfdrv.c                  |  9 +++++++--
 dlls/gdi32/enhmfdrv/enhmetafiledrv.h |  6 ++----
 dlls/gdi32/enhmfdrv/graphics.c       | 18 +++++++++---------
 dlls/gdi32/enhmfdrv/init.c           |  9 +++++----
 dlls/gdi32/enhmfdrv/objects.c        |  2 +-
 5 files changed, 24 insertions(+), 20 deletions(-)

diff --git a/dlls/gdi32/emfdrv.c b/dlls/gdi32/emfdrv.c
index e6421ff560c..006e70cbd2d 100644
--- a/dlls/gdi32/emfdrv.c
+++ b/dlls/gdi32/emfdrv.c
@@ -19,9 +19,15 @@
  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
  */
 
-#include "enhmfdrv/enhmetafiledrv.h"
+#include "ntgdi_private.h"
 
 
+typedef struct
+{
+    struct gdi_physdev dev;
+    INT dev_caps[COLORMGMTCAPS + 1];
+} EMFDRV_PDEVICE;
+
 static inline EMFDRV_PDEVICE *get_emf_physdev( PHYSDEV dev )
 {
     return CONTAINING_RECORD( dev, EMFDRV_PDEVICE, dev );
@@ -576,7 +582,6 @@ HDC WINAPI NtGdiCreateMetafileDC( HDC hdc )
         free_dc_ptr( dc );
         return 0;
     }
-    dc->attr->emf = physDev;
 
     push_dc_driver( &dc->physDev, &physDev->dev, &emfdrv_driver );
 
diff --git a/dlls/gdi32/enhmfdrv/enhmetafiledrv.h b/dlls/gdi32/enhmfdrv/enhmetafiledrv.h
index 288ceed518b..83c3bedfb7e 100644
--- a/dlls/gdi32/enhmfdrv/enhmetafiledrv.h
+++ b/dlls/gdi32/enhmfdrv/enhmetafiledrv.h
@@ -31,9 +31,8 @@
 
 /* Enhanced Metafile driver physical DC */
 
-typedef struct emf
+struct emf
 {
-    struct gdi_physdev dev;
     ENHMETAHEADER  *emh;           /* Pointer to enhanced metafile header */
     DC_ATTR   *dc_attr;
     UINT       handles_size, cur_handles;
@@ -42,8 +41,7 @@ typedef struct emf
     HBRUSH     dc_brush;
     HPEN       dc_pen;
     BOOL       path;
-    INT        dev_caps[COLORMGMTCAPS + 1];
-} EMFDRV_PDEVICE;
+};
 
 extern BOOL emfdc_record( struct emf *emf, EMR *emr ) DECLSPEC_HIDDEN;
 extern void emfdc_update_bounds( struct emf *emf, RECTL *rect ) DECLSPEC_HIDDEN;
diff --git a/dlls/gdi32/enhmfdrv/graphics.c b/dlls/gdi32/enhmfdrv/graphics.c
index 0c6d671c7d4..9ff16f285f0 100644
--- a/dlls/gdi32/enhmfdrv/graphics.c
+++ b/dlls/gdi32/enhmfdrv/graphics.c
@@ -637,14 +637,14 @@ BOOL EMFDC_ExtTextOut( DC_ATTR *dc_attr, INT x, INT y, UINT flags, const RECT *l
 
     if (graphicsMode == GM_COMPATIBLE)
     {
-        const INT horzSize = GetDeviceCaps( emf->dev.hdc, HORZSIZE );
-        const INT horzRes  = GetDeviceCaps( emf->dev.hdc, HORZRES );
-        const INT vertSize = GetDeviceCaps( emf->dev.hdc, VERTSIZE );
-        const INT vertRes  = GetDeviceCaps( emf->dev.hdc, VERTRES );
+        const INT horzSize = GetDeviceCaps( dc_attr->hdc, HORZSIZE );
+        const INT horzRes  = GetDeviceCaps( dc_attr->hdc, HORZRES );
+        const INT vertSize = GetDeviceCaps( dc_attr->hdc, VERTSIZE );
+        const INT vertRes  = GetDeviceCaps( dc_attr->hdc, VERTRES );
         SIZE wndext, vportext;
 
-        GetViewportExtEx( emf->dev.hdc, &vportext );
-        GetWindowExtEx( emf->dev.hdc, &wndext );
+        GetViewportExtEx( dc_attr->hdc, &vportext );
+        GetWindowExtEx( dc_attr->hdc, &wndext );
         exScale = 100.0 * ((FLOAT)horzSize  / (FLOAT)horzRes) /
                           ((FLOAT)wndext.cx / (FLOAT)vportext.cx);
         eyScale = 100.0 * ((FLOAT)vertSize  / (FLOAT)vertRes) /
@@ -685,7 +685,7 @@ BOOL EMFDC_ExtTextOut( DC_ATTR *dc_attr, INT x, INT y, UINT flags, const RECT *l
         for (i = 0; i < count; i++) {
             textWidth += lpDx[i];
         }
-        if (GetTextExtentPoint32W( emf->dev.hdc, str, count, &strSize ))
+        if (GetTextExtentPoint32W( dc_attr->hdc, str, count, &strSize ))
             textHeight = strSize.cy;
     }
     else {
@@ -693,7 +693,7 @@ BOOL EMFDC_ExtTextOut( DC_ATTR *dc_attr, INT x, INT y, UINT flags, const RECT *l
         INT *dx = (INT *)((char*)pemr + pemr->emrtext.offDx);
         SIZE charSize;
         for (i = 0; i < count; i++) {
-            if (GetTextExtentPoint32W( emf->dev.hdc, str + i, 1, &charSize )) {
+            if (GetTextExtentPoint32W( dc_attr->hdc, str + i, 1, &charSize )) {
                 dx[i] = charSize.cx;
                 textWidth += charSize.cx;
                 textHeight = max(textHeight, charSize.cy);
@@ -729,7 +729,7 @@ BOOL EMFDC_ExtTextOut( DC_ATTR *dc_attr, INT x, INT y, UINT flags, const RECT *l
     switch (textAlign & (TA_TOP | TA_BOTTOM | TA_BASELINE)) {
     case TA_BASELINE: {
         TEXTMETRICW tm;
-        if (!GetTextMetricsW( emf->dev.hdc, &tm ))
+        if (!GetTextMetricsW( dc_attr->hdc, &tm ))
             tm.tmDescent = 0;
         /* Play safe here... it's better to have a bounding box */
         /* that is too big than too small. */
diff --git a/dlls/gdi32/enhmfdrv/init.c b/dlls/gdi32/enhmfdrv/init.c
index 1c99b23984a..66701caa19b 100644
--- a/dlls/gdi32/enhmfdrv/init.c
+++ b/dlls/gdi32/enhmfdrv/init.c
@@ -41,7 +41,7 @@ void EMFDC_DeleteDC( DC_ATTR *dc_attr )
     HeapFree( GetProcessHeap(), 0, emf->emh );
     for (index = 0; index < emf->handles_size; index++)
         if (emf->handles[index])
-	    GDI_hdc_not_using_object( emf->handles[index], emf->dev.hdc );
+	    GDI_hdc_not_using_object( emf->handles[index], dc_attr->hdc );
     HeapFree( GetProcessHeap(), 0, emf->handles );
 }
 
@@ -85,7 +85,7 @@ void emfdc_update_bounds( struct emf *emf, RECTL *rect )
     RECTL *bounds = &emf->dc_attr->emf_bounds;
     RECTL vportRect = *rect;
 
-    LPtoDP( emf->dev.hdc, (POINT *)&vportRect, 2 );
+    LPtoDP( emf->dc_attr->hdc, (POINT *)&vportRect, 2 );
 
     /* The coordinate systems may be mirrored
        (LPtoDP handles points, not rectangles) */
@@ -173,12 +173,13 @@ HDC WINAPI CreateEnhMetaFileW(
 
     if (!(ret = NtGdiCreateMetafileDC( hdc ))) return 0;
 
-    if (!(dc_attr = get_dc_attr( ret )))
+    if (!(dc_attr = get_dc_attr( ret )) || !(emf = HeapAlloc( GetProcessHeap(), 0, sizeof(*emf) )))
     {
         DeleteDC( ret );
         return 0;
     }
-    emf = dc_attr->emf;
+
+    dc_attr->emf = emf;
 
     if(description) { /* App name\0Title\0\0 */
         length = lstrlenW(description);
diff --git a/dlls/gdi32/enhmfdrv/objects.c b/dlls/gdi32/enhmfdrv/objects.c
index 03172a0eb40..a37c2e03f87 100644
--- a/dlls/gdi32/enhmfdrv/objects.c
+++ b/dlls/gdi32/enhmfdrv/objects.c
@@ -284,7 +284,7 @@ static BOOL EMFDC_SelectFont( DC_ATTR *dc_attr, HFONT font )
     if (!(index = emfdc_find_object( emf, font )))
     {
         if (!(index = EMFDRV_CreateFontIndirect( emf, font ))) return FALSE;
-        GDI_hdc_using_object( font, emf->dev.hdc, EMFDC_DeleteObject );
+        GDI_hdc_using_object( font, dc_attr->hdc, EMFDC_DeleteObject );
     }
 
  found:




More information about the wine-cvs mailing list