Alexandre Julliard : gdi32: Add a SetLayout driver entry point and implement it for enhanced metafiles .

Alexandre Julliard julliard at winehq.org
Fri Mar 11 10:23:36 CST 2011


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

Author: Alexandre Julliard <julliard at winehq.org>
Date:   Thu Mar 10 22:10:16 2011 +0100

gdi32: Add a SetLayout driver entry point and implement it for enhanced metafiles.

---

 dlls/gdi32/dc.c                      |   15 ++++++++++-----
 dlls/gdi32/driver.c                  |    6 ++++++
 dlls/gdi32/enhmfdrv/enhmetafiledrv.h |    1 +
 dlls/gdi32/enhmfdrv/init.c           |    1 +
 dlls/gdi32/enhmfdrv/mapping.c        |   10 ++++++++++
 dlls/gdi32/gdi_private.h             |    1 +
 dlls/gdi32/mfdrv/init.c              |    1 +
 7 files changed, 30 insertions(+), 5 deletions(-)

diff --git a/dlls/gdi32/dc.c b/dlls/gdi32/dc.c
index 1070506..98b6bf1 100644
--- a/dlls/gdi32/dc.c
+++ b/dlls/gdi32/dc.c
@@ -2015,12 +2015,17 @@ DWORD WINAPI SetLayout(HDC hdc, DWORD layout)
     DC * dc = get_dc_ptr( hdc );
     if (dc)
     {
-        oldlayout = dc->layout;
-        dc->layout = layout;
-        if (layout != oldlayout)
+        PHYSDEV physdev = GET_DC_PHYSDEV( dc, pSetLayout );
+        layout = physdev->funcs->pSetLayout( physdev, layout );
+        if (layout != GDI_ERROR)
         {
-            if (layout & LAYOUT_RTL) dc->MapMode = MM_ANISOTROPIC;
-            DC_UpdateXforms( dc );
+            oldlayout = dc->layout;
+            dc->layout = layout;
+            if (layout != oldlayout)
+            {
+                if (layout & LAYOUT_RTL) dc->MapMode = MM_ANISOTROPIC;
+                DC_UpdateXforms( dc );
+            }
         }
         release_dc_ptr( dc );
     }
