src/java.desktop/share/native/libsplashscreen/splashscreen_gif.c
author erikj
Tue, 12 Sep 2017 19:03:39 +0200
changeset 47216 71c04702a3d5
parent 31173 jdk/src/java.desktop/share/native/libsplashscreen/splashscreen_gif.c@995727750ee6
permissions -rw-r--r--
8187443: Forest Consolidation: Move files to unified layout Reviewed-by: darcy, ihse
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
     1
/*
23010
6dadb192ad81 8029235: Update copyright year to match last edit in jdk8 jdk repository for 2013
lana
parents: 18232
diff changeset
     2
 * Copyright (c) 2005, 2013, Oracle and/or its affiliates. All rights reserved.
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
     3
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
90ce3da70b43 Initial load
duke
parents:
diff changeset
     4
 *
90ce3da70b43 Initial load
duke
parents:
diff changeset
     5
 * This code is free software; you can redistribute it and/or modify it
90ce3da70b43 Initial load
duke
parents:
diff changeset
     6
 * under the terms of the GNU General Public License version 2 only, as
5506
202f599c92aa 6943119: Rebrand source copyright notices
ohair
parents: 2608
diff changeset
     7
 * published by the Free Software Foundation.  Oracle designates this
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
     8
 * particular file as subject to the "Classpath" exception as provided
5506
202f599c92aa 6943119: Rebrand source copyright notices
ohair
parents: 2608
diff changeset
     9
 * by Oracle in the LICENSE file that accompanied this code.
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
    10
 *
90ce3da70b43 Initial load
duke
parents:
diff changeset
    11
 * This code is distributed in the hope that it will be useful, but WITHOUT
90ce3da70b43 Initial load
duke
parents:
diff changeset
    12
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
90ce3da70b43 Initial load
duke
parents:
diff changeset
    13
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
90ce3da70b43 Initial load
duke
parents:
diff changeset
    14
 * version 2 for more details (a copy is included in the LICENSE file that
90ce3da70b43 Initial load
duke
parents:
diff changeset
    15
 * accompanied this code).
90ce3da70b43 Initial load
duke
parents:
diff changeset
    16
 *
90ce3da70b43 Initial load
duke
parents:
diff changeset
    17
 * You should have received a copy of the GNU General Public License version
90ce3da70b43 Initial load
duke
parents:
diff changeset
    18
 * 2 along with this work; if not, write to the Free Software Foundation,
90ce3da70b43 Initial load
duke
parents:
diff changeset
    19
 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
90ce3da70b43 Initial load
duke
parents:
diff changeset
    20
 *
5506
202f599c92aa 6943119: Rebrand source copyright notices
ohair
parents: 2608
diff changeset
    21
 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
202f599c92aa 6943119: Rebrand source copyright notices
ohair
parents: 2608
diff changeset
    22
 * or visit www.oracle.com if you need additional information or have any
202f599c92aa 6943119: Rebrand source copyright notices
ohair
parents: 2608
diff changeset
    23
 * questions.
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
    24
 */
90ce3da70b43 Initial load
duke
parents:
diff changeset
    25
90ce3da70b43 Initial load
duke
parents:
diff changeset
    26
#include "splashscreen_impl.h"
90ce3da70b43 Initial load
duke
parents:
diff changeset
    27
#include "splashscreen_gfx.h"
90ce3da70b43 Initial load
duke
parents:
diff changeset
    28
16512
024da1ae4667 8011278: Allow using a system-installed giflib
omajid
parents: 7668
diff changeset
    29
#include <gif_lib.h>
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
    30
18232
b538b71fb429 8009071: Improve shape handling
anthony
parents: 16512
diff changeset
    31
#include "sizecalc.h"
b538b71fb429 8009071: Improve shape handling
anthony
parents: 16512
diff changeset
    32
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
    33
#define GIF_TRANSPARENT     0x01
90ce3da70b43 Initial load
duke
parents:
diff changeset
    34
#define GIF_USER_INPUT      0x02
90ce3da70b43 Initial load
duke
parents:
diff changeset
    35
#define GIF_DISPOSE_MASK    0x07
90ce3da70b43 Initial load
duke
parents:
diff changeset
    36
#define GIF_DISPOSE_SHIFT   2
90ce3da70b43 Initial load
duke
parents:
diff changeset
    37
90ce3da70b43 Initial load
duke
parents:
diff changeset
    38
#define GIF_NOT_TRANSPARENT -1
90ce3da70b43 Initial load
duke
parents:
diff changeset
    39
90ce3da70b43 Initial load
duke
parents:
diff changeset
    40
#define GIF_DISPOSE_NONE    0   // No disposal specified. The decoder is
90ce3da70b43 Initial load
duke
parents:
diff changeset
    41
                                // not required to take any action.
