[3/3] windowscodecs: Add support for color table sort flag to the GIF decoder.
Dmitry Timoshkov
dmitry at baikal.ru
Sun Sep 16 20:05:20 CDT 2012
---
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;
--
1.7.11.6
More information about the wine-patches
mailing list