You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
236 lines
5.3 KiB
236 lines
5.3 KiB
/*==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 <http://www.gnu.org/licenses/>. |
|
|
|
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==*/ |
|
////////////////////////////////////////////////////////////////////// |
|
// |
|
// pyVaultImageNode - a wrapper class to provide interface to the RelVaultNode |
|
// |
|
////////////////////////////////////////////////////////////////////// |
|
|
|
#include "pyVaultImageNode.h" |
|
#ifndef BUILDING_PYPLASMA |
|
#include "pyVault.h" |
|
#endif |
|
#include "pyImage.h" |
|
#include "plPipeline.h" |
|
#include "cyMisc.h" |
|
|
|
#include "hsResMgr.h" |
|
#include "plGImage/plMipmap.h" |
|
#include "plVault/plVault.h" |
|
#include "pnMessage/plRefMsg.h" |
|
#include "plNetClient/plNetClientMgr.h" |
|
|
|
|
|
static unsigned s_keyseq; |
|
|
|
//============================================================================ |
|
static plKey CreateAndRefImageKey (unsigned nodeId, plMipmap * mipmap) { |
|
char keyName[MAX_PATH]; |
|
StrPrintf(keyName, arrsize(keyName), "VaultImg_%u_%u", nodeId, s_keyseq++); |
|
|
|
plKey key = hsgResMgr::ResMgr()->NewKey(keyName, mipmap, plLocation::kGlobalFixedLoc); |
|
|
|
hsgResMgr::ResMgr()->AddViaNotify( |
|
key, |
|
NEW(plGenRefMsg)( |
|
plNetClientMgr::GetInstance()->GetKey(), |
|
plRefMsg::kOnCreate, |
|
0, |
|
plNetClientMgr::kVaultImage |
|
), |
|
plRefFlags::kActiveRef |
|
); |
|
|
|
return key; |
|
} |
|
|
|
// should only be created from C++ side |
|
pyVaultImageNode::pyVaultImageNode(RelVaultNode* nfsNode) |
|
: pyVaultNode(nfsNode) |
|
, fMipmapKey(nil) |
|
, fMipmap(nil) |
|
{ |
|
} |
|
|
|
//create from the Python side |
|
pyVaultImageNode::pyVaultImageNode(int n) |
|
: pyVaultNode(NEWZERO(RelVaultNode)) |
|
, fMipmapKey(nil) |
|
, fMipmap(nil) |
|
{ |
|
fNode->SetNodeType(plVault::kNodeType_Image); |
|
} |
|
|
|
pyVaultImageNode::~pyVaultImageNode () { |
|
if (fMipmap && fMipmapKey) |
|
fMipmapKey->UnRefObject(); |
|
} |
|
|
|
|
|
//================================================================== |
|
// class RelVaultNode : public plVaultNode |
|
// |
|
void pyVaultImageNode::Image_SetTitle( const char * text ) |
|
{ |
|
if (!fNode) |
|
return; |
|
|
|
wchar * wStr = hsStringToWString(text); |
|
|
|
VaultImageNode image(fNode); |
|
image.SetImageTitle(wStr); |
|
delete [] wStr; |
|
} |
|
|
|
void pyVaultImageNode::Image_SetTitleW( const wchar_t* text ) |
|
{ |
|
if (!fNode) |
|
return; |
|
|
|
VaultImageNode image(fNode); |
|
image.SetImageTitle(text); |
|
} |
|
|
|
std::string pyVaultImageNode::Image_GetTitle( void ) |
|
{ |
|
if (!fNode) |
|
return ""; |
|
|
|
VaultImageNode image(fNode); |
|
|
|
std::string retVal = ""; |
|
if (image.title) |
|
{ |
|
char* temp = hsWStringToString(image.title); |
|
retVal = temp; |
|
delete [] temp; |
|
} |
|
|
|
return retVal; |
|
} |
|
|
|
std::wstring pyVaultImageNode::Image_GetTitleW( void ) |
|
{ |
|
if (!fNode) |
|
return L""; |
|
|
|
VaultImageNode image(fNode); |
|
return image.title ? image.title : L""; |
|
} |
|
|
|
PyObject* pyVaultImageNode::Image_GetImage( void ) |
|
{ |
|
if (!fNode) |
|
PYTHON_RETURN_NONE; |
|
|
|
if (!fMipmap) { |
|
VaultImageNode access(fNode); |
|
if (access.ExtractImage(&fMipmap)) { |
|
fMipmapKey = fMipmap->GetKey(); |
|
if (!fMipmapKey) |
|
fMipmapKey = CreateAndRefImageKey(fNode->nodeId, fMipmap); |
|
else |
|
fMipmapKey->RefObject(); |
|
} |
|
} |
|
|
|
return pyImage::New(fMipmap); |
|
} |
|
|
|
void pyVaultImageNode::Image_SetImage(pyImage& image) |
|
{ |
|
if (!fNode) |
|
return; |
|
|
|
if (fMipmapKey) { |
|
fMipmapKey->UnRefObject(); |
|
fMipmapKey = nil; |
|
fMipmap = nil; |
|
} |
|
|
|
if (fMipmap = image.GetImage()) { |
|
VaultImageNode access(fNode); |
|
access.StuffImage(fMipmap); |
|
|
|
fMipmapKey = image.GetKey(); |
|
if (!fMipmapKey) |
|
fMipmapKey = CreateAndRefImageKey(fNode->nodeId, fMipmap); |
|
else |
|
fMipmapKey->RefObject(); |
|
} |
|
} |
|
|
|
void pyVaultImageNode::SetImageFromBuf( PyObject * pybuf ) |
|
{ |
|
if (!fNode) |
|
return; |
|
|
|
if (fMipmapKey) { |
|
fMipmapKey->UnRefObject(); |
|
fMipmapKey = nil; |
|
fMipmap = nil; |
|
} |
|
|
|
byte * buffer = nil; |
|
int bytes; |
|
PyObject_AsReadBuffer(pybuf, (const void **)&buffer, &bytes); |
|
if (buffer) { |
|
VaultImageNode access(fNode); |
|
access.SetImageData(buffer, bytes); |
|
access.SetImageType(VaultImageNode::kJPEG); |
|
} |
|
} |
|
|
|
void pyVaultImageNode::SetImageFromScrShot() |
|
{ |
|
if (!fNode) |
|
return; |
|
|
|
if (fMipmapKey) { |
|
fMipmapKey->UnRefObject(); |
|
fMipmapKey = nil; |
|
fMipmap = nil; |
|
} |
|
|
|
if (cyMisc::GetPipeline()) { |
|
VaultImageNode access(fNode); |
|
fMipmap = NEW(plMipmap); |
|
if (cyMisc::GetPipeline()->CaptureScreen(fMipmap, false, 800, 600)) { |
|
fMipmapKey = fMipmap->GetKey(); |
|
if (!fMipmapKey) |
|
fMipmapKey = CreateAndRefImageKey(fNode->nodeId, fMipmap); |
|
else |
|
fMipmapKey->RefObject(); |
|
access.StuffImage(fMipmap); |
|
} |
|
else { |
|
access.SetImageData(nil, 0); |
|
access.SetImageType(VaultImageNode::kNone); |
|
DEL(fMipmap); |
|
fMipmap = nil; |
|
} |
|
} |
|
}
|
|
|