Browse Source

Merge pull request #144 from Deledrius/vault_png

More PNG support (Vault and Python)
Adam Johnson 13 years ago
parent
commit
40933d6612
  1. 38
      Sources/Plasma/FeatureLib/pfPython/pyImage.cpp
  2. 1
      Sources/Plasma/FeatureLib/pfPython/pyImage.h
  3. 42
      Sources/Plasma/FeatureLib/pfPython/pyImageGlue.cpp
  4. 2
      Sources/Plasma/FeatureLib/pfPython/pyVaultImageNode.cpp
  5. 1
      Sources/Plasma/PubUtilLib/plVault/Pch.h
  6. 51
      Sources/Plasma/PubUtilLib/plVault/plVaultNodeAccess.cpp
  7. 4
      Sources/Plasma/PubUtilLib/plVault/plVaultNodeAccess.h

38
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 // let's create a nice name for this thing based on the filename
plString name = _TEMP_CONVERT_FROM_LITERAL("PtImageFromDisk_"); plString name = plString::Format("PtImageFromDisk_%S", filename);
const wchar_t* i = filename;
int charsChecked = 0;
while (*i != '\\' && *i != '\0' && charsChecked < 1024) hsgResMgr::ResMgr()->NewKey(name, theMipmap, plLocation::kGlobalFixedLoc);
{
i++;
charsChecked++;
}
if (*i == '\0') return pyImage::New( theMipmap );
{ }
i = filename; else
} PYTHON_RETURN_NONE;
else }
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); hsgResMgr::ResMgr()->NewKey(name, theMipmap, plLocation::kGlobalFixedLoc);
return pyImage::New( theMipmap ); return pyImage::New( theMipmap );
} }
else else

1
Sources/Plasma/FeatureLib/pfPython/pyImage.h

@ -168,6 +168,7 @@ public:
void SaveAsJPEG(const wchar_t* fileName, uint8_t quality = 75); void SaveAsJPEG(const wchar_t* fileName, uint8_t quality = 75);
void SaveAsPNG(const wchar_t* fileName); void SaveAsPNG(const wchar_t* fileName);
static PyObject* LoadJPEGFromDisk(const wchar_t* filename, uint16_t width, uint16_t height); // returns pyImage 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 #endif
}; };

42
Sources/Plasma/FeatureLib/pfPython/pyImageGlue.cpp

@ -285,28 +285,43 @@ PYTHON_GLOBAL_METHOD_DEFINITION(PtLoadJPEGFromDisk, args, "Params: filename,widt
PYTHON_RETURN_ERROR; PYTHON_RETURN_ERROR;
} }
if (PyUnicode_Check(filenameObj)) if (PyString_CheckEx(filenameObj))
{ {
int strLen = PyUnicode_GetSize(filenameObj); char* text = PyString_AsStringEx(filenameObj);
wchar_t* text = new wchar_t[strLen + 1]; wchar_t* wText = hsStringToWString(text);
PyUnicode_AsWideChar((PyUnicodeObject*)filenameObj, text, strLen); PyObject* ret = pyImage::LoadJPEGFromDisk(wText, width, height);
text[strLen] = L'\0'; delete[] wText;
PyObject* ret = pyImage::LoadJPEGFromDisk(text, width, height); delete[] text;
delete [] text;
return ret; return ret;
} }
else if (PyString_Check(filenameObj)) else
{ {
// we'll allow this, just in case something goes weird PyErr_SetString(PyExc_TypeError, "PtLoadJPEGFromDisk expects a string and two unsigned shorts");
char* text = PyString_AsString(filenameObj); 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); wchar_t* wText = hsStringToWString(text);
PyObject* ret = pyImage::LoadJPEGFromDisk(wText, width, height); PyObject* ret = pyImage::LoadPNGFromDisk(wText, width, height);
delete [] wText; delete[] wText;
delete[] text;
return ret; return ret;
} }
else 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; PYTHON_RETURN_ERROR;
} }
} }
@ -316,5 +331,6 @@ void pyImage::AddPlasmaMethods(std::vector<PyMethodDef> &methods)
{ {
#ifndef BUILDING_PYPLASMA #ifndef BUILDING_PYPLASMA
PYTHON_GLOBAL_METHOD(methods, PtLoadJPEGFromDisk); PYTHON_GLOBAL_METHOD(methods, PtLoadJPEGFromDisk);
PYTHON_GLOBAL_METHOD(methods, PtLoadPNGFromDisk);
#endif #endif
} }

2
Sources/Plasma/FeatureLib/pfPython/pyVaultImageNode.cpp

