std::string message;
png_struct *png;
png_info *info;
+ int interlace;
};
return !png_sig_cmp(reinterpret_cast<png_byte *>(const_cast<char*>(sig.data())), 0, sig.size());
}
-void PngLoader::load(Image::Data &data)
+void PngLoader::load_headers_(Image::Data &data)
{
- png_byte **rows = 0;
-
if(setjmp(png_jmpbuf(priv->png)))
{
- delete[] rows;
throw bad_image_data(priv->message);
}
png_uint_32 height;
int depth;
int color;
- int interlace;
- png_get_IHDR(priv->png, priv->info, &width, &height, &depth, &color, &interlace, 0, 0);
+ png_get_IHDR(priv->png, priv->info, &width, &height, &depth, &color, &priv->interlace, 0, 0);
unsigned nchans = png_get_channels(priv->png, priv->info);
if(depth!=8)
case PNG_COLOR_TYPE_RGB_ALPHA: data.fmt = RGBA; break;
default: throw unsupported_image_format("unknown color type");
}
+}
+
+void PngLoader::load_pixels_(Image::Data &data)
+{
+ png_byte **rows = 0;
- data.data = new char[data.stride*data.height];
+ if(setjmp(png_jmpbuf(priv->png)))
+ {
+ delete[] rows;
+ throw bad_image_data(priv->message);
+ }
- if(interlace==PNG_INTERLACE_ADAM7)
+ if(priv->interlace==PNG_INTERLACE_ADAM7)
{
// ADAM7 requires all rows to be loaded at once
unsigned n_passes = png_set_interlace_handling(priv->png);
rows = new png_byte *[data.height];
for(unsigned y=0; y<data.height; ++y)
- rows[y] = reinterpret_cast<png_byte *>(data.data+data.stride*(data.height-1-y));
+ rows[y] = reinterpret_cast<png_byte *>(data.pixels+data.stride*(data.height-1-y));
for(unsigned i=0; i<n_passes; ++i)
png_read_rows(priv->png, rows, 0, data.height);
else
{
for(unsigned y=0; y<data.height; ++y)
- png_read_row(priv->png, reinterpret_cast<png_byte *>(data.data+data.stride*(data.height-1-y)), 0);
+ png_read_row(priv->png, reinterpret_cast<png_byte *>(data.pixels+data.stride*(data.height-1-y)), 0);
}
png_read_end(priv->png, 0);