< prev index next >
src/java.desktop/share/native/libsplashscreen/splashscreen_gif.c
Print this page
*** 80,91 ****
int bufferSize;
byte_t *pBitmapBits, *pOldBitmapBits;
int i, j;
int imageIndex;
int cx, cy, cw, ch; /* clamped coordinates */
! int numLines;
! int numPassLines;
if (DGifSlurp(gif) == GIF_ERROR) {
return 0;
}
--- 80,91 ----
int bufferSize;
byte_t *pBitmapBits, *pOldBitmapBits;
int i, j;
int imageIndex;
int cx, cy, cw, ch; /* clamped coordinates */
! const int interlacedOffset[] = { 0, 4, 2, 1, 0 }; /* The way Interlaced image should. */
! const int interlacedJumps[] = { 8, 8, 4, 2, 1 }; /* be read - offsets and jumps... */
if (DGifSlurp(gif) == GIF_ERROR) {
return 0;
}
*** 211,245 ****
{
byte_t *pSrc = image->RasterBits;
ImageFormat srcFormat;
ImageRect srcRect, dstRect;
srcFormat.colorMap = colorMapBuf;
srcFormat.depthBytes = 1;
srcFormat.byteOrder = BYTE_ORDER_NATIVE;
srcFormat.transparentColor = transparentColor;
srcFormat.fixedBits = QUAD_ALPHA_MASK; // fixed 100% alpha
srcFormat.premultiplied = 0;
/* Number of source lines for current pass */
! numPassLines = desc->Height;
/* Number of lines that fits to dest buffer */
! numLines = ch;
initRect(&srcRect, 0, 0, desc->Width, numLines, 1,
desc->Width, pSrc, &srcFormat);
if (numLines > 0) {
! initRect(&dstRect, cx, cy, cw,
! numLines , 1, stride, pBitmapBits, &splash->imageFormat);
pSrc += convertRect(&srcRect, &dstRect, CVT_ALPHATEST);
}
// skip extra source data
pSrc += (numPassLines - numLines) * srcRect.stride;
}
// now dispose of the previous frame correctly
splash->frames[imageIndex].bitmapBits =
(rgbquad_t *) malloc(bufferSize); // bufferSize is safe (checked above)
--- 211,257 ----
{
byte_t *pSrc = image->RasterBits;
ImageFormat srcFormat;
ImageRect srcRect, dstRect;
+ int pass = 4, npass = 5;
+
+ #if GIFLIB_MAJOR < 5
+ if (desc->Interlace) {
+ pass = 0;
+ npass = 4;
+ }
+ #endif
srcFormat.colorMap = colorMapBuf;
srcFormat.depthBytes = 1;
srcFormat.byteOrder = BYTE_ORDER_NATIVE;
srcFormat.transparentColor = transparentColor;
srcFormat.fixedBits = QUAD_ALPHA_MASK; // fixed 100% alpha
srcFormat.premultiplied = 0;
+ for (; pass < npass; ++pass) {
+ int jump = interlacedJumps[pass];
+ int ofs = interlacedOffset[pass];
/* Number of source lines for current pass */
! int numPassLines = (desc->Height + jump - ofs - 1) / jump;
/* Number of lines that fits to dest buffer */
! int numLines = (ch + jump - ofs - 1) / jump;
initRect(&srcRect, 0, 0, desc->Width, numLines, 1,
desc->Width, pSrc, &srcFormat);
if (numLines > 0) {
! initRect(&dstRect, cx, cy + ofs, cw,
! numLines , jump, stride, pBitmapBits, &splash->imageFormat);
pSrc += convertRect(&srcRect, &dstRect, CVT_ALPHATEST);
}
// skip extra source data
pSrc += (numPassLines - numLines) * srcRect.stride;
}
+ }
// now dispose of the previous frame correctly
splash->frames[imageIndex].bitmapBits =
(rgbquad_t *) malloc(bufferSize); // bufferSize is safe (checked above)
*** 294,312 ****
}
free(pBitmapBits);
free(pOldBitmapBits);
! DGifCloseFile(gif, NULL);
return 1;
}
int
SplashDecodeGifStream(Splash * splash, SplashStream * stream)
{
GifFileType *gif = DGifOpen((void *) stream, SplashStreamGifInputFunc, NULL);
if (!gif)
return 0;
return SplashDecodeGif(splash, gif);
}
--- 306,334 ----
}
free(pBitmapBits);
free(pOldBitmapBits);
! #if GIFLIB_MAJOR > 5 || (GIFLIB_MAJOR == 5 && GIFLIB_MINOR >= 1)
! if (DGifCloseFile(gif, NULL) == GIF_ERROR) {
! return 0;
! }
! #else
! DGifCloseFile(gif);
! #endif
return 1;
}
int
SplashDecodeGifStream(Splash * splash, SplashStream * stream)
{
+ #if GIFLIB_MAJOR >= 5
GifFileType *gif = DGifOpen((void *) stream, SplashStreamGifInputFunc, NULL);
+ #else
+ GifFileType *gif = DGifOpen((void *) stream, SplashStreamGifInputFunc);
+ #endif
if (!gif)
return 0;
return SplashDecodeGif(splash, gif);
}
< prev index next >