]> git.cworth.org Git - apitrace/commitdiff
image: Allow to read PNG from a C++ stream.
authorJosé Fonseca <jfonseca@vmware.com>
Wed, 11 Sep 2013 17:16:18 +0000 (18:16 +0100)
committerJosé Fonseca <jfonseca@vmware.com>
Wed, 11 Sep 2013 17:16:18 +0000 (18:16 +0100)
image/image.hpp
image/image_png.cpp

index 6b32f27df699f0abb49ec8e2b2130cbec6de19e7..cfdf875f3228a95bc95bc1b74c32c76ef893400a 100644 (file)
@@ -104,6 +104,9 @@ public:
 };
 
 
+Image *
+readPNG(std::istream &is);
+
 Image *
 readPNG(const char *filename);
 
index 357a78e9a38c83a744668524339d54db7f50b123..324cfe9814ee53ccbc8842fed32b0ca245b56329 100644 (file)
@@ -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 */