FLTK logo

[master] 500e470 - Refactor fluid: make fl_write_png() public

FLTK matrix user chat room
(using Element browser app)   FLTK gitter user chat room   GitHub FLTK Project   FLTK News RSS Feed  
  FLTK Apps      FLTK Library      Forums      Links     Login 
 All Forums  |  Back to fltk.commit  ]
 
Previous Message ]Next Message ]

[master] 500e470 - Refactor fluid: make fl_write_png() public "Albrecht Schlosser" Nov 09, 2021  
 
commit 500e470d392a547e6b72ac3fec92e0cd638c0d2f
Author:     Albrecht Schlosser <albrechts.fltk@online.de>
AuthorDate: Tue Nov 9 19:55:35 2021 +0100
Commit:     Albrecht Schlosser <albrechts.fltk@online.de>
CommitDate: Tue Nov 9 20:36:23 2021 +0100

    Refactor fluid: make fl_write_png() public
    
    The new function fl_write_png() was moved to its own file and is now
    publicly available ("exported") so other programs can use it.
    
    This function was used in fluid to write a window screenshot (.png)
    together with a template (.fl) to preferences storage.

 FL/Fl_PNG_Image.H    |   8 ++-
 fluid/fluid.cxx      |  25 +---------
 src/CMakeLists.txt   |   3 +-
 src/Makefile         |   3 +-
 src/fl_write_png.cxx | 136 +++++++++++++++++++++++++++++++++++++++++++++++++++
 src/makedepend       |   8 +++
 6 files changed, 157 insertions(+), 26 deletions(-)

diff --git FL/Fl_PNG_Image.H FL/Fl_PNG_Image.H
index b0bd92f..21a01d1 100644
--- FL/Fl_PNG_Image.H
+++ FL/Fl_PNG_Image.H
@@ -1,7 +1,7 @@
 //
 // PNG image header file for the Fast Light Tool Kit (FLTK).
 //
-// Copyright 1998-2010 by Bill Spitzak and others.
+// Copyright 1998-2021 by Bill Spitzak and others.
 //
 // This library is free software. Distribution and use rights are outlined in
 // the file "COPYING" which should have been included with this file.  If this
@@ -37,4 +37,10 @@ private:
   void load_png_(const char *name_png, const unsigned char *buffer_png, int datasize);
 };
 
+// Support functions to write PNG image files (since 1.4.0)
+
+FL_EXPORT int fl_write_png(const char *filename, int w, int h, int d, const unsigned char *pixels);
+
+FL_EXPORT int fl_write_png(const char *filename, Fl_RGB_Image *img);
+
 #endif
