diff --git a/dlls/gdiplus/gdiplus.spec b/dlls/gdiplus/gdiplus.spec index e306fb8c26b..4aac0df3f85 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 f1506372cc7..cf104e90906 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 d51d94a6bf5..489b1a87dcb 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();