90ce3da70b43 Initial load
duke
parents:
diff changeset
    42
#define GIF_DISPOSE_LEAVE   1   // Do not dispose. The graphic is to be left
90ce3da70b43 Initial load
duke
parents:
diff changeset
    43
                                // in place.
90ce3da70b43 Initial load
duke
parents:
diff changeset
    44
#define GIF_DISPOSE_BACKGND 2   // Restore to background color. The area used by the
90ce3da70b43 Initial load
duke
parents:
diff changeset
    45
                                // graphic must be restored to the background color.
90ce3da70b43 Initial load
duke
parents:
diff changeset
    46
90ce3da70b43 Initial load
duke
parents:
diff changeset
    47
#define GIF_DISPOSE_RESTORE 3   // Restore to previous. The decoder is required to
90ce3da70b43 Initial load
duke
parents:
diff changeset
    48
                                // restore the area overwritten by the graphic with
90ce3da70b43 Initial load
duke
parents:
diff changeset
    49
                                // what was there prior to rendering the graphic.
90ce3da70b43 Initial load
duke
parents:
diff changeset
    50
90ce3da70b43 Initial load
duke
parents:
diff changeset
    51
static const char szNetscape20ext[11] = "NETSCAPE2.0";
90ce3da70b43 Initial load
duke
parents:
diff changeset
    52
90ce3da70b43 Initial load
duke
parents:
diff changeset
    53
#define NSEXT_LOOP      0x01    // Loop Count field code
90ce3da70b43 Initial load
duke
parents:
diff changeset
    54
90ce3da70b43 Initial load
duke
parents:
diff changeset
    55
// convert libungif samples to our ones
6825
795e9fe949d3 6989721: awt native code compiler warnings
art
parents: 5506
diff changeset
    56
#define MAKE_QUAD_GIF(c,a) MAKE_QUAD((c).Red, (c).Green, (c).Blue, (unsigned)(a))
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
    57
90ce3da70b43 Initial load
duke
parents:
diff changeset
    58
/* stdio FILE* and memory input functions for libungif */
90ce3da70b43 Initial load
duke
parents:
diff changeset
    59
int
90ce3da70b43 Initial load
duke
parents:
diff changeset
    60
SplashStreamGifInputFunc(GifFileType * gif, GifByteType * buf, int n)
90ce3da70b43 Initial load
duke
parents:
diff changeset
    61
{
90ce3da70b43 Initial load
duke
parents:
diff changeset
    62
    SplashStream* io = (SplashStream*)gif->UserData;
90ce3da70b43 Initial load
duke
parents:
diff changeset
    63
    int rc = io->read(io, buf, n);
90ce3da70b43 Initial load
duke
parents:
diff changeset
    64
    return rc;
90ce3da70b43 Initial load
duke
parents:
diff changeset
    65
}
90ce3da70b43 Initial load
duke
parents:
diff changeset
    66
2603
2c6a8be8dc13 6766136: corrupted gif image may cause crash in java splashscreen library.
bae
parents: 2
diff changeset
    67
/* These macro help to ensure that we only take part of frame that fits into
2c6a8be8dc13 6766136: corrupted gif image may cause crash in java splashscreen library.
bae
parents: 2
diff changeset
    68
   logical screen. */
2c6a8be8dc13 6766136: corrupted gif image may cause crash in java splashscreen library.
bae
parents: 2
diff changeset
    69
2c6a8be8dc13 6766136: corrupted gif image may cause crash in java splashscreen library.
bae
parents: 2
diff changeset
    70
/* Ensure that p belongs to [pmin, pmax) interval. Returns fixed point (if fix is needed) */
2c6a8be8dc13 6766136: corrupted gif image may cause crash in java splashscreen library.
bae
parents: 2
diff changeset
    71
#define FIX_POINT(p, pmin, pmax) ( ((p) < (pmin)) ? (pmin) : (((p) > (pmax)) ? (pmax) : (p)))
2c6a8be8dc13 6766136: corrupted gif image may cause crash in java splashscreen library.
bae
parents: 2
diff changeset
    72
/* Ensures that line starting at point p does not exceed boundary pmax.
2c6a8be8dc13 6766136: corrupted gif image may cause crash in java splashscreen library.
bae
parents: 2
diff changeset
    73
   Returns fixed length (if fix is needed) */
2c6a8be8dc13 6766136: corrupted gif image may cause crash in java splashscreen library.
bae
parents: 2
diff changeset
    74
#define FIX_LENGTH(p, len, pmax) ( ((p) + (len)) > (pmax) ? ((pmax) - (p)) : (len))
2c6a8be8dc13 6766136: corrupted gif image may cause crash in java splashscreen library.
bae
parents: 2
diff changeset
    75
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
    76
