Vincent Povirk : windowscodecs: Support TIFF images with alpha data.

Alexandre Julliard julliard at winehq.org
Thu Oct 21 10:50:43 CDT 2010


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

Author: Vincent Povirk <vincent at codeweavers.com>
Date:   Sat May 29 12:32:32 2010 -0500

windowscodecs: Support TIFF images with alpha data.

---

 dlls/windowscodecs/regsvr.c     |    2 +
 dlls/windowscodecs/tiffformat.c |   51 ++++++++++++++++++++++++++++++++++----
 include/wincodec.idl            |    1 +
 3 files changed, 48 insertions(+), 6 deletions(-)

diff --git a/dlls/windowscodecs/regsvr.c b/dlls/windowscodecs/regsvr.c
index ac84368..b9e85cb 100644
--- a/dlls/windowscodecs/regsvr.c
+++ b/dlls/windowscodecs/regsvr.c
@@ -1083,6 +1083,8 @@ static GUID const * const tiff_formats[] = {
     &GUID_WICPixelFormat32bppBGRA,
     &GUID_WICPixelFormat32bppPBGRA,
     &GUID_WICPixelFormat48bppRGB,
+    &GUID_WICPixelFormat64bppRGBA,
+    &GUID_WICPixelFormat64bppPRGBA,
     NULL
 };
 
diff --git a/dlls/windowscodecs/tiffformat.c b/dlls/windowscodecs/tiffformat.c
index f48d734..f45e03d 100644
--- a/dlls/windowscodecs/tiffformat.c
+++ b/dlls/windowscodecs/tiffformat.c
@@ -227,6 +227,7 @@ static const IWICBitmapFrameDecodeVtbl TiffFrameDecode_Vtbl;
 static HRESULT tiff_get_decode_info(TIFF *tiff, tiff_decode_info *decode_info)
 {
     uint16 photometric, bps, samples, planar;
+    uint16 extra_sample_count, *extra_samples;
     int ret;
 
     decode_info->indexed = 0;
@@ -293,7 +294,16 @@ static HRESULT tiff_get_decode_info(TIFF *tiff, tiff_decode_info *decode_info)
     case 2: /* RGB */
         decode_info->bpp = bps * samples;
 
-        if (samples != 3)
+        if (samples == 4)
+        {
+            ret = pTIFFGetField(tiff, TIFFTAG_EXTRASAMPLES, &extra_sample_count, &extra_samples);
+            if (!ret)
+            {
+                WARN("Cannot get extra sample type for RGB data, ret=%i count=%i\n", ret, extra_sample_count);
+                return E_FAIL;
+            }
+        }
+        else if (samples != 3)
         {
             FIXME("unhandled RGB sample count %u\n", samples);
             return E_FAIL;
@@ -303,10 +313,38 @@ static HRESULT tiff_get_decode_info(TIFF *tiff, tiff_decode_info *decode_info)
         {
         case 8:
             decode_info->reverse_bgr = 1;
-            decode_info->format = &GUID_WICPixelFormat24bppBGR;
+            if (samples == 3)
+                decode_info->format = &GUID_WICPixelFormat24bppBGR;
+            else
+                switch(extra_samples[0])
+                {
+                case 1: /* Associated (pre-multiplied) alpha data */
+                    decode_info->format = &GUID_WICPixelFormat32bppPBGRA;
+                    break;
+                case 2: /* Unassociated alpha data */
+                    decode_info->format = &GUID_WICPixelFormat32bppBGRA;
+                    break;
+                default:
+                    FIXME("unhandled extra sample type %i\n", extra_samples[0]);
+                    return E_FAIL;
+                }
             break;
         case 16:
-            decode_info->format = &GUID_WICPixelFormat48bppRGB;
+            if (samples == 3)
+                decode_info->format = &GUID_WICPixelFormat48bppRGB;
+            else
+                switch(extra_samples[0])
+                {
+                case 1: /* Associated (pre-multiplied) alpha data */
+                    decode_info->format = &GUID_WICPixelFormat64bppPRGBA;
+                    break;
+                case 2: /* Unassociated alpha data */
+                    decode_info->format = &GUID_WICPixelFormat64bppRGBA;
+                    break;
+                default:
+                    FIXME("unhandled extra sample type %i\n", extra_samples[0]);
+                    return E_FAIL;
+                }
             break;
         default:
             FIXME("unhandled RGB bit count %u\n", bps);
@@ -745,19 +783,20 @@ static HRESULT TiffFrameDecode_ReadTile(TiffFrameDecode *This, UINT tile_x, UINT
 
     if (hr == S_OK && This->decode_info.reverse_bgr)
     {
-        if (This->decode_info.format == &GUID_WICPixelFormat24bppBGR)
+        if (This->decode_info.bps == 8)
         {
-            UINT i, total_pixels;
+            UINT i, total_pixels, sample_count;
             BYTE *pixel, temp;
 
             total_pixels = This->decode_info.tile_width * This->decode_info.tile_height;
             pixel = This->cached_tile;
+            sample_count = This->decode_info.samples;
             for (i=0; i<total_pixels; i++)
             {
                 temp = pixel[2];
                 pixel[2] = pixel[0];
                 pixel[0] = temp;
-                pixel += 3;
+                pixel += sample_count;
             }
         }
     }
diff --git a/include/wincodec.idl b/include/wincodec.idl
index 76aac1b..04fb212 100644
--- a/include/wincodec.idl
+++ b/include/wincodec.idl
@@ -165,6 +165,7 @@ cpp_quote("DEFINE_GUID(GUID_WICPixelFormat32bppPBGRA, 0x6fddc324,0x4e03,0x4bfe,0
 
 cpp_quote("DEFINE_GUID(GUID_WICPixelFormat48bppRGB, 0x6fddc324,0x4e03,0x4bfe,0xb1,0x85,0x3d,0x77,0x76,0x8d,0xc9,0x15);")
 cpp_quote("DEFINE_GUID(GUID_WICPixelFormat64bppRGBA, 0x6fddc324,0x4e03,0x4bfe,0xb1,0x85,0x3d,0x77,0x76,0x8d,0xc9,0x16);")
+cpp_quote("DEFINE_GUID(GUID_WICPixelFormat64bppPRGBA, 0x6fddc324,0x4e03,0x4bfe,0xb1,0x85,0x3d,0x77,0x76,0x8d,0xc9,0x17);")
 
 cpp_quote("DEFINE_GUID(GUID_WICPixelFormat32bppCMYK, 0x6fddc324,0x4e03,0x4fbe,0xb1,0x85,0x3d,0x77,0x76,0x8d,0xc9,0x1c);")
 




More information about the wine-cvs mailing list