Evan Stade : gdiplus: Added GdipCreateStreamOnFile.
Alexandre Julliard
julliard at wine.codeweavers.com
Wed Aug 8 08:59:42 CDT 2007
Module: wine
Branch: master
Commit: 3ea77f5cfde7dbf1cacf35ff3f0e595eba01d7c7
URL: http://source.winehq.org/git/wine.git/?a=commit;h=3ea77f5cfde7dbf1cacf35ff3f0e595eba01d7c7
Author: Evan Stade <estade at gmail.com>
Date: Tue Aug 7 18:42:00 2007 -0700
gdiplus: Added GdipCreateStreamOnFile.
---
dlls/gdiplus/Makefile.in | 2 +-
dlls/gdiplus/gdiplus.c | 17 +++++++++++++++++
dlls/gdiplus/gdiplus.spec | 2 +-
dlls/gdiplus/gdiplus_private.h | 1 +
dlls/gdiplus/graphics.c | 24 ++++++++++++++++++++++++
include/gdiplusflat.h | 1 +
6 files changed, 45 insertions(+), 2 deletions(-)
diff --git a/dlls/gdiplus/Makefile.in b/dlls/gdiplus/Makefile.in
index d651c4c..ddf3d99 100644
--- a/dlls/gdiplus/Makefile.in
+++ b/dlls/gdiplus/Makefile.in
@@ -4,7 +4,7 @@ SRCDIR = @srcdir@
VPATH = @srcdir@
MODULE = gdiplus.dll
IMPORTLIB = libgdiplus.$(IMPLIBEXT)
-IMPORTS = oleaut32 ole32 user32 gdi32 advapi32 kernel32 ntdll
+IMPORTS = shlwapi oleaut32 ole32 user32 gdi32 advapi32 kernel32 ntdll
EXTRALIBS = -luuid
C_SRCS = \
diff --git a/dlls/gdiplus/gdiplus.c b/dlls/gdiplus/gdiplus.c
index 3787836..998cec8 100644
--- a/dlls/gdiplus/gdiplus.c
+++ b/dlls/gdiplus/gdiplus.c
@@ -27,6 +27,9 @@
#include "objbase.h"
+#include "winreg.h"
+#include "shlwapi.h"
+
#include "gdiplus.h"
#include "gdiplus_private.h"
@@ -246,3 +249,17 @@ REAL gdiplus_atan2(REAL dy, REAL dx)
return atan2(dy, dx);
}
+
+GpStatus hresult_to_status(HRESULT res)
+{
+ switch(res){
+ case S_OK:
+ return Ok;
+ case E_OUTOFMEMORY:
+ return OutOfMemory;
+ case E_INVALIDARG:
+ return InvalidParameter;
+ default:
+ return GenericError;
+ }
+}
diff --git a/dlls/gdiplus/gdiplus.spec b/dlls/gdiplus/gdiplus.spec
index 7e53322..218990d 100644
--- a/dlls/gdiplus/gdiplus.spec
+++ b/dlls/gdiplus/gdiplus.spec
@@ -129,7 +129,7 @@
@ stub GdipCreateRegionRectI
@ stub GdipCreateRegionRgnData
@ stdcall GdipCreateSolidFill(long ptr)
-@ stub GdipCreateStreamOnFile
+@ stdcall GdipCreateStreamOnFile(ptr long ptr)
@ stub GdipCreateStringFormat
@ stub GdipCreateTexture2
@ stub GdipCreateTexture2I
diff --git a/dlls/gdiplus/gdiplus_private.h b/dlls/gdiplus/gdiplus_private.h
index 79440a2..130703d 100644
--- a/dlls/gdiplus/gdiplus_private.h
+++ b/dlls/gdiplus/gdiplus_private.h
@@ -41,6 +41,7 @@ COLORREF ARGB2COLORREF(ARGB color);
extern INT arc2polybezier(GpPointF * points, REAL x1, REAL y1, REAL x2, REAL y2,
REAL startAngle, REAL sweepAngle);
extern REAL gdiplus_atan2(REAL dy, REAL dx);
+extern GpStatus hresult_to_status(HRESULT res);
static inline INT roundr(REAL x)
{
diff --git a/dlls/gdiplus/graphics.c b/dlls/gdiplus/graphics.c
index c21e891..9787234 100644
--- a/dlls/gdiplus/graphics.c
+++ b/dlls/gdiplus/graphics.c
@@ -30,6 +30,9 @@
#include "olectl.h"
#include "ole2.h"
+#include "winreg.h"
+#include "shlwapi.h"
+
#include "gdiplus.h"
#include "gdiplus_private.h"
#include "wine/debug.h"
@@ -873,6 +876,27 @@ end:
return retval;
}
+GpStatus WINGDIPAPI GdipCreateStreamOnFile(GDIPCONST WCHAR * filename,
+ UINT access, IStream **stream)
+{
+ DWORD dwMode;
+ HRESULT ret;
+
+ if(!stream || !filename)
+ return InvalidParameter;
+
+ if(access & GENERIC_WRITE)
+ dwMode = STGM_SHARE_DENY_WRITE | STGM_WRITE | STGM_CREATE;
+ else if(access & GENERIC_READ)
+ dwMode = STGM_SHARE_DENY_WRITE | STGM_READ | STGM_FAILIFTHERE;
+ else
+ return InvalidParameter;
+
+ ret = SHCreateStreamOnFileW(filename, dwMode, stream);
+
+ return hresult_to_status(ret);
+}
+
GpStatus WINGDIPAPI GdipDeleteGraphics(GpGraphics *graphics)
{
if(!graphics) return InvalidParameter;
diff --git a/include/gdiplusflat.h b/include/gdiplusflat.h
index 3035f0d..1768419 100644
--- a/include/gdiplusflat.h
+++ b/include/gdiplusflat.h
@@ -52,6 +52,7 @@ GpStatus WINGDIPAPI GdipCreateFromHWND(HWND,GpGraphics**);
GpStatus WINGDIPAPI GdipCreateMetafileFromEmf(HENHMETAFILE,BOOL,GpMetafile**);
GpStatus WINGDIPAPI GdipCreateMetafileFromWmf(HMETAFILE,BOOL,
GDIPCONST WmfPlaceableFileHeader*,GpMetafile**);
+GpStatus WINGDIPAPI GdipCreateStreamOnFile(GDIPCONST WCHAR*,UINT,IStream**);
GpStatus WINGDIPAPI GdipDeleteGraphics(GpGraphics *);
GpStatus WINGDIPAPI GdipDrawArc(GpGraphics*,GpPen*,REAL,REAL,REAL,REAL,REAL,REAL);
GpStatus WINGDIPAPI GdipDrawBezier(GpGraphics*,GpPen*,REAL,REAL,REAL,REAL,REAL,
More information about the wine-cvs
mailing list