int
90ce3da70b43 Initial load
duke
parents:
diff changeset
    77
SplashDecodeGif(Splash * splash, GifFileType * gif)
90ce3da70b43 Initial load
duke
parents:
diff changeset
    78
{
90ce3da70b43 Initial load
duke
parents:
diff changeset
    79
    int stride;
90ce3da70b43 Initial load
duke
parents:
diff changeset
    80
    int bufferSize;
90ce3da70b43 Initial load
duke
parents:
diff changeset
    81
    byte_t *pBitmapBits, *pOldBitmapBits;
90ce3da70b43 Initial load
duke
parents:
diff changeset
    82
    int i, j;
90ce3da70b43 Initial load
duke
parents:
diff changeset
    83
    int imageIndex;
2603
2c6a8be8dc13 6766136: corrupted gif image may cause crash in java splashscreen library.
bae
parents: 2
diff changeset
    84
    int cx, cy, cw, ch; /* clamped coordinates */
31173
995727750ee6 8081315: 8077982 giflib upgrade breaks system giflib builds with earlier versions
andrew
parents: 30496
diff changeset
    85
    const int interlacedOffset[] = { 0, 4, 2, 1, 0 };   /* The way Interlaced image should. */
995727750ee6 8081315: 8077982 giflib upgrade breaks system giflib builds with earlier versions
andrew
parents: 30496
diff changeset
    86
    const int interlacedJumps[] = { 8, 8, 4, 2, 1 };    /* be read - offsets and jumps... */
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
    87
90ce3da70b43 Initial load
duke
parents:
diff changeset
    88
    if (DGifSlurp(gif) == GIF_ERROR) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
    89
        return 0;
90ce3da70b43 Initial load
duke
parents:
diff changeset
    90
    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
    91
90ce3da70b43 Initial load
duke
parents:
diff changeset
    92
    SplashCleanup(splash);
90ce3da70b43 Initial load
duke
parents:
diff changeset
    93
2603
2c6a8be8dc13 6766136: corrupted gif image may cause crash in java splashscreen library.
bae
parents: 2
diff changeset
    94
    if (!SAFE_TO_ALLOC(gif->SWidth, splash->imageFormat.depthBytes)) {
2c6a8be8dc13 6766136: corrupted gif image may cause crash in java splashscreen library.
bae
parents: 2
diff changeset
    95
        return 0;
2c6a8be8dc13 6766136: corrupted gif image may cause crash in java splashscreen library.
bae
parents: 2
diff changeset
    96
    }
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
    97
    stride = gif->SWidth * splash->imageFormat.depthBytes;
90ce3da70b43 Initial load
duke
parents:
diff changeset
    98
    if (splash->byteAlignment > 1)
90ce3da70b43 Initial load
duke
parents:
diff changeset
    99
        stride =
90ce3da70b43 Initial load
duke
parents:
diff changeset
   100
            (stride + splash->byteAlignment - 1) & ~(splash->byteAlignment - 1);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   101
2603
2c6a8be8dc13 6766136: corrupted gif image may cause crash in java splashscreen library.
bae
parents: 2
diff changeset
   102
    if (!SAFE_TO_ALLOC(gif->SHeight, stride)) {
2c6a8be8dc13 6766136: corrupted gif image may cause crash in java splashscreen library.
bae
parents: 2
diff changeset
   103
        return 0;
2c6a8be8dc13 6766136: corrupted gif image may cause crash in java splashscreen library.
bae
parents: 2
diff changeset
   104
    }
2c6a8be8dc13 6766136: corrupted gif image may cause crash in java splashscreen library.
bae
parents: 2
diff changeset
   105
2c6a8be8dc13 6766136: corrupted gif image may cause crash in java splashscreen library.
bae
parents: 2
diff changeset
   106
    if (!SAFE_TO_ALLOC(gif->ImageCount, sizeof(SplashImage*))) {
2c6a8be8dc13 6766136: corrupted gif image may cause crash in java splashscreen library.
bae
parents: 2
diff changeset
   107
        return 0;
2c6a8be8dc13 6766136: corrupted gif image may cause crash in java splashscreen library.
bae
parents: 2
diff changeset
   108
    }
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   109
    bufferSize = stride * gif->SHeight;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   110
    pBitmapBits = (byte_t *) malloc(bufferSize);
2603
2c6a8be8dc13 6766136: corrupted gif image may cause crash in java splashscreen library.
bae
parents: 2
diff changeset
   111
    if (!pBitmapBits) {
2c6a8be8dc13 6766136: corrupted gif image may cause crash in java splashscreen library.
bae
parents: 2
diff changeset
   112
        return 0;
2c6a8be8dc13 6766136: corrupted gif image may cause crash in java splashscreen library.
bae
parents: 2
diff changeset
   113
    }
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   114
    pOldBitmapBits = (byte_t *) malloc(bufferSize);
2603
2c6a8be8dc13 6766136: corrupted gif image may cause crash in java splashscreen library.
bae
parents: 2
diff changeset
   115
    if (!pOldBitmapBits) {
2c6a8be8dc13 6766136: corrupted gif image may cause crash in java splashscreen library.
bae
parents: 2
diff changeset
   116
        free(pBitmapBits);
2c6a8be8dc13 6766136: corrupted gif image may cause crash in java splashscreen library.
bae
parents: 2
diff changeset
   117
        return 0;
2c6a8be8dc13 6766136: corrupted gif image may cause crash in java splashscreen library.
bae
parents: 2
diff changeset
   118
    }
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   119
    memset(pBitmapBits, 0, bufferSize);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   120
90ce3da70b43 Initial load
duke
parents:
diff changeset
   121
    splash->width = gif->SWidth;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   122
    splash->height = gif->SHeight;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   123
    splash->frameCount = gif->ImageCount;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   124
    splash->frames = (SplashImage *)
18232
b538b71fb429 8009071: Improve shape handling
anthony
parents: 16512
diff changeset
   125
        SAFE_SIZE_ARRAY_ALLOC(malloc, sizeof(SplashImage), gif->ImageCount);
2603
2c6a8be8dc13 6766136: corrupted gif image may cause crash in java splashscreen library.
bae
parents: 2
diff changeset
   126
    if (!splash->frames) {
2c6a8be8dc13 6766136: corrupted gif image may cause crash in java splashscreen library.
bae
parents: 2
diff changeset
   127
      free(pBitmapBits);
2c6a8be8dc13 6766136: corrupted gif image may cause crash in java splashscreen library.
bae
parents: 2
diff changeset
   128
      free(pOldBitmapBits);
2c6a8be8dc13 6766136: corrupted gif image may cause crash in java splashscreen library.
bae
parents: 2
diff changeset
   129
      return 0;
2c6a8be8dc13 6766136: corrupted gif image may cause crash in java splashscreen library.
bae
parents: 2
diff changeset
   130
    }
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   131
    memset(splash->frames, 0, sizeof(SplashImage) * gif->ImageCount);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   132
    splash->loopCount = 1;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   133
90ce3da70b43 Initial load
duke
parents:
diff changeset
   134
    for (imageIndex = 0; imageIndex < gif->ImageCount; imageIndex++) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   135
        SavedImage *image = &(gif->SavedImages[imageIndex]);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   136
        GifImageDesc *desc = &(image->ImageDesc);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   137
        ColorMapObject *colorMap =
90ce3da70b43 Initial load
duke
parents:
diff changeset
   138
            desc->ColorMap ? desc->ColorMap : gif->SColorMap;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   139
90ce3da70b43 Initial load
duke
parents:
diff changeset
   140
        int transparentColor = -1;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   141
        int frameDelay = 100;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   142
        int disposeMethod = GIF_DISPOSE_RESTORE;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   143
        int colorCount = 0;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   144
        rgbquad_t colorMapBuf[SPLASH_COLOR_MAP_SIZE];
90ce3da70b43 Initial load
duke
parents:
diff changeset
   145
2603
2c6a8be8dc13 6766136: corrupted gif image may cause crash in java splashscreen library.
bae
parents: 2
diff changeset
   146
        cx = FIX_POINT(desc->Left, 0, gif->SWidth);
2c6a8be8dc13 6766136: corrupted gif image may cause crash in java splashscreen library.
bae
parents: 2
diff changeset
   147
        cy = FIX_POINT(desc->Top, 0, gif->SHeight);
2c6a8be8dc13 6766136: corrupted gif image may cause crash in java splashscreen library.
bae
parents: 2
diff changeset
   148
        cw = FIX_LENGTH(desc->Left, desc->Width, gif->SWidth);
2c6a8be8dc13 6766136: corrupted gif image may cause crash in java splashscreen library.
bae
parents: 2
diff changeset
   149
        ch = FIX_LENGTH(desc->Top, desc->Height, gif->SHeight);
2c6a8be8dc13 6766136: corrupted gif image may cause crash in java splashscreen library.
bae
parents: 2
diff changeset
   150
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   151
        if (colorMap) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   152
            if (colorMap->ColorCount <= SPLASH_COLOR_MAP_SIZE) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   153
                colorCount = colorMap->ColorCount;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   154
            } else  {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   155
                colorCount = SPLASH_COLOR_MAP_SIZE;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   156
            }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   157
        }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   158
