Vincent Povirk : gdiplus: Store the codec information and functions in a single structure.

Alexandre Julliard julliard at winehq.org
Fri Aug 21 09:32:06 CDT 2009


Module: wine
Branch: master
Commit: 96023267c8f5383ea8b1fa11645785b988f0af7e
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=96023267c8f5383ea8b1fa11645785b988f0af7e

Author: Vincent Povirk <vincent at codeweavers.com>
Date:   Thu Aug 20 17:21:41 2009 -0500

gdiplus: Store the codec information and functions in a single structure.

---

 dlls/gdiplus/image.c |   32 +++++++++++++++++++-------------
 1 files changed, 19 insertions(+), 13 deletions(-)

diff --git a/dlls/gdiplus/image.c b/dlls/gdiplus/image.c
index 2ed64f8..cf48d87 100644
--- a/dlls/gdiplus/image.c
+++ b/dlls/gdiplus/image.c
@@ -1354,18 +1354,20 @@ static GpStatus encode_image_BMP(LPVOID bitmap_bits, LPBITMAPINFO bitmap_info,
     return Ok;
 }
 
-typedef GpStatus encode_image_func(LPVOID bitmap_bits, LPBITMAPINFO bitmap_info,
+typedef GpStatus (*encode_image_func)(LPVOID bitmap_bits, LPBITMAPINFO bitmap_info,
                                    void **output, unsigned int *output_size);
 
+typedef struct image_codec {
+    ImageCodecInfo info;
+    encode_image_func encode_func;
+} image_codec;
+
 typedef enum {
     BMP,
     NUM_ENCODERS_SUPPORTED
 } ImageFormat;
 
-static const ImageCodecInfo codecs[NUM_ENCODERS_SUPPORTED];
-static encode_image_func *const encode_image_funcs[NUM_ENCODERS_SUPPORTED] = {
-    encode_image_BMP,
-};
+static const struct image_codec codecs[NUM_ENCODERS_SUPPORTED];
 
 /*****************************************************************************
  * GdipSaveImageToStream [GDIPLUS.@]
@@ -1382,7 +1384,7 @@ GpStatus WINGDIPAPI GdipSaveImageToStream(GpImage *image, IStream* stream,
     int bm_is_selected;
     BITMAPINFO bmp_info;
     LPVOID bmp_bits;
-    encode_image_func* encode_image;
+    encode_image_func encode_image;
     LPVOID output;
     unsigned int output_size;
     unsigned int dummy;
@@ -1407,8 +1409,8 @@ GpStatus WINGDIPAPI GdipSaveImageToStream(GpImage *image, IStream* stream,
     /* select correct encoder */
     encode_image = NULL;
     for (i = 0; i < NUM_ENCODERS_SUPPORTED; i++) {
-        if (IsEqualCLSID(clsid, &codecs[i].Clsid))
-            encode_image = encode_image_funcs[i];
+        if (IsEqualCLSID(clsid, &codecs[i].info.Clsid))
+            encode_image = codecs[i].encode_func;
     }
     if (encode_image == NULL)
         return UnknownImageFormat;
@@ -1500,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 ImageCodecInfo codecs[NUM_ENCODERS_SUPPORTED] =
+static const struct image_codec codecs[NUM_ENCODERS_SUPPORTED] = {
     {
         { /* BMP */
             /* Clsid */              { 0x557cf400, 0x1a04, 0x11d3, { 0x9a, 0x73, 0x0, 0x0, 0xf8, 0x1e, 0xf3, 0x2e } },
@@ -1517,7 +1519,9 @@ static const ImageCodecInfo codecs[NUM_ENCODERS_SUPPORTED] =
             /* SigPattern */         bmp_sig_pattern,
             /* SigMask */            bmp_sig_mask,
         },
-    };
+        encode_image_BMP
+    }
+};
 
 /*****************************************************************************
  * GdipGetImageDecodersSize [GDIPLUS.@]
@@ -1559,7 +1563,7 @@ GpStatus WINGDIPAPI GdipGetImageEncodersSize(UINT *numEncoders, UINT *size)
         return InvalidParameter;
 
     *numEncoders = NUM_ENCODERS_SUPPORTED;
-    *size = sizeof (codecs);
+    *size = NUM_ENCODERS_SUPPORTED * sizeof(ImageCodecInfo);
 
     return Ok;
 }
@@ -1569,14 +1573,16 @@ GpStatus WINGDIPAPI GdipGetImageEncodersSize(UINT *numEncoders, UINT *size)
  */
 GpStatus WINGDIPAPI GdipGetImageEncoders(UINT numEncoders, UINT size, ImageCodecInfo *encoders)
 {
+    int i;
     TRACE("%u %u %p\n", numEncoders, size, encoders);
 
     if (!encoders ||
         (numEncoders != NUM_ENCODERS_SUPPORTED) ||
-        (size != sizeof (codecs)))
+        (size != NUM_ENCODERS_SUPPORTED * sizeof(ImageCodecInfo)))
         return GenericError;
 
-    memcpy(encoders, codecs, sizeof (codecs));
+    for (i=0; i<NUM_ENCODERS_SUPPORTED; i++)
+        memcpy(&encoders[i], &codecs[i].info, sizeof(ImageCodecInfo));
 
     return Ok;
 }




More information about the wine-cvs mailing list