// png_writer.cc // nono - programme du robot 2004. {{{ // // Copyright (C) 2004 Nicolas Schodet // // Robot APB Team/Efrei 2004. // Web: http://assos.efrei.fr/robot/ // Email: robot AT efrei DOT fr // // This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 2 of the License, or // (at your option) any later version. // // This program 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 General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. // // }}} #include "png_writer.h" #include "utils/errno_exception.h" #include #include /// Constructeur. PngWriter::PngWriter (const std::string &filename) : filename_ (filename) { } /// Écrit une image, retourne le nombre d'octets écrits. int PngWriter::write (void *buf, int size, int width, int height) const { int y; unsigned char *p; FILE *fd; png_infop info_ptr; png_structp png_ptr; int depth = 3; // Ouvre le fichier. fd = fopen(filename_.c_str (), "w+"); if (!fd) throw std::runtime_error (filename_); // Crée le structure PNG. png_ptr = png_create_write_struct (PNG_LIBPNG_VER_STRING, 0, 0, 0); if (!png_ptr) return 0; info_ptr = png_create_info_struct (png_ptr); if (!info_ptr) { png_destroy_write_struct (&png_ptr, 0); return 0; } // Initialise. png_init_io (png_ptr, fd); png_set_IHDR (png_ptr, info_ptr, width, height, 8, PNG_COLOR_TYPE_RGB, PNG_INTERLACE_NONE, PNG_COMPRESSION_TYPE_DEFAULT, PNG_FILTER_TYPE_DEFAULT); png_set_bgr (png_ptr); png_write_info (png_ptr, info_ptr); // Écrit l'image. p = reinterpret_cast (buf); for (y = 0; y < height; y++) { png_write_row (png_ptr, p); p += width * depth; } // Fin. png_write_end (png_ptr, info_ptr); png_destroy_write_struct (&png_ptr, &info_ptr); fclose (fd); return size; }