diff --git a/CMakeLists.txt b/CMakeLists.txt index 1b4c51da..84fc3855 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -10,6 +10,7 @@ find_package(PythonLibs REQUIRED) find_package(EXPAT REQUIRED) find_package(ZLIB REQUIRED) find_package(PhysX REQUIRED) #TODO: Not required if we aren't building the client +find_package(PNG REQUIRED) find_package(Ogg REQUIRED) #TODO: Not required if we aren't building the client find_package(Vorbis REQUIRED) #TODO: Not required if we aren't building the client find_package(Speex REQUIRED) #TODO: Not required if we aren't building the client @@ -86,4 +87,4 @@ endif(MSVC) include_directories(${OPENSSL_INCLUDE_DIR}) add_subdirectory(Sources/Plasma) -add_subdirectory(Sources/Tools) \ No newline at end of file +add_subdirectory(Sources/Tools) diff --git a/Sources/Plasma/PubUtilLib/plGImage/CMakeLists.txt b/Sources/Plasma/PubUtilLib/plGImage/CMakeLists.txt index e2baff10..992e5853 100644 --- a/Sources/Plasma/PubUtilLib/plGImage/CMakeLists.txt +++ b/Sources/Plasma/PubUtilLib/plGImage/CMakeLists.txt @@ -3,6 +3,9 @@ include_directories("../../NucleusLib/inc") include_directories("../../NucleusLib") include_directories("../../PubUtilLib") +find_package(PNG REQUIRED) +include_directories(${PNG_INCLUDE_DIR}) + set(plGImage_SOURCES hsCodecManager.cpp hsDXTDirectXCodec.cpp @@ -17,6 +20,7 @@ set(plGImage_SOURCES plFontCache.cpp plLODMipmap.cpp plMipmap.cpp + plPNG.cpp plTGAWriter.cpp plWinFontCache.cpp ) @@ -37,6 +41,7 @@ set(plGImage_HEADERS plGImageCreatable.h plLODMipmap.h plMipmap.h + plPNG.h plTGAWriter.h plWinFontCache.h ) diff --git a/Sources/Plasma/PubUtilLib/plGImage/plPNG.cpp b/Sources/Plasma/PubUtilLib/plGImage/plPNG.cpp new file mode 100644 index 00000000..83f9a4ec --- /dev/null +++ b/Sources/Plasma/PubUtilLib/plGImage/plPNG.cpp @@ -0,0 +1,139 @@ +/*==LICENSE==* + +CyanWorlds.com Engine - MMOG client, server and tools +Copyright (C) 2011 Cyan Worlds, Inc. + +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 3 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, see . + +You can contact Cyan Worlds, Inc. by email legal@cyan.com + or by snail mail at: + Cyan Worlds, Inc. + 14617 N Newport Hwy + Mead, WA 99021 + +*==LICENSE==*/ + +#include "hsTypes.h" +#include "hsStream.h" +#include "hsExceptions.h" +#include "hsUtils.h" +#include "plPNG.h" +#include "plGImage/plMipmap.h" + +#include + + +plMipmap *plPNG::IRead( hsStream *inStream ) +{ + plMipmap *newMipmap = NULL; + png_structp png_ptr; + png_infop info_ptr; + png_infop end_info; + + try + { + // Check PNG Signature + png_byte sig[8]; + inStream->Read8Bytes((char *) sig); + if (!png_sig_cmp(sig, 0, 8)) + { + inStream->Rewind(); + + // Allocate required structs + png_ptr = png_create_read_struct(PNG_LIBPNG_VER_STRING, NULL, NULL, NULL); + if (!png_ptr) + throw( false ); + + info_ptr = png_create_info_struct(png_ptr); + if (!info_ptr) + { + png_destroy_read_struct(&png_ptr, (png_infopp)NULL, (png_infopp)NULL); + throw( false ); + } + + end_info = png_create_info_struct(png_ptr); + if (!end_info) + { + png_destroy_read_struct(&png_ptr, &info_ptr, (png_infopp)NULL); + throw( false ); + } + + + + // Clean up allocated structs + png_destroy_read_struct(&png_ptr, &info_ptr, &end_info); + } + } + catch( ... ) + { + if (newMipmap != NULL) + { + delete newMipmap; + newMipmap = NULL; + } + } + + return newMipmap; +} + +plMipmap* plPNG::ReadFromFile( const char *fileName ) +{ + wchar* wFilename = hsStringToWString(fileName); + plMipmap* retVal = ReadFromFile(wFilename); + delete [] wFilename; + return retVal; +} + +plMipmap* plPNG::ReadFromFile( const wchar *fileName ) +{ + hsUNIXStream in; + if (!in.Open(fileName, L"rb")) + return false; + plMipmap* ret = IRead(&in); + in.Close(); + return ret; +} + +hsBool plPNG::IWrite( plMipmap *source, hsStream *outStream ) +{ + hsBool result = true; + + try + { + } + catch( ... ) + { + result = false; + } + + return result; +} + +hsBool plPNG::WriteToFile( const char *fileName, plMipmap *sourceData ) +{ + wchar* wFilename = hsStringToWString(fileName); + hsBool retVal = WriteToFile(wFilename, sourceData); + delete [] wFilename; + return retVal; +} + +hsBool plPNG::WriteToFile( const wchar *fileName, plMipmap *sourceData ) +{ + hsUNIXStream out; + if (!out.Open(fileName, L"wb")) + return false; + hsBool ret = IWrite(sourceData, &out); + out.Close(); + return ret; +} \ No newline at end of file diff --git a/Sources/Plasma/PubUtilLib/plGImage/plPNG.h b/Sources/Plasma/PubUtilLib/plGImage/plPNG.h new file mode 100644 index 00000000..22ac28fc --- /dev/null +++ b/Sources/Plasma/PubUtilLib/plGImage/plPNG.h @@ -0,0 +1,54 @@ +/*==LICENSE==* + +CyanWorlds.com Engine - MMOG client, server and tools +Copyright (C) 2011 Cyan Worlds, Inc. + +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 3 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, see . + +You can contact Cyan Worlds, Inc. by email legal@cyan.com + or by snail mail at: + Cyan Worlds, Inc. + 14617 N Newport Hwy + Mead, WA 99021 + +*==LICENSE==*/ + +#ifndef _plPNG_h +#define _plPNG_h + + +//// Class Definition ///////////////////////////////////////////////////////// + +class plMipmap; +class hsStream; + +class plPNG +{ + protected: + + plMipmap *IRead( hsStream *inStream ); + hsBool IWrite( plMipmap *source, hsStream *outStream ); + + public: + + plMipmap *ReadFromStream( hsStream *inStream ) { return IRead( inStream ); } + plMipmap *ReadFromFile( const char *fileName ); + plMipmap *ReadFromFile( const wchar *fileName ); + + hsBool WriteToStream( hsStream *outStream, plMipmap *sourceData ) { return IWrite( sourceData, outStream ); } + hsBool WriteToFile( const char *fileName, plMipmap *sourceData ); + hsBool WriteToFile( const wchar *fileName, plMipmap *sourceData ); +}; + +#endif // _plPNG_h \ No newline at end of file