mirror of
https://foundry.openuru.org/gitblit/r/CWE-ou-minkata.git
synced 2025-07-14 02:27:40 -04:00
Merge pull request #144 from Deledrius/vault_png
More PNG support (Vault and Python)
This commit is contained in:
@ -200,26 +200,7 @@ 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)
|
|
||||||
{
|
|
||||||
i++;
|
|
||||||
charsChecked++;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (*i == '\0')
|
|
||||||
{
|
|
||||||
i = filename;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
i++;
|
|
||||||
}
|
|
||||||
|
|
||||||
name += plString::FromWchar(i);
|
|
||||||
|
|
||||||
hsgResMgr::ResMgr()->NewKey(name, theMipmap, plLocation::kGlobalFixedLoc);
|
hsgResMgr::ResMgr()->NewKey(name, theMipmap, plLocation::kGlobalFixedLoc);
|
||||||
|
|
||||||
@ -229,4 +210,29 @@ PyObject* pyImage::LoadJPEGFromDisk(const wchar_t* filename, uint16_t width, uin
|
|||||||
PYTHON_RETURN_NONE;
|
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)
|
||||||
|
{
|
||||||
|
if (!theMipmap->ResizeNicely(width, height, plMipmap::kDefaultFilter))
|
||||||
|
{
|
||||||
|
delete theMipmap;
|
||||||
|
PYTHON_RETURN_NONE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// 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
|
||||||
|
PYTHON_RETURN_NONE;
|
||||||
|
}
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
@ -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
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -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];
|
|
||||||
PyUnicode_AsWideChar((PyUnicodeObject*)filenameObj, text, strLen);
|
|
||||||
text[strLen] = L'\0';
|
|
||||||
PyObject* ret = pyImage::LoadJPEGFromDisk(text, width, height);
|
|
||||||
delete [] text;
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
else if (PyString_Check(filenameObj))
|
|
||||||
{
|
|
||||||
// we'll allow this, just in case something goes weird
|
|
||||||
char* text = PyString_AsString(filenameObj);
|
|
||||||
wchar_t* wText = hsStringToWString(text);
|
wchar_t* wText = hsStringToWString(text);
|
||||||
PyObject* ret = pyImage::LoadJPEGFromDisk(wText, width, height);
|
PyObject* ret = pyImage::LoadJPEGFromDisk(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, "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::LoadPNGFromDisk(wText, width, height);
|
||||||
|
delete[] wText;
|
||||||
|
delete[] text;
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
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
|
||||||
}
|
}
|
@ -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);
|
||||||
|
@ -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"
|
||||||
|
@ -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 kNone:
|
case kJPEG:
|
||||||
(*dst) = nil;
|
|
||||||
return false;
|
|
||||||
|
|
||||||
case kJPEG: {
|
|
||||||
hsRAMStream ramStream;
|
|
||||||
ramStream.Write(imgDataLen, imgData);
|
|
||||||
ramStream.Rewind();
|
|
||||||
(*dst) = plJPEG::Instance().ReadFromStream(&ramStream);
|
(*dst) = plJPEG::Instance().ReadFromStream(&ramStream);
|
||||||
}
|
break;
|
||||||
return ((*dst) != nil);
|
|
||||||
|
case kPNG:
|
||||||
DEFAULT_FATAL(imgType);
|
(*dst) = plPNG::Instance().ReadFromStream(&ramStream);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case kNone:
|
||||||
|
default:
|
||||||
|
(*dst) = nil;
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
|
return ((*dst) != nil);
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
@ -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
|
||||||
};
|
};
|
||||||
|
Reference in New Issue
Block a user