forked from metin2/client
427 lines
10 KiB
C++
427 lines
10 KiB
C++
|
#include "StdAfx.h"
|
|||
|
|
|||
|
bool PyTuple_GetTextInstance(PyObject* poArgs, int pos, CGraphicTextInstance** ppTextInstance)
|
|||
|
{
|
|||
|
int handle;
|
|||
|
if (!PyTuple_GetInteger(poArgs, pos, &handle))
|
|||
|
return false;
|
|||
|
|
|||
|
if (!handle)
|
|||
|
return false;
|
|||
|
|
|||
|
*ppTextInstance=(CGraphicTextInstance*)handle;
|
|||
|
|
|||
|
return true;
|
|||
|
}
|
|||
|
|
|||
|
PyObject* grpTextGenerate(PyObject* poSelf, PyObject* poArgs)
|
|||
|
{
|
|||
|
CGraphicTextInstance * pTextInstance = CGraphicTextInstance::New();
|
|||
|
return Py_BuildValue("i", pTextInstance);
|
|||
|
}
|
|||
|
|
|||
|
PyObject* grpTextDestroy(PyObject* poSelf, PyObject* poArgs)
|
|||
|
{
|
|||
|
CGraphicTextInstance* pTextInstance;
|
|||
|
if (!PyTuple_GetTextInstance(poArgs, 0, &pTextInstance))
|
|||
|
return Py_BuildException();
|
|||
|
|
|||
|
CGraphicTextInstance::Delete(pTextInstance);
|
|||
|
return Py_BuildNone();
|
|||
|
}
|
|||
|
|
|||
|
PyObject* grpTextGetSize(PyObject* poSelf, PyObject* poArgs)
|
|||
|
{
|
|||
|
CGraphicTextInstance* pTextInstance;
|
|||
|
if (!PyTuple_GetTextInstance(poArgs, 0, &pTextInstance))
|
|||
|
return Py_BuildException();
|
|||
|
|
|||
|
int width, height;
|
|||
|
pTextInstance->GetTextSize(&width, &height);
|
|||
|
return Py_BuildValue("(i, i)", width, height);
|
|||
|
}
|
|||
|
|
|||
|
PyObject* grpTextSetPosition(PyObject* poSelf, PyObject* poArgs)
|
|||
|
{
|
|||
|
CGraphicTextInstance* pTextInstance;
|
|||
|
if (!PyTuple_GetTextInstance(poArgs, 0, &pTextInstance))
|
|||
|
return Py_BuildException();
|
|||
|
|
|||
|
int ix;
|
|||
|
if (!PyTuple_GetInteger(poArgs, 1, &ix))
|
|||
|
return Py_BuildException();
|
|||
|
int iy;
|
|||
|
if (!PyTuple_GetInteger(poArgs, 2, &iy))
|
|||
|
return Py_BuildException();
|
|||
|
|
|||
|
pTextInstance->SetPosition((float) ix, (float) iy);
|
|||
|
return Py_BuildNone();
|
|||
|
}
|
|||
|
|
|||
|
PyObject* grpTextSetText(PyObject* poSelf, PyObject* poArgs)
|
|||
|
{
|
|||
|
CGraphicTextInstance* pTextInstance;
|
|||
|
if (!PyTuple_GetTextInstance(poArgs, 0, &pTextInstance))
|
|||
|
return Py_BuildException();
|
|||
|
|
|||
|
char* szText;
|
|||
|
if (!PyTuple_GetString(poArgs, 1, &szText))
|
|||
|
return Py_BuildException();
|
|||
|
|
|||
|
pTextInstance->SetValue(szText);
|
|||
|
return Py_BuildNone();
|
|||
|
}
|
|||
|
|
|||
|
PyObject* grpTextSetSecret(PyObject* poSelf, PyObject* poArgs)
|
|||
|
{
|
|||
|
CGraphicTextInstance* pTextInstance;
|
|||
|
if (!PyTuple_GetTextInstance(poArgs, 0, &pTextInstance))
|
|||
|
return Py_BuildException();
|
|||
|
|
|||
|
bool bValue;
|
|||
|
if (!PyTuple_GetBoolean(poArgs, 1, &bValue))
|
|||
|
return Py_BuildException();
|
|||
|
|
|||
|
pTextInstance->SetSecret(bValue);
|
|||
|
return Py_BuildNone();
|
|||
|
}
|
|||
|
|
|||
|
PyObject* grpTextOutline(PyObject* poSelf, PyObject* poArgs)
|
|||
|
{
|
|||
|
CGraphicTextInstance* pTextInstance;
|
|||
|
if (!PyTuple_GetTextInstance(poArgs, 0, &pTextInstance))
|
|||
|
return Py_BuildException();
|
|||
|
|
|||
|
bool bValue;
|
|||
|
if (!PyTuple_GetBoolean(poArgs, 1, &bValue))
|
|||
|
return Py_BuildException();
|
|||
|
|
|||
|
pTextInstance->SetOutline(bValue);
|
|||
|
return Py_BuildNone();
|
|||
|
}
|
|||
|
|
|||
|
PyObject* grpTextGetText(PyObject* poSelf, PyObject* poArgs)
|
|||
|
{
|
|||
|
CGraphicTextInstance* pTextInstance;
|
|||
|
if (!PyTuple_GetTextInstance(poArgs, 0, &pTextInstance))
|
|||
|
return Py_BuildException();
|
|||
|
|
|||
|
return Py_BuildValue("s", pTextInstance->GetValueStringReference().c_str());
|
|||
|
}
|
|||
|
|
|||
|
PyObject* grpTextSetFontName(PyObject* poSelf, PyObject* poArgs)
|
|||
|
{
|
|||
|
CGraphicTextInstance* pTextInstance;
|
|||
|
if (!PyTuple_GetTextInstance(poArgs, 0, &pTextInstance))
|
|||
|
return Py_BuildException();
|
|||
|
|
|||
|
char* szFontName;
|
|||
|
if (!PyTuple_GetString(poArgs, 1, &szFontName))
|
|||
|
return Py_BuildException();
|
|||
|
|
|||
|
std::string stFontName = szFontName;
|
|||
|
stFontName += ".fnt";
|
|||
|
|
|||
|
CResource* pResource = CResourceManager::Instance().GetResourcePointer(stFontName.c_str());
|
|||
|
pTextInstance->SetTextPointer(static_cast<CGraphicText*>(pResource));
|
|||
|
return Py_BuildNone();
|
|||
|
}
|
|||
|
|
|||
|
PyObject* grpTextSetFontColor(PyObject* poSelf, PyObject* poArgs)
|
|||
|
{
|
|||
|
CGraphicTextInstance* pTextInstance;
|
|||
|
if (!PyTuple_GetTextInstance(poArgs, 0, &pTextInstance))
|
|||
|
return Py_BuildException();
|
|||
|
|
|||
|
if (2 == PyTuple_Size(poArgs))
|
|||
|
{
|
|||
|
int iColor;
|
|||
|
if (!PyTuple_GetInteger(poArgs, 1, &iColor))
|
|||
|
return Py_BuildException();
|
|||
|
pTextInstance->SetColor(DWORD(iColor));
|
|||
|
}
|
|||
|
else if (4 == PyTuple_Size(poArgs))
|
|||
|
{
|
|||
|
float fRed;
|
|||
|
if (!PyTuple_GetFloat(poArgs, 1, &fRed))
|
|||
|
return Py_BuildException();
|
|||
|
float fGreen;
|
|||
|
if (!PyTuple_GetFloat(poArgs, 2, &fGreen))
|
|||
|
return Py_BuildException();
|
|||
|
float fBlue;
|
|||
|
if (!PyTuple_GetFloat(poArgs, 3, &fBlue))
|
|||
|
return Py_BuildException();
|
|||
|
pTextInstance->SetColor(fRed, fGreen, fBlue);
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
return Py_BuildException();
|
|||
|
}
|
|||
|
|
|||
|
return Py_BuildNone();
|
|||
|
}
|
|||
|
|
|||
|
PyObject* grpTextSetOutLineColor(PyObject* poSelf, PyObject* poArgs)
|
|||
|
{
|
|||
|
CGraphicTextInstance* pTextInstance;
|
|||
|
if (!PyTuple_GetTextInstance(poArgs, 0, &pTextInstance))
|
|||
|
return Py_BuildException();
|
|||
|
|
|||
|
float fRed;
|
|||
|
if (!PyTuple_GetFloat(poArgs, 1, &fRed))
|
|||
|
return Py_BuildException();
|
|||
|
float fGreen;
|
|||
|
if (!PyTuple_GetFloat(poArgs, 2, &fGreen))
|
|||
|
return Py_BuildException();
|
|||
|
float fBlue;
|
|||
|
if (!PyTuple_GetFloat(poArgs, 3, &fBlue))
|
|||
|
return Py_BuildException();
|
|||
|
|
|||
|
float fAlpha;
|
|||
|
if (!PyTuple_GetFloat(poArgs, 4, &fAlpha))
|
|||
|
return Py_BuildException();
|
|||
|
|
|||
|
pTextInstance->SetOutLineColor(fRed, fGreen, fBlue, fAlpha);
|
|||
|
return Py_BuildNone();
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
PyObject* grpTextRender(PyObject* poSelf, PyObject* poArgs)
|
|||
|
{
|
|||
|
CGraphicTextInstance* pTextInstance;
|
|||
|
if (!PyTuple_GetTextInstance(poArgs, 0, &pTextInstance))
|
|||
|
return Py_BuildException();
|
|||
|
|
|||
|
pTextInstance->Render();
|
|||
|
return Py_BuildNone();
|
|||
|
}
|
|||
|
|
|||
|
PyObject* grpTextUpdate(PyObject* poSelf, PyObject* poArgs)
|
|||
|
{
|
|||
|
CGraphicTextInstance* pTextInstance;
|
|||
|
if (!PyTuple_GetTextInstance(poArgs, 0, &pTextInstance))
|
|||
|
return Py_BuildException();
|
|||
|
|
|||
|
pTextInstance->Update();
|
|||
|
return Py_BuildNone();
|
|||
|
}
|
|||
|
|
|||
|
PyObject* grpTextShowCursor(PyObject* poSelf, PyObject* poArgs)
|
|||
|
{
|
|||
|
CGraphicTextInstance* pTextInstance;
|
|||
|
if (!PyTuple_GetTextInstance(poArgs, 0, &pTextInstance))
|
|||
|
return Py_BuildException();
|
|||
|
|
|||
|
pTextInstance->ShowCursor();
|
|||
|
return Py_BuildNone();
|
|||
|
}
|
|||
|
|
|||
|
PyObject* grpTextHideCursor(PyObject* poSelf, PyObject* poArgs)
|
|||
|
{
|
|||
|
CGraphicTextInstance* pTextInstance;
|
|||
|
if (!PyTuple_GetTextInstance(poArgs, 0, &pTextInstance))
|
|||
|
return Py_BuildException();
|
|||
|
|
|||
|
pTextInstance->HideCursor();
|
|||
|
return Py_BuildNone();
|
|||
|
}
|
|||
|
|
|||
|
PyObject* grpSetHorizontalAlign(PyObject* poSelf, PyObject* poArgs)
|
|||
|
{
|
|||
|
CGraphicTextInstance* pTextInstance;
|
|||
|
if (!PyTuple_GetTextInstance(poArgs, 0, &pTextInstance))
|
|||
|
return Py_BuildException();
|
|||
|
|
|||
|
int iAlign;
|
|||
|
if (!PyTuple_GetInteger(poArgs, 1, &iAlign))
|
|||
|
return Py_BuildException();
|
|||
|
|
|||
|
pTextInstance->SetHorizonalAlign(iAlign);
|
|||
|
return Py_BuildNone();
|
|||
|
}
|
|||
|
|
|||
|
PyObject* grpSetVerticalAlign(PyObject* poSelf, PyObject* poArgs)
|
|||
|
{
|
|||
|
CGraphicTextInstance* pTextInstance;
|
|||
|
if (!PyTuple_GetTextInstance(poArgs, 0, &pTextInstance))
|
|||
|
return Py_BuildException();
|
|||
|
|
|||
|
int iAlign;
|
|||
|
if (!PyTuple_GetInteger(poArgs, 1, &iAlign))
|
|||
|
return Py_BuildException();
|
|||
|
|
|||
|
pTextInstance->SetVerticalAlign(iAlign);
|
|||
|
return Py_BuildNone();
|
|||
|
}
|
|||
|
|
|||
|
PyObject* grpSetMax(PyObject* poSelf, PyObject* poArgs)
|
|||
|
{
|
|||
|
CGraphicTextInstance* pTextInstance;
|
|||
|
if (!PyTuple_GetTextInstance(poArgs, 0, &pTextInstance))
|
|||
|
return Py_BuildException();
|
|||
|
|
|||
|
int iValue;
|
|||
|
if (!PyTuple_GetInteger(poArgs, 1, &iValue))
|
|||
|
return Py_BuildException();
|
|||
|
|
|||
|
pTextInstance->SetMax(iValue);
|
|||
|
return Py_BuildNone();
|
|||
|
}
|
|||
|
|
|||
|
PyObject* grpGetSplitingTextLineCount(PyObject* poSelf, PyObject* poArgs)
|
|||
|
{
|
|||
|
char * szText;
|
|||
|
if (!PyTuple_GetString(poArgs, 0, &szText))
|
|||
|
return Py_BuildException();
|
|||
|
|
|||
|
int iLineLimitation;
|
|||
|
if (!PyTuple_GetInteger(poArgs, 1, &iLineLimitation))
|
|||
|
return Py_BuildException();
|
|||
|
|
|||
|
int iPosition = 0;
|
|||
|
int iLineCount = 0;
|
|||
|
|
|||
|
for (DWORD i = 0; i < strlen(szText);)
|
|||
|
{
|
|||
|
if ('|' == szText[i])
|
|||
|
{
|
|||
|
i += 1;
|
|||
|
|
|||
|
// <20>ڵ<EFBFBD> <20><> <20>ٲǰ<DEB5> <20>ٷ<EFBFBD> | <20><> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
|
|||
|
if (iPosition>0)
|
|||
|
++iLineCount;
|
|||
|
|
|||
|
iPosition = 0;
|
|||
|
continue;
|
|||
|
}
|
|||
|
|
|||
|
if (szText[i] & 0x80)
|
|||
|
{
|
|||
|
i += 2;
|
|||
|
iPosition += 2;
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
i += 1;
|
|||
|
iPosition += 1;
|
|||
|
}
|
|||
|
|
|||
|
if (iPosition >= iLineLimitation)
|
|||
|
{
|
|||
|
++iLineCount;
|
|||
|
iPosition = 0;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
if (iPosition > 0)
|
|||
|
++iLineCount;
|
|||
|
|
|||
|
return Py_BuildValue("i", iLineCount);
|
|||
|
}
|
|||
|
|
|||
|
PyObject* grpGetSplitingTextLine(PyObject* poSelf, PyObject* poArgs)
|
|||
|
{
|
|||
|
char * szText;
|
|||
|
if (!PyTuple_GetString(poArgs, 0, &szText))
|
|||
|
return Py_BuildException();
|
|||
|
|
|||
|
int iLineLimitation;
|
|||
|
if (!PyTuple_GetInteger(poArgs, 1, &iLineLimitation))
|
|||
|
return Py_BuildException();
|
|||
|
|
|||
|
int iGettingLine;
|
|||
|
if (!PyTuple_GetInteger(poArgs, 2, &iGettingLine))
|
|||
|
return Py_BuildException();
|
|||
|
|
|||
|
std::string strLine = "";
|
|||
|
int iPosition = 0;
|
|||
|
int iLineCount = 0;
|
|||
|
|
|||
|
// 1<><31> : <20><><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD>ϰ<EFBFBD> <20>ȵɱ<C8B5> -_-a
|
|||
|
// 2<><32> : <20><>.. <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> +_+
|
|||
|
for (DWORD i = 0; i < strlen(szText);)
|
|||
|
{
|
|||
|
if ('|' == szText[i])
|
|||
|
{
|
|||
|
i += 1;
|
|||
|
|
|||
|
// <20>ڵ<EFBFBD> <20><> <20>ٲǰ<DEB5> <20>ٷ<EFBFBD> | <20><> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
|
|||
|
if (iPosition>0)
|
|||
|
++iLineCount;
|
|||
|
iPosition = 0;
|
|||
|
continue;
|
|||
|
}
|
|||
|
|
|||
|
if (szText[i] & 0x80)
|
|||
|
{
|
|||
|
if (iLineCount == iGettingLine)
|
|||
|
strLine.append(szText+i, 2);
|
|||
|
|
|||
|
i += 2;
|
|||
|
iPosition += 2;
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
if (iLineCount == iGettingLine)
|
|||
|
strLine += szText[i];
|
|||
|
|
|||
|
i += 1;
|
|||
|
iPosition += 1;
|
|||
|
}
|
|||
|
|
|||
|
if (iPosition >= iLineLimitation)
|
|||
|
{
|
|||
|
++iLineCount;
|
|||
|
iPosition = 0;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
return Py_BuildValue("s", strLine.c_str());
|
|||
|
}
|
|||
|
|
|||
|
PyObject* grpTextPixelPositionToCharacterPosition(PyObject* poSelf, PyObject* poArgs)
|
|||
|
{
|
|||
|
CGraphicTextInstance * pTextInstance;
|
|||
|
if (!PyTuple_GetTextInstance(poArgs, 0, &pTextInstance))
|
|||
|
return Py_BuildException();
|
|||
|
|
|||
|
int iPixelPosition;
|
|||
|
if (!PyTuple_GetInteger(poArgs, 1, &iPixelPosition))
|
|||
|
return Py_BuildException();
|
|||
|
|
|||
|
int iCharacterPosition = pTextInstance->PixelPositionToCharacterPosition(iPixelPosition);
|
|||
|
|
|||
|
return Py_BuildValue("i", iCharacterPosition);
|
|||
|
}
|
|||
|
|
|||
|
void initgrpText()
|
|||
|
{
|
|||
|
static PyMethodDef s_methods[] =
|
|||
|
{
|
|||
|
{ "Update", grpTextUpdate, METH_VARARGS },
|
|||
|
{ "Render", grpTextRender, METH_VARARGS },
|
|||
|
{ "Generate", grpTextGenerate, METH_VARARGS },
|
|||
|
{ "Destroy", grpTextDestroy, METH_VARARGS },
|
|||
|
{ "SetFontName", grpTextSetFontName, METH_VARARGS },
|
|||
|
{ "SetFontColor", grpTextSetFontColor, METH_VARARGS },
|
|||
|
{ "SetOutLineColor", grpTextSetOutLineColor, METH_VARARGS },
|
|||
|
{ "SetSecret", grpTextSetSecret, METH_VARARGS },
|
|||
|
{ "SetOutline", grpTextOutline, METH_VARARGS },
|
|||
|
{ "SetText", grpTextSetText, METH_VARARGS },
|
|||
|
{ "GetText", grpTextGetText, METH_VARARGS },
|
|||
|
{ "GetSize", grpTextGetSize, METH_VARARGS },
|
|||
|
{ "SetPosition", grpTextSetPosition, METH_VARARGS },
|
|||
|
{ "ShowCursor", grpTextShowCursor, METH_VARARGS },
|
|||
|
{ "HideCursor", grpTextHideCursor, METH_VARARGS },
|
|||
|
{ "SetHorizontalAlign", grpSetHorizontalAlign, METH_VARARGS },
|
|||
|
{ "SetVerticalAlign", grpSetVerticalAlign, METH_VARARGS },
|
|||
|
{ "SetMax", grpSetMax, METH_VARARGS },
|
|||
|
{ "GetSplitingTextLineCount", grpGetSplitingTextLineCount, METH_VARARGS },
|
|||
|
{ "GetSplitingTextLine", grpGetSplitingTextLine, METH_VARARGS },
|
|||
|
{ "PixelPositionToCharacterPosition", grpTextPixelPositionToCharacterPosition, METH_VARARGS },
|
|||
|
{ NULL, NULL, NULL },
|
|||
|
};
|
|||
|
|
|||
|
Py_InitModule("grpText", s_methods);
|
|||
|
}
|