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