90ce3da70b43 Initial load
duke
parents:
diff changeset
   159
        /* the code below is loosely based around gif extension processing from win32 libungif sample */
90ce3da70b43 Initial load
duke
parents:
diff changeset
   160
90ce3da70b43 Initial load
duke
parents:
diff changeset
   161
        for (i = 0; i < image->ExtensionBlockCount; i++) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   162
            byte_t *pExtension = (byte_t *) image->ExtensionBlocks[i].Bytes;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   163
            unsigned size = image->ExtensionBlocks[i].ByteCount;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   164
90ce3da70b43 Initial load
duke
parents:
diff changeset
   165
            switch (image->ExtensionBlocks[i].Function) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   166
            case GRAPHICS_EXT_FUNC_CODE:
90ce3da70b43 Initial load
duke
parents:
diff changeset
   167
                {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   168
                    int flag = pExtension[0];
90ce3da70b43 Initial load
duke
parents:
diff changeset
   169
6825
795e9fe949d3 6989721: awt native code compiler warnings
art
parents: 5506
diff changeset
   170
                    frameDelay = (((int)pExtension[2]) << 8) | pExtension[1];
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   171
                    if (frameDelay < 10)
90ce3da70b43 Initial load
duke
parents:
diff changeset
   172
                        frameDelay = 10;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   173
                    if (flag & GIF_TRANSPARENT) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   174
                        transparentColor = pExtension[3];
90ce3da70b43 Initial load
duke
parents:
diff changeset
   175
                    } else {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   176
                        transparentColor = GIF_NOT_TRANSPARENT;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   177
                    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   178
                    disposeMethod =
90ce3da70b43 Initial load
duke
parents:
diff changeset
   179
                        (flag >> GIF_DISPOSE_SHIFT) & GIF_DISPOSE_MASK;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   180
                    break;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   181
                }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   182
            case APPLICATION_EXT_FUNC_CODE:
