Vincent Povirk : windowscodecs: Byte-swap image data from big endian TIFF files.
Alexandre Julliard
julliard at winehq.org
Wed Aug 25 12:35:04 CDT 2010
Module: wine
Branch: master
Commit: e486a17a407bd458f6070025b370fb2f8ac5c774
URL: http://source.winehq.org/git/wine.git/?a=commit;h=e486a17a407bd458f6070025b370fb2f8ac5c774
Author: Vincent Povirk <vincent at codeweavers.com>
Date: Sat May 29 10:43:30 2010 -0500
windowscodecs: Byte-swap image data from big endian TIFF files.
---
dlls/windowscodecs/tiffformat.c | 41 ++++++++++++++++++++++++++++++++++++++-
1 files changed, 40 insertions(+), 1 deletions(-)
diff --git a/dlls/windowscodecs/tiffformat.c b/dlls/windowscodecs/tiffformat.c
index 9318ac2..c92a2f2 100644
--- a/dlls/windowscodecs/tiffformat.c
+++ b/dlls/windowscodecs/tiffformat.c
@@ -59,6 +59,7 @@ MAKE_FUNCPTR(TIFFClientOpen);
MAKE_FUNCPTR(TIFFClose);
MAKE_FUNCPTR(TIFFCurrentDirectory);
MAKE_FUNCPTR(TIFFGetField);
+MAKE_FUNCPTR(TIFFIsByteSwapped);
MAKE_FUNCPTR(TIFFReadDirectory);
MAKE_FUNCPTR(TIFFReadEncodedStrip);
MAKE_FUNCPTR(TIFFSetDirectory);
@@ -85,6 +86,7 @@ static void *load_libtiff(void)
LOAD_FUNCPTR(TIFFClose);
LOAD_FUNCPTR(TIFFCurrentDirectory);
LOAD_FUNCPTR(TIFFGetField);
+ LOAD_FUNCPTR(TIFFIsByteSwapped);
LOAD_FUNCPTR(TIFFReadDirectory);
LOAD_FUNCPTR(TIFFReadEncodedStrip);
LOAD_FUNCPTR(TIFFSetDirectory);
@@ -197,6 +199,8 @@ typedef struct {
typedef struct {
const WICPixelFormatGUID *format;
+ int bps;
+ int samples;
int bpp;
int indexed;
int reverse_bgr;
@@ -220,7 +224,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 photometric, bps, samples=1, planar;
int ret;
decode_info->indexed = 0;
@@ -236,6 +240,8 @@ static HRESULT tiff_get_decode_info(TIFF *tiff, tiff_decode_info *decode_info)
ret = pTIFFGetField(tiff, TIFFTAG_BITSPERSAMPLE, &bps);
if (!ret) bps = 1;
+ decode_info->bps = bps;
+
switch(photometric)
{
case 1: /* BlackIsZero */
@@ -313,6 +319,8 @@ static HRESULT tiff_get_decode_info(TIFF *tiff, tiff_decode_info *decode_info)
return E_FAIL;
}
+ decode_info->samples = samples;
+
ret = pTIFFGetField(tiff, TIFFTAG_IMAGEWIDTH, &decode_info->width);
if (!ret)
{
@@ -667,6 +675,9 @@ static HRESULT TiffFrameDecode_ReadTile(TiffFrameDecode *This, UINT tile_x, UINT
{
HRESULT hr=S_OK;
tsize_t ret;
+ int swap_bytes;
+
+ swap_bytes = pTIFFIsByteSwapped(This->parent->tiff);
ret = pTIFFSetDirectory(This->parent->tiff, This->index);
@@ -700,6 +711,34 @@ static HRESULT TiffFrameDecode_ReadTile(TiffFrameDecode *This, UINT tile_x, UINT
}
}
+ if (hr == S_OK && swap_bytes && This->decode_info.bps > 8)
+ {
+ UINT row, i, samples_per_row;
+ BYTE *sample, temp;
+
+ samples_per_row = This->decode_info.tile_width * This->decode_info.samples;
+
+ switch(This->decode_info.bps)
+ {
+ case 16:
+ for (row=0; row<This->decode_info.tile_height; row++)
+ {
+ sample = This->cached_tile + row * This->decode_info.tile_stride;
+ for (i=0; i<samples_per_row; i++)
+ {
+ temp = sample[1];
+ sample[1] = sample[0];
+ sample[0] = temp;
+ sample += 2;
+ }
+ }
+ break;
+ default:
+ ERR("unhandled bps for byte swap %u\n", This->decode_info.bps);
+ return E_FAIL;
+ }
+ }
+
if (hr == S_OK)
{
This->cached_tile_x = tile_x;
More information about the wine-cvs
mailing list