Vincent Povirk : windowscodecs: Implement CopyPalette for the PNG decoder.

Alexandre Julliard julliard at winehq.org
Fri Aug 28 10:18:04 CDT 2009


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

Author: Vincent Povirk <vincent at codeweavers.com>
Date:   Thu Aug 27 13:17:06 2009 -0500

windowscodecs: Implement CopyPalette for the PNG decoder.

---

 dlls/windowscodecs/pngformat.c |   45 ++++++++++++++++++++++++++++++++++++++-
 1 files changed, 43 insertions(+), 2 deletions(-)

diff --git a/dlls/windowscodecs/pngformat.c b/dlls/windowscodecs/pngformat.c
index 5c73f40..cfc5d2d 100644
--- a/dlls/windowscodecs/pngformat.c
+++ b/dlls/windowscodecs/pngformat.c
@@ -52,6 +52,8 @@ MAKE_FUNCPTR(png_get_color_type);
 MAKE_FUNCPTR(png_get_image_height);
 MAKE_FUNCPTR(png_get_image_width);
 MAKE_FUNCPTR(png_get_io_ptr);
+MAKE_FUNCPTR(png_get_PLTE);
+MAKE_FUNCPTR(png_get_tRNS);
 MAKE_FUNCPTR(png_set_bgr);
 MAKE_FUNCPTR(png_set_gray_to_rgb);
 MAKE_FUNCPTR(png_set_read_fn);
@@ -78,6 +80,8 @@ static void *load_libpng(void)
         LOAD_FUNCPTR(png_get_image_height);
         LOAD_FUNCPTR(png_get_image_width);
         LOAD_FUNCPTR(png_get_io_ptr);
+        LOAD_FUNCPTR(png_get_PLTE);
+        LOAD_FUNCPTR(png_get_tRNS);
         LOAD_FUNCPTR(png_set_bgr);
         LOAD_FUNCPTR(png_set_gray_to_rgb);
         LOAD_FUNCPTR(png_set_read_fn);
@@ -484,8 +488,45 @@ static HRESULT WINAPI PngDecoder_Frame_GetResolution(IWICBitmapFrameDecode *ifac
 static HRESULT WINAPI PngDecoder_Frame_CopyPalette(IWICBitmapFrameDecode *iface,
     IWICPalette *pIPalette)
 {
-    FIXME("(%p,%p): stub\n", iface, pIPalette);
-    return E_NOTIMPL;
+    PngDecoder *This = impl_from_frame(iface);
+    png_uint_32 ret;
+    png_colorp png_palette;
+    int num_palette;
+    WICColor palette[256];
+    png_bytep trans;
+    int num_trans;
+    png_color_16p trans_values;
+    int i;
+
+    TRACE("(%p,%p)\n", iface, pIPalette);
+
+    ret = ppng_get_PLTE(This->png_ptr, This->info_ptr, &png_palette, &num_palette);
+    if (!ret) return WINCODEC_ERR_PALETTEUNAVAILABLE;
+
+    if (num_palette > 256)
+    {
+        ERR("palette has %i colors?!\n", num_palette);
+        return E_FAIL;
+    }
+
+    for (i=0; i<num_palette; i++)
+    {
+        palette[i] = (0xff000000|
+                      png_palette[i].red << 16|
+                      png_palette[i].green << 8|
+                      png_palette[i].blue);
+    }
+
+    ret = ppng_get_tRNS(This->png_ptr, This->info_ptr, &trans, &num_trans, &trans_values);
+    if (ret)
+    {
+        for (i=0; i<num_trans; i++)
+        {
+            palette[trans[i]] = 0x00000000;
+        }
+    }
+
+    return IWICPalette_InitializeCustom(pIPalette, palette, num_palette);
 }
 
 static HRESULT WINAPI PngDecoder_Frame_CopyPixels(IWICBitmapFrameDecode *iface,




More information about the wine-cvs mailing list