From 59889aafe642e52742524da2c202a1003643fa94 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Jos=C3=A9=20Fonseca?= Date: Wed, 11 Sep 2013 18:16:18 +0100 Subject: [PATCH] image: Allow to read PNG from a C++ stream. --- image/image.hpp | 3 +++ image/image_png.cpp | 30 ++++++++++++++++++++---------- 2 files changed, 23 insertions(+), 10 deletions(-) diff --git a/image/image.hpp b/image/image.hpp index 6b32f27..cfdf875 100644 --- a/image/image.hpp +++ b/image/image.hpp @@ -104,6 +104,9 @@ public: }; +Image * +readPNG(std::istream &is); + Image * readPNG(const char *filename); 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 */ -- 2.43.0