diff --git a/MOULOpenSourceClientPlugin/Plasma20/Sources/Plasma/FeatureLib/pfPython/pyVaultImageNode.cpp b/MOULOpenSourceClientPlugin/Plasma20/Sources/Plasma/FeatureLib/pfPython/pyVaultImageNode.cpp index a771f122..3d463e8c 100644 --- a/MOULOpenSourceClientPlugin/Plasma20/Sources/Plasma/FeatureLib/pfPython/pyVaultImageNode.cpp +++ b/MOULOpenSourceClientPlugin/Plasma20/Sources/Plasma/FeatureLib/pfPython/pyVaultImageNode.cpp @@ -171,6 +171,8 @@ PyObject* pyVaultImageNode::Image_GetImage( void ) else fMipmapKey->RefObject(); } + else + PYTHON_RETURN_NONE; } return pyImage::New(fMipmap); diff --git a/MOULOpenSourceClientPlugin/Plasma20/Sources/Plasma/PubUtilLib/plJPEG/plJPEG.cpp b/MOULOpenSourceClientPlugin/Plasma20/Sources/Plasma/PubUtilLib/plJPEG/plJPEG.cpp index 60637244..71401bf8 100644 --- a/MOULOpenSourceClientPlugin/Plasma20/Sources/Plasma/PubUtilLib/plJPEG/plJPEG.cpp +++ b/MOULOpenSourceClientPlugin/Plasma20/Sources/Plasma/PubUtilLib/plJPEG/plJPEG.cpp @@ -328,11 +328,25 @@ plMipmap* plJPEG::ReadFromFile( const char *fileName ) plMipmap* plJPEG::ReadFromFile( const wchar *fileName ) { // we use a stream because the IJL can't handle unicode - hsUNIXStream out; - if (!out.Open(fileName, L"rb")) + hsRAMStream tempstream; + hsUNIXStream in; + if (!in.Open(fileName, L"rb")) return false; - plMipmap* ret = IRead(&out); - out.Close(); + + // The stream reader for JPEGs expects a 32-bit size at the start, + // so insert that into the stream before passing it on + in.FastFwd(); + UInt32 fsize = in.GetPosition(); + UInt8 *tempbuffer = TRACKED_NEW UInt8[fsize]; + in.Rewind(); + in.Read(fsize, tempbuffer); + tempstream.WriteSwap32(fsize); + tempstream.Write(fsize, tempbuffer); + delete [] tempbuffer; + tempstream.Rewind(); + + plMipmap* ret = IRead(&tempstream); + in.Close(); return ret; } @@ -419,7 +433,7 @@ hsBool plJPEG::IWrite( plMipmap *source, hsStream *outStream ) jcProps.jquality = fWriteQuality; #else cinfo.jpeg_width = source->GetWidth(); // default - cinfo.jpeg_width = source->GetHeight(); // default + cinfo.jpeg_height = source->GetHeight(); // default cinfo.jpeg_color_space = JCS_YCbCr; // default // not sure how to set 4:1:1 but supposedly it's the default jpeg_set_quality( &cinfo, fWriteQuality, TRUE ); @@ -487,10 +501,23 @@ hsBool plJPEG::WriteToFile( const char *fileName, plMipmap *sourceData ) hsBool plJPEG::WriteToFile( const wchar *fileName, plMipmap *sourceData ) { // we use a stream because the IJL can't handle unicode + hsRAMStream tempstream; hsUNIXStream out; if (!out.Open(fileName, L"wb")) return false; - hsBool ret = IWrite(sourceData, &out); + hsBool ret = IWrite(sourceData, &tempstream); + if (ret) + { + // The stream writer for JPEGs prepends a 32-bit size, + // so remove that from the stream before saving to a file + tempstream.Rewind(); + UInt32 fsize = tempstream.ReadSwap32(); + UInt8 *tempbuffer = TRACKED_NEW UInt8[fsize]; + tempstream.Read(fsize, tempbuffer); + out.Write(fsize, tempbuffer); + + delete [] tempbuffer; + } out.Close(); return ret; }