Lines 116-125
gdip_load_png_properties (png_structp pn
Link Here
|
116 |
bitmap_data->dpi_horz = png_get_x_pixels_per_inch(png_ptr, info_ptr); |
116 |
bitmap_data->dpi_horz = png_get_x_pixels_per_inch(png_ptr, info_ptr); |
117 |
bitmap_data->dpi_vert = png_get_y_pixels_per_inch(png_ptr, info_ptr); |
117 |
bitmap_data->dpi_vert = png_get_y_pixels_per_inch(png_ptr, info_ptr); |
118 |
#elif defined(PNG_pHYs_SUPPORTED) |
118 |
#elif defined(PNG_pHYs_SUPPORTED) |
119 |
if ((info_ptr->valid & PNG_INFO_pHYs) && (info_ptr->phys_unit_type == PNG_RESOLUTION_METER)) { |
119 |
if (png_get_valid (png_ptr, info_ptr, PNG_INFO_pHYs)) { |
120 |
bitmap_data->image_flags |= ImageFlagsHasRealDPI; |
120 |
png_uint_32 res_x, res_y; |
121 |
bitmap_data->dpi_horz = info_ptr->x_pixels_per_unit * 0.0254; |
121 |
int unit_type; |
122 |
bitmap_data->dpi_vert = info_ptr->y_pixels_per_unit * 0.0254; |
122 |
png_get_pHYs (png_ptr, info_ptr, &res_x, &res_y, &unit_type); |
|
|
123 |
if (unit_type == PNG_RESOLUTION_METER) { |
124 |
bitmap_data->image_flags |= ImageFlagsHasRealDPI; |
125 |
bitmap_data->dpi_horz = res_x * 0.0254; |
126 |
bitmap_data->dpi_vert = res_y * 0.0254; |
127 |
} |
123 |
} |
128 |
} |
124 |
#endif |
129 |
#endif |
125 |
/* default to screen resolution (if nothing was provided or available) */ |
130 |
/* default to screen resolution (if nothing was provided or available) */ |
Lines 130-136
gdip_load_png_properties (png_structp pn
Link Here
|
130 |
#if defined(PNG_iCCP_SUPPORTED) |
135 |
#if defined(PNG_iCCP_SUPPORTED) |
131 |
{ |
136 |
{ |
132 |
png_charp name; |
137 |
png_charp name; |
133 |
png_charp profile; |
138 |
png_bytep profile; |
134 |
png_uint_32 proflen; |
139 |
png_uint_32 proflen; |
135 |
int compression_type; |
140 |
int compression_type; |
136 |
|
141 |
|
Lines 292-297
gdip_load_png_image_from_file_or_stream
Link Here
|
292 |
ImageFlags colourspace_flag; |
297 |
ImageFlags colourspace_flag; |
293 |
int i; |
298 |
int i; |
294 |
int j; |
299 |
int j; |
|
|
300 |
png_colorp png_palette; |
301 |
int png_num_palette; |
302 |
png_bytep trans_alpha; |
303 |
int num_trans; |
304 |
png_color_16p trans_color; |
295 |
|
305 |
|
296 |
width = png_get_image_width (png_ptr, info_ptr); |
306 |
width = png_get_image_width (png_ptr, info_ptr); |
297 |
height = png_get_image_height (png_ptr, info_ptr); |
307 |
height = png_get_image_height (png_ptr, info_ptr); |
Lines 309-314
gdip_load_png_image_from_file_or_stream
Link Here
|
309 |
} |
319 |
} |
310 |
|
320 |
|
311 |
/* Copy palette. */ |
321 |
/* Copy palette. */ |
|
|
322 |
png_get_PLTE (png_ptr, info_ptr, &png_palette, &png_num_palette); |
323 |
|
312 |
num_colours = 1 << bit_depth; |
324 |
num_colours = 1 << bit_depth; |
313 |
|
325 |
|
314 |
if (png_get_color_type (png_ptr, info_ptr) == PNG_COLOR_TYPE_GRAY) { |
326 |
if (png_get_color_type (png_ptr, info_ptr) == PNG_COLOR_TYPE_GRAY) { |
Lines 321-328
gdip_load_png_image_from_file_or_stream
Link Here
|
321 |
colourspace_flag = ImageFlagsColorSpaceRGB; |
333 |
colourspace_flag = ImageFlagsColorSpaceRGB; |
322 |
|
334 |
|
323 |
palette_entries = num_colours; |
335 |
palette_entries = num_colours; |
324 |
if (palette_entries > info_ptr->num_palette) { |
336 |
if (palette_entries > png_num_palette) { |
325 |
palette_entries = info_ptr->num_palette; |
337 |
palette_entries = png_num_palette; |
326 |
} |
338 |
} |
327 |
|
339 |
|
328 |
palette = GdipAlloc (sizeof(ColorPalette) + (num_colours - 1) * sizeof(ARGB)); |
340 |
palette = GdipAlloc (sizeof(ColorPalette) + (num_colours - 1) * sizeof(ARGB)); |
Lines 331-359
gdip_load_png_image_from_file_or_stream
Link Here
|
331 |
|
343 |
|
332 |
for (i=0; i < palette_entries; i++) { |
344 |
for (i=0; i < palette_entries; i++) { |
333 |
set_pixel_bgra (&palette->Entries[i], 0, |
345 |
set_pixel_bgra (&palette->Entries[i], 0, |
334 |
info_ptr->palette[i].blue, |
346 |
png_palette[i].blue, |
335 |
info_ptr->palette[i].green, |
347 |
png_palette[i].green, |
336 |
info_ptr->palette[i].red, |
348 |
png_palette[i].red, |
337 |
0xFF); /* alpha */ |
349 |
0xFF); /* alpha */ |
338 |
} |
350 |
} |
339 |
} |
351 |
} |
340 |
|
352 |
|
|
|
353 |
png_get_tRNS (png_ptr, info_ptr, &trans_alpha, &num_trans, &trans_color); |
341 |
/* Make sure transparency is respected. */ |
354 |
/* Make sure transparency is respected. */ |
342 |
if (info_ptr->num_trans > 0) { |
355 |
if (num_trans > 0) { |
343 |
palette->Flags |= PaletteFlagsHasAlpha; |
356 |
palette->Flags |= PaletteFlagsHasAlpha; |
344 |
colourspace_flag |= ImageFlagsHasAlpha; |
357 |
colourspace_flag |= ImageFlagsHasAlpha; |
345 |
|
358 |
|
346 |
if (info_ptr->num_trans > info_ptr->num_palette) { |
359 |
if (num_trans > png_num_palette) { |
347 |
info_ptr->num_trans = info_ptr->num_palette; |
360 |
num_trans = png_num_palette; |
348 |
} |
361 |
} |
349 |
|
362 |
|
350 |
for (i=0; i < info_ptr->num_trans; i++) { |
363 |
for (i=0; i < num_trans; i++) { |
351 |
set_pixel_bgra(&palette->Entries[i], 0, |
364 |
set_pixel_bgra(&palette->Entries[i], 0, |
352 |
info_ptr->palette[i].blue, |
365 |
png_palette[i].blue, |
353 |
info_ptr->palette[i].green, |
366 |
png_palette[i].green, |
354 |
info_ptr->palette[i].red, |
367 |
png_palette[i].red, |
355 |
#if PNG_LIBPNG_VER > 10399 |
368 |
#if PNG_LIBPNG_VER > 10399 |
356 |
info_ptr->trans_alpha [i]); /* alpha */ |
369 |
trans_alpha [i]); /* alpha */ |
357 |
#else |
370 |
#else |
358 |
info_ptr->trans[i]); /* alpha */ |
371 |
info_ptr->trans[i]); /* alpha */ |
359 |
#endif |
372 |
#endif |
Lines 398-403
gdip_load_png_image_from_file_or_stream
Link Here
|
398 |
BYTE bit_depth; |
411 |
BYTE bit_depth; |
399 |
int stride; |
412 |
int stride; |
400 |
int interlace; |
413 |
int interlace; |
|
|
414 |
png_colorp png_palette; |
415 |
int png_num_palette; |
401 |
png_bytep *row_pointers; |
416 |
png_bytep *row_pointers; |
402 |
BYTE *rawptr; |
417 |
BYTE *rawptr; |
403 |
int i, j; |
418 |
int i, j; |
Lines 490-521
gdip_load_png_image_from_file_or_stream
Link Here
|
490 |
png_byte palette = 0; |
505 |
png_byte palette = 0; |
491 |
png_byte pix = *rowp++; |
506 |
png_byte pix = *rowp++; |
492 |
|
507 |
|
|
|
508 |
png_get_PLTE (png_ptr, info_ptr, &png_palette, &png_num_palette); |
493 |
palette = (pix >> 6) & 0x03; |
509 |
palette = (pix >> 6) & 0x03; |
494 |
set_pixel_bgra (rawptr, 0, |
510 |
set_pixel_bgra (rawptr, 0, |
495 |
info_ptr->palette[palette].blue, |
511 |
png_palette[palette].blue, |
496 |
info_ptr->palette[palette].green, |
512 |
png_palette[palette].green, |
497 |
info_ptr->palette[palette].red, |
513 |
png_palette[palette].red, |
498 |
0xFF); /* alpha */ |
514 |
0xFF); /* alpha */ |
499 |
|
515 |
|
500 |
palette = (pix >> 4) & 0x03; |
516 |
palette = (pix >> 4) & 0x03; |
501 |
set_pixel_bgra (rawptr, 4, |
517 |
set_pixel_bgra (rawptr, 4, |
502 |
info_ptr->palette[palette].blue, |
518 |
png_palette[palette].blue, |
503 |
info_ptr->palette[palette].green, |
519 |
png_palette[palette].green, |
504 |
info_ptr->palette[palette].red, |
520 |
png_palette[palette].red, |
505 |
0xFF); /* alpha */ |
521 |
0xFF); /* alpha */ |
506 |
|
522 |
|
507 |
palette = (pix >> 2) & 0x03; |
523 |
palette = (pix >> 2) & 0x03; |
508 |
set_pixel_bgra (rawptr, 8, |
524 |
set_pixel_bgra (rawptr, 8, |
509 |
info_ptr->palette[palette].blue, |
525 |
png_palette[palette].blue, |
510 |
info_ptr->palette[palette].green, |
526 |
png_palette[palette].green, |
511 |
info_ptr->palette[palette].red, |
527 |
png_palette[palette].red, |
512 |
0xFF); /* alpha */ |
528 |
0xFF); /* alpha */ |
513 |
|
529 |
|
514 |
palette = pix & 0x03; |
530 |
palette = pix & 0x03; |
515 |
set_pixel_bgra (rawptr, 12, |
531 |
set_pixel_bgra (rawptr, 12, |
516 |
info_ptr->palette[palette].blue, |
532 |
png_palette[palette].blue, |
517 |
info_ptr->palette[palette].green, |
533 |
png_palette[palette].green, |
518 |
info_ptr->palette[palette].red, |
534 |
png_palette[palette].red, |
519 |
0xFF); /* alpha */ |
535 |
0xFF); /* alpha */ |
520 |
rawptr += 16; |
536 |
rawptr += 16; |
521 |
} |
537 |
} |