[PATCH 2/5] gdiplus: Implement GdipSaveImageToFile via GdipSaveImageToStream.
Nathan Beckmann
nathan.beckmann at gmail.com
Mon Mar 10 10:16:54 CDT 2008
Still need to implement saving the image based on the encoder
parameter.
Basic tests included.
---
dlls/gdiplus/gdiplus.spec | 2 +-
dlls/gdiplus/image.c | 23 +++++++++++++++++++++
dlls/gdiplus/tests/image.c | 48 ++++++++++++++++++++++++++++++++++++++++++++
3 files changed, 72 insertions(+), 1 deletions(-)
diff --git a/dlls/gdiplus/gdiplus.spec b/dlls/gdiplus/gdiplus.spec
index e306fb8..4aac0df 100644
--- a/dlls/gdiplus/gdiplus.spec
+++ b/dlls/gdiplus/gdiplus.spec
@@ -494,7 +494,7 @@
@ stub GdipSaveAdd
@ stub GdipSaveAddImage
@ stdcall GdipSaveGraphics(ptr ptr)
-@ stub GdipSaveImageToFile
+@ stdcall GdipSaveImageToFile(ptr ptr ptr ptr)
@ stdcall GdipSaveImageToStream(ptr ptr ptr ptr)
@ stub GdipScaleLineTransform
@ stdcall GdipScaleMatrix(ptr long long long)
diff --git a/dlls/gdiplus/image.c b/dlls/gdiplus/image.c
index f150637..db19cae 100644
--- a/dlls/gdiplus/image.c
+++ b/dlls/gdiplus/image.c
@@ -811,6 +811,29 @@ GpStatus WINGDIPAPI GdipRemovePropertyItem(GpImage *image, PROPID propId)
return NotImplemented;
}
+GpStatus WINGDIPAPI GdipSaveImageToFile(GpImage *image, GDIPCONST WCHAR* filename,
+ GDIPCONST CLSID *clsidEncoder,
+ GDIPCONST EncoderParameters *encoderParams)
+{
+ GpStatus stat;
+ IStream *stream;
+
+ if (!image || !filename|| !clsidEncoder)
+ return InvalidParameter;
+
+ if (!(image->picture))
+ return InvalidParameter;
+
+ stat = GdipCreateStreamOnFile(filename, GENERIC_WRITE, &stream);
+ if (stat != Ok)
+ return GenericError;
+
+ stat = GdipSaveImageToStream(image, stream, clsidEncoder, encoderParams);
+
+ IStream_Release(stream);
+ return stat;
+}
+
GpStatus WINGDIPAPI GdipSaveImageToStream(GpImage *image, IStream* stream,
GDIPCONST CLSID* clsid, GDIPCONST EncoderParameters* params)
{
diff --git a/dlls/gdiplus/tests/image.c b/dlls/gdiplus/tests/image.c
index d51d94a..5293ac6 100644
--- a/dlls/gdiplus/tests/image.c
+++ b/dlls/gdiplus/tests/image.c
@@ -122,6 +122,53 @@ static void test_LoadingImages(void)
expect(InvalidParameter, stat);
}
+static void test_SavingImages(void)
+{
+ GpStatus stat;
+ GpBitmap *bm;
+ UINT n;
+ UINT s;
+ ImageCodecInfo *codecs;
+ static const WCHAR filename[] = { 'a','.','b','m','p',0 };
+
+ codecs = NULL;
+
+ stat = GdipSaveImageToFile(0, 0, 0, 0);
+ expect(InvalidParameter, stat);
+
+ bm = NULL;
+ stat = GdipCreateBitmapFromScan0(10, 10, 10, PixelFormat24bppRGB, NULL, &bm);
+ expect(Ok, stat);
+ if (!bm)
+ return;
+
+ /* invalid params */
+ stat = GdipSaveImageToFile((GpImage*)bm, 0, 0, 0);
+ expect(InvalidParameter, stat);
+
+ stat = GdipSaveImageToFile((GpImage*)bm, filename, 0, 0);
+ expect(InvalidParameter, stat);
+
+ /* this should succeed */
+ stat = GdipGetImageEncodersSize(&n, &s);
+ if (stat != Ok || n == 0) goto cleanup;
+
+ codecs = GdipAlloc(s);
+ if (!codecs) goto cleanup;
+
+ stat = GdipGetImageEncoders(n, s, codecs);
+ if (stat != Ok) goto cleanup;
+
+ stat = GdipSaveImageToFile((GpImage*)bm, filename, &codecs[0].Clsid, 0);
+ expect(stat, Ok);
+
+ cleanup:
+ if (codecs)
+ GdipFree(codecs);
+ if (bm)
+ GdipDisposeImage((GpImage*)bm);
+}
+
static void test_encoders(void)
{
GpStatus stat;
@@ -287,6 +334,7 @@ START_TEST(image)
test_Scan0();
test_GetImageDimension();
test_LoadingImages();
+ test_SavingImages();
test_encoders();
test_LockBits();
--
1.5.4.2
More information about the wine-patches
mailing list