[2/6] gdiplus: added GdipCreateBitmapFromFile

Evan Stade estade at gmail.com
Mon Aug 6 20:55:42 CDT 2007


Hi,

 dlls/gdiplus/gdiplus.spec |    2 +-
 dlls/gdiplus/image.c      |   48 +++++++++++++++++++++++++++++++++++++++++++++
 include/gdiplusflat.h     |    1 +
 3 files changed, 50 insertions(+), 1 deletions(-)

-- 
Evan Stade
-------------- next part --------------
diff --git a/dlls/gdiplus/gdiplus.spec b/dlls/gdiplus/gdiplus.spec
index 7e53322..f7e6c6c 100644
--- a/dlls/gdiplus/gdiplus.spec
+++ b/dlls/gdiplus/gdiplus.spec
@@ -71,7 +71,7 @@
 @ stub GdipConvertToEmfPlusToStream
 @ stub GdipCreateAdjustableArrowCap
 @ stub GdipCreateBitmapFromDirectDrawSurface
-@ stub GdipCreateBitmapFromFile
+@ stdcall GdipCreateBitmapFromFile(wstr ptr)
 @ stub GdipCreateBitmapFromFileICM
 @ stub GdipCreateBitmapFromGdiDib
 @ stub GdipCreateBitmapFromGraphics
diff --git a/dlls/gdiplus/image.c b/dlls/gdiplus/image.c
index ec47d24..abc48af 100644
--- a/dlls/gdiplus/image.c
+++ b/dlls/gdiplus/image.c
@@ -229,6 +229,54 @@ GpStatus WINGDIPAPI GdipBitmapUnlockBits
     return Ok;
 }
 
+GpStatus WINGDIPAPI GdipCreateBitmapFromFile(GDIPCONST WCHAR* filename,
+    GpBitmap **bitmap)
+{
+    HANDLE file;
+    GpStatus stat;
+    IStream *stream = NULL;
+    DWORD size, bytesread;
+    BYTE * buff;
+
+    if(!filename || !bitmap)
+        return InvalidParameter;
+
+    file = CreateFileW(filename, GENERIC_READ, FILE_SHARE_READ, NULL,
+                       OPEN_EXISTING, 0, 0);
+
+    if(!file)
+        return FileNotFound; /* FIXME: just a guess */
+
+    size = GetFileSize(file, NULL);
+
+    buff = GdipAlloc(size);
+    if(!buff){
+        CloseHandle(file);
+        return OutOfMemory;
+    }
+
+    if(!ReadFile(file, buff, size, &bytesread, NULL)){
+        GdipFree(buff);
+        CloseHandle(file);
+        return GenericError;
+    }
+
+    CloseHandle(file);
+
+    if(CreateStreamOnHGlobal(buff, TRUE, &stream) != S_OK){
+        ERR("could not make stream\n");
+        GdipFree(buff);
+        return GenericError;
+    }
+
+    stat = GdipCreateBitmapFromStream(stream, bitmap);
+
+    if(stat != Ok)
+        IStream_Release(stream);
+
+    return stat;
+}
+
 GpStatus WINGDIPAPI GdipCreateBitmapFromScan0(INT width, INT height, INT stride,
     PixelFormat format, BYTE* scan0, GpBitmap** bitmap)
 {
diff --git a/include/gdiplusflat.h b/include/gdiplusflat.h
index 3035f0d..10ab021 100644
--- a/include/gdiplusflat.h
+++ b/include/gdiplusflat.h
@@ -166,6 +166,7 @@ GpStatus WINGDIPAPI GdipDeleteCustomLine
 GpStatus WINGDIPAPI GdipBitmapGetPixel(GpBitmap*,INT,INT,ARGB*);
 GpStatus WINGDIPAPI GdipBitmapLockBits(GpBitmap*,GDIPCONST GpRect*,UINT,
     PixelFormat,BitmapData*);
+GpStatus WINGDIPAPI GdipCreateBitmapFromFile(GDIPCONST WCHAR*,GpBitmap**);
 GpStatus WINGDIPAPI GdipCreateBitmapFromScan0(INT,INT,INT,PixelFormat,BYTE*,
     GpBitmap**);
 GpStatus WINGDIPAPI GdipCreateBitmapFromStream(IStream*,GpBitmap**);
-- 
1.4.1


More information about the wine-patches mailing list