165 lines
5.4 KiB
Diff
165 lines
5.4 KiB
Diff
|
$NetBSD: patch-aa,v 1.8 2011/01/21 10:21:51 wiz Exp $
|
||
|
|
||
|
Fix build with png-1.5.
|
||
|
|
||
|
--- a/src/pngcodec.c.orig 2010-11-03 16:52:54.000000000 +0000
|
||
|
+++ b/src/pngcodec.c
|
||
|
@@ -116,10 +116,15 @@ gdip_load_png_properties (png_structp pn
|
||
|
bitmap_data->dpi_horz = png_get_x_pixels_per_inch(png_ptr, info_ptr);
|
||
|
bitmap_data->dpi_vert = png_get_y_pixels_per_inch(png_ptr, info_ptr);
|
||
|
#elif defined(PNG_pHYs_SUPPORTED)
|
||
|
- if ((info_ptr->valid & PNG_INFO_pHYs) && (info_ptr->phys_unit_type == PNG_RESOLUTION_METER)) {
|
||
|
- bitmap_data->image_flags |= ImageFlagsHasRealDPI;
|
||
|
- bitmap_data->dpi_horz = info_ptr->x_pixels_per_unit * 0.0254;
|
||
|
- bitmap_data->dpi_vert = info_ptr->y_pixels_per_unit * 0.0254;
|
||
|
+ if (png_get_valid (png_ptr, info_ptr, PNG_INFO_pHYs)) {
|
||
|
+ png_uint_32 res_x, res_y;
|
||
|
+ int unit_type;
|
||
|
+ png_get_pHYs (png_ptr, info_ptr, &res_x, &res_y, &unit_type);
|
||
|
+ if (unit_type == PNG_RESOLUTION_METER) {
|
||
|
+ bitmap_data->image_flags |= ImageFlagsHasRealDPI;
|
||
|
+ bitmap_data->dpi_horz = res_x * 0.0254;
|
||
|
+ bitmap_data->dpi_vert = res_y * 0.0254;
|
||
|
+ }
|
||
|
}
|
||
|
#endif
|
||
|
/* default to screen resolution (if nothing was provided or available) */
|
||
|
@@ -130,7 +135,7 @@ gdip_load_png_properties (png_structp pn
|
||
|
#if defined(PNG_iCCP_SUPPORTED)
|
||
|
{
|
||
|
png_charp name;
|
||
|
- png_charp profile;
|
||
|
+ png_bytep profile;
|
||
|
png_uint_32 proflen;
|
||
|
int compression_type;
|
||
|
|
||
|
@@ -292,6 +297,11 @@ gdip_load_png_image_from_file_or_stream
|
||
|
ImageFlags colourspace_flag;
|
||
|
int i;
|
||
|
int j;
|
||
|
+ png_colorp png_palette;
|
||
|
+ int png_num_palette;
|
||
|
+ png_bytep trans_alpha;
|
||
|
+ int num_trans;
|
||
|
+ png_color_16p trans_color;
|
||
|
|
||
|
width = png_get_image_width (png_ptr, info_ptr);
|
||
|
height = png_get_image_height (png_ptr, info_ptr);
|
||
|
@@ -309,6 +319,8 @@ gdip_load_png_image_from_file_or_stream
|
||
|
}
|
||
|
|
||
|
/* Copy palette. */
|
||
|
+ png_get_PLTE (png_ptr, info_ptr, &png_palette, &png_num_palette);
|
||
|
+
|
||
|
num_colours = 1 << bit_depth;
|
||
|
|
||
|
if (png_get_color_type (png_ptr, info_ptr) == PNG_COLOR_TYPE_GRAY) {
|
||
|
@@ -321,8 +333,8 @@ gdip_load_png_image_from_file_or_stream
|
||
|
colourspace_flag = ImageFlagsColorSpaceRGB;
|
||
|
|
||
|
palette_entries = num_colours;
|
||
|
- if (palette_entries > info_ptr->num_palette) {
|
||
|
- palette_entries = info_ptr->num_palette;
|
||
|
+ if (palette_entries > png_num_palette) {
|
||
|
+ palette_entries = png_num_palette;
|
||
|
}
|
||
|
|
||
|
palette = GdipAlloc (sizeof(ColorPalette) + (num_colours - 1) * sizeof(ARGB));
|
||
|
@@ -331,29 +343,30 @@ gdip_load_png_image_from_file_or_stream
|
||
|
|
||
|
for (i=0; i < palette_entries; i++) {
|
||
|
set_pixel_bgra (&palette->Entries[i], 0,
|
||
|
- info_ptr->palette[i].blue,
|
||
|
- info_ptr->palette[i].green,
|
||
|
- info_ptr->palette[i].red,
|
||
|
+ png_palette[i].blue,
|
||
|
+ png_palette[i].green,
|
||
|
+ png_palette[i].red,
|
||
|
0xFF); /* alpha */
|
||
|
}
|
||
|
}
|
||
|
|
||
|
+ png_get_tRNS (png_ptr, info_ptr, &trans_alpha, &num_trans, &trans_color);
|
||
|
/* Make sure transparency is respected. */
|
||
|
- if (info_ptr->num_trans > 0) {
|
||
|
+ if (num_trans > 0) {
|
||
|
palette->Flags |= PaletteFlagsHasAlpha;
|
||
|
colourspace_flag |= ImageFlagsHasAlpha;
|
||
|
|
||
|
- if (info_ptr->num_trans > info_ptr->num_palette) {
|
||
|
- info_ptr->num_trans = info_ptr->num_palette;
|
||
|
+ if (num_trans > png_num_palette) {
|
||
|
+ num_trans = png_num_palette;
|
||
|
}
|
||
|
|
||
|
- for (i=0; i < info_ptr->num_trans; i++) {
|
||
|
+ for (i=0; i < num_trans; i++) {
|
||
|
set_pixel_bgra(&palette->Entries[i], 0,
|
||
|
- info_ptr->palette[i].blue,
|
||
|
- info_ptr->palette[i].green,
|
||
|
- info_ptr->palette[i].red,
|
||
|
+ png_palette[i].blue,
|
||
|
+ png_palette[i].green,
|
||
|
+ png_palette[i].red,
|
||
|
#if PNG_LIBPNG_VER > 10399
|
||
|
- info_ptr->trans_alpha [i]); /* alpha */
|
||
|
+ trans_alpha [i]); /* alpha */
|
||
|
#else
|
||
|
info_ptr->trans[i]); /* alpha */
|
||
|
#endif
|
||
|
@@ -398,6 +411,8 @@ gdip_load_png_image_from_file_or_stream
|
||
|
BYTE bit_depth;
|
||
|
int stride;
|
||
|
int interlace;
|
||
|
+ png_colorp png_palette;
|
||
|
+ int png_num_palette;
|
||
|
png_bytep *row_pointers;
|
||
|
BYTE *rawptr;
|
||
|
int i, j;
|
||
|
@@ -490,32 +505,33 @@ gdip_load_png_image_from_file_or_stream
|
||
|
png_byte palette = 0;
|
||
|
png_byte pix = *rowp++;
|
||
|
|
||
|
+ png_get_PLTE (png_ptr, info_ptr, &png_palette, &png_num_palette);
|
||
|
palette = (pix >> 6) & 0x03;
|
||
|
set_pixel_bgra (rawptr, 0,
|
||
|
- info_ptr->palette[palette].blue,
|
||
|
- info_ptr->palette[palette].green,
|
||
|
- info_ptr->palette[palette].red,
|
||
|
+ png_palette[palette].blue,
|
||
|
+ png_palette[palette].green,
|
||
|
+ png_palette[palette].red,
|
||
|
0xFF); /* alpha */
|
||
|
|
||
|
palette = (pix >> 4) & 0x03;
|
||
|
set_pixel_bgra (rawptr, 4,
|
||
|
- info_ptr->palette[palette].blue,
|
||
|
- info_ptr->palette[palette].green,
|
||
|
- info_ptr->palette[palette].red,
|
||
|
+ png_palette[palette].blue,
|
||
|
+ png_palette[palette].green,
|
||
|
+ png_palette[palette].red,
|
||
|
0xFF); /* alpha */
|
||
|
|
||
|
palette = (pix >> 2) & 0x03;
|
||
|
set_pixel_bgra (rawptr, 8,
|
||
|
- info_ptr->palette[palette].blue,
|
||
|
- info_ptr->palette[palette].green,
|
||
|
- info_ptr->palette[palette].red,
|
||
|
+ png_palette[palette].blue,
|
||
|
+ png_palette[palette].green,
|
||
|
+ png_palette[palette].red,
|
||
|
0xFF); /* alpha */
|
||
|
|
||
|
palette = pix & 0x03;
|
||
|
set_pixel_bgra (rawptr, 12,
|
||
|
- info_ptr->palette[palette].blue,
|
||
|
- info_ptr->palette[palette].green,
|
||
|
- info_ptr->palette[palette].red,
|
||
|
+ png_palette[palette].blue,
|
||
|
+ png_palette[palette].green,
|
||
|
+ png_palette[palette].red,
|
||
|
0xFF); /* alpha */
|
||
|
rawptr += 16;
|
||
|
}
|