diff --git a/Sources/Plasma/FeatureLib/pfPython/pyImage.cpp b/Sources/Plasma/FeatureLib/pfPython/pyImage.cpp index 5b0fcfbc..7e019a88 100644 --- a/Sources/Plasma/FeatureLib/pfPython/pyImage.cpp +++ b/Sources/Plasma/FeatureLib/pfPython/pyImage.cpp @@ -200,29 +200,35 @@ PyObject* pyImage::LoadJPEGFromDisk(const wchar_t* filename, uint16_t width, uin } // let's create a nice name for this thing based on the filename - plString name = _TEMP_CONVERT_FROM_LITERAL("PtImageFromDisk_"); - const wchar_t* i = filename; - int charsChecked = 0; + plString name = plString::Format("PtImageFromDisk_%S", filename); - while (*i != '\\' && *i != '\0' && charsChecked < 1024) - { - i++; - charsChecked++; - } + hsgResMgr::ResMgr()->NewKey(name, theMipmap, plLocation::kGlobalFixedLoc); - if (*i == '\0') - { - i = filename; - } - else + return pyImage::New( theMipmap ); + } + else + PYTHON_RETURN_NONE; +} + +PyObject* pyImage::LoadPNGFromDisk(const wchar_t* filename, uint16_t width, uint16_t height) +{ + plMipmap* theMipmap = plPNG::Instance().ReadFromFile(filename); + if (theMipmap) + { + if (width > 0 && height > 0) { - i++; + if (!theMipmap->ResizeNicely(width, height, plMipmap::kDefaultFilter)) + { + delete theMipmap; + PYTHON_RETURN_NONE; + } } - name += plString::FromWchar(i); + // let's create a nice name for this thing based on the filename + plString name = plString::Format("PtImageFromDisk_%S", filename); hsgResMgr::ResMgr()->NewKey(name, theMipmap, plLocation::kGlobalFixedLoc); - + return pyImage::New( theMipmap ); } else diff --git a/Sources/Plasma/FeatureLib/pfPython/pyImage.h b/Sources/Plasma/FeatureLib/pfPython/pyImage.h index 86e9337f..95c2a810 100644 --- a/Sources/Plasma/FeatureLib/pfPython/pyImage.h +++ b/Sources/Plasma/FeatureLib/pfPython/pyImage.h @@ -168,6 +168,7 @@ public: void SaveAsJPEG(const wchar_t* fileName, uint8_t quality = 75); void SaveAsPNG(const wchar_t* fileName); static PyObject* LoadJPEGFromDisk(const wchar_t* filename, uint16_t width, uint16_t height); // returns pyImage + static PyObject* LoadPNGFromDisk(const wchar_t* filename, uint16_t width, uint16_t height); // returns pyImage #endif }; diff --git a/Sources/Plasma/FeatureLib/pfPython/pyImageGlue.cpp b/Sources/Plasma/FeatureLib/pfPython/pyImageGlue.cpp index bf0c1c01..7670b48c 100644 --- a/Sources/Plasma/FeatureLib/pfPython/pyImageGlue.cpp +++ b/Sources/Plasma/FeatureLib/pfPython/pyImageGlue.cpp @@ -285,28 +285,43 @@ PYTHON_GLOBAL_METHOD_DEFINITION(PtLoadJPEGFromDisk, args, "Params: filename,widt PYTHON_RETURN_ERROR; } - if (PyUnicode_Check(filenameObj)) + if (PyString_CheckEx(filenameObj)) { - int strLen = PyUnicode_GetSize(filenameObj); - wchar_t* text = new wchar_t[strLen + 1]; - PyUnicode_AsWideChar((PyUnicodeObject*)filenameObj, text, strLen); - text[strLen] = L'\0'; - PyObject* ret = pyImage::LoadJPEGFromDisk(text, width, height); - delete [] text; + char* text = PyString_AsStringEx(filenameObj); + wchar_t* wText = hsStringToWString(text); + PyObject* ret = pyImage::LoadJPEGFromDisk(wText, width, height); + delete[] wText; + delete[] text; return ret; } - else if (PyString_Check(filenameObj)) + else { - // we'll allow this, just in case something goes weird - char* text = PyString_AsString(filenameObj); + PyErr_SetString(PyExc_TypeError, "PtLoadJPEGFromDisk expects a string and two unsigned shorts"); + PYTHON_RETURN_ERROR; + } +} + +PYTHON_GLOBAL_METHOD_DEFINITION(PtLoadPNGFromDisk, args, "Params: filename,width,height\nThe image will be resized to fit the width and height arguments. Set to 0 if resizing is not desired.\nReturns a pyImage of the specified file.") +{ + PyObject* filenameObj; + unsigned short width, height; + if (!PyArg_ParseTuple(args, "Ohh", &filenameObj, &width, &height)) + { + PyErr_SetString(PyExc_TypeError, "PtLoadPNGFromDisk expects a string and two unsigned shorts"); + PYTHON_RETURN_ERROR; + } + if (PyString_CheckEx(filenameObj)) + { + char* text = PyString_AsStringEx(filenameObj); wchar_t* wText = hsStringToWString(text); - PyObject* ret = pyImage::LoadJPEGFromDisk(wText, width, height); - delete [] wText; + PyObject* ret = pyImage::LoadPNGFromDisk(wText, width, height); + delete[] wText; + delete[] text; return ret; } else { - PyErr_SetString(PyExc_TypeError, "saveAsJPEG expects a string and a unsigned 8-bit int"); + PyErr_SetString(PyExc_TypeError, "PtLoadPNGFromDisk expects a string and two unsigned shorts"); PYTHON_RETURN_ERROR; } } @@ -316,5 +331,6 @@ void pyImage::AddPlasmaMethods(std::vector &methods) { #ifndef BUILDING_PYPLASMA PYTHON_GLOBAL_METHOD(methods, PtLoadJPEGFromDisk); + PYTHON_GLOBAL_METHOD(methods, PtLoadPNGFromDisk); #endif } \ No newline at end of file diff --git a/Sources/Plasma/FeatureLib/pfPython/pyVaultImageNode.cpp b/Sources/Plasma/FeatureLib/pfPython/pyVaultImageNode.cpp index a64c5067..1aaea5fc 100644 --- a/Sources/Plasma/FeatureLib/pfPython/pyVaultImageNode.cpp +++ b/Sources/Plasma/FeatureLib/pfPython/pyVaultImageNode.cpp @@ -170,6 +170,8 @@ PyObject* pyVaultImageNode::Image_GetImage( void ) else fMipmapKey->RefObject(); } + else + PYTHON_RETURN_NONE; } return pyImage::New(fMipmap); diff --git a/Sources/Plasma/PubUtilLib/plVault/Pch.h b/Sources/Plasma/PubUtilLib/plVault/Pch.h index 80663e1f..9b751c76 100644 --- a/Sources/Plasma/PubUtilLib/plVault/Pch.h +++ b/Sources/Plasma/PubUtilLib/plVault/Pch.h @@ -74,6 +74,7 @@ You can contact Cyan Worlds, Inc. by email legal@cyan.com #include "pnDispatch/plDispatch.h" #include "plDniCoordinateInfo.h" #include "plGImage/plMipmap.h" +#include "plGImage/plPNG.h" #include "plJPEG/plJPEG.h" #include "plMessage/plVaultNotifyMsg.h" #include "plNetClientComm/plNetClientComm.h" diff --git a/Sources/Plasma/PubUtilLib/plVault/plVaultNodeAccess.cpp b/Sources/Plasma/PubUtilLib/plVault/plVaultNodeAccess.cpp index 754b6288..47d520aa 100644 --- a/Sources/Plasma/PubUtilLib/plVault/plVaultNodeAccess.cpp +++ b/Sources/Plasma/PubUtilLib/plVault/plVaultNodeAccess.cpp @@ -633,18 +633,30 @@ void VaultImageNode::SetImageData (const uint8_t buffer[], unsigned bytes) { //============================================================================ #ifdef CLIENT -void VaultImageNode::StuffImage (plMipmap * src) { +void VaultImageNode::StuffImage (plMipmap * src, int dstType) { hsRAMStream ramStream; - plJPEG::Instance().SetWriteQuality(30/*percent*/); - if (plJPEG::Instance().WriteToStream(&ramStream, src)) { + hsBool compressSuccess = false; + + switch (dstType) { + case kJPEG: + plJPEG::Instance().SetWriteQuality(70/*percent*/); + compressSuccess = plJPEG::Instance().WriteToStream(&ramStream, src); + break; + case kPNG: + compressSuccess = plPNG::Instance().WriteToStream(&ramStream, src); + break; + default: + break; + } + + if (compressSuccess) { unsigned bytes = ramStream.GetEOF(); uint8_t * buffer = (uint8_t *)malloc(bytes); ramStream.CopyToMem(buffer); IVaultNodeSetBlob(kImageData, base, &imgData, &imgDataLen, buffer, bytes); - SetImageType(kJPEG); + SetImageType(dstType); free(buffer); - } - else { + } else { IVaultNodeSetBlob(kImageData, base, &imgData, &imgDataLen, nil, 0); SetImageType(kNone); } @@ -654,22 +666,25 @@ void VaultImageNode::StuffImage (plMipmap * src) { //============================================================================ #ifdef CLIENT bool VaultImageNode::ExtractImage (plMipmap ** dst) { - + hsRAMStream ramStream; + ramStream.Write(imgDataLen, imgData); + ramStream.Rewind(); + switch (imgType) { + case kJPEG: + (*dst) = plJPEG::Instance().ReadFromStream(&ramStream); + break; + + case kPNG: + (*dst) = plPNG::Instance().ReadFromStream(&ramStream); + break; + case kNone: + default: (*dst) = nil; - return false; - - case kJPEG: { - hsRAMStream ramStream; - ramStream.Write(imgDataLen, imgData); - ramStream.Rewind(); - (*dst) = plJPEG::Instance().ReadFromStream(&ramStream); - } - return ((*dst) != nil); - - DEFAULT_FATAL(imgType); + break; } + return ((*dst) != nil); } #endif diff --git a/Sources/Plasma/PubUtilLib/plVault/plVaultNodeAccess.h b/Sources/Plasma/PubUtilLib/plVault/plVaultNodeAccess.h index 83acd6c3..a15ecccd 100644 --- a/Sources/Plasma/PubUtilLib/plVault/plVaultNodeAccess.h +++ b/Sources/Plasma/PubUtilLib/plVault/plVaultNodeAccess.h @@ -290,7 +290,7 @@ struct VaultAgeLinkNode : NetVaultNodeAccess { //============================================================================ struct VaultImageNode : NetVaultNodeAccess { - enum ImageTypes { kNone=0, kJPEG=1 }; + enum ImageTypes { kNone=0, kJPEG=1, kPNG=2 }; static const uint64_t kImageType = NetVaultNode::kInt32_1; static const uint64_t kImageTitle = NetVaultNode::kString64_1; @@ -310,7 +310,7 @@ struct VaultImageNode : NetVaultNodeAccess { void SetImageData (const uint8_t buffer[], unsigned bytes); #ifdef CLIENT - void StuffImage (class plMipmap * src); + void StuffImage (class plMipmap * src, int dstType=kJPEG); bool ExtractImage (class plMipmap ** dst); #endif };