__transparent = false;
__chromaKey = BGRA8888(0xff, 0x00, 0xff, 0x00);
__transColor = 0;
- __pixelFormat = MEDIA_PIXEL_FORMAT_RGB565LE;
+ __pixelFormat = MEDIA_PIXEL_FORMAT_BGRA8888;
__firstFramePos = 0;
__dstLength = 0;
__srcWidth = 0;
__frameIndex = 0;
__duration = 0;
__totalFrames = 0;
+ __globalTransparent = false;
+ __globalChromaKey = __chromaKey;
}
_GifDecoder::~_GifDecoder(void)
{
for (k = 0; k < width; k++)
{
- pBuf[k] = ((unsigned short*) pPalette)[pLine[k]];
+ if (pLine[k] == __transColor && __frameIndex == 0)
+ {
+ pBuf[k] = ((unsigned short*) pPalette)[pLine[k]];
+ }
+ else if (pLine[k] == __transColor)
+ {
+ // use previous frame's color
+ }
+ else
+ {
+ pBuf[k] = ((unsigned short*) pPalette)[pLine[k]];
+ }
}
}
}
{
for (k = 0; k < width; k++)
{
- pBuf[k] = ((unsigned int*) pPalette)[pLine[k]];
- if (pLine[k] == __transColor)
+ if (pLine[k] == __transColor && __frameIndex == 0)
{
+ pBuf[k] = ((unsigned int*) pPalette)[pLine[k]];
pBuf[k] &= 0x00ffffff;
}
+ else if (pLine[k] == __transColor)
+ {
+ // use previous frame's color
+ }
+ else
+ {
+ pBuf[k] = ((unsigned int*) pPalette)[pLine[k]];
+ }
}
}
else
"[E_INVALID_DATA] DGifGetLineByte failed with code %x", GifLastError());
for (k = 0; k < width; k++)
{
- pBuf[k] = ((unsigned short*) pPalette)[pLine[k]];
+ if (pLine[k] == __transColor && __frameIndex == 0)
+ {
+ pBuf[k] = ((unsigned short*) pPalette)[pLine[k]];
+ }
+ else if (pLine[k] == __transColor)
+ {
+ // use previous frame's color
+ }
+ else
+ {
+ pBuf[k] = ((unsigned short*) pPalette)[pLine[k]];
+ }
}
}
}
{
for (k = 0; k < width; k++)
{
- pBuf[k] = ((unsigned int*) pPalette)[pLine[k]];
- if (pLine[k] == __transColor)
+ if (pLine[k] == __transColor && __frameIndex == 0)
{
+ pBuf[k] = ((unsigned int*) pPalette)[pLine[k]];
pBuf[k] &= 0x00ffffff;
}
+ else if (pLine[k] == __transColor)
+ {
+ // use previous frame's color
+ }
+ else
+ {
+ pBuf[k] = ((unsigned int*) pPalette)[pLine[k]];
+ }
}
}
else
}
length = __dstLength;
r = E_SUCCESS;
+
+ if (__frameIndex == 0)
+ {
+ __globalTransparent = __transparent;
+ __globalChromaKey = __chromaKey;
+ }
+ __frameIndex++;
+
return r;
}
r = ConstructBuffer(__pixelFormat);
+ __frameIndex = 0;
CATCH:
return r;
}
SysTryCatch(NID_MEDIA, pTransparent, r = E_INVALID_ARG, E_INVALID_ARG,
"value is not a Boolean");
- pTransparent->value = __transparent;
+ pTransparent->value = __globalTransparent;
}
else if (key.Equals(L"chromaKey", false))
{
SysTryCatch(NID_MEDIA, pChromaKey, r = E_INVALID_ARG, E_INVALID_ARG,
"value is not an Integer");
- pChromaKey->value = __chromaKey;
+ pChromaKey->value = __globalChromaKey;
}
else
{