Module: wine Branch: master Commit: 7900947ce3e1a9d7db9da2dac4d8d472e293c313 URL: http://source.winehq.org/git/wine.git/?a=commit;h=7900947ce3e1a9d7db9da2dac4...
Author: Nathan Beckmann nathan.beckmann@gmail.com Date: Mon Mar 10 08:16:54 2008 -0700
gdiplus: Implement GdipSaveImageToFile via GdipSaveImageToStream.
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..cf104e9 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..489b1a8 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();