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,259 ---- { 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; 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); } --- 308,336 ---- } 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); }