Vincent Povirk : windowscodecs: Add support for decoding RGB TIFF images.

Alexandre Julliard julliard at winehq.org
Mon Mar 22 11:12:03 CDT 2010


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

Author: Vincent Povirk <vincent at codeweavers.com>
Date:   Fri Mar 19 17:11:50 2010 -0500

windowscodecs: Add support for decoding RGB TIFF images.

---

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

diff --git a/dlls/windowscodecs/tiffformat.c b/dlls/windowscodecs/tiffformat.c
index 2b93c74..fe87ddd 100644
--- a/dlls/windowscodecs/tiffformat.c
+++ b/dlls/windowscodecs/tiffformat.c
@@ -220,7 +220,7 @@ static const IWICBitmapFrameDecodeVtbl TiffFrameDecode_Vtbl;
 
 static HRESULT tiff_get_decode_info(TIFF *tiff, tiff_decode_info *decode_info)
 {
-    uint16 photometric, bps;
+    uint16 photometric, bps, samples, planar;
     int ret;
 
     decode_info->indexed = 0;
@@ -256,6 +256,29 @@ static HRESULT tiff_get_decode_info(TIFF *tiff, tiff_decode_info *decode_info)
             return E_FAIL;
         }
         break;
+    case 2: /* RGB */
+        if (bps != 8)
+        {
+            FIXME("unhandled RGB bit count %u\n", bps);
+            return E_FAIL;
+        }
+        ret = pTIFFGetField(tiff, TIFFTAG_SAMPLESPERPIXEL, &samples);
+        if (samples != 3)
+        {
+            FIXME("unhandled RGB sample count %u\n", samples);
+            return E_FAIL;
+        }
+        ret = pTIFFGetField(tiff, TIFFTAG_PLANARCONFIG, &planar);
+        if (!ret) planar = 1;
+        if (planar != 1)
+        {
+            FIXME("unhandled planar configuration %u\n", planar);
+            return E_FAIL;
+        }
+        decode_info->bpp = bps * samples;
+        decode_info->reverse_bgr = 1;
+        decode_info->format = &GUID_WICPixelFormat24bppBGR;
+        break;
     case 3: /* RGB Palette */
         decode_info->indexed = 1;
         decode_info->bpp = bps;
@@ -273,7 +296,6 @@ static HRESULT tiff_get_decode_info(TIFF *tiff, tiff_decode_info *decode_info)
         }
         break;
     case 0: /* WhiteIsZero */
-    case 2: /* RGB */
     case 4: /* Transparency mask */
     case 5: /* CMYK */
     case 6: /* YCbCr */
@@ -651,6 +673,25 @@ static HRESULT TiffFrameDecode_ReadTile(TiffFrameDecode *This, UINT tile_x, UINT
             hr = E_FAIL;
     }
 
+    if (hr == S_OK && This->decode_info.reverse_bgr)
+    {
+        if (This->decode_info.format == &GUID_WICPixelFormat24bppBGR)
+        {
+            UINT i, total_pixels;
+            BYTE *pixel, temp;
+
+            total_pixels = This->decode_info.tile_width * This->decode_info.tile_height;
+            pixel = This->cached_tile;
+            for (i=0; i<total_pixels; i++)
+            {
+                temp = pixel[2];
+                pixel[2] = pixel[0];
+                pixel[0] = temp;
+                pixel += 3;
+            }
+        }
+    }
+
     if (hr == S_OK)
     {
         This->cached_tile_x = tile_x;




More information about the wine-cvs mailing list