]> git.cworth.org Git - apitrace/blobdiff - image/image_png.cpp
image: Allow to read PNG from a C++ stream.
[apitrace] / image / image_png.cpp
index 0a413e1c6bbf25b8c23017c8f4c303359f2afaf7..324cfe9814ee53ccbc8842fed32b0ca245b56329 100644 (file)
@@ -123,20 +123,34 @@ no_png:
 }
 
 
+bool
+Image::writePNG(const char *filename) const
+{
+    std::ofstream os(filename, std::ofstream::binary);
+    if (!os) {
+        return false;
+    }
+    return writePNG(os);
+}
+
+
+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;
@@ -158,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);
 
@@ -193,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 */