90ce3da70b43 Initial load
duke
parents:
diff changeset
   183
                {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   184
                    if (size == sizeof(szNetscape20ext)
90ce3da70b43 Initial load
duke
parents:
diff changeset
   185
                        && memcmp(pExtension, szNetscape20ext, size) == 0) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   186
                        int iSubCode;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   187
90ce3da70b43 Initial load
duke
parents:
diff changeset
   188
                        if (++i >= image->ExtensionBlockCount)
90ce3da70b43 Initial load
duke
parents:
diff changeset
   189
                            break;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   190
                        pExtension = (byte_t *) image->ExtensionBlocks[i].Bytes;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   191
                        if (image->ExtensionBlocks[i].ByteCount != 3)
90ce3da70b43 Initial load
duke
parents:
diff changeset
   192
                            break;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   193
                        iSubCode = pExtension[0] & 0x07;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   194
                        if (iSubCode == NSEXT_LOOP) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   195
                            splash->loopCount =
6825
795e9fe949d3 6989721: awt native code compiler warnings
art
parents: 5506
diff changeset
   196
                                (pExtension[1] | (((int)pExtension[2]) << 8)) - 1;
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   197
                        }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   198
                    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   199
                    break;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   200
                }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   201
            default:
90ce3da70b43 Initial load
duke
parents:
diff changeset
   202
                break;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   203
            }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   204
        }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   205
