From e982b7231fcb465bd367f869fd1baaf3c27e0660 Mon Sep 17 00:00:00 2001 From: John Reck Date: Mon, 26 Aug 2013 16:53:40 -0700 Subject: [PATCH] Forward compatibility fixes Change-Id: Iaf387a10c387e5e157bb16d120a1e033b3d1a6e8 --- tools/aapt/Images.cpp | 27 ++++++++++++++++----------- 1 file changed, 16 insertions(+), 11 deletions(-) diff --git a/tools/aapt/Images.cpp b/tools/aapt/Images.cpp index 9de685ae763e..b2cbf49843af 100644 --- a/tools/aapt/Images.cpp +++ b/tools/aapt/Images.cpp @@ -12,13 +12,15 @@ #include #include +#include #define NOISY(x) //x static void png_write_aapt_file(png_structp png_ptr, png_bytep data, png_size_t length) { - status_t err = ((AaptFile*)png_ptr->io_ptr)->writeData(data, length); + AaptFile* aaptfile = (AaptFile*) png_get_io_ptr(png_ptr); + status_t err = aaptfile->writeData(data, length); if (err != NO_ERROR) { png_error(png_ptr, "Write Error"); } @@ -90,7 +92,7 @@ static void read_png(const char* imageName, png_set_palette_to_rgb(read_ptr); if (color_type == PNG_COLOR_TYPE_GRAY && bit_depth < 8) - png_set_gray_1_2_4_to_8(read_ptr); + png_set_expand_gray_1_2_4_to_8(read_ptr); if (png_get_valid(read_ptr, read_info, PNG_INFO_tRNS)) { //printf("Has PNG_INFO_tRNS!\n"); @@ -109,7 +111,7 @@ static void read_png(const char* imageName, png_read_update_info(read_ptr, read_info); outImageInfo->rows = (png_bytepp)malloc( - outImageInfo->height * png_sizeof(png_bytep)); + outImageInfo->height * sizeof(png_bytep)); outImageInfo->allocHeight = outImageInfo->height; outImageInfo->allocRows = outImageInfo->rows; @@ -573,7 +575,7 @@ static status_t do_9patch(const char* imageName, image_info* image) image->info9Patch.paddingTop, image->info9Patch.paddingBottom)); // Remove frame from image. - image->rows = (png_bytepp)malloc((H-2) * png_sizeof(png_bytep)); + image->rows = (png_bytepp)malloc((H-2) * sizeof(png_bytep)); for (i=0; i<(H-2); i++) { image->rows[i] = image->allocRows[i+1]; memmove(image->rows[i], image->rows[i]+4, (W-2)*4); @@ -984,7 +986,7 @@ static void write_png(const char* imageName, unknowns[0].data = NULL; unknowns[1].data = NULL; - png_bytepp outRows = (png_bytepp) malloc((int) imageInfo.height * png_sizeof(png_bytep)); + png_bytepp outRows = (png_bytepp) malloc((int) imageInfo.height * sizeof(png_bytep)); if (outRows == (png_bytepp) 0) { printf("Can't allocate output buffer!\n"); exit(1); @@ -1073,18 +1075,19 @@ static void write_png(const char* imageName, unknowns[b_index].size = chunk_size; } + for (int i = 0; i < chunk_count; i++) { + unknowns[i].location = PNG_HAVE_PLTE; + } png_set_keep_unknown_chunks(write_ptr, PNG_HANDLE_CHUNK_ALWAYS, chunk_names, chunk_count); png_set_unknown_chunks(write_ptr, write_info, unknowns, chunk_count); - // XXX I can't get this to work without forcibly changing - // the location to what I want... which apparently is supposed - // to be a private API, but everything else I have tried results - // in the location being set to what I -last- wrote so I never - // get written. :p +#if PNG_LIBPNG_VER < 10600 + /* Deal with unknown chunk location bug in 1.5.x and earlier */ png_set_unknown_chunk_location(write_ptr, write_info, 0, PNG_HAVE_PLTE); if (imageInfo.haveLayoutBounds) { png_set_unknown_chunk_location(write_ptr, write_info, 1, PNG_HAVE_PLTE); } +#endif } @@ -1092,7 +1095,9 @@ static void write_png(const char* imageName, png_bytepp rows; if (color_type == PNG_COLOR_TYPE_RGB || color_type == PNG_COLOR_TYPE_RGB_ALPHA) { - png_set_filler(write_ptr, 0, PNG_FILLER_AFTER); + if (color_type == PNG_COLOR_TYPE_RGB) { + png_set_filler(write_ptr, 0, PNG_FILLER_AFTER); + } rows = imageInfo.rows; } else { rows = outRows; -- 2.11.0