@ -170,6 +170,8 @@ PyObject* pyVaultImageNode::Image_GetImage( void )
else else
fMipmapKey->RefObject(); fMipmapKey->RefObject();
} }
else
PYTHON_RETURN_NONE;
} }
return pyImage::New(fMipmap); return pyImage::New(fMipmap);

1
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 "pnDispatch/plDispatch.h"
#include "plDniCoordinateInfo.h" #include "plDniCoordinateInfo.h"
#include "plGImage/plMipmap.h" #include "plGImage/plMipmap.h"
#include "plGImage/plPNG.h"
#include "plJPEG/plJPEG.h" #include "plJPEG/plJPEG.h"
#include "plMessage/plVaultNotifyMsg.h" #include "plMessage/plVaultNotifyMsg.h"
#include "plNetClientComm/plNetClientComm.h" #include "plNetClientComm/plNetClientComm.h"

51
Sources/Plasma/PubUtilLib/plVault/plVaultNodeAccess.cpp

@ -633,18 +633,30 @@ void VaultImageNode::SetImageData (const uint8_t buffer[], unsigned bytes) {
//============================================================================ //============================================================================
#ifdef CLIENT #ifdef CLIENT
void VaultImageNode::StuffImage (plMipmap * src) { void VaultImageNode::StuffImage (plMipmap * src, int dstType) {
hsRAMStream ramStream; hsRAMStream ramStream;
plJPEG::Instance().SetWriteQuality(30/*percent*/); hsBool compressSuccess = false;
if (plJPEG::Instance().WriteToStream(&ramStream, src)) {
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(); unsigned bytes = ramStream.GetEOF();
uint8_t * buffer = (uint8_t *)malloc(bytes); uint8_t * buffer = (uint8_t *)malloc(bytes);
ramStream.CopyToMem(buffer); ramStream.CopyToMem(buffer);
IVaultNodeSetBlob(kImageData, base, &imgData, &imgDataLen, buffer, bytes); IVaultNodeSetBlob(kImageData, base, &imgData, &imgDataLen, buffer, bytes);
SetImageType(kJPEG); SetImageType(dstType);
free(buffer); free(buffer);
} } else {
else {
IVaultNodeSetBlob(kImageData, base, &imgData, &imgDataLen, nil, 0); IVaultNodeSetBlob(kImageData, base, &imgData, &imgDataLen, nil, 0);
SetImageType(kNone); SetImageType(kNone);
} }
@ -654,22 +666,25 @@ void VaultImageNode::StuffImage (plMipmap * src) {
//============================================================================ //============================================================================
#ifdef CLIENT #ifdef CLIENT
bool VaultImageNode::ExtractImage (plMipmap ** dst) { bool VaultImageNode::ExtractImage (plMipmap ** dst) {
hsRAMStream ramStream;
ramStream.Write(imgDataLen, imgData);
ramStream.Rewind();
switch (imgType) { switch (imgType) {
case kJPEG:
(*dst) = plJPEG::Instance().ReadFromStream(&ramStream);
break;
case kPNG:
(*dst) = plPNG::Instance().ReadFromStream(&ramStream);
break;
case kNone: case kNone:
default:
(*dst) = nil; (*dst) = nil;
return false; break;
case kJPEG: {
hsRAMStream ramStream;
ramStream.Write(imgDataLen, imgData);
ramStream.Rewind();
(*dst) = plJPEG::Instance().ReadFromStream(&ramStream);
}
return ((*dst) != nil);
DEFAULT_FATAL(imgType);
} }
return ((*dst) != nil);
} }
#endif #endif

4
Sources/Plasma/PubUtilLib/plVault/plVaultNodeAccess.h

@ -290,7 +290,7 @@ struct VaultAgeLinkNode : NetVaultNodeAccess {
//============================================================================ //============================================================================
struct VaultImageNode : 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 kImageType = NetVaultNode::kInt32_1;
static const uint64_t kImageTitle = NetVaultNode::kString64_1; static const uint64_t kImageTitle = NetVaultNode::kString64_1;
@ -310,7 +310,7 @@ struct VaultImageNode : NetVaultNodeAccess {
void SetImageData (const uint8_t buffer[], unsigned bytes); void SetImageData (const uint8_t buffer[], unsigned bytes);
#ifdef CLIENT #ifdef CLIENT
void StuffImage (class plMipmap * src); void StuffImage (class plMipmap * src, int dstType=kJPEG);
bool ExtractImage (class plMipmap ** dst); bool ExtractImage (class plMipmap ** dst);
#endif #endif
}; };

Loading…
Cancel
Save