diff --git fluid/fluid.cxx fluid/fluid.cxx
index b5e01f3..fdc005d 100644
--- fluid/fluid.cxx
+++ fluid/fluid.cxx
@@ -347,34 +347,13 @@ void save_template_cb(Fl_Widget *, void *) {
   // Save to a PNG file...
   strcpy(ext, ".png");
 
-  FILE *fp;
-
-  if ((fp = fl_fopen(filename, "wb")) == NULL) {
+  errno = 0;
+  if (fl_write_png(filename, w, h, 3, pixels) != 0) {
     delete[] pixels;
     fl_alert("Error writing %s: %s", filename, strerror(errno));
     return;
   }
 
-  png_structp pptr = png_create_write_struct(PNG_LIBPNG_VER_STRING, 0, 0, 0);
-  png_infop iptr = png_create_info_struct(pptr);
-  png_bytep ptr = (png_bytep)pixels;
-
-  png_init_io(pptr, fp);
-  png_set_IHDR(pptr, iptr, w, h, 8, PNG_COLOR_TYPE_RGB, PNG_INTERLACE_NONE,
-               PNG_COMPRESSION_TYPE_DEFAULT, PNG_FILTER_TYPE_DEFAULT);
-  png_set_sRGB(pptr, iptr, PNG_sRGB_INTENT_PERCEPTUAL);
-
-  png_write_info(pptr, iptr);
-
-  for (int i = h; i > 0; i --, ptr += w * 3) {
-    png_write_row(pptr, ptr);
-  }
-
-  png_write_end(pptr, iptr);
-  png_destroy_write_struct(&pptr, &iptr);
-
-  fclose(fp);
-
 #  if 0 // The original PPM output code...
   strcpy(ext, ".ppm");
   fp = fl_fopen(filename, "wb");
diff --git src/CMakeLists.txt src/CMakeLists.txt
index 274df8e..0efbfed 100644
--- src/CMakeLists.txt
+++ src/CMakeLists.txt
@@ -1,7 +1,7 @@
 #
 # CMakeLists.txt to build the FLTK library using CMake (www.cmake.org)
 #
-# Copyright 1998-2020 by Bill Spitzak and others.
+# Copyright 1998-2021 by Bill Spitzak and others.
 #
 # This library is free software. Distribution and use rights are outlined in
 # the file "COPYING" which should have been included with this file.  If this
@@ -424,6 +424,7 @@ set (GLCPPFILES
 
 set (IMGCPPFILES
   fl_images_core.cxx
+  fl_write_png.cxx
   Fl_BMP_Image.cxx
   Fl_File_Icon2.cxx
   Fl_GIF_Image.cxx
diff --git src/Makefile src/Makefile
index 1415be1..0b7b89a 100644
--- src/Makefile
+++ src/Makefile
@@ -1,7 +1,7 @@
 #
 # Library Makefile for the Fast Light Tool Kit (FLTK).
 #
-# Copyright 1998-2020 by Bill Spitzak and others.
+# Copyright 1998-2021 by Bill Spitzak and others.
 #
 # This library is free software. Distribution and use rights are outlined in
 # the file "COPYING" which should have been included with this file.  If this
@@ -210,6 +210,7 @@ GLCPPFILES += $(GLCPPFILES_$(BUILD))
 
 IMGCPPFILES = \
 	fl_images_core.cxx \
+	fl_write_png.cxx \
 	Fl_BMP_Image.cxx \
 	Fl_File_Icon2.cxx \
 	Fl_GIF_Image.cxx \
diff --git src/fl_write_png.cxx src/fl_write_png.cxx
new file mode 100644
index 0000000..e3fa560
--- /dev/null
+++ src/fl_write_png.cxx
@@ -0,0 +1,136 @@
+//
+// Fl_PNG_Image support functions for the Fast Light Tool Kit (FLTK).
+//
+// Copyright 2021 by Bill Spitzak and others.
+//
+// This library is free software. Distribution and use rights are outlined in
+// the file "COPYING" which should have been included with this file.  If this
+// file is missing or damaged, see the license at:
+//
+//     https://www.fltk.org/COPYING.php
+//
+// Please see the following page on how to report bugs and issues:
+//
+//     https://www.fltk.org/bugs.php
+//
+
+#include <config.h>
+#include <FL/Fl_PNG_Image.H>
+#include <FL/Fl_RGB_Image.H>
+#include <FL/fl_string.h>
+#include <FL/fl_utf8.h> // fl_fopen()
+#include <stdio.h>
+
+// PNG library include files
+
+extern "C" {
+#if defined(HAVE_LIBPNG) && defined(HAVE_LIBZ)
+#include <zlib.h>
+#ifdef HAVE_PNG_H
+#include <png.h>
+#else
+#include <libpng/png.h>
+#endif // HAVE_PNG_H
+#endif // HAVE_LIBPNG && HAVE_LIBZ
+} // extern "C"
+
+/**
+  \file fl_write_png.cxx
+
+  PNG image support functions.
+
+*/
+
+/**
+  Write a RGB(A) image to a PNG image file.
+
+  This is a very basic and restricted function to create a PNG image file
+  from an RGB image (Fl_RGB_Image).
+
+  The image data must be aligned w/o gaps, i.e. ld() \b MUST be zero or
+  equal to data_w() * data_h().
+
+  The image file is always written with the original image size data_w()
+  and data_h(), even if the image has been scaled.
+
+  Image depth 3 (RGB) and 4 (RGBA) are supported.
+
+  \note Behavior of grayscale images (depth 1 and 2) is currently undefined
+    and may or may not work. There is no error handling except for opening
+    the file. This function may be changed in the future.
+
+  \param[in]  filename  Output filename, extension should be '.png'
+  \param[in]  img       RGB image to be written
+
+  \return     success (0) or error code
+
+  \retval      0        success, file has been written
+  \retval     -1        png or zlib library not available
+  \retval     -2        file open error
+
+  \see fl_write_png(const char *, int, int, int, const unsigned char *)
+*/
+
+int fl_write_png(const char *filename, Fl_RGB_Image *img) {
+  return fl_write_png(filename,
+                      img->data_w(), img->data_h(), img->d(),
+                      (const unsigned char *)img->data()[0]);
+}
+
+/**
+  Write raw image data to a PNG image file.
+
+  This is a very basic and restricted function to create a PNG image file
+  from raw image data, e.g. a screenshot.
+
+  The image data must be aligned w/o gaps after each row.
+
+  For further restrictions and return values please see
+  fl_write_png(const char *filename, Fl_RGB_Image *img).
+
+  \param[in]  filename  Output filename, extension should be '.png'
+  \param[in]  w         Image data width
+  \param[in]  h         Image data height
+  \param[in]  d         Image depth (3 = RGB, 4 = RGBA)
+  \param[in]  pixels    Image data (\p w * \p h * \p d bytes)
+
+  \return     success (0) or error code, see ...
+
+  \see fl_write_png(const char *filename, Fl_RGB_Image *img)
+ */
+int fl_write_png(const char *filename, int w, int h, int d, const unsigned char *pixels) {
+
+#if defined(HAVE_LIBPNG) && defined(HAVE_LIBZ)
+
+  FILE *fp;
+
+  if ((fp = fl_fopen(filename, "wb")) == NULL) {
+    return -2;
+  }
+
+  png_structp pptr = png_create_write_struct(PNG_LIBPNG_VER_STRING, 0, 0, 0);
+  png_infop iptr = png_create_info_struct(pptr);
+  png_bytep ptr = (png_bytep)pixels;
+
+  png_init_io(pptr, fp);
+  png_set_IHDR(pptr, iptr, w, h, 8,
+               PNG_COLOR_TYPE_RGB, PNG_INTERLACE_NONE,
+               PNG_COMPRESSION_TYPE_DEFAULT, PNG_FILTER_TYPE_DEFAULT);
+  png_set_sRGB(pptr, iptr, PNG_sRGB_INTENT_PERCEPTUAL);
+
+  png_write_info(pptr, iptr);
+
+  for (int i = h; i > 0; i--, ptr += w * d) {
+    png_write_row(pptr, ptr);
+  }
+
+  png_write_end(pptr, iptr);
+  png_destroy_write_struct(&pptr, &iptr);
+
+  fclose(fp);
+  return 0;
+
+#else
+  return -1;
+#endif
+}
diff --git src/makedepend src/makedepend
index 328e057..137bc94 100644
--- src/makedepend
+++ src/makedepend
@@ -3502,6 +3502,14 @@ Fl_Wizard.o: ../FL/Fl_Widget.H
 Fl_Wizard.o: ../FL/Fl_Window.H
 Fl_Wizard.o: ../FL/Fl_Wizard.H
 Fl_Wizard.o: ../FL/platform_types.h
+fl_write_png.o: ../config.h
+fl_write_png.o: ../FL/Fl_Export.H
+fl_write_png.o: ../FL/Fl_Image.H
+fl_write_png.o: ../FL/Fl_PNG_Image.H
+fl_write_png.o: ../FL/Fl_RGB_Image.H
+fl_write_png.o: ../FL/fl_string.h
+fl_write_png.o: ../FL/fl_types.h
+fl_write_png.o: ../FL/fl_utf8.h
 Fl_x.o: ../config.h
 Fl_x.o: ../FL/abi-version.h
 Fl_x.o: ../FL/Enumerations.H
Direct Link to Message ]
 
     
Previous Message ]Next Message ]
 
 

Comments are owned by the poster. All other content is copyright 1998-2024 by Bill Spitzak and others. This project is hosted by The FLTK Team. Please report site problems to 'erco@seriss.com'.