diff --git a/src/PIL/GifImagePlugin.py b/src/PIL/GifImagePlugin.py index 44d15b5961e..55b09abec54 100644 --- a/src/PIL/GifImagePlugin.py +++ b/src/PIL/GifImagePlugin.py @@ -313,18 +313,14 @@ def _rgb(color): pass if interlace is not None: - transparency = -1 - if frame_transparency is not None: - if frame == 0: - self.info["transparency"] = frame_transparency - else: - transparency = frame_transparency + if frame == 0 and frame_transparency is not None: + self.info["transparency"] = frame_transparency self.tile = [ ( "gif", (x0, y0, x1, y1), self.__offset, - (bits, interlace, transparency), + (bits, interlace), ) ] else: diff --git a/src/decode.c b/src/decode.c index cb018a4e706..e236264cdb4 100644 --- a/src/decode.c +++ b/src/decode.c @@ -433,8 +433,7 @@ PyImaging_GifDecoderNew(PyObject *self, PyObject *args) { char *mode; int bits = 8; int interlace = 0; - int transparency = -1; - if (!PyArg_ParseTuple(args, "s|iii", &mode, &bits, &interlace, &transparency)) { + if (!PyArg_ParseTuple(args, "s|ii", &mode, &bits, &interlace)) { return NULL; } @@ -452,7 +451,6 @@ PyImaging_GifDecoderNew(PyObject *self, PyObject *args) { ((GIFDECODERSTATE *)decoder->state.context)->bits = bits; ((GIFDECODERSTATE *)decoder->state.context)->interlace = interlace; - ((GIFDECODERSTATE *)decoder->state.context)->transparency = transparency; return (PyObject *)decoder; } diff --git a/src/libImaging/Gif.h b/src/libImaging/Gif.h index 91132e2e627..4029bbfe5f1 100644 --- a/src/libImaging/Gif.h +++ b/src/libImaging/Gif.h @@ -30,9 +30,6 @@ typedef struct { */ int interlace; - /* The transparent palette index, or -1 for no transparency. */ - int transparency; - /* PRIVATE CONTEXT (set by decoder) */ /* Interlace parameters */ diff --git a/src/libImaging/GifDecode.c b/src/libImaging/GifDecode.c index 301f604b9b8..30478e24aac 100644 --- a/src/libImaging/GifDecode.c +++ b/src/libImaging/GifDecode.c @@ -248,33 +248,27 @@ ImagingGifDecode(Imaging im, ImagingCodecState state, UINT8 *buffer, Py_ssize_t /* To squeeze some extra pixels out of this loop, we test for some common cases and handle them separately. */ - /* If we have transparency, we need to use the regular loop. */ - if (context->transparency == -1) { - if (i == 1) { - if (state->x < state->xsize - 1) { - /* Single pixel, not at the end of the line. */ - *out++ = p[0]; - state->x++; - continue; - } - } else if (state->x + i <= state->xsize) { - /* This string fits into current line. */ - memcpy(out, p, i); - out += i; - state->x += i; - if (state->x == state->xsize) { - NEWLINE(state, context); - } + if (i == 1) { + if (state->x < state->xsize - 1) { + /* Single pixel, not at the end of the line. */ + *out++ = p[0]; + state->x++; continue; } + } else if (state->x + i <= state->xsize) { + /* This string fits into current line. */ + memcpy(out, p, i); + out += i; + state->x += i; + if (state->x == state->xsize) { + NEWLINE(state, context); + } + continue; } /* No shortcut, copy pixel by pixel */ for (c = 0; c < i; c++) { - if (p[c] != context->transparency) { - *out = p[c]; - } - out++; + *out++ = p[c]; if (++state->x >= state->xsize) { NEWLINE(state, context); }