From 50799cf04f1dcc634a6f9f07c39ea06b98f21e65 Mon Sep 17 00:00:00 2001 From: Evan Stade Date: Mon, 30 Jul 2007 19:10:03 -0700 Subject: [PATCH] gdiplus: Partial implementation of GdipCreateMetafileFromWMF. --- dlls/gdiplus/Makefile.in | 3 +- dlls/gdiplus/gdiplus_private.h | 18 +++++++++++ dlls/gdiplus/graphics.c | 57 ++++++++++++++++++++++++++++++++-- 3 files changed, 75 insertions(+), 3 deletions(-) diff --git a/dlls/gdiplus/Makefile.in b/dlls/gdiplus/Makefile.in index dc4e2e0e1f0..8efc6d69945 100644 --- a/dlls/gdiplus/Makefile.in +++ b/dlls/gdiplus/Makefile.in @@ -4,7 +4,8 @@ SRCDIR = @srcdir@ VPATH = @srcdir@ MODULE = gdiplus.dll IMPORTLIB = libgdiplus.$(IMPLIBEXT) -IMPORTS = user32 gdi32 advapi32 kernel32 ntdll +IMPORTS = oleaut32 ole32 user32 gdi32 advapi32 kernel32 ntdll +EXTRALIBS = -luuid C_SRCS = \ brush.c \ diff --git a/dlls/gdiplus/gdiplus_private.h b/dlls/gdiplus/gdiplus_private.h index b9420a398d9..8050125c8c9 100644 --- a/dlls/gdiplus/gdiplus_private.h +++ b/dlls/gdiplus/gdiplus_private.h @@ -20,13 +20,22 @@ #define __WINE_GP_PRIVATE_H_ #include +#include + #include "windef.h" #include "wingdi.h" +#include "winbase.h" +#include "winuser.h" + +#include "objbase.h" +#include "ocidl.h" + #include "gdiplus.h" #define GP_DEFAULT_PENSTYLE (PS_GEOMETRIC | PS_SOLID | PS_ENDCAP_FLAT | PS_JOIN_MITER) #define MAX_ARC_PTS (13) #define MAX_DASHLEN (16) /* this is a limitation of gdi */ +#define INCH_HIMETRIC (2540) COLORREF ARGB2COLORREF(ARGB color); extern INT arc2polybezier(GpPointF * points, REAL x1, REAL y1, REAL x2, REAL y2, @@ -108,4 +117,13 @@ struct GpCustomLineCap{ REAL inset; /* how much to adjust the end of the line */ }; +struct GpImage{ + IPicture* picture; + ImageType type; +}; + +struct GpMetafile{ + GpImage image; +}; + #endif diff --git a/dlls/gdiplus/graphics.c b/dlls/gdiplus/graphics.c index 92662b5ddea..24d61d3843d 100644 --- a/dlls/gdiplus/graphics.c +++ b/dlls/gdiplus/graphics.c @@ -23,6 +23,13 @@ #include "winbase.h" #include "winuser.h" #include "wingdi.h" + +#define COBJMACROS +#include "objbase.h" +#include "ocidl.h" +#include "olectl.h" +#include "ole2.h" + #include "gdiplus.h" #include "gdiplus_private.h" #include "wine/debug.h" @@ -839,14 +846,60 @@ GpStatus WINGDIPAPI GdipCreateMetafileFromWmf(HMETAFILE hwmf, BOOL delete, GDIPCONST WmfPlaceableFileHeader * placeable, GpMetafile **metafile) { static int calls; + IStream *stream; + UINT read; + BYTE* copy; + METAFILEPICT mfp; + HENHMETAFILE hemf; if(!hwmf || !metafile || !placeable) return InvalidParameter; if(!(calls++)) - FIXME("not implemented\n"); + FIXME("partially implemented\n"); - return NotImplemented; + if(placeable->Inch != INCH_HIMETRIC) + return NotImplemented; + + mfp.mm = MM_HIMETRIC; + mfp.xExt = placeable->BoundingBox.Right - placeable->BoundingBox.Left; + mfp.yExt = placeable->BoundingBox.Bottom - placeable->BoundingBox.Top; + mfp.hMF = NULL; + + read = GetMetaFileBitsEx(hwmf, 0, NULL); + if(!read) + return GenericError; + copy = GdipAlloc(read); + GetMetaFileBitsEx(hwmf, read, copy); + + hemf = SetWinMetaFileBits(read, copy, NULL, &mfp); + GdipFree(copy); + + read = GetEnhMetaFileBits(hemf, 0, NULL); + copy = GdipAlloc(read); + GetEnhMetaFileBits(hemf, read, copy); + DeleteEnhMetaFile(hemf); + + if(CreateStreamOnHGlobal(copy, TRUE, &stream) != S_OK){ + ERR("could not make stream\n"); + return GenericError; + } + + *metafile = GdipAlloc(sizeof(GpMetafile)); + if(!*metafile) return OutOfMemory; + + if(OleLoadPicture(stream, 0, FALSE, &IID_IPicture, + (LPVOID*) &((*metafile)->image.picture)) != S_OK){ + GdipFree(*metafile); + return GenericError; + } + + (*metafile)->image.type = ImageTypeMetafile; + + if(delete) + DeleteMetaFile(hwmf); + + return Ok; } GpStatus WINGDIPAPI GdipDeleteGraphics(GpGraphics *graphics)