blob: a0542a5240c0279c274a6d9a55ac2b6a2d632947 [file] [log] [blame]
From: Maks Orlovich <morlovich@google.com>
Subject: Stop using private libpng data, but rather the public API.
This is needed to build on Debian sid against system libpng, which is always 1.6.
Also stop using png_sizeof, it's the same as sizeof in practice,
and is gone in 1.6.
Origin: upstream, https://github.com/pagespeed/mod_pagespeed/commit/2fcfa08ce1c168c3669067c2047cbc8875d677a2
--- a/src/pagespeed/kernel/image/gif_reader.cc
+++ b/src/pagespeed/kernel/image/gif_reader.cc
@@ -108,7 +108,10 @@
int transparent_palette_index,
MessageHandler* handler) {
const int num_trans = transparent_palette_index + 1;
- if (num_trans <= 0 || num_trans > info_ptr->num_palette) {
+ png_colorp palette;
+ int num_palette = 0;
+ png_get_PLTE(png_ptr, info_ptr, &palette, &num_palette);
+ if (num_trans <= 0 || num_trans > num_palette) {
PS_LOG_INFO(handler, "Transparent palette index out of bounds.");
return false;
}
@@ -177,12 +180,13 @@
return false;
}
+ png_bytepp rows = png_get_rows(png_ptr, info_ptr);
if (gif_file->Image.Interlace == 0) {
// Not interlaced. Read each line into the PNG buffer.
for (GifWord i = 0; i < height; ++i) {
if (DGifGetLine(gif_file,
static_cast<GifPixelType*>(
- &info_ptr->row_pointers[row + i][pixel]),
+ &rows[row + i][pixel]),
width) == GIF_ERROR) {
PS_DLOG_INFO(handler, "Failed to DGifGetLine");
return false;
@@ -197,7 +201,7 @@
j += kInterlaceJumps[i]) {
if (DGifGetLine(gif_file,
static_cast<GifPixelType*>(
- &info_ptr->row_pointers[j][pixel]),
+ &rows[j][pixel]),
width) == GIF_ERROR) {
PS_DLOG_INFO(handler, "Failed to DGifGetLine");
return false;
@@ -206,7 +210,7 @@
}
}
- info_ptr->valid |= PNG_INFO_IDAT;
+ png_set_rows(png_ptr, info_ptr, rows);
return true;
}
@@ -274,23 +278,22 @@
return 0;
}
-#ifdef PNG_FREE_ME_SUPPORTED
png_free_data(png_ptr, info_ptr, PNG_FREE_ROWS, 0);
-#endif
- if (info_ptr->row_pointers == NULL) {
+ if (png_get_rows(png_ptr, info_ptr) == NULL) {
+ png_uint_32 height = png_get_image_height(png_ptr, info_ptr);
+
// Allocate the array of pointers to each row.
const png_size_t row_pointers_size =
- info_ptr->height * png_sizeof(png_bytep);
- info_ptr->row_pointers = static_cast<png_bytepp>(
+ height * sizeof(png_bytep);
+ png_bytepp row_pointers = static_cast<png_bytepp>(
png_malloc(png_ptr, row_pointers_size));
- memset(info_ptr->row_pointers, 0, row_pointers_size);
-#ifdef PNG_FREE_ME_SUPPORTED
- info_ptr->free_me |= PNG_FREE_ROWS;
-#endif
+ memset(row_pointers, 0, row_pointers_size);
+ png_set_rows(png_ptr, info_ptr, row_pointers);
+ png_data_freer(png_ptr, info_ptr, PNG_DESTROY_WILL_FREE_DATA, PNG_FREE_ROWS);
// Allocate memory for each row.
- for (png_uint_32 row = 0; row < info_ptr->height; ++row) {
- info_ptr->row_pointers[row] =
+ for (png_uint_32 row = 0; row < height; ++row) {
+ row_pointers[row] =
static_cast<png_bytep>(png_malloc(png_ptr, row_size));
}
}
@@ -327,14 +330,17 @@
return false;
}
+ png_bytepp rgb_row_pointers = png_get_rows(rgb_png_ptr, rgb_info_ptr);
+ png_bytepp pal_row_pointers = png_get_rows(paletted_png_ptr,
+ paletted_info_ptr);
for (png_uint_32 row = 0; row < height; ++row) {
- png_bytep rgb_next_byte = rgb_info_ptr->row_pointers[row];
+ png_bytep rgb_next_byte = rgb_row_pointers[row];
if (have_alpha) {
// Make the row opaque initially.
memset(rgb_next_byte, 0xff, row_size);
}
for (png_uint_32 column = 0; column < width; ++column) {
- png_byte palette_entry = paletted_info_ptr->row_pointers[row][column];
+ png_byte palette_entry = pal_row_pointers[row][column];
if (have_alpha &&
(palette_entry == static_cast<png_byte>(transparent_palette_index))) {
// Transparent: clear RGBA bytes.
@@ -346,7 +352,7 @@
rgb_next_byte += bytes_per_pixel;
}
}
- rgb_info_ptr->valid |= PNG_INFO_IDAT;
+ png_set_rows(rgb_png_ptr, rgb_info_ptr, rgb_row_pointers);
return true;
}
@@ -358,7 +364,7 @@
bool require_opaque,
MessageHandler* handler) {
if (static_cast<png_size_t>(gif_file->SHeight) >
- PNG_UINT_32_MAX/png_sizeof(png_bytep)) {
+ PNG_UINT_32_MAX/sizeof(png_bytep)) {
PS_DLOG_INFO(handler, "GIF image is too big to process.");
return false;
}
@@ -407,12 +413,11 @@
}
// Fill the rows with the background color.
- memset(paletted_info_ptr->row_pointers[0],
- gif_file->SBackGroundColor, row_size);
- for (png_uint_32 row = 1; row < paletted_info_ptr->height; ++row) {
- memcpy(paletted_info_ptr->row_pointers[row],
- paletted_info_ptr->row_pointers[0],
- row_size);
+ png_bytepp row_pointers = png_get_rows(paletted_png_ptr, paletted_info_ptr);
+ png_uint_32 height = png_get_image_height(paletted_png_ptr, paletted_info_ptr);
+ memset(row_pointers[0], gif_file->SBackGroundColor, row_size);
+ for (png_uint_32 row = 1; row < height; ++row) {
+ memcpy(row_pointers[row], row_pointers[0], row_size);
}
int transparent_palette_index = -1;