Module: wine Branch: master Commit: cfdf84b434387c4e0006d7ec8b7b970c74c74df3 URL: http://source.winehq.org/git/wine.git/?a=commit;h=cfdf84b434387c4e0006d7ec8b...
Author: Dmitry Timoshkov dmitry@baikal.ru Date: Mon Sep 17 10:05:20 2012 +0900
windowscodecs: Add support for color table sort flag to the GIF decoder.
---
dlls/windowscodecs/gifformat.c | 3 ++- dlls/windowscodecs/ungif.c | 9 +++++++-- dlls/windowscodecs/ungif.h | 1 + 3 files changed, 10 insertions(+), 3 deletions(-)
diff --git a/dlls/windowscodecs/gifformat.c b/dlls/windowscodecs/gifformat.c index 1dba2bb..06047e7 100644 --- a/dlls/windowscodecs/gifformat.c +++ b/dlls/windowscodecs/gifformat.c @@ -912,7 +912,8 @@ static HRESULT create_IMD_metadata_reader(GifFrameDecode *This, IWICMetadataRead IMD_data.packed |= 1 << 7; /* local_color_table_size */ IMD_data.packed |= This->frame->ImageDesc.ColorMap->BitsPerPixel - 1; - /* FIXME: sort_flag */ + /* sort_flag */ + IMD_data.packed |= This->frame->ImageDesc.ColorMap->SortFlag ? 0x20 : 0; }
stream = create_stream(&IMD_data, sizeof(IMD_data)); diff --git a/dlls/windowscodecs/ungif.c b/dlls/windowscodecs/ungif.c index 85cd924..0efe065 100644 --- a/dlls/windowscodecs/ungif.c +++ b/dlls/windowscodecs/ungif.c @@ -272,7 +272,7 @@ FreeSavedImages(GifFileType * GifFile) { static int DGifGetScreenDesc(GifFileType * GifFile) {
- int i, BitsPerPixel; + int i, BitsPerPixel, SortFlag; GifByteType Buf[3];
/* Put the screen descriptor into the file: */ @@ -284,6 +284,7 @@ DGifGetScreenDesc(GifFileType * GifFile) { return GIF_ERROR; } GifFile->SColorResolution = (((Buf[0] & 0x70) + 1) >> 4) + 1; + SortFlag = (Buf[0] & 0x08) != 0; BitsPerPixel = (Buf[0] & 0x07) + 1; GifFile->SBackGroundColor = Buf[1]; GifFile->SAspectRatio = Buf[2]; @@ -295,6 +296,7 @@ DGifGetScreenDesc(GifFileType * GifFile) { }
/* Get the global color map: */ + GifFile->SColorMap->SortFlag = SortFlag; for (i = 0; i < GifFile->SColorMap->ColorCount; i++) { if (READ(GifFile, Buf, 3) != 3) { FreeMapObject(GifFile->SColorMap); @@ -353,7 +355,7 @@ DGifGetRecordType(GifFileType * GifFile, static int DGifGetImageDesc(GifFileType * GifFile) {
- int i, BitsPerPixel; + int i, BitsPerPixel, SortFlag; GifByteType Buf[3]; GifFilePrivateType *Private = GifFile->Private; SavedImage *sp; @@ -367,6 +369,7 @@ DGifGetImageDesc(GifFileType * GifFile) { return GIF_ERROR; } BitsPerPixel = (Buf[0] & 0x07) + 1; + SortFlag = (Buf[0] & 0x20) != 0; GifFile->Image.Interlace = (Buf[0] & 0x40); if (Buf[0] & 0x80) { /* Does this image have local color map? */
@@ -381,6 +384,7 @@ DGifGetImageDesc(GifFileType * GifFile) { }
/* Get the image local color map: */ + GifFile->Image.ColorMap->SortFlag = SortFlag; for (i = 0; i < GifFile->Image.ColorMap->ColorCount; i++) { if (READ(GifFile, Buf, 3) != 3) { FreeMapObject(GifFile->Image.ColorMap); @@ -417,6 +421,7 @@ DGifGetImageDesc(GifFileType * GifFile) { if (sp->ImageDesc.ColorMap == NULL) { return GIF_ERROR; } + sp->ImageDesc.ColorMap->SortFlag = GifFile->Image.ColorMap->SortFlag; } sp->RasterBits = NULL; sp->ExtensionBlockCount = 0; diff --git a/dlls/windowscodecs/ungif.h b/dlls/windowscodecs/ungif.h index 510b69a..5e377d2 100644 --- a/dlls/windowscodecs/ungif.h +++ b/dlls/windowscodecs/ungif.h @@ -88,6 +88,7 @@ typedef struct GifColorType { typedef struct ColorMapObject { int ColorCount; int BitsPerPixel; + int SortFlag; GifColorType *Colors; } ColorMapObject;