Module: wine Branch: master Commit: 30997b563422beb2eaf8b9e9025823efccd17e25 URL: http://source.winehq.org/git/wine.git/?a=commit;h=30997b563422beb2eaf8b9e902...
Author: Alexandre Julliard julliard@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 */