Module: wine Branch: master Commit: 40df7dbc0772efa3440a34cf0bd0ad03f17ea534 URL: http://source.winehq.org/git/wine.git/?a=commit;h=40df7dbc0772efa3440a34cf0b...
Author: Vincent Povirk vincent@codeweavers.com Date: Thu Aug 20 17:33:39 2009 -0500
gdiplus: Implement GdipGetImageDecoders[Size].
---
dlls/gdiplus/image.c | 72 ++++++++++++++++++++++++++++++++++++++------------ 1 files changed, 55 insertions(+), 17 deletions(-)
diff --git a/dlls/gdiplus/image.c b/dlls/gdiplus/image.c index cf48d87..c9e5287 100644 --- a/dlls/gdiplus/image.c +++ b/dlls/gdiplus/image.c @@ -1364,10 +1364,10 @@ typedef struct image_codec {
typedef enum { BMP, - NUM_ENCODERS_SUPPORTED + NUM_CODECS } ImageFormat;
-static const struct image_codec codecs[NUM_ENCODERS_SUPPORTED]; +static const struct image_codec codecs[NUM_CODECS];
/***************************************************************************** * GdipSaveImageToStream [GDIPLUS.@] @@ -1408,7 +1408,7 @@ GpStatus WINGDIPAPI GdipSaveImageToStream(GpImage *image, IStream* stream,
/* select correct encoder */ encode_image = NULL; - for (i = 0; i < NUM_ENCODERS_SUPPORTED; i++) { + for (i = 0; i < NUM_CODECS; i++) { if (IsEqualCLSID(clsid, &codecs[i].info.Clsid)) encode_image = codecs[i].encode_func; } @@ -1502,7 +1502,7 @@ static const WCHAR bmp_format[] = {'B', 'M', 'P', 0}; /* BMP */ static const BYTE bmp_sig_pattern[] = { 0x42, 0x4D }; static const BYTE bmp_sig_mask[] = { 0xFF, 0xFF };
-static const struct image_codec codecs[NUM_ENCODERS_SUPPORTED] = { +static const struct image_codec codecs[NUM_CODECS] = { { { /* BMP */ /* Clsid */ { 0x557cf400, 0x1a04, 0x11d3, { 0x9a, 0x73, 0x0, 0x0, 0xf8, 0x1e, 0xf3, 0x2e } }, @@ -1528,13 +1528,21 @@ static const struct image_codec codecs[NUM_ENCODERS_SUPPORTED] = { */ GpStatus WINGDIPAPI GdipGetImageDecodersSize(UINT *numDecoders, UINT *size) { - FIXME("%p %p stub!\n", numDecoders, size); + int decoder_count=0; + int i; + TRACE("%p %p\n", numDecoders, size);
if (!numDecoders || !size) return InvalidParameter;
- *numDecoders = 0; - *size = 0; + for (i=0; i<NUM_CODECS; i++) + { + if (codecs[i].info.Flags & ImageCodecFlagsDecoder) + decoder_count++; + } + + *numDecoders = decoder_count; + *size = decoder_count * sizeof(ImageCodecInfo);
return Ok; } @@ -1544,12 +1552,26 @@ GpStatus WINGDIPAPI GdipGetImageDecodersSize(UINT *numDecoders, UINT *size) */ GpStatus WINGDIPAPI GdipGetImageDecoders(UINT numDecoders, UINT size, ImageCodecInfo *decoders) { - FIXME("%u %u %p stub!\n", numDecoders, size, decoders); + int i, decoder_count=0; + TRACE("%u %u %p\n", numDecoders, size, decoders);
- if (!decoders) + if (!decoders || + size != numDecoders * sizeof(ImageCodecInfo)) return GenericError;
- return NotImplemented; + for (i=0; i<NUM_CODECS; i++) + { + if (codecs[i].info.Flags & ImageCodecFlagsDecoder) + { + if (decoder_count == numDecoders) return GenericError; + memcpy(&decoders[decoder_count], &codecs[i].info, sizeof(ImageCodecInfo)); + decoder_count++; + } + } + + if (decoder_count < numDecoders) return GenericError; + + return Ok; }
/***************************************************************************** @@ -1557,13 +1579,21 @@ GpStatus WINGDIPAPI GdipGetImageDecoders(UINT numDecoders, UINT size, ImageCodec */ GpStatus WINGDIPAPI GdipGetImageEncodersSize(UINT *numEncoders, UINT *size) { + int encoder_count=0; + int i; TRACE("%p %p\n", numEncoders, size);
if (!numEncoders || !size) return InvalidParameter;
- *numEncoders = NUM_ENCODERS_SUPPORTED; - *size = NUM_ENCODERS_SUPPORTED * sizeof(ImageCodecInfo); + for (i=0; i<NUM_CODECS; i++) + { + if (codecs[i].info.Flags & ImageCodecFlagsEncoder) + encoder_count++; + } + + *numEncoders = encoder_count; + *size = encoder_count * sizeof(ImageCodecInfo);
return Ok; } @@ -1573,16 +1603,24 @@ GpStatus WINGDIPAPI GdipGetImageEncodersSize(UINT *numEncoders, UINT *size) */ GpStatus WINGDIPAPI GdipGetImageEncoders(UINT numEncoders, UINT size, ImageCodecInfo *encoders) { - int i; + int i, encoder_count=0; TRACE("%u %u %p\n", numEncoders, size, encoders);
if (!encoders || - (numEncoders != NUM_ENCODERS_SUPPORTED) || - (size != NUM_ENCODERS_SUPPORTED * sizeof(ImageCodecInfo))) + size != numEncoders * sizeof(ImageCodecInfo)) return GenericError;
- for (i=0; i<NUM_ENCODERS_SUPPORTED; i++) - memcpy(&encoders[i], &codecs[i].info, sizeof(ImageCodecInfo)); + for (i=0; i<NUM_CODECS; i++) + { + if (codecs[i].info.Flags & ImageCodecFlagsEncoder) + { + if (encoder_count == numEncoders) return GenericError; + memcpy(&encoders[encoder_count], &codecs[i].info, sizeof(ImageCodecInfo)); + encoder_count++; + } + } + + if (encoder_count < numEncoders) return GenericError;
return Ok; }