Chao Long : gdiplus/metafile: Implement GdipRecordMetafileFileName.

Alexandre Julliard julliard at winehq.org
Mon Feb 8 15:46:40 CST 2021


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

Author: Chao Long <longchao at uniontech.com>
Date:   Sun Feb  7 10:03:04 2021 +0800

gdiplus/metafile: Implement GdipRecordMetafileFileName.

Signed-off-by: Chao Long <longchao at uniontech.com>
Signed-off-by: Esme Povirk <esme at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

 dlls/gdiplus/metafile.c | 205 ++++++++++++++++++++++++------------------------
 1 file changed, 103 insertions(+), 102 deletions(-)

diff --git a/dlls/gdiplus/metafile.c b/dlls/gdiplus/metafile.c
index d506d0dc8bf..5ff6b113c3d 100644
--- a/dlls/gdiplus/metafile.c
+++ b/dlls/gdiplus/metafile.c
@@ -759,109 +759,10 @@ static GpStatus METAFILE_WriteEndOfFile(GpMetafile *metafile)
 GpStatus WINGDIPAPI GdipRecordMetafile(HDC hdc, EmfType type, GDIPCONST GpRectF *frameRect,
                                        MetafileFrameUnit frameUnit, GDIPCONST WCHAR *desc, GpMetafile **metafile)
 {
-    HDC record_dc;
-    REAL dpix, dpiy;
-    REAL framerect_factor_x, framerect_factor_y;
-    RECT rc, *lprc;
-    GpStatus stat;
 
     TRACE("(%p %d %s %d %p %p)\n", hdc, type, debugstr_rectf(frameRect), frameUnit, desc, metafile);
 
-    if (!hdc || type < EmfTypeEmfOnly || type > EmfTypeEmfPlusDual || !metafile)
-        return InvalidParameter;
-
-    dpix = (REAL)GetDeviceCaps(hdc, HORZRES) / GetDeviceCaps(hdc, HORZSIZE) * 25.4;
-    dpiy = (REAL)GetDeviceCaps(hdc, VERTRES) / GetDeviceCaps(hdc, VERTSIZE) * 25.4;
-
-    if (frameRect)
-    {
-        switch (frameUnit)
-        {
-        case MetafileFrameUnitPixel:
-            framerect_factor_x = 2540.0 / dpix;
-            framerect_factor_y = 2540.0 / dpiy;
-            break;
-        case MetafileFrameUnitPoint:
-            framerect_factor_x = framerect_factor_y = 2540.0 / 72.0;
-            break;
-        case MetafileFrameUnitInch:
-            framerect_factor_x = framerect_factor_y = 2540.0;
-            break;
-        case MetafileFrameUnitDocument:
-            framerect_factor_x = framerect_factor_y = 2540.0 / 300.0;
-            break;
-        case MetafileFrameUnitMillimeter:
-            framerect_factor_x = framerect_factor_y = 100.0;
-            break;
-        case MetafileFrameUnitGdi:
-            framerect_factor_x = framerect_factor_y = 1.0;
-            break;
-        default:
-            return InvalidParameter;
-        }
-
-        rc.left = framerect_factor_x * frameRect->X;
-        rc.top = framerect_factor_y * frameRect->Y;
-        rc.right = rc.left + framerect_factor_x * frameRect->Width;
-        rc.bottom = rc.top + framerect_factor_y * frameRect->Height;
-
-        lprc = &rc;
-    }
-    else
-        lprc = NULL;
-
-    record_dc = CreateEnhMetaFileW(hdc, NULL, lprc, desc);
-
-    if (!record_dc)
-        return GenericError;
-
-    *metafile = heap_alloc_zero(sizeof(GpMetafile));
-    if(!*metafile)
-    {
-        DeleteEnhMetaFile(CloseEnhMetaFile(record_dc));
-        return OutOfMemory;
-    }
-
-    (*metafile)->image.type = ImageTypeMetafile;
-    (*metafile)->image.flags   = ImageFlagsNone;
-    (*metafile)->image.palette = NULL;
-    (*metafile)->image.xres = dpix;
-    (*metafile)->image.yres = dpiy;
-    (*metafile)->bounds.X = (*metafile)->bounds.Y = 0.0;
-    (*metafile)->bounds.Width = (*metafile)->bounds.Height = 1.0;
-    (*metafile)->unit = UnitPixel;
-    (*metafile)->metafile_type = type;
-    (*metafile)->record_dc = record_dc;
-    (*metafile)->comment_data = NULL;
-    (*metafile)->comment_data_size = 0;
-    (*metafile)->comment_data_length = 0;
-    (*metafile)->limit_dpi = 96;
-    (*metafile)->hemf = NULL;
-    (*metafile)->printer_display = (GetDeviceCaps(record_dc, TECHNOLOGY) == DT_RASPRINTER);
-    (*metafile)->logical_dpix = (REAL)GetDeviceCaps(record_dc, LOGPIXELSX);
-    (*metafile)->logical_dpiy = (REAL)GetDeviceCaps(record_dc, LOGPIXELSY);
-    list_init(&(*metafile)->containers);
-
-    if (!frameRect)
-    {
-        (*metafile)->auto_frame = TRUE;
-        (*metafile)->auto_frame_min.X = 0;
-        (*metafile)->auto_frame_min.Y = 0;
-        (*metafile)->auto_frame_max.X = -1;
-        (*metafile)->auto_frame_max.Y = -1;
-    }
-
-    stat = METAFILE_WriteHeader(*metafile, hdc);
-
-    if (stat != Ok)
-    {
-        DeleteEnhMetaFile(CloseEnhMetaFile(record_dc));
-        heap_free(*metafile);
-        *metafile = NULL;
-        return OutOfMemory;
-    }
-
-    return stat;
+    return GdipRecordMetafileFileName(NULL, hdc, type, frameRect, frameUnit, desc, metafile);
 }
 
 /*****************************************************************************
@@ -4266,10 +4167,110 @@ GpStatus WINGDIPAPI GdipRecordMetafileFileName(GDIPCONST WCHAR* fileName,
                             MetafileFrameUnit frameUnit, GDIPCONST WCHAR *desc,
                             GpMetafile **metafile)
 {
-    FIXME("%s %p %d %s %d %s %p stub!\n", debugstr_w(fileName), hdc, type, debugstr_rectf(pFrameRect),
+    HDC record_dc;
+    REAL dpix, dpiy;
+    REAL framerect_factor_x, framerect_factor_y;
+    RECT rc, *lprc;
+    GpStatus stat;
+
+    TRACE("%s %p %d %s %d %s %p\n", debugstr_w(fileName), hdc, type, debugstr_rectf(pFrameRect),
                                  frameUnit, debugstr_w(desc), metafile);
 
-    return NotImplemented;
+    if (!hdc || type < EmfTypeEmfOnly || type > EmfTypeEmfPlusDual || !metafile)
+        return InvalidParameter;
+
+    dpix = (REAL)GetDeviceCaps(hdc, HORZRES) / GetDeviceCaps(hdc, HORZSIZE) * 25.4;
+    dpiy = (REAL)GetDeviceCaps(hdc, VERTRES) / GetDeviceCaps(hdc, VERTSIZE) * 25.4;
+
+    if (pFrameRect)
+    {
+        switch (frameUnit)
+        {
+        case MetafileFrameUnitPixel:
+            framerect_factor_x = 2540.0 / dpix;
+            framerect_factor_y = 2540.0 / dpiy;
+            break;
+        case MetafileFrameUnitPoint:
+            framerect_factor_x = framerect_factor_y = 2540.0 / 72.0;
+            break;
+        case MetafileFrameUnitInch:
+            framerect_factor_x = framerect_factor_y = 2540.0;
+            break;
+        case MetafileFrameUnitDocument:
+            framerect_factor_x = framerect_factor_y = 2540.0 / 300.0;
+            break;
+        case MetafileFrameUnitMillimeter:
+            framerect_factor_x = framerect_factor_y = 100.0;
+            break;
+        case MetafileFrameUnitGdi:
+            framerect_factor_x = framerect_factor_y = 1.0;
+            break;
+        default:
+            return InvalidParameter;
+        }
+
+        rc.left = framerect_factor_x * pFrameRect->X;
+        rc.top = framerect_factor_y * pFrameRect->Y;
+        rc.right = rc.left + framerect_factor_x * pFrameRect->Width;
+        rc.bottom = rc.top + framerect_factor_y * pFrameRect->Height;
+
+        lprc = &rc;
+    }
+    else
+        lprc = NULL;
+
+    record_dc = CreateEnhMetaFileW(hdc, fileName, lprc, desc);
+
+    if (!record_dc)
+        return GenericError;
+
+    *metafile = heap_alloc_zero(sizeof(GpMetafile));
+    if(!*metafile)
+    {
+        DeleteEnhMetaFile(CloseEnhMetaFile(record_dc));
+        return OutOfMemory;
+    }
+
+    (*metafile)->image.type = ImageTypeMetafile;
+    (*metafile)->image.flags   = ImageFlagsNone;
+    (*metafile)->image.palette = NULL;
+    (*metafile)->image.xres = dpix;
+    (*metafile)->image.yres = dpiy;
+    (*metafile)->bounds.X = (*metafile)->bounds.Y = 0.0;
+    (*metafile)->bounds.Width = (*metafile)->bounds.Height = 1.0;
+    (*metafile)->unit = UnitPixel;
+    (*metafile)->metafile_type = type;
+    (*metafile)->record_dc = record_dc;
+    (*metafile)->comment_data = NULL;
+    (*metafile)->comment_data_size = 0;
+    (*metafile)->comment_data_length = 0;
+    (*metafile)->limit_dpi = 96;
+    (*metafile)->hemf = NULL;
+    (*metafile)->printer_display = (GetDeviceCaps(record_dc, TECHNOLOGY) == DT_RASPRINTER);
+    (*metafile)->logical_dpix = (REAL)GetDeviceCaps(record_dc, LOGPIXELSX);
+    (*metafile)->logical_dpiy = (REAL)GetDeviceCaps(record_dc, LOGPIXELSY);
+    list_init(&(*metafile)->containers);
+
+    if (!pFrameRect)
+    {
+        (*metafile)->auto_frame = TRUE;
+        (*metafile)->auto_frame_min.X = 0;
+        (*metafile)->auto_frame_min.Y = 0;
+        (*metafile)->auto_frame_max.X = -1;
+        (*metafile)->auto_frame_max.Y = -1;
+    }
+
+    stat = METAFILE_WriteHeader(*metafile, hdc);
+
+    if (stat != Ok)
+    {
+        DeleteEnhMetaFile(CloseEnhMetaFile(record_dc));
+        heap_free(*metafile);
+        *metafile = NULL;
+        return OutOfMemory;
+    }
+
+    return stat;
 }
 
 GpStatus WINGDIPAPI GdipRecordMetafileFileNameI(GDIPCONST WCHAR* fileName, HDC hdc, EmfType type,




More information about the wine-cvs mailing list