24 #include <core/exception.h>
25 #include <fvutils/readers/png.h>
26 #include <fvutils/color/rgbyuv.h>
59 PNGReader::PNGReader(
const char *filename)
64 __d = setup_read(filename);
71 PNGReader::setup_read(
const char *filename)
73 PNGReaderData *d =
new PNGReaderData();
76 if ((d->infile = fopen(filename,
"rb")) == NULL) {
80 d->png_ptr = png_create_read_struct(PNG_LIBPNG_VER_STRING, NULL, NULL, NULL);
82 if (d->png_ptr == NULL) {
84 throw Exception(
"Could not create PNG read struct");
88 d->info_ptr = png_create_info_struct(d->png_ptr);
89 if (d->info_ptr == NULL) {
91 png_destroy_read_struct(&d->png_ptr, (png_infopp)NULL, (png_infopp)NULL);
92 throw Exception(
"Could not create PNG info struct");
99 if (setjmp(png_jmpbuf(d->png_ptr))) {
101 png_destroy_read_struct(&d->png_ptr, &d->info_ptr, (png_infopp)NULL);
104 throw Exception(
"Could not read PNG file");
108 png_init_io(d->png_ptr, d->infile);
112 png_read_info(d->png_ptr, d->info_ptr);
115 png_set_strip_16(d->png_ptr);
119 png_set_strip_alpha(d->png_ptr);
123 png_set_packing(d->png_ptr);
125 png_byte color_type = png_get_color_type(d->png_ptr, d->info_ptr);
128 if (color_type == PNG_COLOR_TYPE_PALETTE) png_set_palette_to_rgb(d->png_ptr);
131 if (color_type == PNG_COLOR_TYPE_GRAY) png_set_gray_to_rgb(d->png_ptr);
139 double screen_gamma = 2.2;
140 if (png_get_sRGB(d->png_ptr, d->info_ptr, &intent)) {
141 png_set_gamma(d->png_ptr, screen_gamma, 0.45455);
144 if (png_get_gAMA(d->png_ptr, d->info_ptr, &image_gamma)) {
145 png_set_gamma(d->png_ptr, screen_gamma, image_gamma);
147 png_set_gamma(d->png_ptr, screen_gamma, 0.45455);
154 d->number_passes = png_set_interlace_handling(d->png_ptr);
159 png_read_update_info(d->png_ptr, d->info_ptr);
165 PNGReader::~PNGReader()
167 fclose( __d->infile );
169 png_destroy_read_struct(&__d->png_ptr, &__d->info_ptr, (png_infopp)NULL);
178 PNGReader::set_buffer(
unsigned char *yuv422planar_buffer)
180 buffer = yuv422planar_buffer;
185 PNGReader::colorspace()
187 return YUV422_PLANAR;
192 PNGReader::pixel_width()
195 return png_get_image_width(__d->png_ptr, __d->info_ptr);
203 PNGReader::pixel_height()
206 return png_get_image_height(__d->png_ptr, __d->info_ptr);
216 if ( buffer == NULL ) {
217 throw Exception(
"PNGReader::read: buffer == NULL");
220 throw Exception(
"Can read PNG file only once.");
224 png_bytep row_pointer;
225 row_pointer = (png_bytep)png_malloc(__d->png_ptr, png_get_rowbytes(__d->png_ptr, __d->info_ptr));
227 unsigned int lheight = pixel_height();
228 unsigned int lwidth = pixel_width();
230 for (
int pass = 0; pass < __d->number_passes; ++pass) {
231 for (
unsigned y = 0; y < lheight; ++y) {
232 png_read_rows(__d->png_ptr, &row_pointer, (png_bytepp)NULL, 1);
233 convert_line_rgb_to_yuv422planar( row_pointer, buffer, lwidth, lheight, 0, y );
238 png_read_end(__d->png_ptr, __d->info_ptr);
239 png_free(__d->png_ptr, row_pointer);
Fawkes library namespace.
Base class for exceptions in Fawkes.