X-Git-Url: https://git.cworth.org/git?a=blobdiff_plain;f=image%2Fimage_png.cpp;h=324cfe9814ee53ccbc8842fed32b0ca245b56329;hb=59889aafe642e52742524da2c202a1003643fa94;hp=357a78e9a38c83a744668524339d54db7f50b123;hpb=08473e50e90059e75d6e7bce7e12be8bf6dd028b;p=apitrace diff --git a/image/image_png.cpp b/image/image_png.cpp index 357a78e..324cfe9 100644 --- a/image/image_png.cpp +++ b/image/image_png.cpp @@ -134,20 +134,23 @@ Image::writePNG(const char *filename) const } +static void +pngReadCallback(png_structp png_ptr, png_bytep data, png_size_t length) +{ + std::istream *os = (std::istream *) png_get_io_ptr(png_ptr); + os->read((char *)data, length); +} + + Image * -readPNG(const char *filename) +readPNG(std::istream &is) { - FILE *fp; png_structp png_ptr; png_infop info_ptr; png_infop end_info; unsigned channels; Image *image; - fp = fopen(filename, "rb"); - if (!fp) - goto no_fp; - png_ptr = png_create_read_struct(PNG_LIBPNG_VER_STRING, NULL, NULL, NULL); if (!png_ptr) goto no_png; @@ -169,7 +172,7 @@ readPNG(const char *filename) goto no_png; } - png_init_io(png_ptr, fp); + png_set_read_fn(png_ptr, &is, pngReadCallback); png_read_info(png_ptr, info_ptr); @@ -204,17 +207,24 @@ readPNG(const char *filename) png_read_end(png_ptr, info_ptr); png_destroy_read_struct(&png_ptr, &info_ptr, &end_info); - fclose(fp); + return image; no_image: png_destroy_read_struct(&png_ptr, &info_ptr, &end_info); no_png: - fclose(fp); -no_fp: return NULL; } +Image * +readPNG(const char *filename) +{ + std::ifstream is(filename, std::ifstream::binary); + if (!is) { + return NULL; + } + return readPNG(filename); +} } /* namespace image */