90ce3da70b43 Initial load
duke
parents:
diff changeset
   206
        if (colorMap) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   207
            for (i = 0; i < colorCount; i++) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   208
                colorMapBuf[i] = MAKE_QUAD_GIF(colorMap->Colors[i], 0xff);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   209
            }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   210
        }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   211
        {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   212
90ce3da70b43 Initial load
duke
parents:
diff changeset
   213
            byte_t *pSrc = image->RasterBits;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   214
            ImageFormat srcFormat;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   215
            ImageRect srcRect, dstRect;
31173
995727750ee6 8081315: 8077982 giflib upgrade breaks system giflib builds with earlier versions
andrew
parents: 30496
diff changeset
   216
            int pass = 4, npass = 5;
995727750ee6 8081315: 8077982 giflib upgrade breaks system giflib builds with earlier versions
andrew
parents: 30496
diff changeset
   217
995727750ee6 8081315: 8077982 giflib upgrade breaks system giflib builds with earlier versions
andrew
parents: 30496
diff changeset
   218
#if GIFLIB_MAJOR < 5
995727750ee6 8081315: 8077982 giflib upgrade breaks system giflib builds with earlier versions
andrew
parents: 30496
diff changeset
   219
            /* Interlaced gif support is broken in giflib < 5
995727750ee6 8081315: 8077982 giflib upgrade breaks system giflib builds with earlier versions
andrew
parents: 30496
diff changeset
   220
               so we need to work around this */
995727750ee6 8081315: 8077982 giflib upgrade breaks system giflib builds with earlier versions
andrew
parents: 30496
diff changeset
   221
            if (desc->Interlace) {
995727750ee6 8081315: 8077982 giflib upgrade breaks system giflib builds with earlier versions
andrew
parents: 30496
diff changeset
   222
                pass = 0;
995727750ee6 8081315: 8077982 giflib upgrade breaks system giflib builds with earlier versions
andrew
parents: 30496
diff changeset
   223
                npass = 4;
995727750ee6 8081315: 8077982 giflib upgrade breaks system giflib builds with earlier versions
andrew
parents: 30496
diff changeset
   224
            }
995727750ee6 8081315: 8077982 giflib upgrade breaks system giflib builds with earlier versions
andrew
parents: 30496
diff changeset
   225
#endif
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   226
90ce3da70b43 Initial load
duke
parents:
diff changeset
   227
            srcFormat.colorMap = colorMapBuf;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   228
            srcFormat.depthBytes = 1;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   229
            srcFormat.byteOrder = BYTE_ORDER_NATIVE;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   230
            srcFormat.transparentColor = transparentColor;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   231
            srcFormat.fixedBits = QUAD_ALPHA_MASK;      // fixed 100% alpha
90ce3da70b43 Initial load
duke
parents:
diff changeset
   232
            srcFormat.premultiplied = 0;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   233
31173
995727750ee6 8081315: 8077982 giflib upgrade breaks system giflib builds with earlier versions
andrew
parents: 30496
diff changeset
   234
            for (; pass < npass; ++pass) {
995727750ee6 8081315: 8077982 giflib upgrade breaks system giflib builds with earlier versions
andrew
parents: 30496
diff changeset
   235
                int jump = interlacedJumps[pass];
995727750ee6 8081315: 8077982 giflib upgrade breaks system giflib builds with earlier versions
andrew
parents: 30496
diff changeset
   236
                int ofs = interlacedOffset[pass];
995727750ee6 8081315: 8077982 giflib upgrade breaks system giflib builds with earlier versions
andrew
parents: 30496
diff changeset
   237
                /* Number of source lines for current pass */
995727750ee6 8081315: 8077982 giflib upgrade breaks system giflib builds with earlier versions
andrew
parents: 30496
diff changeset
   238
                int numPassLines = (desc->Height + jump - ofs - 1) / jump;
995727750ee6 8081315: 8077982 giflib upgrade breaks system giflib builds with earlier versions
andrew
parents: 30496
diff changeset
   239
                /* Number of lines that fits to dest buffer */
995727750ee6 8081315: 8077982 giflib upgrade breaks system giflib builds with earlier versions
andrew
parents: 30496
diff changeset
   240
                int numLines = (ch + jump - ofs - 1) / jump;
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   241
31173
995727750ee6 8081315: 8077982 giflib upgrade breaks system giflib builds with earlier versions
andrew
parents: 30496
diff changeset
   242
                initRect(&srcRect, 0, 0, desc->Width, numLines, 1,
995727750ee6 8081315: 8077982 giflib upgrade breaks system giflib builds with earlier versions
andrew
parents: 30496
diff changeset
   243
                    desc->Width, pSrc, &srcFormat);
2603
2c6a8be8dc13 6766136: corrupted gif image may cause crash in java splashscreen library.
bae
parents: 2
diff changeset
   244
31173
995727750ee6 8081315: 8077982 giflib upgrade breaks system giflib builds with earlier versions
andrew
parents: 30496
diff changeset
   245
                if (numLines > 0) {
995727750ee6 8081315: 8077982 giflib upgrade breaks system giflib builds with earlier versions
andrew
parents: 30496
diff changeset
   246
                    initRect(&dstRect, cx, cy + ofs, cw,
995727750ee6 8081315: 8077982 giflib upgrade breaks system giflib builds with earlier versions
andrew
parents: 30496
diff changeset
   247
                             numLines , jump, stride, pBitmapBits, &splash->imageFormat);
995727750ee6 8081315: 8077982 giflib upgrade breaks system giflib builds with earlier versions
andrew
parents: 30496
diff changeset
   248
995727750ee6 8081315: 8077982 giflib upgrade breaks system giflib builds with earlier versions
andrew
parents: 30496
diff changeset
   249
                    pSrc += convertRect(&srcRect, &dstRect, CVT_ALPHATEST);
995727750ee6 8081315: 8077982 giflib upgrade breaks system giflib builds with earlier versions
andrew
parents: 30496
diff changeset
   250
                }
995727750ee6 8081315: 8077982 giflib upgrade breaks system giflib builds with earlier versions
andrew
parents: 30496
diff changeset
   251
                // skip extra source data
995727750ee6 8081315: 8077982 giflib upgrade breaks system giflib builds with earlier versions
andrew
parents: 30496
diff changeset
   252
                pSrc += (numPassLines - numLines) * srcRect.stride;
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   253
            }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   254
        }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   255
