From 325f646fdc4ee762255e9d942b6a5c792092fec6 Mon Sep 17 00:00:00 2001
From: Dave Belanger <dave.belanger@cimmetry.com>
Date: Sat, 4 Oct 2003 03:08:25 +0000
Subject: [PATCH] Implemented the SetArcDirection metarecord in EMF driver.

---
 dlls/gdi/driver.c                  |  1 +
 dlls/gdi/enhmfdrv/enhmetafiledrv.h |  1 +
 dlls/gdi/enhmfdrv/graphics.c       | 17 +++++++++++++++++
 dlls/gdi/enhmfdrv/init.c           |  1 +
 dlls/gdi/mfdrv/init.c              |  1 +
 include/gdi.h                      |  1 +
 objects/dc.c                       |  4 ++++
 7 files changed, 26 insertions(+)

diff --git a/dlls/gdi/driver.c b/dlls/gdi/driver.c
index 08404cf9e9c..408cbddb2e0 100644
--- a/dlls/gdi/driver.c
+++ b/dlls/gdi/driver.c
@@ -153,6 +153,7 @@ static struct graphics_driver *create_driver( HMODULE module )
     GET_FUNC(SelectFont);
     GET_FUNC(SelectPalette);
     GET_FUNC(SelectPen);
+    GET_FUNC(SetArcDirection);
     GET_FUNC(SetBitmapBits);
     GET_FUNC(SetBkColor);
     GET_FUNC(SetBkMode);
diff --git a/dlls/gdi/enhmfdrv/enhmetafiledrv.h b/dlls/gdi/enhmfdrv/enhmetafiledrv.h
index 9df1fc31593..47a072d1ac6 100644
--- a/dlls/gdi/enhmfdrv/enhmetafiledrv.h
+++ b/dlls/gdi/enhmfdrv/enhmetafiledrv.h
@@ -119,6 +119,7 @@ extern HBRUSH   EMFDRV_SelectBrush( PHYSDEV dev, HBRUSH handle );
 extern BOOL     EMFDRV_SelectClipPath( PHYSDEV dev, INT iMode );
 extern HFONT    EMFDRV_SelectFont( PHYSDEV dev, HFONT handle );
 extern HPEN     EMFDRV_SelectPen( PHYSDEV dev, HPEN handle );
+extern INT      EMFDRV_SetArcDirection( PHYSDEV dev, INT arcDirection );
 extern COLORREF EMFDRV_SetBkColor( PHYSDEV dev, COLORREF color );
 extern INT      EMFDRV_SetBkMode( PHYSDEV dev, INT mode );
 extern INT      EMFDRV_SetDIBitsToDevice( PHYSDEV dev, INT xDest, INT yDest,
diff --git a/dlls/gdi/enhmfdrv/graphics.c b/dlls/gdi/enhmfdrv/graphics.c
index ca5eab41a49..cd7713d17ad 100644
--- a/dlls/gdi/enhmfdrv/graphics.c
+++ b/dlls/gdi/enhmfdrv/graphics.c
@@ -693,3 +693,20 @@ BOOL EMFDRV_ExtTextOut( PHYSDEV dev, INT x, INT y, UINT flags,
     HeapFree( GetProcessHeap(), 0, pemr );
     return ret;
 }
+
+/**********************************************************************
+ *          EMFDRV_SetArcDirection
+ */
+INT EMFDRV_SetArcDirection(PHYSDEV dev, INT arcDirection)
+{
+    EMRSETARCDIRECTION emr;
+
+    emr.emr.iType = EMR_SETARCDIRECTION;
+    emr.emr.nSize = sizeof(emr);
+    emr.iArcDirection = arcDirection;
+
+    EMFDRV_WriteRecord(dev, &emr.emr);
+
+    /* We don't know the old arc direction and we don't care... */ 
+    return 0;
+}
diff --git a/dlls/gdi/enhmfdrv/init.c b/dlls/gdi/enhmfdrv/init.c
index 3ea16c93534..4c7323b6ccd 100644
--- a/dlls/gdi/enhmfdrv/init.c
+++ b/dlls/gdi/enhmfdrv/init.c
@@ -112,6 +112,7 @@ static const DC_FUNCTIONS EMFDRV_Funcs =
     EMFDRV_SelectFont,               /* pSelectFont */
     NULL,                            /* pSelectPalette */
     EMFDRV_SelectPen,                /* pSelectPen */
+    EMFDRV_SetArcDirection,          /* pSetArcDirection */
     NULL,                            /* pSetBitmapBits */
     EMFDRV_SetBkColor,               /* pSetBkColor */
     EMFDRV_SetBkMode,                /* pSetBkMode */
diff --git a/dlls/gdi/mfdrv/init.c b/dlls/gdi/mfdrv/init.c
index d5d077cf263..24a8947c8b4 100644
--- a/dlls/gdi/mfdrv/init.c
+++ b/dlls/gdi/mfdrv/init.c
@@ -113,6 +113,7 @@ static const DC_FUNCTIONS MFDRV_Funcs =
     MFDRV_SelectFont,                /* pSelectFont */
     MFDRV_SelectPalette,             /* pSelectPalette */
     MFDRV_SelectPen,                 /* pSelectPen */
+    NULL,                            /* pSetArcDirection */
     NULL,                            /* pSetBitmapBits */
     MFDRV_SetBkColor,                /* pSetBkColor */
     MFDRV_SetBkMode,                 /* pSetBkMode */
diff --git a/include/gdi.h b/include/gdi.h
index 85e41b1f12a..70001484b4c 100644
--- a/include/gdi.h
+++ b/include/gdi.h
@@ -252,6 +252,7 @@ typedef struct tagDC_FUNCS
     HFONT    (*pSelectFont)(PHYSDEV,HFONT);
     HPALETTE (*pSelectPalette)(PHYSDEV,HPALETTE,BOOL);
     HPEN     (*pSelectPen)(PHYSDEV,HPEN);
+    INT      (*pSetArcDirection)(PHYSDEV,INT);
     LONG     (*pSetBitmapBits)(HBITMAP,const void*,LONG);
     COLORREF (*pSetBkColor)(PHYSDEV,COLORREF);
     INT      (*pSetBkMode)(PHYSDEV,INT);
diff --git a/objects/dc.c b/objects/dc.c
index 486d67e95df..d0aebe903b7 100644
--- a/objects/dc.c
+++ b/objects/dc.c
@@ -987,6 +987,10 @@ INT WINAPI SetArcDirection( HDC hdc, INT nDirection )
 
     if ((dc = DC_GetDCPtr( hdc )))
     {
+        if (dc->funcs->pSetArcDirection)
+        {
+            dc->funcs->pSetArcDirection(dc->physDev, nDirection);
+        }
         nOldDirection = dc->ArcDirection;
         dc->ArcDirection = nDirection;
         GDI_ReleaseObj( hdc );
-- 
GitLab