From a6163888f3c56123b1db313743c6147ba498732c Mon Sep 17 00:00:00 2001 From: Yuval Adam Date: Fri, 8 Aug 2014 14:42:07 +0300 Subject: Add third_party libs --- .../windows/fltk-1.1.10/src/Fl_PNG_Image.cxx | 155 +++++++++++++++++++++ 1 file changed, 155 insertions(+) create mode 100644 third_party/windows/fltk-1.1.10/src/Fl_PNG_Image.cxx (limited to 'third_party/windows/fltk-1.1.10/src/Fl_PNG_Image.cxx') diff --git a/third_party/windows/fltk-1.1.10/src/Fl_PNG_Image.cxx b/third_party/windows/fltk-1.1.10/src/Fl_PNG_Image.cxx new file mode 100644 index 0000000..fa1deb4 --- /dev/null +++ b/third_party/windows/fltk-1.1.10/src/Fl_PNG_Image.cxx @@ -0,0 +1,155 @@ +// +// "$Id: Fl_PNG_Image.cxx 5190 2006-06-09 16:16:34Z mike $" +// +// Fl_PNG_Image routines. +// +// Copyright 1997-2005 by Easy Software Products. +// Image support donated by Matthias Melcher, Copyright 2000. +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Library General Public +// License as published by the Free Software Foundation; either +// version 2 of the License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Library General Public License for more details. +// +// You should have received a copy of the GNU Library General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 +// USA. +// +// Please report all bugs and problems on the following page: +// +// http://www.fltk.org/str.php +// +// Contents: +// +// Fl_PNG_Image::Fl_PNG_Image() - Load a PNG image file. +// + +// +// Include necessary header files... +// + +#include +#include +#include +#include +#include + +extern "C" +{ +#if defined(HAVE_LIBPNG) && defined(HAVE_LIBZ) +# include +# ifdef HAVE_PNG_H +# include +# else +# include +# endif // HAVE_PNG_H +#endif // HAVE_LIBPNG && HAVE_LIBZ +} + + +// +// 'Fl_PNG_Image::Fl_PNG_Image()' - Load a PNG image file. +// + +Fl_PNG_Image::Fl_PNG_Image(const char *png) // I - File to read + : Fl_RGB_Image(0,0,0) { +#if defined(HAVE_LIBPNG) && defined(HAVE_LIBZ) + int i; // Looping var + FILE *fp; // File pointer + int channels; // Number of color channels + png_structp pp; // PNG read pointer + png_infop info; // PNG info pointers + png_bytep *rows; // PNG row pointers + + + // Open the PNG file... + if ((fp = fopen(png, "rb")) == NULL) return; + + // Setup the PNG data structures... + pp = png_create_read_struct(PNG_LIBPNG_VER_STRING, NULL, NULL, NULL); + info = png_create_info_struct(pp); + + if (setjmp(pp->jmpbuf)) + { + Fl::warning("PNG file \"%s\" contains errors!\n", png); + return; + } + + // Initialize the PNG read "engine"... + png_init_io(pp, fp); + + // Get the image dimensions and convert to grayscale or RGB... + png_read_info(pp, info); + + if (info->color_type == PNG_COLOR_TYPE_PALETTE) + png_set_expand(pp); + + if (info->color_type & PNG_COLOR_MASK_COLOR) + channels = 3; + else + channels = 1; + + if ((info->color_type & PNG_COLOR_MASK_ALPHA) || info->num_trans) + channels ++; + + w((int)(info->width)); + h((int)(info->height)); + d(channels); + + if (info->bit_depth < 8) + { + png_set_packing(pp); + png_set_expand(pp); + } + else if (info->bit_depth == 16) + png_set_strip_16(pp); + +# if defined(HAVE_PNG_GET_VALID) && defined(HAVE_PNG_SET_TRNS_TO_ALPHA) + // Handle transparency... + if (png_get_valid(pp, info, PNG_INFO_tRNS)) + png_set_tRNS_to_alpha(pp); +# endif // HAVE_PNG_GET_VALID && HAVE_PNG_SET_TRNS_TO_ALPHA + + array = new uchar[w() * h() * d()]; + alloc_array = 1; + + // Allocate pointers... + rows = new png_bytep[h()]; + + for (i = 0; i < h(); i ++) + rows[i] = (png_bytep)(array + i * w() * d()); + + // Read the image, handling interlacing as needed... + for (i = png_set_interlace_handling(pp); i > 0; i --) + png_read_rows(pp, rows, NULL, h()); + +#ifdef WIN32 + // Some Windows graphics drivers don't honor transparency when RGB == white + if (channels == 4) { + // Convert RGB to 0 when alpha == 0... + uchar *ptr = (uchar *)array; + for (i = w() * h(); i > 0; i --, ptr += 4) + if (!ptr[3]) ptr[0] = ptr[1] = ptr[2] = 0; + } +#endif // WIN32 + + // Free memory and return... + delete[] rows; + + png_read_end(pp, info); + png_destroy_read_struct(&pp, &info, NULL); + + fclose(fp); +#endif // HAVE_LIBPNG && HAVE_LIBZ +} + + +// +// End of "$Id: Fl_PNG_Image.cxx 5190 2006-06-09 16:16:34Z mike $". +// -- cgit v1.3.1