From 7c3d8ad0c765dd1fcece1b325cdfd387112792e8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Axel=20D=C3=B6rfler?= Date: Wed, 9 Nov 2005 23:52:27 +0000 Subject: [PATCH] * added a call to png_set_strip_alpha() which could fix the alpha channel problem we're seeing (at least I couldn't reproduce the problem anymore). * SaveToPNG() now returns an error code. * cleanup. git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@14813 a95241bf-73f2-0310-859d-f6bbb57e9c96 --- src/servers/app/PNGDump.cpp | 184 ++++++++++++++++-------------------- src/servers/app/PNGDump.h | 42 +++----- 2 files changed, 94 insertions(+), 132 deletions(-) diff --git a/src/servers/app/PNGDump.cpp b/src/servers/app/PNGDump.cpp index 773836c4f4..be1879f898 100644 --- a/src/servers/app/PNGDump.cpp +++ b/src/servers/app/PNGDump.cpp @@ -1,115 +1,91 @@ -//------------------------------------------------------------------------------ -// Copyright (c) 2001-2002, Haiku, Inc. -// -// Permission is hereby granted, free of charge, to any person obtaining a -// copy of this software and associated documentation files (the "Software"), -// to deal in the Software without restriction, including without limitation -// the rights to use, copy, modify, merge, publish, distribute, sublicense, -// and/or sell copies of the Software, and to permit persons to whom the -// Software is furnished to do so, subject to the following conditions: -// -// The above copyright notice and this permission notice shall be included in -// all copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING -// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER -// DEALINGS IN THE SOFTWARE. -// -// File Name: PNGDump.cpp -// Author: DarkWyrm -// Description: Function for saving a generic framebuffer to a PNG file -// -//------------------------------------------------------------------------------ -#include -#include -#include -#include -#include -#include +/* + * Copyright 2001-2005, Haiku. + * Distributed under the terms of the MIT License. + * + * Authors: + * DarkWyrm + */ + +/** Function for saving a generic framebuffer to a PNG file */ + #include "PNGDump.h" -#define DEBUG_PNGDUMP +#include -void SaveToPNG(const char *filename, const BRect &bounds, color_space space, - const void *bits, const int32 &bitslength, const int32 bytesperrow) +#include + +#include +#include +#include +#include + + +#define TRACE_PNGDUMP +#ifdef TRACE_PNGDUMP +# define TRACE(x) printf x +#else +# define TRACE(x) ; +#endif + + +status_t +SaveToPNG(const char* filename, const BRect& bounds, color_space space, + const void* bits, int32 bitsLength, int32 bytesPerRow) { -#ifdef DEBUG_PNGDUMP -printf("SaveToPNG: %s ",filename); -bounds.PrintToStream(); -#endif - FILE *fp; - png_structp png_ptr; - png_infop info_ptr; - - fp=fopen(filename, "wb"); - if(fp==NULL) - { -#ifdef DEBUG_PNGDUMP -printf("Couldn't open file\n"); -#endif - return; - } - - png_ptr=png_create_write_struct(PNG_LIBPNG_VER_STRING, NULL, NULL, NULL); - - if(png_ptr==NULL) - { -#ifdef DEBUG_PNGDUMP -printf("Couldn't create write struct\n"); -#endif - fclose(fp); - return; - } - - info_ptr=png_create_info_struct(png_ptr); - if(info_ptr==NULL) - { -#ifdef DEBUG_PNGDUMP -printf("Couldn't create info struct\n"); -#endif - fclose(fp); - png_destroy_write_struct(&png_ptr, (png_infopp)NULL); - return; - } - - if(setjmp(png_ptr->jmpbuf)) - { -#ifdef DEBUG_PNGDUMP -printf("Couldn't set jump\n"); -#endif - fclose(fp); - png_destroy_write_struct(&png_ptr, (png_infopp)NULL); - return; - } - - png_init_io(png_ptr, fp); - -// png_set_compression_level(png_ptr, Z_NO_COMPRESSION); - - png_set_bgr(png_ptr); - int32 width = bounds.IntegerWidth() + 1; int32 height = bounds.IntegerHeight() + 1; - - png_set_IHDR(png_ptr, info_ptr, width, height, 8, PNG_COLOR_TYPE_RGB_ALPHA, -// PNG_INTERLACE_NONE, PNG_COMPRESSION_TYPE_BASE, PNG_FILTER_TYPE_BASE); - PNG_INTERLACE_NONE, PNG_COMPRESSION_TYPE_DEFAULT, PNG_FILTER_TYPE_DEFAULT); - - png_write_info(png_ptr, info_ptr); - png_byte* row_pointers[height]; + TRACE(("SaveToPNG: %s (%ldx%ld)\n", filename, width, height)); + + FILE *file = fopen(filename, "wb"); + if (file == NULL) { + TRACE(("Couldn't open file: %s\n", strerror(errno))); + return errno; + } + + png_structp png = png_create_write_struct(PNG_LIBPNG_VER_STRING, + NULL, NULL, NULL); + if (png == NULL) { + TRACE(("Couldn't create write struct\n")); + fclose(file); + return B_NO_MEMORY; + } + + png_infop info = png_create_info_struct(png); + if (info == NULL) { + TRACE(("Couldn't create info struct\n")); + png_destroy_write_struct(&png, NULL); + fclose(file); + return B_NO_MEMORY; + } + + if (setjmp(png->jmpbuf)) { + png_destroy_write_struct(&png, NULL); + fclose(file); + return B_ERROR; + } + + png_init_io(png, file); + png_set_bgr(png); + + png_set_IHDR(png, info, width, height, 8, PNG_COLOR_TYPE_RGB_ALPHA, + PNG_INTERLACE_NONE, PNG_COMPRESSION_TYPE_DEFAULT, + PNG_FILTER_TYPE_DEFAULT); + png_set_strip_alpha(png); + + png_write_info(png, info); + + png_byte* rowPointers[height]; png_byte* index = (png_byte*)bits; for (int32 i = 0; i < height; i++) { - row_pointers[i] = index; - index += bytesperrow; + rowPointers[i] = index; + index += bytesPerRow; } - png_write_image(png_ptr, row_pointers); - png_write_end(png_ptr, info_ptr); - - png_destroy_write_struct(&png_ptr, (png_infopp)NULL); - fclose(fp); + + png_write_image(png, rowPointers); + png_write_end(png, info); + + png_destroy_write_struct(&png, NULL); + fclose(file); + return B_OK; } diff --git a/src/servers/app/PNGDump.h b/src/servers/app/PNGDump.h index e34ff2b77f..6c4b2f4fd7 100644 --- a/src/servers/app/PNGDump.h +++ b/src/servers/app/PNGDump.h @@ -1,34 +1,20 @@ -//------------------------------------------------------------------------------ -// Copyright (c) 2001-2002, Haiku, Inc. -// -// Permission is hereby granted, free of charge, to any person obtaining a -// copy of this software and associated documentation files (the "Software"), -// to deal in the Software without restriction, including without limitation -// the rights to use, copy, modify, merge, publish, distribute, sublicense, -// and/or sell copies of the Software, and to permit persons to whom the -// Software is furnished to do so, subject to the following conditions: -// -// The above copyright notice and this permission notice shall be included in -// all copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING -// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER -// DEALINGS IN THE SOFTWARE. -// -// File Name: PNGDump.H -// Author: DarkWyrm -// Description: Function for saving a generic framebuffer to a PNG file -// -//------------------------------------------------------------------------------ +/* + * Copyright 2001-2005, Haiku. + * Distributed under the terms of the MIT License. + * + * Authors: + * DarkWyrm + */ #ifndef PNGDUMP_H #define PNGDUMP_H -void SaveToPNG(const char *filename, const BRect &bounds, color_space space, - const void *bits, const int32 &bitslength, const int32 bytesperrow); +#include + +class BRect; + + +status_t SaveToPNG(const char* filename, const BRect& bounds, color_space space, + const void* bits, int32 bitsLength, int32 bytesPerRow); #endif