windowscodecs: Add support for decoding RGB TIFF images.
authorVincent Povirk <vincent@codeweavers.com>
Fri, 19 Mar 2010 22:11:50 +0000 (17:11 -0500)
committerAlexandre Julliard <julliard@winehq.org>
Mon, 22 Mar 2010 10:44:18 +0000 (11:44 +0100)
dlls/windowscodecs/tiffformat.c

index 2b93c7472b40b4c83fb72d4dd7ecdf2cae82a4f2..fe87ddd6ba5048f2ccefbff9799ee5dabcf03ebd 100644 (file)
@@ -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;