24 #include <core/exception.h> 25 #include <fvutils/readers/png.h> 26 #include <fvutils/color/rgbyuv.h> 62 PNGReader::PNGReader(
const char *filename)
67 __d = setup_read(filename);
74 PNGReader::setup_read(
const char *filename)
76 PNGReaderData *d =
new PNGReaderData();
79 if ((d->infile = fopen(filename,
"rb")) == NULL) {
80 throw Exception(
"Cannot open PNG file %s: %s", filename, ::strerror(errno));
83 d->png_ptr = png_create_read_struct(PNG_LIBPNG_VER_STRING, NULL, NULL, NULL);
85 if (d->png_ptr == NULL) {
87 throw Exception(
"Could not create PNG read struct");
91 d->info_ptr = png_create_info_struct(d->png_ptr);
92 if (d->info_ptr == NULL) {
94 png_destroy_read_struct(&d->png_ptr, (png_infopp)NULL, (png_infopp)NULL);
95 throw Exception(
"Could not create PNG info struct");
102 if (setjmp(png_jmpbuf(d->png_ptr))) {
103 std::string err(::strerror(errno));
105 png_destroy_read_struct(&d->png_ptr, &d->info_ptr, (png_infopp)NULL);
108 throw Exception(
"Could not read PNG file %s: %s", filename, err.c_str());
112 png_init_io(d->png_ptr, d->infile);
116 png_read_info(d->png_ptr, d->info_ptr);
119 png_set_strip_16(d->png_ptr);
123 png_set_strip_alpha(d->png_ptr);
127 png_set_packing(d->png_ptr);
129 png_byte color_type = png_get_color_type(d->png_ptr, d->info_ptr);
132 if (color_type == PNG_COLOR_TYPE_PALETTE) png_set_palette_to_rgb(d->png_ptr);
135 if (color_type == PNG_COLOR_TYPE_GRAY) png_set_gray_to_rgb(d->png_ptr);
143 double screen_gamma = 2.2;
144 if (png_get_sRGB(d->png_ptr, d->info_ptr, &intent)) {
145 png_set_gamma(d->png_ptr, screen_gamma, 0.45455);
148 if (png_get_gAMA(d->png_ptr, d->info_ptr, &image_gamma)) {
149 png_set_gamma(d->png_ptr, screen_gamma, image_gamma);
151 png_set_gamma(d->png_ptr, screen_gamma, 0.45455);
158 d->number_passes = png_set_interlace_handling(d->png_ptr);
163 png_read_update_info(d->png_ptr, d->info_ptr);
169 PNGReader::~PNGReader()
171 fclose( __d->infile );
173 png_destroy_read_struct(&__d->png_ptr, &__d->info_ptr, (png_infopp)NULL);
182 PNGReader::set_buffer(
unsigned char *yuv422planar_buffer)
184 buffer = yuv422planar_buffer;
189 PNGReader::colorspace()
191 return YUV422_PLANAR;
196 PNGReader::pixel_width()
199 return png_get_image_width(__d->png_ptr, __d->info_ptr);
207 PNGReader::pixel_height()
210 return png_get_image_height(__d->png_ptr, __d->info_ptr);
220 if ( buffer == NULL ) {
221 throw Exception(
"PNGReader::read: buffer == NULL");
224 throw Exception(
"Can read PNG file only once.");
228 png_bytep row_pointer;
229 row_pointer = (png_bytep)png_malloc(__d->png_ptr, png_get_rowbytes(__d->png_ptr, __d->info_ptr));
231 unsigned int lheight = pixel_height();
232 unsigned int lwidth = pixel_width();
234 for (
int pass = 0; pass < __d->number_passes; ++pass) {
235 for (
unsigned y = 0; y < lheight; ++y) {
236 png_read_rows(__d->png_ptr, &row_pointer, (png_bytepp)NULL, 1);
237 convert_line_rgb_to_yuv422planar( row_pointer, buffer, lwidth, lheight, 0, y );
242 png_read_end(__d->png_ptr, __d->info_ptr);
243 png_free(__d->png_ptr, row_pointer);
Fawkes library namespace.
Base class for exceptions in Fawkes.