From cfdf84b434387c4e0006d7ec8b7b970c74c74df3 Mon Sep 17 00:00:00 2001 From: Dmitry Timoshkov Date: Mon, 17 Sep 2012 10:05:20 +0900 Subject: [PATCH] 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 1dba2bb0f76..06047e765b4 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 85cd92433c9..0efe065270e 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 510b69ae840..5e377d2bfdc 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;