90ce3da70b43 Initial load
duke
parents:
diff changeset
   256
        // now dispose of the previous frame correctly
90ce3da70b43 Initial load
duke
parents:
diff changeset
   257
90ce3da70b43 Initial load
duke
parents:
diff changeset
   258
        splash->frames[imageIndex].bitmapBits =
18232
b538b71fb429 8009071: Improve shape handling
anthony
parents: 16512
diff changeset
   259
            (rgbquad_t *) malloc(bufferSize); // bufferSize is safe (checked above)
2603
2c6a8be8dc13 6766136: corrupted gif image may cause crash in java splashscreen library.
bae
parents: 2
diff changeset
   260
        if (!splash->frames[imageIndex].bitmapBits) {
2c6a8be8dc13 6766136: corrupted gif image may cause crash in java splashscreen library.
bae
parents: 2
diff changeset
   261
            free(pBitmapBits);
2c6a8be8dc13 6766136: corrupted gif image may cause crash in java splashscreen library.
bae
parents: 2
diff changeset
   262
            free(pOldBitmapBits);
2c6a8be8dc13 6766136: corrupted gif image may cause crash in java splashscreen library.
bae
parents: 2
diff changeset
   263
            /* Assuming that callee will take care of splash frames we have already allocated */
2c6a8be8dc13 6766136: corrupted gif image may cause crash in java splashscreen library.
bae
parents: 2
diff changeset
   264
            return 0;
2c6a8be8dc13 6766136: corrupted gif image may cause crash in java splashscreen library.
bae
parents: 2
diff changeset
   265
        }
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   266
        memcpy(splash->frames[imageIndex].bitmapBits, pBitmapBits, bufferSize);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   267
90ce3da70b43 Initial load
duke
parents:
diff changeset
   268
        SplashInitFrameShape(splash, imageIndex);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   269
90ce3da70b43 Initial load
duke
parents:
diff changeset
   270
        splash->frames[imageIndex].delay = frameDelay * 10;     // 100ths of second to milliseconds
90ce3da70b43 Initial load
duke
parents:
diff changeset
   271
        switch (disposeMethod) {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   272
        case GIF_DISPOSE_LEAVE:
90ce3da70b43 Initial load
duke
parents:
diff changeset
   273
            memcpy(pOldBitmapBits, pBitmapBits, bufferSize);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   274
            break;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   275
        case GIF_DISPOSE_NONE:
90ce3da70b43 Initial load
duke
parents:
diff changeset
   276
            break;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   277
        case GIF_DISPOSE_BACKGND:
90ce3da70b43 Initial load
duke
parents:
diff changeset
   278
            {
90ce3da70b43 Initial load
duke
parents:
diff changeset
   279
                ImageRect dstRect;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   280
                rgbquad_t fillColor = 0;                        // 0 is transparent
2603
2c6a8be8dc13 6766136: corrupted gif image may cause crash in java splashscreen library.
bae
parents: 2
diff changeset
   281
6812
83cac1fcd3ed 6853488: REGRESSION : A black background is seen for a transparent animated gif image for splash screen
bae
parents: 5506
diff changeset
   282
                if (transparentColor < 0) {
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   283
                    fillColor= MAKE_QUAD_GIF(
90ce3da70b43 Initial load
duke
parents:
diff changeset
   284
                        colorMap->Colors[gif->SBackGroundColor], 0xff);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   285
                }
2603
2c6a8be8dc13 6766136: corrupted gif image may cause crash in java splashscreen library.
bae
parents: 2
diff changeset
   286
                initRect(&dstRect,
2c6a8be8dc13 6766136: corrupted gif image may cause crash in java splashscreen library.
bae
parents: 2
diff changeset
   287
                         cx, cy, cw, ch,
2c6a8be8dc13 6766136: corrupted gif image may cause crash in java splashscreen library.
bae
parents: 2
diff changeset
   288
                         1, stride,
2c6a8be8dc13 6766136: corrupted gif image may cause crash in java splashscreen library.
bae
parents: 2
diff changeset
   289
                         pBitmapBits, &splash->imageFormat);
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   290
                fillRect(fillColor, &dstRect);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   291
            }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   292
            break;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   293
        case GIF_DISPOSE_RESTORE:
90ce3da70b43 Initial load
duke
parents:
diff changeset
   294
            {
2603
2c6a8be8dc13 6766136: corrupted gif image may cause crash in java splashscreen library.
bae
parents: 2
diff changeset
   295
                int lineSize = cw * splash->imageFormat.depthBytes;
2c6a8be8dc13 6766136: corrupted gif image may cause crash in java splashscreen library.
bae
parents: 2
diff changeset
   296
                if (lineSize > 0) {
2c6a8be8dc13 6766136: corrupted gif image may cause crash in java splashscreen library.
bae
parents: 2
diff changeset
   297
                    int lineOffset = cx * splash->imageFormat.depthBytes;
2c6a8be8dc13 6766136: corrupted gif image may cause crash in java splashscreen library.
bae
parents: 2
diff changeset
   298
                    int lineIndex = cy * stride + lineOffset;
2c6a8be8dc13 6766136: corrupted gif image may cause crash in java splashscreen library.
bae
parents: 2
diff changeset
   299
                    for (j=0; j<ch; j++) {
2c6a8be8dc13 6766136: corrupted gif image may cause crash in java splashscreen library.
bae
parents: 2
diff changeset
   300
                        memcpy(pBitmapBits + lineIndex, pOldBitmapBits + lineIndex,
2c6a8be8dc13 6766136: corrupted gif image may cause crash in java splashscreen library.
bae
parents: 2
diff changeset
   301
                               lineSize);
2c6a8be8dc13 6766136: corrupted gif image may cause crash in java splashscreen library.
bae
parents: 2
diff changeset
   302
                        lineIndex += stride;
2c6a8be8dc13 6766136: corrupted gif image may cause crash in java splashscreen library.
bae
parents: 2
diff changeset
   303
                    }
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   304
                }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   305
            }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   306
            break;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   307
        }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   308
    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   309