diff --git a/dlls/gdi32/driver.c b/dlls/gdi32/driver.c
index 9a19cfd..3d5f0e7 100644
--- a/dlls/gdi32/driver.c
+++ b/dlls/gdi32/driver.c
@@ -467,6 +467,11 @@ static void CDECL nulldrv_SetDeviceClipping( PHYSDEV dev, HRGN vis_rgn, HRGN cli
 {
 }
 
+static DWORD CDECL nulldrv_SetLayout( PHYSDEV dev, DWORD layout )
+{
+    return layout;
+}
+
 static DWORD CDECL nulldrv_SetMapperFlags( PHYSDEV dev, DWORD flags )
 {
     return flags;
@@ -683,6 +688,7 @@ const DC_FUNCTIONS null_driver =
     NULL,                               /* pSetDIBitsToDevice */
     nulldrv_SetDeviceClipping,          /* pSetDeviceClipping */
     NULL,                               /* pSetDeviceGammaRamp */
+    nulldrv_SetLayout,                  /* pSetLayout */
     nulldrv_SetMapMode,                 /* pSetMapMode */
     nulldrv_SetMapperFlags,             /* pSetMapperFlags */
     nulldrv_SetPixel,                   /* pSetPixel */
diff --git a/dlls/gdi32/enhmfdrv/enhmetafiledrv.h b/dlls/gdi32/enhmfdrv/enhmetafiledrv.h
index eba7536..ee82463 100644
--- a/dlls/gdi32/enhmfdrv/enhmetafiledrv.h
+++ b/dlls/gdi32/enhmfdrv/enhmetafiledrv.h
@@ -137,6 +137,7 @@ extern INT      CDECL EMFDRV_SetDIBitsToDevice( PHYSDEV dev, INT xDest, INT yDes
                                                 INT ySrc, UINT startscan, UINT lines,
                                                 LPCVOID bits, const BITMAPINFO *info,
                                                 UINT coloruse ) DECLSPEC_HIDDEN;
+extern DWORD    CDECL EMFDRV_SetLayout( PHYSDEV dev, DWORD layout ) DECLSPEC_HIDDEN;
 extern INT      CDECL EMFDRV_SetMapMode( PHYSDEV dev, INT mode ) DECLSPEC_HIDDEN;
 extern DWORD    CDECL EMFDRV_SetMapperFlags( PHYSDEV dev, DWORD flags ) DECLSPEC_HIDDEN;
 extern COLORREF CDECL EMFDRV_SetPixel( PHYSDEV dev, INT x, INT y, COLORREF color ) DECLSPEC_HIDDEN;
diff --git a/dlls/gdi32/enhmfdrv/init.c b/dlls/gdi32/enhmfdrv/init.c
index ff9f69d..1c04d95 100644
--- a/dlls/gdi32/enhmfdrv/init.c
+++ b/dlls/gdi32/enhmfdrv/init.c
@@ -127,6 +127,7 @@ static const DC_FUNCTIONS EMFDRV_Funcs =
     EMFDRV_SetDIBitsToDevice,        /* pSetDIBitsToDevice */
     NULL,                            /* pSetDeviceClipping */
     NULL,                            /* pSetDeviceGammaRamp */
+    EMFDRV_SetLayout,                /* pSetLayout */
     EMFDRV_SetMapMode,               /* pSetMapMode */
     EMFDRV_SetMapperFlags,           /* pSetMapperFlags */
     EMFDRV_SetPixel,                 /* pSetPixel */
diff --git a/dlls/gdi32/enhmfdrv/mapping.c b/dlls/gdi32/enhmfdrv/mapping.c
index b89ed20..e566e01 100644
--- a/dlls/gdi32/enhmfdrv/mapping.c
+++ b/dlls/gdi32/enhmfdrv/mapping.c
@@ -120,6 +120,16 @@ BOOL CDECL EMFDRV_ScaleWindowExtEx( PHYSDEV dev, INT xNum, INT xDenom, INT yNum,
     return next->funcs->pScaleWindowExtEx( next, xNum, xDenom, yNum, yDenom, size );
 }
 
+DWORD CDECL EMFDRV_SetLayout( PHYSDEV dev, DWORD layout )
+{
+    EMRSETLAYOUT emr;
+
+    emr.emr.iType = EMR_SETLAYOUT;
+    emr.emr.nSize = sizeof(emr);
+    emr.iMode = layout;
+    return EMFDRV_WriteRecord( dev, &emr.emr ) ? layout : GDI_ERROR;
+}
+
 BOOL CDECL EMFDRV_SetWorldTransform( PHYSDEV dev, const XFORM *xform)
 {
     EMRSETWORLDTRANSFORM emr;
diff --git a/dlls/gdi32/gdi_private.h b/dlls/gdi32/gdi_private.h
index 40eae6c..aa9ba4b 100644
--- a/dlls/gdi32/gdi_private.h
+++ b/dlls/gdi32/gdi_private.h
@@ -175,6 +175,7 @@ typedef struct tagDC_FUNCS
                                            const BITMAPINFO*,UINT);
     VOID     (CDECL *pSetDeviceClipping)(PHYSDEV,HRGN,HRGN);
     BOOL     (CDECL *pSetDeviceGammaRamp)(PHYSDEV,LPVOID);
+    DWORD    (CDECL *pSetLayout)(PHYSDEV,DWORD);
     INT      (CDECL *pSetMapMode)(PHYSDEV,INT);
     DWORD    (CDECL *pSetMapperFlags)(PHYSDEV,DWORD);
     COLORREF (CDECL *pSetPixel)(PHYSDEV,INT,INT,COLORREF);
diff --git a/dlls/gdi32/mfdrv/init.c b/dlls/gdi32/mfdrv/init.c
index 932ab92..63f067f 100644
--- a/dlls/gdi32/mfdrv/init.c
+++ b/dlls/gdi32/mfdrv/init.c
@@ -125,6 +125,7 @@ static const DC_FUNCTIONS MFDRV_Funcs =
     MFDRV_SetDIBitsToDevice,         /* pSetDIBitsToDevice */
     NULL,                            /* pSetDeviceClipping */
     NULL,                            /* pSetDeviceGammaRamp */
+    NULL,                            /* pSetLayout */
     MFDRV_SetMapMode,                /* pSetMapMode */
     MFDRV_SetMapperFlags,            /* pSetMapperFlags */
     MFDRV_SetPixel,                  /* pSetPixel */




More information about the wine-cvs mailing list