diff -r 58f22982419a -r 995727750ee6 jdk/src/java.desktop/share/native/libsplashscreen/splashscreen_gif.c --- a/jdk/src/java.desktop/share/native/libsplashscreen/splashscreen_gif.c Mon Jun 08 18:30:41 2015 +0300 +++ b/jdk/src/java.desktop/share/native/libsplashscreen/splashscreen_gif.c Mon Jun 08 16:47:23 2015 +0100 @@ -82,8 +82,8 @@ int i, j; int imageIndex; int cx, cy, cw, ch; /* clamped coordinates */ - int numLines; - int numPassLines; + 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; @@ -213,6 +213,16 @@ byte_t *pSrc = image->RasterBits; ImageFormat srcFormat; ImageRect srcRect, dstRect; + int pass = 4, npass = 5; + +#if GIFLIB_MAJOR < 5 + /* Interlaced gif support is broken in giflib < 5 + so we need to work around this */ + if (desc->Interlace) { + pass = 0; + npass = 4; + } +#endif srcFormat.colorMap = colorMapBuf; srcFormat.depthBytes = 1; @@ -221,22 +231,26 @@ 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); + 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; - if (numLines > 0) { - initRect(&dstRect, cx, cy, cw, - numLines , 1, stride, pBitmapBits, &splash->imageFormat); + initRect(&srcRect, 0, 0, desc->Width, numLines, 1, + desc->Width, pSrc, &srcFormat); - pSrc += convertRect(&srcRect, &dstRect, CVT_ALPHATEST); + 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; } - // skip extra source data - pSrc += (numPassLines - numLines) * srcRect.stride; } // now dispose of the previous frame correctly @@ -296,7 +310,13 @@ free(pBitmapBits); free(pOldBitmapBits); - DGifCloseFile(gif, NULL); +#if GIFLIB_MAJOR > 5 || (GIFLIB_MAJOR == 5 && GIFLIB_MINOR >= 1) + if (DGifCloseFile(gif, NULL) == GIF_ERROR) { + return 0; + } +#else + DGifCloseFile(gif); +#endif return 1; } @@ -304,7 +324,11 @@ 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;