90ce3da70b43 Initial load
duke
parents:
diff changeset
   310
    free(pBitmapBits);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   311
    free(pOldBitmapBits);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   312
31173
995727750ee6 8081315: 8077982 giflib upgrade breaks system giflib builds with earlier versions
andrew
parents: 30496
diff changeset
   313
#if GIFLIB_MAJOR > 5 || (GIFLIB_MAJOR == 5 && GIFLIB_MINOR >= 1)
995727750ee6 8081315: 8077982 giflib upgrade breaks system giflib builds with earlier versions
andrew
parents: 30496
diff changeset
   314
    if (DGifCloseFile(gif, NULL) == GIF_ERROR) {
995727750ee6 8081315: 8077982 giflib upgrade breaks system giflib builds with earlier versions
andrew
parents: 30496
diff changeset
   315
        return 0;
995727750ee6 8081315: 8077982 giflib upgrade breaks system giflib builds with earlier versions
andrew
parents: 30496
diff changeset
   316
    }
995727750ee6 8081315: 8077982 giflib upgrade breaks system giflib builds with earlier versions
andrew
parents: 30496
diff changeset
   317
#else
995727750ee6 8081315: 8077982 giflib upgrade breaks system giflib builds with earlier versions
andrew
parents: 30496
diff changeset
   318
    DGifCloseFile(gif);
995727750ee6 8081315: 8077982 giflib upgrade breaks system giflib builds with earlier versions
andrew
parents: 30496
diff changeset
   319
#endif
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   320
90ce3da70b43 Initial load
duke
parents:
diff changeset
   321
    return 1;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   322
}
90ce3da70b43 Initial load
duke
parents:
diff changeset
   323
90ce3da70b43 Initial load
duke
parents:
diff changeset
   324
int
90ce3da70b43 Initial load
duke
parents:
diff changeset
   325
SplashDecodeGifStream(Splash * splash, SplashStream * stream)
90ce3da70b43 Initial load
duke
parents:
diff changeset
   326
{
31173
995727750ee6 8081315: 8077982 giflib upgrade breaks system giflib builds with earlier versions
andrew
parents: 30496
diff changeset
   327
#if GIFLIB_MAJOR >= 5
30496
aac453851104 8077982: GIFLIB upgrade
azvegint
parents: 25859
diff changeset
   328
    GifFileType *gif = DGifOpen((void *) stream, SplashStreamGifInputFunc, NULL);
31173
995727750ee6 8081315: 8077982 giflib upgrade breaks system giflib builds with earlier versions
andrew
parents: 30496
diff changeset
   329
#else
995727750ee6 8081315: 8077982 giflib upgrade breaks system giflib builds with earlier versions
andrew
parents: 30496
diff changeset
   330
    GifFileType *gif = DGifOpen((void *) stream, SplashStreamGifInputFunc);
995727750ee6 8081315: 8077982 giflib upgrade breaks system giflib builds with earlier versions
andrew
parents: 30496
diff changeset
   331
#endif
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   332
90ce3da70b43 Initial load
duke
parents:
diff changeset
   333
    if (!gif)
90ce3da70b43 Initial load
duke
parents:
diff changeset
   334
        return 0;
90ce3da70b43 Initial load
duke
parents:
diff changeset
   335
    return SplashDecodeGif(splash, gif);
90ce3da70b43 Initial load
duke
parents:
diff changeset
   336
}