From e7537ca6033a13ff1d21aac4a61a49ef325684b6 Mon Sep 17 00:00:00 2001 From: Andrei Karas Date: Mon, 18 Sep 2017 18:57:19 +0300 Subject: Move imagewriter into utils directory and rename to pnglib. --- src/CMakeLists.txt | 8 +-- src/Makefile.am | 4 +- src/game.cpp | 4 +- src/progs/dyecmd/dyemain.cpp | 5 +- src/resources/imagewriter.cpp | 121 ------------------------------------------ src/resources/imagewriter.h | 44 --------------- src/test/testlauncher.cpp | 10 ++-- src/utils/pnglib.cpp | 113 +++++++++++++++++++++++++++++++++++++++ src/utils/pnglib.h | 38 +++++++++++++ 9 files changed, 166 insertions(+), 181 deletions(-) delete mode 100644 src/resources/imagewriter.cpp delete mode 100644 src/resources/imagewriter.h create mode 100644 src/utils/pnglib.cpp create mode 100644 src/utils/pnglib.h diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 236ba3e4d..e64b6cf4f 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -685,8 +685,6 @@ SET(SRCS resources/imagerect.h resources/imageset.h resources/imageset.cpp - resources/imagewriter.cpp - resources/imagewriter.h resources/itemcolordata.h resources/db/itemdb.cpp resources/db/itemdb.h @@ -916,6 +914,8 @@ SET(SRCS fs/paths.h utils/perfomance.cpp utils/perfomance.h + utils/pnglib.cpp + utils/pnglib.h fs/virtfs/fsfuncs.h fs/virtfs/rwops.cpp fs/virtfs/rwops.h @@ -1778,8 +1778,6 @@ SET(DYE_CMD_SRCS resources/imagerect.h resources/imageset.cpp resources/imageset.h - resources/imagewriter.cpp - resources/imagewriter.h resources/itemcolordata.h resources/resource.cpp resources/resource.h @@ -1846,6 +1844,8 @@ SET(DYE_CMD_SRCS fs/paths.h utils/perfomance.cpp utils/perfomance.h + utils/pnglib.cpp + utils/pnglib.h fs/virtfs/fsfuncs.h fs/virtfs/rwops.cpp fs/virtfs/rwops.h diff --git a/src/Makefile.am b/src/Makefile.am index 83ea3e584..d46a76cad 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -464,8 +464,6 @@ BASE_SRC += client.h \ resources/imagehelper.h \ resources/imageset.cpp \ resources/imageset.h \ - resources/imagewriter.cpp \ - resources/imagewriter.h \ resources/itemcolordata.h \ resources/mstack.h \ resources/notificationinfo.h \ @@ -621,6 +619,8 @@ BASE_SRC += client.h \ fs/paths.h \ utils/perfomance.cpp \ utils/perfomance.h \ + utils/pnglib.cpp \ + utils/pnglib.h \ fs/virtfs/fsfuncs.h \ fs/virtfs/rwops.cpp \ fs/virtfs/rwops.h \ diff --git a/src/game.cpp b/src/game.cpp index ad819230b..e09e6c92f 100644 --- a/src/game.cpp +++ b/src/game.cpp @@ -110,7 +110,6 @@ #include "particle/particleengine.h" #include "resources/delayedmanager.h" -#include "resources/imagewriter.h" #include "resources/mapreader.h" #include "resources/screenshothelper.h" @@ -125,6 +124,7 @@ #include "utils/delete2.h" #include "utils/foreach.h" #include "utils/gettext.h" +#include "utils/pnglib.h" #include "utils/sdlcheckutils.h" #include "utils/timer.h" @@ -606,7 +606,7 @@ bool Game::saveScreenshot(SDL_Surface *const screenshot, } const std::string fileNameStr = filename.str(); - const bool success = ImageWriter::writePNG(screenshot, fileNameStr); + const bool success = PngLib::writePNG(screenshot, fileNameStr); #ifdef __native_client__ std::string nacScreenshotlDir = fileNameStr; cutFirst(nacScreenshotlDir, "/persistent"); diff --git a/src/progs/dyecmd/dyemain.cpp b/src/progs/dyecmd/dyemain.cpp index 234e4a600..a5e8a2a34 100644 --- a/src/progs/dyecmd/dyemain.cpp +++ b/src/progs/dyecmd/dyemain.cpp @@ -26,8 +26,6 @@ #include "fs/virtfs/fs.h" -#include "resources/imagewriter.h" - #include "resources/image/image.h" #ifdef USE_SDL2 @@ -37,6 +35,7 @@ #include "resources/loaders/imageloader.h" #include "utils/gettext.h" +#include "utils/pnglib.h" #include "utils/sdlhelper.h" #include @@ -114,7 +113,7 @@ int main(int argc, char **argv) } SDL_Surface *const surface = ImageHelper::convertTo32Bit( image->getSDLSurface()); - ImageWriter::writePNG(surface, dst); + PngLib::writePNG(surface, dst); SDL_FreeSurface(surface); VirtFs::deinit(); return 0; diff --git a/src/resources/imagewriter.cpp b/src/resources/imagewriter.cpp deleted file mode 100644 index d9485a52c..000000000 --- a/src/resources/imagewriter.cpp +++ /dev/null @@ -1,121 +0,0 @@ -/* - * The ManaPlus Client - * Copyright (C) 2004-2009 The Mana World Development Team - * Copyright (C) 2009-2010 The Mana Developers - * Copyright (C) 2011-2017 The ManaPlus Developers - * - * This file is part of The ManaPlus Client. - * - * 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 - * 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, see . - */ - -#include "resources/imagewriter.h" - -#include "utils/cast.h" -#include "utils/checkutils.h" - -#include -PRAGMA48(GCC diagnostic push) -PRAGMA48(GCC diagnostic ignored "-Wshadow") -#include -PRAGMA48(GCC diagnostic pop) - -#include "debug.h" - -bool ImageWriter::writePNG(SDL_Surface *const surface, - const std::string &filename) -{ - if (surface == nullptr) - return false; - - - if (SDL_MUSTLOCK(surface)) - SDL_LockSurface(surface); - - png_structp png_ptr = png_create_write_struct(PNG_LIBPNG_VER_STRING, - nullptr, nullptr, nullptr); - if (png_ptr == nullptr) - { - reportAlways("Had trouble creating png_structp"); - return false; - } - - png_infop info_ptr = png_create_info_struct(png_ptr); - if (info_ptr == nullptr) - { - png_destroy_write_struct(&png_ptr, static_cast(nullptr)); - reportAlways("Could not create png_info"); - return false; - } - - if (setjmp(png_jmpbuf(png_ptr))) - { - png_destroy_write_struct(&png_ptr, &info_ptr); - reportAlways("problem writing to %s", filename.c_str()); - return false; - } - - FILE *const fp = fopen(filename.c_str(), "wb"); - if (fp == nullptr) - { - reportAlways("could not open file %s for writing", - filename.c_str()); - return false; - } - - png_init_io(png_ptr, fp); - - const int colortype = (surface->format->BitsPerPixel == 24) ? - PNG_COLOR_TYPE_RGB : PNG_COLOR_TYPE_RGB_ALPHA; - - png_set_IHDR(png_ptr, info_ptr, surface->w, surface->h, 8, colortype, - PNG_INTERLACE_NONE, PNG_COMPRESSION_TYPE_DEFAULT, - PNG_FILTER_TYPE_DEFAULT); - - png_write_info(png_ptr, info_ptr); - - png_set_packing(png_ptr); - - png_bytep *const row_pointers - = new png_bytep[CAST_SIZE(surface->h)]; -/* - if (!row_pointers) - { - logger->log1("Had trouble converting surface to row pointers"); - fclose(fp); - return false; - } -*/ - - for (int i = 0; i < surface->h; i++) - { - row_pointers[i] = static_cast(static_cast( - surface->pixels) + CAST_SIZE(i * surface->pitch)); - } - - png_write_image(png_ptr, row_pointers); - png_write_end(png_ptr, info_ptr); - - fclose(fp); - - delete [] row_pointers; - - png_destroy_write_struct(&png_ptr, - &info_ptr); - - if (SDL_MUSTLOCK(surface)) - SDL_UnlockSurface(surface); - - return true; -} diff --git a/src/resources/imagewriter.h b/src/resources/imagewriter.h deleted file mode 100644 index dbe7c75ff..000000000 --- a/src/resources/imagewriter.h +++ /dev/null @@ -1,44 +0,0 @@ -/* - * The ManaPlus Client - * Copyright (C) 2004-2009 The Mana World Development Team - * Copyright (C) 2009-2010 The Mana Developers - * Copyright (C) 2011-2017 The ManaPlus Developers - * - * This file is part of The ManaPlus Client. - * - * 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 - * 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, see . - */ - -#ifndef RESOURCES_IMAGEWRITER_H -#define RESOURCES_IMAGEWRITER_H - -#include - -#include "localconsts.h" - -struct SDL_Surface; - -class ImageWriter final -{ - public: - ImageWriter() - { } - - A_DELETE_COPY(ImageWriter) - - static bool writePNG(SDL_Surface *const surface, - const std::string &filename); -}; - -#endif // RESOURCES_IMAGEWRITER_H diff --git a/src/test/testlauncher.cpp b/src/test/testlauncher.cpp index c7331df49..d5df688a7 100644 --- a/src/test/testlauncher.cpp +++ b/src/test/testlauncher.cpp @@ -33,13 +33,13 @@ #include "gui/fonts/font.h" +#include "utils/pnglib.h" #include "utils/stringutils.h" #include "render/graphics.h" #include "render/vertexes/imagecollection.h" -#include "resources/imagewriter.h" #include "resources/openglimagehelper.h" #include "resources/screenshothelper.h" #include "resources/surfaceimagehelper.h" @@ -476,9 +476,9 @@ int TestLauncher::testDye() { SurfaceImageHelper::combineSurface(image->mSDLSurface, nullptr, surface, nullptr); - ImageWriter::writePNG(image->mSDLSurface, + PngLib::writePNG(image->mSDLSurface, settings.tempDir + "/testimage1.png"); - ImageWriter::writePNG(surface, + PngLib::writePNG(surface, settings.tempDir + "/testimage2.png"); } @@ -494,9 +494,9 @@ int TestLauncher::testDye() { SurfaceImageHelper::combineSurface(image->mSDLSurface, nullptr, surface, nullptr); - ImageWriter::writePNG(image->mSDLSurface, + PngLib::writePNG(image->mSDLSurface, settings.tempDir + "/testimage3.png"); - ImageWriter::writePNG(surface, + PngLib::writePNG(surface, settings.tempDir + "/testimage4.png"); } } diff --git a/src/utils/pnglib.cpp b/src/utils/pnglib.cpp new file mode 100644 index 000000000..d472bd565 --- /dev/null +++ b/src/utils/pnglib.cpp @@ -0,0 +1,113 @@ +/* + * The ManaPlus Client + * Copyright (C) 2004-2009 The Mana World Development Team + * Copyright (C) 2009-2010 The Mana Developers + * Copyright (C) 2011-2017 The ManaPlus Developers + * + * This file is part of The ManaPlus Client. + * + * 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 + * 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, see . + */ + +#include "utils/pnglib.h" + +#include "utils/cast.h" +#include "utils/checkutils.h" + +#include +PRAGMA48(GCC diagnostic push) +PRAGMA48(GCC diagnostic ignored "-Wshadow") +#include +PRAGMA48(GCC diagnostic pop) + +#include "debug.h" + +bool PngLib::writePNG(SDL_Surface *const surface, + const std::string &filename) +{ + if (surface == nullptr) + return false; + + + if (SDL_MUSTLOCK(surface)) + SDL_LockSurface(surface); + + png_structp png_ptr = png_create_write_struct(PNG_LIBPNG_VER_STRING, + nullptr, nullptr, nullptr); + if (png_ptr == nullptr) + { + reportAlways("Had trouble creating png_structp"); + return false; + } + + png_infop info_ptr = png_create_info_struct(png_ptr); + if (info_ptr == nullptr) + { + png_destroy_write_struct(&png_ptr, static_cast(nullptr)); + reportAlways("Could not create png_info"); + return false; + } + + if (setjmp(png_jmpbuf(png_ptr))) + { + png_destroy_write_struct(&png_ptr, &info_ptr); + reportAlways("problem writing to %s", filename.c_str()); + return false; + } + + FILE *const fp = fopen(filename.c_str(), "wb"); + if (fp == nullptr) + { + reportAlways("could not open file %s for writing", + filename.c_str()); + return false; + } + + png_init_io(png_ptr, fp); + + const int colortype = (surface->format->BitsPerPixel == 24) ? + PNG_COLOR_TYPE_RGB : PNG_COLOR_TYPE_RGB_ALPHA; + + png_set_IHDR(png_ptr, info_ptr, surface->w, surface->h, 8, colortype, + PNG_INTERLACE_NONE, PNG_COMPRESSION_TYPE_DEFAULT, + PNG_FILTER_TYPE_DEFAULT); + + png_write_info(png_ptr, info_ptr); + + png_set_packing(png_ptr); + + png_bytep *const row_pointers + = new png_bytep[CAST_SIZE(surface->h)]; + + for (int i = 0; i < surface->h; i++) + { + row_pointers[i] = static_cast(static_cast( + surface->pixels) + CAST_SIZE(i * surface->pitch)); + } + + png_write_image(png_ptr, row_pointers); + png_write_end(png_ptr, info_ptr); + + fclose(fp); + + delete [] row_pointers; + + png_destroy_write_struct(&png_ptr, + &info_ptr); + + if (SDL_MUSTLOCK(surface)) + SDL_UnlockSurface(surface); + + return true; +} diff --git a/src/utils/pnglib.h b/src/utils/pnglib.h new file mode 100644 index 000000000..a79c476ca --- /dev/null +++ b/src/utils/pnglib.h @@ -0,0 +1,38 @@ +/* + * The ManaPlus Client + * Copyright (C) 2004-2009 The Mana World Development Team + * Copyright (C) 2009-2010 The Mana Developers + * Copyright (C) 2011-2017 The ManaPlus Developers + * + * This file is part of The ManaPlus Client. + * + * 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 + * 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, see . + */ + +#ifndef UTILS_PNGLIB_H +#define UTILS_PNGLIB_H + +#include + +#include "localconsts.h" + +struct SDL_Surface; + +namespace PngLib +{ + bool writePNG(SDL_Surface *const surface, + const std::string &filename); +} // namespace PngLib + +#endif // UTILS_PNGLIB_H -- cgit v1.2.3-70-g09d2