|
|
|
@@ -1061,15 +1061,31 @@ static int apply_color_indexing_transform(WebPContext *s) |
|
|
|
av_free(line); |
|
|
|
} |
|
|
|
|
|
|
|
for (y = 0; y < img->frame->height; y++) { |
|
|
|
for (x = 0; x < img->frame->width; x++) { |
|
|
|
p = GET_PIXEL(img->frame, x, y); |
|
|
|
i = p[2]; |
|
|
|
if (i >= pal->frame->width) { |
|
|
|
AV_WB32(p, 0x00000000); |
|
|
|
} else { |
|
|
|
const uint8_t *pi = GET_PIXEL(pal->frame, i, 0); |
|
|
|
AV_COPY32(p, pi); |
|
|
|
// switch to local palette if it's worth initializing it |
|
|
|
if (img->frame->height * img->frame->width > 300) { |
|
|
|
uint8_t palette[256 * 4]; |
|
|
|
const int size = pal->frame->width * 4; |
|
|
|
memcpy(palette, GET_PIXEL(pal->frame, 0, 0), size); // copy palette |
|
|
|
// set extra entries to transparent black |
|
|
|
memset(palette + size, 0, 256 * 4 - size); |
|
|
|
for (y = 0; y < img->frame->height; y++) { |
|
|
|
for (x = 0; x < img->frame->width; x++) { |
|
|
|
p = GET_PIXEL(img->frame, x, y); |
|
|
|
i = p[2]; |
|
|
|
AV_COPY32(p, &palette[i * 4]); |
|
|
|
} |
|
|
|
} |
|
|
|
} else { |
|
|
|
for (y = 0; y < img->frame->height; y++) { |
|
|
|
for (x = 0; x < img->frame->width; x++) { |
|
|
|
p = GET_PIXEL(img->frame, x, y); |
|
|
|
i = p[2]; |
|
|
|
if (i >= pal->frame->width) { |
|
|
|
AV_WB32(p, 0x00000000); |
|
|
|
} else { |
|
|
|
const uint8_t *pi = GET_PIXEL(pal->frame, i, 0); |
|
|
|
AV_COPY32(p, pi); |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|