add: Clipping mask.

This commit is contained in:
WildEgo 2024-06-01 17:28:20 +01:00
parent a2bac7a5f3
commit 96a5766760
13 changed files with 589 additions and 128 deletions

View File

@ -131,7 +131,6 @@ class Window(object):
self.parentWindow=proxy(parent) self.parentWindow=proxy(parent)
wndMgr.SetParent(self.hWnd, parent.hWnd) wndMgr.SetParent(self.hWnd, parent.hWnd)
def GetParentProxy(self): def GetParentProxy(self):
return self.parentWindow return self.parentWindow
@ -221,11 +220,18 @@ class Window(object):
def SetOnMouseLeftButtonUpEvent(self, event): def SetOnMouseLeftButtonUpEvent(self, event):
self.onMouseLeftButtonUpEvent = event self.onMouseLeftButtonUpEvent = event
def OnMouseLeftButtonUp(self): def OnMouseLeftButtonUp(self):
if self.onMouseLeftButtonUpEvent: if self.onMouseLeftButtonUpEvent:
self.onMouseLeftButtonUpEvent() self.onMouseLeftButtonUpEvent()
if app.__BL_CLIP_MASK__:
def SetClippingMaskRect(self, left, top, right, bottom):
wndMgr.SetClippingMaskRect(self.hWnd, left, top, right, bottom)
def SetClippingMaskWindow(self, clipping_mask_window):
wndMgr.SetClippingMaskWindow(self.hWnd, clipping_mask_window.hWnd)
class ListBoxEx(Window): class ListBoxEx(Window):
class Item(Window): class Item(Window):
@ -870,7 +876,7 @@ class ExpandedImageBox(ImageBox):
def SetRenderingMode(self, mode): def SetRenderingMode(self, mode):
wndMgr.SetRenderingMode(self.hWnd, mode) wndMgr.SetRenderingMode(self.hWnd, mode)
# [0.0, 1.0] 사이의 값만큼 퍼센트로 그리지 않는다. # [0.0, 1.0] <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>ŭ <20>ۼ<EFBFBD>Ʈ<EFBFBD><C6AE> <20>׸<EFBFBD><D7B8><EFBFBD> <20>ʴ´<CAB4>.
def SetRenderingRect(self, left, top, right, bottom): def SetRenderingRect(self, left, top, right, bottom):
wndMgr.SetRenderingRect(self.hWnd, left, top, right, bottom) wndMgr.SetRenderingRect(self.hWnd, left, top, right, bottom)
@ -1359,11 +1365,11 @@ class SlotWindow(Window):
return wndMgr.GetSlotCount(self.hWnd) return wndMgr.GetSlotCount(self.hWnd)
def SetUseMode(self, flag): def SetUseMode(self, flag):
"True일때만 ItemToItem 이 가능한지 보여준다" "True<EFBFBD>϶<EFBFBD><EFBFBD><EFBFBD> ItemToItem <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ش<EFBFBD>"
wndMgr.SetUseMode(self.hWnd, flag) wndMgr.SetUseMode(self.hWnd, flag)
def SetUsableItem(self, flag): def SetUsableItem(self, flag):
"True면 현재 가리킨 아이템이 ItemToItem 적용 가능하다" "True<EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>Ų <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ItemToItem <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ϴ<EFBFBD>"
wndMgr.SetUsableItem(self.hWnd, flag) wndMgr.SetUsableItem(self.hWnd, flag)
## Slot ## Slot
@ -1521,7 +1527,7 @@ class TitleBar(Window):
def MakeTitleBar(self, width, color): def MakeTitleBar(self, width, color):
## 현재 Color는 사용하고 있지 않음 ## <EFBFBD><EFBFBD><EFBFBD><EFBFBD> Color<6F><72> <20><><EFBFBD><EFBFBD>ϰ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
width = max(64, width) width = max(64, width)
@ -2752,8 +2758,8 @@ class PythonScriptLoader(object):
print "===== Load Script File : %s" % (FileName) print "===== Load Script File : %s" % (FileName)
try: try:
# chr, player 등은 sandbox 내에서 import가 허용되지 않기 때문에,(봇이 악용할 여지가 매우 큼.) # chr, player <EFBFBD><EFBFBD><EFBFBD><EFBFBD> sandbox <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> import<72><74> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ʱ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>,(<28><><EFBFBD><EFBFBD> <20>ǿ<EFBFBD><C7BF><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ſ<EFBFBD> ŭ.)
# 미리 script dictionary에 필요한 상수를 넣어놓는다. # <EFBFBD≯<EFBFBD> script dictionary<72><79> <20>ʿ<EFBFBD><CABF><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> <20>־<EFBFBD><D6BE><EFBFBD>´<EFBFBD>.
import chr import chr
import player import player
import app import app

View File

@ -26,7 +26,11 @@ void CGraphicExpandedImageInstance::Delete(CGraphicExpandedImageInstance* pkImgI
ms_kPool.Free(pkImgInst); ms_kPool.Free(pkImgInst);
} }
#if defined(__BL_CLIP_MASK__)
void CGraphicExpandedImageInstance::OnRender(RECT* pClipRect)
#else
void CGraphicExpandedImageInstance::OnRender() void CGraphicExpandedImageInstance::OnRender()
#endif
{ {
CGraphicImage * pImage = m_roImage.GetPointer(); CGraphicImage * pImage = m_roImage.GetPointer();
CGraphicTexture * pTexture = pImage->GetTexturePointer(); CGraphicTexture * pTexture = pImage->GetTexturePointer();
@ -116,7 +120,7 @@ void CGraphicExpandedImageInstance::OnRender()
break; break;
} }
// 2004.11.18.myevan.ctrl+alt+del 반복 사용시 튕기는 문제 // 2004.11.18.myevan.ctrl+alt+del <EFBFBD>ݺ<EFBFBD> <20><><EFBFBD><EFBFBD> ƨ<><C6A8><EFBFBD> <20><><EFBFBD><EFBFBD>
if (CGraphicBase::SetPDTStream(vertices, 4)) if (CGraphicBase::SetPDTStream(vertices, 4))
{ {
CGraphicBase::SetDefaultIndexBuffer(CGraphicBase::DEFAULT_IB_FILL_RECT); CGraphicBase::SetDefaultIndexBuffer(CGraphicBase::DEFAULT_IB_FILL_RECT);

View File

@ -37,7 +37,11 @@ class CGraphicExpandedImageInstance : public CGraphicImageInstance
protected: protected:
void Initialize(); void Initialize();
#if defined(__BL_CLIP_MASK__)
void OnRender(RECT* pClipRect);
#else
void OnRender(); void OnRender();
#endif
void OnSetImagePointer(); void OnSetImagePointer();
BOOL OnIsType(DWORD dwType); BOOL OnIsType(DWORD dwType);

View File

@ -31,17 +31,29 @@ void CGraphicImageInstance::Delete(CGraphicImageInstance* pkImgInst)
ms_kPool.Free(pkImgInst); ms_kPool.Free(pkImgInst);
} }
#if defined(__BL_CLIP_MASK__)
void CGraphicImageInstance::Render(RECT* pClipRect)
#else
void CGraphicImageInstance::Render() void CGraphicImageInstance::Render()
#endif
{ {
if (IsEmpty()) if (IsEmpty())
return; return;
assert(!IsEmpty()); assert(!IsEmpty());
#if defined(__BL_CLIP_MASK__)
OnRender(pClipRect);
#else
OnRender(); OnRender();
#endif
} }
#if defined(__BL_CLIP_MASK__)
void CGraphicImageInstance::OnRender(RECT* pClipRect)
#else
void CGraphicImageInstance::OnRender() void CGraphicImageInstance::OnRender()
#endif
{ {
CGraphicImage * pImage = m_roImage.GetPointer(); CGraphicImage * pImage = m_roImage.GetPointer();
CGraphicTexture * pTexture = pImage->GetTexturePointer(); CGraphicTexture * pTexture = pImage->GetTexturePointer();
@ -56,34 +68,109 @@ void CGraphicImageInstance::OnRender()
float sv = c_rRect.top * texReverseHeight; float sv = c_rRect.top * texReverseHeight;
float eu = (c_rRect.left + (c_rRect.right-c_rRect.left)) * texReverseWidth; float eu = (c_rRect.left + (c_rRect.right-c_rRect.left)) * texReverseWidth;
float ev = (c_rRect.top + (c_rRect.bottom-c_rRect.top)) * texReverseHeight; float ev = (c_rRect.top + (c_rRect.bottom-c_rRect.top)) * texReverseHeight;
TPDTVertex vertices[4];
vertices[0].position.x = m_v2Position.x-0.5f;
vertices[0].position.y = m_v2Position.y-0.5f;
vertices[0].position.z = 0.0f;
vertices[0].texCoord = TTextureCoordinate(su, sv);
vertices[0].diffuse = m_DiffuseColor;
vertices[1].position.x = m_v2Position.x + fimgWidth-0.5f; #if defined(__BL_CLIP_MASK__)
vertices[1].position.y = m_v2Position.y-0.5f; float sx = m_v2Position.x - 0.5f;
vertices[1].position.z = 0.0f; float sy = m_v2Position.y - 0.5f;
vertices[1].texCoord = TTextureCoordinate(eu, sv); float ex = m_v2Position.x + fimgWidth - 0.5f;
vertices[1].diffuse = m_DiffuseColor; float ey = m_v2Position.y + fimgHeight - 0.5f;
vertices[2].position.x = m_v2Position.x-0.5f; if (pClipRect)
vertices[2].position.y = m_v2Position.y + fimgHeight-0.5f; {
vertices[2].position.z = 0.0f; const float width = ex - sx;
vertices[2].texCoord = TTextureCoordinate(su, ev); const float height = ey - sy;
vertices[2].diffuse = m_DiffuseColor; const float uDiff = eu - su;
const float vDiff = ev - sv;
vertices[3].position.x = m_v2Position.x + fimgWidth-0.5f; if (ex < pClipRect->left)
vertices[3].position.y = m_v2Position.y + fimgHeight-0.5f; return;
vertices[3].position.z = 0.0f;
vertices[3].texCoord = TTextureCoordinate(eu, ev);
vertices[3].diffuse = m_DiffuseColor;
// 2004.11.18.myevan.ctrl+alt+del 반복 사용시 튕기는 문제 if (ey < pClipRect->top)
return;
if (sx > pClipRect->right)
return;
if (sy > pClipRect->bottom)
return;
if (sx < pClipRect->left)
{
su += (pClipRect->left - sx) / width * uDiff;
sx = pClipRect->left;
}
if (sy < pClipRect->top)
{
sv += (pClipRect->top - sy) / height * vDiff;
sy = pClipRect->top;
}
if (ex > pClipRect->right)
{
eu -= (ex - pClipRect->right) / width * uDiff;
ex = pClipRect->right;
}
if (ey > pClipRect->bottom)
{
ev -= (ey - pClipRect->bottom) / height * vDiff;
ey = pClipRect->bottom;
}
}
TPDTVertex vertices[4];
vertices[0].position.x = sx;
vertices[0].position.y = sy;
vertices[0].position.z = 0.0f;
vertices[0].texCoord = TTextureCoordinate(su, sv);
vertices[0].diffuse = m_DiffuseColor;
vertices[1].position.x = ex;
vertices[1].position.y = sy;
vertices[1].position.z = 0.0f;
vertices[1].texCoord = TTextureCoordinate(eu, sv);
vertices[1].diffuse = m_DiffuseColor;
vertices[2].position.x = sx;
vertices[2].position.y = ey;
vertices[2].position.z = 0.0f;
vertices[2].texCoord = TTextureCoordinate(su, ev);
vertices[2].diffuse = m_DiffuseColor;
vertices[3].position.x = ex;
vertices[3].position.y = ey;
vertices[3].position.z = 0.0f;
vertices[3].texCoord = TTextureCoordinate(eu, ev);
vertices[3].diffuse = m_DiffuseColor;
#else
TPDTVertex vertices[4];
vertices[0].position.x = m_v2Position.x - 0.5f;
vertices[0].position.y = m_v2Position.y - 0.5f;
vertices[0].position.z = 0.0f;
vertices[0].texCoord = TTextureCoordinate(su, sv);
vertices[0].diffuse = m_DiffuseColor;
vertices[1].position.x = m_v2Position.x + fimgWidth - 0.5f;
vertices[1].position.y = m_v2Position.y - 0.5f;
vertices[1].position.z = 0.0f;
vertices[1].texCoord = TTextureCoordinate(eu, sv);
vertices[1].diffuse = m_DiffuseColor;
vertices[2].position.x = m_v2Position.x - 0.5f;
vertices[2].position.y = m_v2Position.y + fimgHeight - 0.5f;
vertices[2].position.z = 0.0f;
vertices[2].texCoord = TTextureCoordinate(su, ev);
vertices[2].diffuse = m_DiffuseColor;
vertices[3].position.x = m_v2Position.x + fimgWidth - 0.5f;
vertices[3].position.y = m_v2Position.y + fimgHeight - 0.5f;
vertices[3].position.z = 0.0f;
vertices[3].texCoord = TTextureCoordinate(eu, ev);
vertices[3].diffuse = m_DiffuseColor;
#endif
// 2004.11.18.myevan.ctrl+alt+del <20>ݺ<EFBFBD> <20><><EFBFBD><EFBFBD> ƨ<><C6A8><EFBFBD> <20><><EFBFBD><EFBFBD>
if (CGraphicBase::SetPDTStream(vertices, 4)) if (CGraphicBase::SetPDTStream(vertices, 4))
{ {
CGraphicBase::SetDefaultIndexBuffer(CGraphicBase::DEFAULT_IB_FILL_RECT); CGraphicBase::SetDefaultIndexBuffer(CGraphicBase::DEFAULT_IB_FILL_RECT);
@ -207,7 +294,7 @@ void CGraphicImageInstance::Initialize()
void CGraphicImageInstance::Destroy() void CGraphicImageInstance::Destroy()
{ {
m_roImage.SetPointer(NULL); // CRef 에서 레퍼런스 카운트가 떨어져야 함. m_roImage.SetPointer(NULL); // CRef <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>۷<EFBFBD><DBB7><EFBFBD> ī<><C4AB>Ʈ<EFBFBD><C6AE> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>.
Initialize(); Initialize();
} }

View File

@ -4,6 +4,7 @@
#include "GrpIndexBuffer.h" #include "GrpIndexBuffer.h"
#include "GrpVertexBufferDynamic.h" #include "GrpVertexBufferDynamic.h"
#include "Pool.h" #include "Pool.h"
#include "../UserInterface/Locale_inc.h"
class CGraphicImageInstance class CGraphicImageInstance
{ {
@ -17,7 +18,11 @@ class CGraphicImageInstance
void Destroy(); void Destroy();
#if defined(__BL_CLIP_MASK__)
void Render(RECT* pClipRect = NULL);
#else
void Render(); void Render();
#endif
void SetDiffuseColor(float fr, float fg, float fb, float fa); void SetDiffuseColor(float fr, float fg, float fb, float fa);
void SetPosition(float fx, float fy); void SetPosition(float fx, float fy);
@ -38,7 +43,11 @@ class CGraphicImageInstance
protected: protected:
void Initialize(); void Initialize();
#if defined(__BL_CLIP_MASK__)
virtual void OnRender(RECT* pClipRect);
#else
virtual void OnRender(); virtual void OnRender();
#endif
virtual void OnSetImagePointer(); virtual void OnSetImagePointer();
virtual BOOL OnIsType(DWORD dwType); virtual BOOL OnIsType(DWORD dwType);

View File

@ -6,6 +6,7 @@
#include "../EterLocale/StringCodec.h" #include "../EterLocale/StringCodec.h"
#include "../EterBase/Utils.h" #include "../EterBase/Utils.h"
#include "../EterLocale/Arabic.h" #include "../EterLocale/Arabic.h"
#include "../UserInterface/Locale_inc.h"
extern DWORD GetDefaultCodePage(); extern DWORD GetDefaultCodePage();
@ -121,12 +122,12 @@ int ReadToken(const char* token)
void CGraphicTextInstance::Update() void CGraphicTextInstance::Update()
{ {
if (m_isUpdate) // 문자열이 바뀌었을 때만 업데이트 한다. if (m_isUpdate) // <EFBFBD><EFBFBD><EFBFBD>ڿ<EFBFBD><EFBFBD><EFBFBD> <20>ٲ<EFBFBD><D9B2><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ʈ <20>Ѵ<EFBFBD>.
return; return;
if (m_roText.IsNull()) if (m_roText.IsNull())
{ {
Tracef("CGraphicTextInstance::Update - 폰트가 설정되지 않았습니다\n"); Tracef("CGraphicTextInstance::Update - <EFBFBD><EFBFBD>Ʈ<EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ʾҽ<CABE><D2BD>ϴ<EFBFBD>\n");
return; return;
} }
@ -139,7 +140,7 @@ void CGraphicTextInstance::Update()
UINT defCodePage = GetDefaultCodePage(); UINT defCodePage = GetDefaultCodePage();
UINT dataCodePage = defCodePage; // 아랍 및 베트남 내부 데이터를 UTF8 을 사용하려 했으나 실패 UINT dataCodePage = defCodePage; // <EFBFBD>ƶ<EFBFBD> <20><> <20><>Ʈ<EFBFBD><C6AE> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>͸<EFBFBD> UTF8 <20><> <20><><EFBFBD><EFBFBD>Ϸ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
CGraphicFontTexture::TCharacterInfomation* pSpaceInfo = pFontTexture->GetCharacterInfomation(dataCodePage, ' '); CGraphicFontTexture::TCharacterInfomation* pSpaceInfo = pFontTexture->GetCharacterInfomation(dataCodePage, ' ');
@ -185,7 +186,7 @@ void CGraphicTextInstance::Update()
bool isEnglish = true; bool isEnglish = true;
int nEnglishBase = wArabicTextLen - 1; int nEnglishBase = wArabicTextLen - 1;
//<<하이퍼 링크>> //<<<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>ũ>>
int x = 0; int x = 0;
int len; int len;
@ -194,7 +195,7 @@ void CGraphicTextInstance::Update()
std::wstring hyperlinkBuffer; std::wstring hyperlinkBuffer;
int no_hyperlink = 0; int no_hyperlink = 0;
// 심볼로 끝나면 아랍어 모드로 시작해야한다 // <EFBFBD>ɺ<EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ƶ<EFBFBD><C6B6><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ؾ<EFBFBD><D8BE>Ѵ<EFBFBD>
if (Arabic_IsInSymbol(wArabicText[wArabicTextLen - 1])) if (Arabic_IsInSymbol(wArabicText[wArabicTextLen - 1]))
{ {
isEnglish = false; isEnglish = false;
@ -208,24 +209,24 @@ void CGraphicTextInstance::Update()
if (isEnglish) if (isEnglish)
{ {
// <<심볼의 경우 (ex. 기호, 공백)>> -> 영어 모드 유지. // <<<EFBFBD>ɺ<EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD> (ex. <20><>ȣ, <20><><EFBFBD><EFBFBD>)>> -> <20><><EFBFBD><EFBFBD> <20><><EFBFBD> <20><><EFBFBD><EFBFBD>.
// <<(심볼이 아닌 것들 : 숫자, 영어, 아랍어)>> // <<(<EFBFBD>ɺ<EFBFBD><EFBFBD><EFBFBD> <20>ƴ<EFBFBD> <20>͵<EFBFBD> : <20><><EFBFBD><EFBFBD>, <20><><EFBFBD><EFBFBD>, <20>ƶ<EFBFBD><C6B6><EFBFBD>)>>
// (1) 맨 앞의 심볼 or // (1) <EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>ɺ<EFBFBD> or
// (2) // (2)
// 1) 앞 글자가 아랍어 아님 && // 1) <EFBFBD><EFBFBD> <20><><EFBFBD>ڰ<EFBFBD> <20>ƶ<EFBFBD><C6B6><EFBFBD> <20>ƴ<EFBFBD> &&
// 2) 뒷 글자가 아랍어 아님 && // 2) <EFBFBD><EFBFBD> <20><><EFBFBD>ڰ<EFBFBD> <20>ƶ<EFBFBD><C6B6><EFBFBD> <20>ƴ<EFBFBD> &&
// 3) 뒷 글자가 심볼'|'이 아님 && // 3) <EFBFBD><EFBFBD> <20><><EFBFBD>ڰ<EFBFBD> <20>ɺ<EFBFBD>'|'<27><> <20>ƴ<EFBFBD> &&
// or // or
// (3) 현재 심볼이 '|' // (3) <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ɺ<EFBFBD><C9BA><EFBFBD> '|'
// <<아랍어 모드로 넘어가는 경우 : 심볼에서.>> // <<<EFBFBD>ƶ<EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>Ѿ<D1BE><EEB0A1> <20><><EFBFBD> : <20>ɺ<EFBFBD><C9BA><EFBFBD><EFBFBD><EFBFBD>.>>
// 1) 앞글자 아랍어 // 1) <EFBFBD>ձ<EFBFBD><EFBFBD><EFBFBD> <20>ƶ<EFBFBD><C6B6><EFBFBD>
// 2) 뒷글자 아랍어 // 2) <EFBFBD>ޱ<EFBFBD><EFBFBD><EFBFBD> <20>ƶ<EFBFBD><C6B6><EFBFBD>
// //
// //
if (Arabic_IsInSymbol(wArabicChar) && ( if (Arabic_IsInSymbol(wArabicChar) && (
(i == 0) || (i == 0) ||
(i > 0 && (i > 0 &&
!(Arabic_HasPresentation(wArabicText, i - 1) || Arabic_IsInPresentation(wArabicText[i + 1])) && //앞글자, 뒷글자가 아랍어 아님. !(Arabic_HasPresentation(wArabicText, i - 1) || Arabic_IsInPresentation(wArabicText[i + 1])) && //<EFBFBD>ձ<EFBFBD><EFBFBD><EFBFBD>, <20>ޱ<EFBFBD><DEB1>ڰ<EFBFBD> <20>ƶ<EFBFBD><C6B6><EFBFBD> <20>ƴ<EFBFBD>.
wArabicText[i+1] != '|' wArabicText[i+1] != '|'
) || ) ||
wArabicText[i] == '|' wArabicText[i] == '|'
@ -234,10 +235,10 @@ void CGraphicTextInstance::Update()
// pass // pass
int temptest = 1; int temptest = 1;
} }
// (1)아랍어이거나 (2)아랍어 다음의 심볼이라면 아랍어 모드 전환 // (1)<EFBFBD>ƶ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>̰ų<EFBFBD> (2)<29>ƶ<EFBFBD><C6B6><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ɺ<EFBFBD><C9BA>̶<EFBFBD><CCB6> <20>ƶ<EFBFBD><C6B6><EFBFBD> <20><><EFBFBD> <20><>ȯ
else if (Arabic_IsInPresentation(wArabicChar) || Arabic_IsInSymbol(wArabicChar)) else if (Arabic_IsInPresentation(wArabicChar) || Arabic_IsInSymbol(wArabicChar))
{ {
//그 전까지의 영어를 그린다. //<EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><20>׸<EFBFBD><D7B8><EFBFBD>.
for (int e = i + 1; e <= nEnglishBase;) { for (int e = i + 1; e <= nEnglishBase;) {
int ret = GetTextTag(&wArabicText[e], wArabicTextLen - e, len, hyperlinkBuffer); int ret = GetTextTag(&wArabicText[e], wArabicTextLen - e, len, hyperlinkBuffer);
@ -251,7 +252,7 @@ void CGraphicTextInstance::Update()
kHyperlink.ex += charWidth; kHyperlink.ex += charWidth;
//x += charWidth; //x += charWidth;
//기존 추가한 하이퍼링크의 좌표 수정. //<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>߰<EFBFBD><DFB0><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>۸<EFBFBD>ũ<EFBFBD><C5A9> <20><>ǥ <20><><EFBFBD><EFBFBD>.
for (int j = 1; j <= no_hyperlink; j++) for (int j = 1; j <= no_hyperlink; j++)
{ {
if(m_hyperlinkVector.size() < j) if(m_hyperlinkVector.size() < j)
@ -279,7 +280,7 @@ void CGraphicTextInstance::Update()
if (hyperlinkStep == 1) if (hyperlinkStep == 1)
{ {
++hyperlinkStep; ++hyperlinkStep;
kHyperlink.ex = kHyperlink.sx = 0; // 실제 텍스트가 시작되는 위치 kHyperlink.ex = kHyperlink.sx = 0; // <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ؽ<EFBFBD>Ʈ<EFBFBD><C6AE> <20><><EFBFBD>۵Ǵ<DBB5> <20><>ġ
} }
else else
{ {
@ -299,7 +300,7 @@ void CGraphicTextInstance::Update()
int charWidth = __DrawCharacter(pFontTexture, dataCodePage, Arabic_ConvSymbol(wArabicText[i]), dwColor); int charWidth = __DrawCharacter(pFontTexture, dataCodePage, Arabic_ConvSymbol(wArabicText[i]), dwColor);
kHyperlink.ex += charWidth; kHyperlink.ex += charWidth;
//기존 추가한 하이퍼링크의 좌표 수정. //<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>߰<EFBFBD><DFB0><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>۸<EFBFBD>ũ<EFBFBD><C5A9> <20><>ǥ <20><><EFBFBD><EFBFBD>.
for (int j = 1; j <= no_hyperlink; j++) for (int j = 1; j <= no_hyperlink; j++)
{ {
if(m_hyperlinkVector.size() < j) if(m_hyperlinkVector.size() < j)
@ -313,16 +314,16 @@ void CGraphicTextInstance::Update()
isEnglish = false; isEnglish = false;
} }
} }
else //[[[아랍어 모드]]] else //[[[<EFBFBD>ƶ<EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>]]]
{ {
// 아랍어이거나 아랍어 출력중 나오는 심볼이라면 // <EFBFBD>ƶ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>̰ų<EFBFBD> <20>ƶ<EFBFBD><C6B6><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ɺ<EFBFBD><C9BA>̶<EFBFBD><CCB6>
if (Arabic_IsInPresentation(wArabicChar) || Arabic_IsInSymbol(wArabicChar)) if (Arabic_IsInPresentation(wArabicChar) || Arabic_IsInSymbol(wArabicChar))
{ {
int charWidth = __DrawCharacter(pFontTexture, dataCodePage, Arabic_ConvSymbol(wArabicText[i]), dwColor); int charWidth = __DrawCharacter(pFontTexture, dataCodePage, Arabic_ConvSymbol(wArabicText[i]), dwColor);
kHyperlink.ex += charWidth; kHyperlink.ex += charWidth;
x += charWidth; x += charWidth;
//기존 추가한 하이퍼링크의 좌표 수정. //<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>߰<EFBFBD><DFB0><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>۸<EFBFBD>ũ<EFBFBD><C5A9> <20><>ǥ <20><><EFBFBD><EFBFBD>.
for (int j = 1; j <= no_hyperlink; j++) for (int j = 1; j <= no_hyperlink; j++)
{ {
if(m_hyperlinkVector.size() < j) if(m_hyperlinkVector.size() < j)
@ -333,7 +334,7 @@ void CGraphicTextInstance::Update()
tempLink.sx += charWidth; tempLink.sx += charWidth;
} }
} }
else //영어이거나, 영어 다음에 나오는 심볼이라면, else //<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>̰ų<EFBFBD>, <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ɺ<EFBFBD><C9BA>̶<EFBFBD><CCB6>,
{ {
nEnglishBase = i; nEnglishBase = i;
isEnglish = true; isEnglish = true;
@ -355,7 +356,7 @@ void CGraphicTextInstance::Update()
int charWidth = __DrawCharacter(pFontTexture, dataCodePage, wArabicText[e], dwColor); int charWidth = __DrawCharacter(pFontTexture, dataCodePage, wArabicText[e], dwColor);
kHyperlink.ex += charWidth; kHyperlink.ex += charWidth;
//기존 추가한 하이퍼링크의 좌표 수정. //<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>߰<EFBFBD><DFB0><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>۸<EFBFBD>ũ<EFBFBD><C5A9> <20><>ǥ <20><><EFBFBD><EFBFBD>.
for (int j = 1; j <= no_hyperlink; j++) for (int j = 1; j <= no_hyperlink; j++)
{ {
if(m_hyperlinkVector.size() < j) if(m_hyperlinkVector.size() < j)
@ -383,7 +384,7 @@ void CGraphicTextInstance::Update()
if (hyperlinkStep == 1) if (hyperlinkStep == 1)
{ {
++hyperlinkStep; ++hyperlinkStep;
kHyperlink.ex = kHyperlink.sx = 0; // 실제 텍스트가 시작되는 위치 kHyperlink.ex = kHyperlink.sx = 0; // <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ؽ<EFBFBD>Ʈ<EFBFBD><C6AE> <20><><EFBFBD>۵Ǵ<DBB5> <20><>ġ
} }
else else
{ {
@ -401,7 +402,7 @@ void CGraphicTextInstance::Update()
} }
} }
else // 아랍외 다른 지역. else // <EFBFBD>ƶ<EFBFBD><EFBFBD><EFBFBD> <20>ٸ<EFBFBD> <20><><EFBFBD><EFBFBD>.
{ {
int x = 0; int x = 0;
int len; int len;
@ -440,7 +441,7 @@ void CGraphicTextInstance::Update()
if (hyperlinkStep == 1) if (hyperlinkStep == 1)
{ {
++hyperlinkStep; ++hyperlinkStep;
kHyperlink.ex = kHyperlink.sx = x; // 실제 텍스트가 시작되는 위치 kHyperlink.ex = kHyperlink.sx = x; // <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ؽ<EFBFBD>Ʈ<EFBFBD><C6AE> <20><><EFBFBD>۵Ǵ<DBB5> <20><>ġ
} }
else else
{ {
@ -460,7 +461,7 @@ void CGraphicTextInstance::Update()
if (token < end) if (token < end)
{ {
int newCodePage = ReadToken(token); int newCodePage = ReadToken(token);
dataCodePage = newCodePage; // 아랍 및 베트남 내부 데이터를 UTF8 을 사용하려 했으나 실패 dataCodePage = newCodePage; // <EFBFBD>ƶ<EFBFBD> <20><> <20><>Ʈ<EFBFBD><C6AE> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>͸<EFBFBD> UTF8 <20><> <20><><EFBFBD><EFBFBD>Ϸ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
begin = token + 5; begin = token + 5;
} }
else else
@ -570,7 +571,7 @@ void CGraphicTextInstance::Render(RECT * pClipRect)
CGraphicFontTexture::TCharacterInfomation* pCurCharInfo; CGraphicFontTexture::TCharacterInfomation* pCurCharInfo;
// 테두리 // <EFBFBD>׵θ<EFBFBD>
if (m_isOutline) if (m_isOutline)
{ {
fCurX=fStanX; fCurX=fStanX;
@ -586,7 +587,7 @@ void CGraphicTextInstance::Render(RECT * pClipRect)
fFontHeight=float(pCurCharInfo->height); fFontHeight=float(pCurCharInfo->height);
fFontAdvance=float(pCurCharInfo->advance); fFontAdvance=float(pCurCharInfo->advance);
// NOTE : 폰트 출력에 Width 제한을 둡니다. - [levites] // NOTE : <EFBFBD><EFBFBD>Ʈ <20><>¿<EFBFBD> Width <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>Ӵϴ<D3B4>. - [levites]
if ((fCurX+fFontWidth)-m_v3Position.x > m_fLimitWidth) if ((fCurX+fFontWidth)-m_v3Position.x > m_fLimitWidth)
{ {
if (m_isMultiLine) if (m_isMultiLine)
@ -600,6 +601,7 @@ void CGraphicTextInstance::Render(RECT * pClipRect)
} }
} }
#if !defined(__BL_CLIP_MASK__)
if (pClipRect) if (pClipRect)
{ {
if (fCurY <= pClipRect->top) if (fCurY <= pClipRect->top)
@ -608,23 +610,97 @@ void CGraphicTextInstance::Render(RECT * pClipRect)
continue; continue;
} }
} }
#endif
fFontSx = fCurX - 0.5f; fFontSx = fCurX - 0.5f;
fFontSy = fCurY - 0.5f; fFontSy = fCurY - 0.5f;
fFontEx = fFontSx + fFontWidth; fFontEx = fFontSx + fFontWidth;
fFontEy = fFontSy + fFontHeight; fFontEy = fFontSy + fFontHeight;
#if defined(__BL_CLIP_MASK__)
float su = pCurCharInfo->left;
float sv = pCurCharInfo->top;
float eu = pCurCharInfo->right;
float ev = pCurCharInfo->bottom;
if (pClipRect)
{
const float width = pCurCharInfo->right - pCurCharInfo->left;
const float height = pCurCharInfo->bottom - pCurCharInfo->top;
if (fFontEx <= pClipRect->left)
{
fCurX += fFontAdvance;
continue;
}
if (fFontSx < pClipRect->left)
{
su += (pClipRect->left - fFontSx) / fFontWidth * width;
fFontSx = pClipRect->left;
}
if (fFontEy <= pClipRect->top)
{
fCurX += fFontAdvance;
continue;
}
if (fFontSy < pClipRect->top)
{
sv += (pClipRect->top - fFontSy) / fFontHeight * height;
fFontSy = pClipRect->top;
}
if (fFontSx >= pClipRect->right)
{
fCurX += fFontAdvance;
continue;
}
if (fFontEx > pClipRect->right)
{
eu -= (fFontEx - pClipRect->right) / fFontWidth * width;
fFontEx = pClipRect->right;
}
if (fFontSy >= pClipRect->bottom)
{
fCurX += fFontAdvance;
continue;
}
if (fFontEy > pClipRect->bottom)
{
ev -= (fFontEy - pClipRect->bottom) / fFontHeight * height;
fFontEy = pClipRect->bottom;
}
}
pFontTexture->SelectTexture(pCurCharInfo->index); pFontTexture->SelectTexture(pCurCharInfo->index);
STATEMANAGER.SetTexture(0, pFontTexture->GetD3DTexture()); STATEMANAGER.SetTexture(0, pFontTexture->GetD3DTexture());
akVertex[0].u=pCurCharInfo->left; akVertex[0].u = su;
akVertex[0].v=pCurCharInfo->top; akVertex[0].v = sv;
akVertex[1].u=pCurCharInfo->left; akVertex[1].u = su;
akVertex[1].v=pCurCharInfo->bottom; akVertex[1].v = ev;
akVertex[2].u=pCurCharInfo->right; akVertex[2].u = eu;
akVertex[2].v=pCurCharInfo->top; akVertex[2].v = sv;
akVertex[3].u=pCurCharInfo->right; akVertex[3].u = eu;
akVertex[3].v=pCurCharInfo->bottom; akVertex[3].v = ev;
#else
pFontTexture->SelectTexture(pCurCharInfo->index);
STATEMANAGER.SetTexture(0, pFontTexture->GetD3DTexture());
akVertex[0].u = pCurCharInfo->left;
akVertex[0].v = pCurCharInfo->top;
akVertex[1].u = pCurCharInfo->left;
akVertex[1].v = pCurCharInfo->bottom;
akVertex[2].u = pCurCharInfo->right;
akVertex[2].v = pCurCharInfo->top;
akVertex[3].u = pCurCharInfo->right;
akVertex[3].v = pCurCharInfo->bottom;
#endif
akVertex[3].color = akVertex[2].color = akVertex[1].color = akVertex[0].color = m_dwOutLineColor; akVertex[3].color = akVertex[2].color = akVertex[1].color = akVertex[0].color = m_dwOutLineColor;
@ -636,7 +712,7 @@ void CGraphicTextInstance::Render(RECT * pClipRect)
akVertex[2].y=fFontSy-feather; akVertex[2].y=fFontSy-feather;
akVertex[3].y=fFontEy+feather; akVertex[3].y=fFontEy+feather;
// // <EFBFBD><EFBFBD>
akVertex[0].x=fFontSx-fFontHalfWeight-feather; akVertex[0].x=fFontSx-fFontHalfWeight-feather;
akVertex[1].x=fFontSx-fFontHalfWeight-feather; akVertex[1].x=fFontSx-fFontHalfWeight-feather;
akVertex[2].x=fFontEx-fFontHalfWeight+feather; akVertex[2].x=fFontEx-fFontHalfWeight+feather;
@ -646,7 +722,7 @@ void CGraphicTextInstance::Render(RECT * pClipRect)
STATEMANAGER.DrawPrimitive(D3DPT_TRIANGLESTRIP, 0, 2); STATEMANAGER.DrawPrimitive(D3DPT_TRIANGLESTRIP, 0, 2);
// 오른 // <EFBFBD><EFBFBD><EFBFBD><EFBFBD>
akVertex[0].x=fFontSx+fFontHalfWeight-feather; akVertex[0].x=fFontSx+fFontHalfWeight-feather;
akVertex[1].x=fFontSx+fFontHalfWeight-feather; akVertex[1].x=fFontSx+fFontHalfWeight-feather;
akVertex[2].x=fFontEx+fFontHalfWeight+feather; akVertex[2].x=fFontEx+fFontHalfWeight+feather;
@ -660,7 +736,7 @@ void CGraphicTextInstance::Render(RECT * pClipRect)
akVertex[2].x=fFontEx+feather; akVertex[2].x=fFontEx+feather;
akVertex[3].x=fFontEx+feather; akVertex[3].x=fFontEx+feather;
// // <EFBFBD><EFBFBD>
akVertex[0].y=fFontSy-fFontHalfWeight-feather; akVertex[0].y=fFontSy-fFontHalfWeight-feather;
akVertex[1].y=fFontEy-fFontHalfWeight+feather; akVertex[1].y=fFontEy-fFontHalfWeight+feather;
akVertex[2].y=fFontSy-fFontHalfWeight-feather; akVertex[2].y=fFontSy-fFontHalfWeight-feather;
@ -670,7 +746,7 @@ void CGraphicTextInstance::Render(RECT * pClipRect)
if (CGraphicBase::SetPDTStream((SPDTVertex*)akVertex, 4)) if (CGraphicBase::SetPDTStream((SPDTVertex*)akVertex, 4))
STATEMANAGER.DrawPrimitive(D3DPT_TRIANGLESTRIP, 0, 2); STATEMANAGER.DrawPrimitive(D3DPT_TRIANGLESTRIP, 0, 2);
// 아래 // <EFBFBD>Ʒ<EFBFBD>
akVertex[0].y=fFontSy+fFontHalfWeight-feather; akVertex[0].y=fFontSy+fFontHalfWeight-feather;
akVertex[1].y=fFontEy+fFontHalfWeight+feather; akVertex[1].y=fFontEy+fFontHalfWeight+feather;
akVertex[2].y=fFontSy+fFontHalfWeight-feather; akVertex[2].y=fFontSy+fFontHalfWeight-feather;
@ -684,7 +760,7 @@ void CGraphicTextInstance::Render(RECT * pClipRect)
} }
} }
// 메인 폰트 // <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>Ʈ
fCurX=fStanX; fCurX=fStanX;
fCurY=fStanY; fCurY=fStanY;
fFontMaxHeight=0.0f; fFontMaxHeight=0.0f;
@ -698,7 +774,7 @@ void CGraphicTextInstance::Render(RECT * pClipRect)
fFontMaxHeight=max(fFontHeight, pCurCharInfo->height); fFontMaxHeight=max(fFontHeight, pCurCharInfo->height);
fFontAdvance=float(pCurCharInfo->advance); fFontAdvance=float(pCurCharInfo->advance);
// NOTE : 폰트 출력에 Width 제한을 둡니다. - [levites] // NOTE : <EFBFBD><EFBFBD>Ʈ <20><>¿<EFBFBD> Width <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>Ӵϴ<D3B4>. - [levites]
if ((fCurX+fFontWidth)-m_v3Position.x > m_fLimitWidth) if ((fCurX+fFontWidth)-m_v3Position.x > m_fLimitWidth)
{ {
if (m_isMultiLine) if (m_isMultiLine)
@ -712,6 +788,7 @@ void CGraphicTextInstance::Render(RECT * pClipRect)
} }
} }
#if !defined(__BL_CLIP_MASK__)
if (pClipRect) if (pClipRect)
{ {
if (fCurY <= pClipRect->top) if (fCurY <= pClipRect->top)
@ -720,12 +797,96 @@ void CGraphicTextInstance::Render(RECT * pClipRect)
continue; continue;
} }
} }
#endif
fFontSx = fCurX-0.5f; fFontSx = fCurX-0.5f;
fFontSy = fCurY-0.5f; fFontSy = fCurY-0.5f;
fFontEx = fFontSx + fFontWidth; fFontEx = fFontSx + fFontWidth;
fFontEy = fFontSy + fFontHeight; fFontEy = fFontSy + fFontHeight;
#if defined(__BL_CLIP_MASK__)
float su = pCurCharInfo->left;
float sv = pCurCharInfo->top;
float eu = pCurCharInfo->right;
float ev = pCurCharInfo->bottom;
if (pClipRect)
{
const float width = pCurCharInfo->right - pCurCharInfo->left;
const float height = pCurCharInfo->bottom - pCurCharInfo->top;
if (fFontEx <= pClipRect->left)
{
fCurX += fFontAdvance;
continue;
}
if (fFontSx < pClipRect->left)
{
su += (pClipRect->left - fFontSx) / fFontWidth * width;
fFontSx = pClipRect->left;
}
if (fFontEy <= pClipRect->top)
{
fCurX += fFontAdvance;
continue;
}
if (fFontSy < pClipRect->top)
{
sv += (pClipRect->top - fFontSy) / fFontHeight * height;
fFontSy = pClipRect->top;
}
if (fFontSx >= pClipRect->right)
{
fCurX += fFontAdvance;
continue;
}
if (fFontEx > pClipRect->right)
{
eu -= (fFontEx - pClipRect->right) / fFontWidth * width;
fFontEx = pClipRect->right;
}
if (fFontSy >= pClipRect->bottom)
{
fCurX += fFontAdvance;
continue;
}
if (fFontEy > pClipRect->bottom)
{
ev -= (fFontEy - pClipRect->bottom) / fFontHeight * height;
fFontEy = pClipRect->bottom;
}
}
pFontTexture->SelectTexture(pCurCharInfo->index);
STATEMANAGER.SetTexture(0, pFontTexture->GetD3DTexture());
akVertex[0].x = fFontSx;
akVertex[0].y = fFontSy;
akVertex[0].u = su;
akVertex[0].v = sv;
akVertex[1].x = fFontSx;
akVertex[1].y = fFontEy;
akVertex[1].u = su;
akVertex[1].v = ev;
akVertex[2].x = fFontEx;
akVertex[2].y = fFontSy;
akVertex[2].u = eu;
akVertex[2].v = sv;
akVertex[3].x = fFontEx;
akVertex[3].y = fFontEy;
akVertex[3].u = eu;
akVertex[3].v = ev;
#else
pFontTexture->SelectTexture(pCurCharInfo->index); pFontTexture->SelectTexture(pCurCharInfo->index);
STATEMANAGER.SetTexture(0, pFontTexture->GetD3DTexture()); STATEMANAGER.SetTexture(0, pFontTexture->GetD3DTexture());
@ -748,6 +909,7 @@ void CGraphicTextInstance::Render(RECT * pClipRect)
akVertex[3].y=fFontEy; akVertex[3].y=fFontEy;
akVertex[3].u=pCurCharInfo->right; akVertex[3].u=pCurCharInfo->right;
akVertex[3].v=pCurCharInfo->bottom; akVertex[3].v=pCurCharInfo->bottom;
#endif
//m_dwColorInfoVector[i]; //m_dwColorInfoVector[i];
//m_dwTextColor; //m_dwTextColor;
@ -811,9 +973,9 @@ void CGraphicTextInstance::Render(RECT * pClipRect)
sy -= float(m_textHeight) / 2.0f; sy -= float(m_textHeight) / 2.0f;
break; break;
} }
// 최적화 사항 // <EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȭ <20><><EFBFBD><EFBFBD>
// 같은텍스쳐를 사용한다면... STRIP을 구성하고, 텍스쳐가 변경되거나 끝나면 DrawPrimitive를 호출해 // <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ؽ<EFBFBD><EFBFBD>ĸ<EFBFBD> <20><><EFBFBD><EFBFBD>Ѵٸ<D1B4>... STRIP<49><50> <20><><EFBFBD><EFBFBD><EFBFBD>ϰ<EFBFBD>, <20>ؽ<EFBFBD><D8BD>İ<EFBFBD> <20><><EFBFBD><EFBFBD>ǰų<C7B0> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> DrawPrimitive<76><65> ȣ<><C8A3><EFBFBD><EFBFBD>
// 최대한 숫자를 줄이도록하자! // <EFBFBD>ִ<EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>ڸ<EFBFBD> <20><><EFBFBD>̵<EFBFBD><CCB5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>!
TPDTVertex vertices[4]; TPDTVertex vertices[4];
vertices[0].diffuse = diffuse; vertices[0].diffuse = diffuse;
@ -865,13 +1027,13 @@ void CGraphicTextInstance::Render(RECT * pClipRect)
STATEMANAGER.SetRenderState(D3DRS_FOGENABLE, dwFogEnable); STATEMANAGER.SetRenderState(D3DRS_FOGENABLE, dwFogEnable);
STATEMANAGER.SetRenderState(D3DRS_LIGHTING, dwLighting); STATEMANAGER.SetRenderState(D3DRS_LIGHTING, dwLighting);
//금강경 링크 띄워주는 부분. //<EFBFBD>ݰ<EFBFBD><EFBFBD><EFBFBD> <20><>ũ <20><><EFBFBD><EFBFBD>ִ<EFBFBD> <20>κ<EFBFBD>.
if (m_hyperlinkVector.size() != 0) if (m_hyperlinkVector.size() != 0)
{ {
int lx = gs_mx - m_v3Position.x; int lx = gs_mx - m_v3Position.x;
int ly = gs_my - m_v3Position.y; int ly = gs_my - m_v3Position.y;
//아랍은 좌표 부호를 바꿔준다. //<EFBFBD>ƶ<EFBFBD><EFBFBD><EFBFBD> <20><>ǥ <20><>ȣ<EFBFBD><C8A3> <20>ٲ<EFBFBD><D9B2>ش<EFBFBD>.
if (GetDefaultCodePage() == CP_ARABIC) { if (GetDefaultCodePage() == CP_ARABIC) {
lx = -lx; lx = -lx;
ly = -ly + m_textHeight; ly = -ly + m_textHeight;
@ -1063,7 +1225,7 @@ WORD CGraphicTextInstance::GetTextLineCount()
float fFontAdvance=float(pCurCharInfo->advance); float fFontAdvance=float(pCurCharInfo->advance);
//float fFontHeight=float(pCurCharInfo->height); //float fFontHeight=float(pCurCharInfo->height);
// NOTE : 폰트 출력에 Width 제한을 둡니다. - [levites] // NOTE : <EFBFBD><EFBFBD>Ʈ <20><>¿<EFBFBD> Width <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>Ӵϴ<D3B4>. - [levites]
if (fx+fFontWidth > m_fLimitWidth) if (fx+fFontWidth > m_fLimitWidth)
{ {
fx = 0.0f; fx = 0.0f;
@ -1110,7 +1272,7 @@ void CGraphicTextInstance::__Initialize()
m_vAlign = VERTICAL_ALIGN_TOP; m_vAlign = VERTICAL_ALIGN_TOP;
m_iMax = 0; m_iMax = 0;
m_fLimitWidth = 1600.0f; // NOTE : 해상도의 최대치. 이보다 길게 쓸 일이 있을까? - [levites] m_fLimitWidth = 1600.0f; // NOTE : <EFBFBD>ػ<EFBFBD><EFBFBD><EFBFBD> <20>ִ<EFBFBD>ġ. <20>̺<EFBFBD><CCBA><EFBFBD> <20><><EFBFBD> <20><> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>? - [levites]
m_isCursor = false; m_isCursor = false;
m_isSecret = false; m_isSecret = false;

View File

@ -8,7 +8,6 @@ BOOL g_bOutlineBoxEnable = FALSE;
namespace UI namespace UI
{ {
CWindow::CWindow(PyObject * ppyObject) : CWindow::CWindow(PyObject * ppyObject) :
m_x(0), m_x(0),
m_y(0), m_y(0),
@ -30,6 +29,11 @@ namespace UI
m_HorizontalAlign = HORIZONTAL_ALIGN_LEFT; m_HorizontalAlign = HORIZONTAL_ALIGN_LEFT;
m_VerticalAlign = VERTICAL_ALIGN_TOP; m_VerticalAlign = VERTICAL_ALIGN_TOP;
m_rect.bottom = m_rect.left = m_rect.right = m_rect.top = 0; m_rect.bottom = m_rect.left = m_rect.right = m_rect.top = 0;
#if defined(__BL_CLIP_MASK__)
m_bEnableMask = false;
m_pMaskWindow = NULL;
memset(&m_rMaskRect, 0, sizeof(m_rMaskRect));
#endif
m_limitBiasRect.bottom = m_limitBiasRect.left = m_limitBiasRect.right = m_limitBiasRect.top = 0; m_limitBiasRect.bottom = m_limitBiasRect.left = m_limitBiasRect.right = m_limitBiasRect.top = 0;
} }
@ -66,10 +70,13 @@ namespace UI
void CWindow::Clear() void CWindow::Clear()
{ {
// FIXME : Children을 즉시 Delete하지는 않는다. #if defined(__BL_CLIP_MASK__)
// 어차피 Python쪽에서 Destroy가 하나씩 다시 호출 될 것이므로.. m_pMaskWindow = NULL;
// 하지만 만약을 위해 링크는 끊어 놓는다. #endif
// 더 좋은 형태는 있는가? - [levites] // FIXME : Children<65><6E> <20><><EFBFBD> Delete<74><65><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ʴ´<CAB4>.
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> Python<6F>ʿ<EFBFBD><CABF><EFBFBD> Destroy<6F><79> <20>ϳ<EFBFBD><CFB3><EFBFBD> <20>ٽ<EFBFBD> ȣ<><C8A3> <20><> <20><><EFBFBD>̹Ƿ<CCB9>..
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><>ũ<EFBFBD><C5A9> <20><><EFBFBD><EFBFBD> <20><><EFBFBD>´<EFBFBD>.
// <20><> <20><><EFBFBD><EFBFBD> <20><><EFBFBD>´<EFBFBD> <20>ִ°<D6B4>? - [levites]
std::for_each(m_pChildList.begin(), m_pChildList.end(), FClear()); std::for_each(m_pChildList.begin(), m_pChildList.end(), FClear());
m_pChildList.clear(); m_pChildList.clear();
@ -93,8 +100,8 @@ namespace UI
m_bShow = false; m_bShow = false;
} }
// NOTE : IsShow는 "자신이 보이는가?" 이지만, __IsShowing은 "자신이 그려지고 있는가?" 를 체크한다 // NOTE : IsShow<EFBFBD><EFBFBD> "<22>ڽ<EFBFBD><DABD><EFBFBD> <20><><EFBFBD>̴°<CCB4>?" <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>, __IsShowing<6E><67> "<22>ڽ<EFBFBD><DABD><EFBFBD> <20>׷<EFBFBD><D7B7><EFBFBD><EFBFBD><EFBFBD> <20>ִ°<D6B4>?" <20><> üũ<C3BC>Ѵ<EFBFBD>
// 자신은 Show 지만 Tree 위쪽의 Parent 중 하나는 Hide 일 수 있으므로.. - [levites] // <EFBFBD>ڽ<EFBFBD><EFBFBD><EFBFBD> Show <20><><EFBFBD><EFBFBD> Tree <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> Parent <20><> <20>ϳ<EFBFBD><CFB3><EFBFBD> Hide <20><> <20><> <20><><EFBFBD><EFBFBD><EFBFBD>Ƿ<EFBFBD>.. - [levites]
bool CWindow::IsRendering() bool CWindow::IsRendering()
{ {
if (!IsShow()) if (!IsShow())
@ -427,6 +434,41 @@ namespace UI
PyCallClassMemberFunc(m_poHandler, "OnIMEUpdate", BuildEmptyTuple()); PyCallClassMemberFunc(m_poHandler, "OnIMEUpdate", BuildEmptyTuple());
} }
#if defined(__BL_CLIP_MASK__)
void CWindow::SetClippingMaskRect(const RECT& rMask)
{
m_bEnableMask = true;
m_rMaskRect = rMask;
TWindowContainer::const_reverse_iterator itor;
for (itor = m_pChildList.rbegin(); itor != m_pChildList.rend(); ++itor)
{
CWindow* pWindow = *itor;
if (pWindow)
pWindow->SetClippingMaskRect(rMask);
}
}
void CWindow::SetClippingMaskWindow(CWindow* pMaskWindow)
{
if (!pMaskWindow)
return;
m_bEnableMask = true;
m_pMaskWindow = pMaskWindow;
TWindowContainer::const_reverse_iterator itor;
for (itor = m_pChildList.rbegin(); itor != m_pChildList.rend(); ++itor)
{
CWindow* pWindow = *itor;
if (pWindow)
pWindow->SetClippingMaskWindow(pMaskWindow);
}
}
#endif
BOOL CWindow::RunIMETabEvent() BOOL CWindow::RunIMETabEvent()
{ {
if (!IsRendering()) if (!IsRendering())
@ -577,7 +619,7 @@ namespace UI
BOOL CWindow::OnMouseLeftButtonUp() BOOL CWindow::OnMouseLeftButtonUp()
{ {
PyCallClassMemberFunc(m_poHandler, "OnMouseLeftButtonUp", BuildEmptyTuple()); PyCallClassMemberFunc(m_poHandler, "OnMouseLeftButtonUp", BuildEmptyTuple());
return TRUE; // NOTE : ButtonUp은 예외로 무조건 TRUE return TRUE; // NOTE : ButtonUp<EFBFBD><EFBFBD> <20><><EFBFBD>ܷ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> TRUE
} }
BOOL CWindow::OnMouseLeftButtonDoubleClick() BOOL CWindow::OnMouseLeftButtonDoubleClick()
@ -1027,6 +1069,23 @@ namespace UI
m_TextInstance.Update(); m_TextInstance.Update();
} }
#if defined(__BL_CLIP_MASK__)
void CTextLine::OnUpdate()
{
if (!IsShow())
return;
if (m_bEnableMask && m_pMaskWindow)
m_rMaskRect = m_pMaskWindow->GetRect();
m_TextInstance.Update();
}
void CTextLine::OnRender()
{
if (IsShow())
m_TextInstance.Render(m_bEnableMask ? &m_rMaskRect : NULL);
}
#else
void CTextLine::OnUpdate() void CTextLine::OnUpdate()
{ {
if (IsShow()) if (IsShow())
@ -1037,6 +1096,7 @@ namespace UI
if (IsShow()) if (IsShow())
m_TextInstance.Render(); m_TextInstance.Render();
} }
#endif
void CTextLine::OnChangePosition() void CTextLine::OnChangePosition()
{ {
@ -1271,9 +1331,37 @@ namespace UI
return m_pImageInstance->GetHeight(); return m_pImageInstance->GetHeight();
} }
#if defined(__BL_CLIP_MASK__)
void CImageBox::OnUpdate()
{
if (!m_pImageInstance)
return;
if (!IsShow())
return;
if (!m_bEnableMask)
return;
if (!m_pMaskWindow)
return;
m_rMaskRect = m_pMaskWindow->GetRect();
}
void CImageBox::OnRender()
{
if (!m_pImageInstance)
return;
if (IsShow())
m_pImageInstance->Render(m_bEnableMask ? &m_rMaskRect : NULL);
}
#else
void CImageBox::OnUpdate() void CImageBox::OnUpdate()
{ {
} }
void CImageBox::OnRender() void CImageBox::OnRender()
{ {
if (!m_pImageInstance) if (!m_pImageInstance)
@ -1282,6 +1370,8 @@ namespace UI
if (IsShow()) if (IsShow())
m_pImageInstance->Render(); m_pImageInstance->Render();
} }
#endif
void CImageBox::OnChangePosition() void CImageBox::OnChangePosition()
{ {
if (!m_pImageInstance) if (!m_pImageInstance)
@ -1291,7 +1381,7 @@ namespace UI
} }
/////////////////////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////////////////////
// MarkBox - 마크 출력용 UI 윈도우 // MarkBox - <EFBFBD><EFBFBD>ũ <20><>¿<EFBFBD> UI <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
/////////////////////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////////////////////
CMarkBox::CMarkBox(PyObject * ppyObject) : CWindow(ppyObject) CMarkBox::CMarkBox(PyObject * ppyObject) : CWindow(ppyObject)
{ {
@ -1742,9 +1832,41 @@ namespace UI
PyCallClassMemberFunc(m_poHandler, "DownEvent", BuildEmptyTuple()); PyCallClassMemberFunc(m_poHandler, "DownEvent", BuildEmptyTuple());
} }
#if defined(__BL_CLIP_MASK__)
void CButton::OnUpdate()
{
if (!m_bEnableMask)
return;
if (!m_pMaskWindow)
return;
m_rMaskRect = m_pMaskWindow->GetRect();
}
void CButton::OnRender()
{
if (!IsShow())
return;
if (m_pcurVisual)
{
if (m_isFlash)
if (!IsIn())
if (int(timeGetTime() / 500) % 2)
{
return;
}
m_pcurVisual->Render(m_bEnableMask ? &m_rMaskRect : NULL);
}
PyCallClassMemberFunc(m_poHandler, "OnRender", BuildEmptyTuple());
}
#else
void CButton::OnUpdate() void CButton::OnUpdate()
{ {
} }
void CButton::OnRender() void CButton::OnRender()
{ {
if (!IsShow()) if (!IsShow())
@ -1764,6 +1886,8 @@ namespace UI
PyCallClassMemberFunc(m_poHandler, "OnRender", BuildEmptyTuple()); PyCallClassMemberFunc(m_poHandler, "OnRender", BuildEmptyTuple());
} }
#endif
void CButton::OnChangePosition() void CButton::OnChangePosition()
{ {
if (m_pcurVisual) if (m_pcurVisual)

View File

@ -1,6 +1,7 @@
#pragma once #pragma once
#include "../eterBase/Utils.h" #include "../eterBase/Utils.h"
#include "../UserInterface/Locale_inc.h"
namespace UI namespace UI
{ {
@ -28,16 +29,16 @@ namespace UI
enum EFlags enum EFlags
{ {
FLAG_MOVABLE = (1 << 0), // 움직일 수 있는 창 FLAG_MOVABLE = (1 << 0), // <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20>ִ<EFBFBD> â
FLAG_LIMIT = (1 << 1), // 창이 화면을 벗어나지 않음 FLAG_LIMIT = (1 << 1), // â<EFBFBD><EFBFBD> ȭ<><C8AD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EEB3AA> <20><><EFBFBD><EFBFBD>
FLAG_SNAP = (1 << 2), // 스냅 될 수 있는 창 FLAG_SNAP = (1 << 2), // <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><> <20>ִ<EFBFBD> â
FLAG_DRAGABLE = (1 << 3), FLAG_DRAGABLE = (1 << 3),
FLAG_ATTACH = (1 << 4), // 완전히 부모에 붙어 있는 창 (For Drag / ex. ScriptWindow) FLAG_ATTACH = (1 << 4), // <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>θ<EFBFBD> <20>پ<EFBFBD> <20>ִ<EFBFBD> â (For Drag / ex. ScriptWindow)
FLAG_RESTRICT_X = (1 << 5), // 좌우 이동 제한 FLAG_RESTRICT_X = (1 << 5), // <EFBFBD>¿<EFBFBD> <20>̵<EFBFBD> <20><><EFBFBD><EFBFBD>
FLAG_RESTRICT_Y = (1 << 6), // 상하 이동 제한 FLAG_RESTRICT_Y = (1 << 6), // <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>̵<EFBFBD> <20><><EFBFBD><EFBFBD>
FLAG_NOT_CAPTURE = (1 << 7), FLAG_NOT_CAPTURE = (1 << 7),
FLAG_FLOAT = (1 << 8), // 공중에 떠있어서 순서 재배치가 되는 창 FLAG_FLOAT = (1 << 8), // <EFBFBD><EFBFBD><EFBFBD>߿<EFBFBD> <20><><EFBFBD>־ <20><><EFBFBD><EFBFBD> <20><><EFBFBD>ġ<EFBFBD><C4A1> <20>Ǵ<EFBFBD> â
FLAG_NOT_PICK = (1 << 9), // 마우스에 의해 Pick되지 않는 창 FLAG_NOT_PICK = (1 << 9), // <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> Pick<63><6B><EFBFBD><EFBFBD> <20>ʴ<EFBFBD> â
FLAG_IGNORE_SIZE = (1 << 10), FLAG_IGNORE_SIZE = (1 << 10),
FLAG_RTL = (1 << 11), // Right-to-left FLAG_RTL = (1 << 11), // Right-to-left
}; };
@ -91,8 +92,8 @@ namespace UI
bool IsIn(long x, long y); bool IsIn(long x, long y);
bool IsIn(); bool IsIn();
CWindow * PickWindow(long x, long y); CWindow * PickWindow(long x, long y);
CWindow * PickTopWindow(long x, long y); // NOTE : Children으로 내려가지 않고 상위에서만 CWindow * PickTopWindow(long x, long y); // NOTE : Children<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ʰ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// 체크 하는 특화된 함수 // üũ <20>ϴ<EFBFBD> Ưȭ<C6AF><C8AD> <20>Լ<EFBFBD>
void __RemoveReserveChildren(); void __RemoveReserveChildren();
@ -159,6 +160,10 @@ namespace UI
///////////////////////////////////// /////////////////////////////////////
virtual BOOL IsWindow() { return TRUE; } virtual BOOL IsWindow() { return TRUE; }
#if defined(__BL_CLIP_MASK__)
virtual void SetClippingMaskRect(const RECT& rMask);
virtual void SetClippingMaskWindow(CWindow* pMaskWindow);
#endif
///////////////////////////////////// /////////////////////////////////////
protected: protected:
@ -166,10 +171,10 @@ namespace UI
EHorizontalAlign m_HorizontalAlign; EHorizontalAlign m_HorizontalAlign;
EVerticalAlign m_VerticalAlign; EVerticalAlign m_VerticalAlign;
long m_x, m_y; // X,Y 상대좌표 long m_x, m_y; // X,Y <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ǥ
long m_lWidth, m_lHeight; // 크기 long m_lWidth, m_lHeight; // ũ<EFBFBD><EFBFBD>
RECT m_rect; // Global 좌표 RECT m_rect; // Global <EFBFBD><EFBFBD>ǥ
RECT m_limitBiasRect; // limit bias RECT m_limitBiasRect; // limit bias <EFBFBD><EFBFBD>
bool m_bMovable; bool m_bMovable;
bool m_bShow; bool m_bShow;
@ -183,7 +188,12 @@ namespace UI
BOOL m_isUpdatingChildren; BOOL m_isUpdatingChildren;
TWindowContainer m_pReserveChildList; TWindowContainer m_pReserveChildList;
#if defined(__BL_CLIP_MASK__)
bool m_bEnableMask;
CWindow* m_pMaskWindow;
RECT m_rMaskRect;
#endif
#ifdef _DEBUG #ifdef _DEBUG
public: public:
DWORD DEBUG_dwCounter; DWORD DEBUG_dwCounter;

View File

@ -534,7 +534,7 @@ namespace UI
if (m_pActiveWindow) if (m_pActiveWindow)
m_pActiveWindow->OnKillFocus(); m_pActiveWindow->OnKillFocus();
// 이미 락된 윈도우리스트안에 있다면 제거한다.. // <EFBFBD>̹<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><ECB8AE>Ʈ<EFBFBD>ȿ<EFBFBD> <20>ִٸ<D6B4> <20><><EFBFBD><EFBFBD><EFBFBD>Ѵ<EFBFBD>..
m_LockWindowList.remove(pWin); m_LockWindowList.remove(pWin);
if (m_pLockWindow) if (m_pLockWindow)
@ -575,8 +575,8 @@ namespace UI
if (m_pActiveWindow) if (m_pActiveWindow)
{ {
// NOTE : 누적된 Window가 많아지면 Clear를 해줘야 할까? // NOTE : <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> Window<6F><77> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> Clear<61><72> <20><><EFBFBD><EFBFBD><EFBFBD> <20>ұ<EFBFBD>?
// 일단은 중복 누적이 안되며 포커스 되는 갯수 자체가 5개 미만이니 굳이 필요하지는 않을 듯.. - [levites] // <EFBFBD>ϴ<EFBFBD><EFBFBD><EFBFBD> <20>ߺ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ȵǸ<C8B5> <20><>Ŀ<EFBFBD><C4BF> <20>Ǵ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><>ü<EFBFBD><C3BC> 5<><35> <20≯<EFBFBD><CCB8>̴<EFBFBD> <20><><EFBFBD><EFBFBD> <20>ʿ<EFBFBD><CABF><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><>.. - [levites]
m_ActiveWindowList.push_back(m_pActiveWindow); m_ActiveWindowList.push_back(m_pActiveWindow);
m_pActiveWindow->OnKillFocus(); m_pActiveWindow->OnKillFocus();
} }
@ -618,8 +618,8 @@ namespace UI
CWindow * pParentWindow = pWin->GetParent(); CWindow * pParentWindow = pWin->GetParent();
pParentWindow->SetTop(pWin); pParentWindow->SetTop(pWin);
// NOTE : Capture가 리셋된다..? - [levites] // NOTE : Capture<EFBFBD><EFBFBD> <20><><EFBFBD>µȴ<C2B5>..? - [levites]
// NOTE : 인벤토리에서 아이템을 드래그 해서 밖에다 놓을때 캡춰가 남아서 창의 버튼을 두번 눌러야 하는 버그를 위해 추가 // NOTE : <EFBFBD>κ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><EFBFBD><E5B7A1> <20>ؼ<EFBFBD> <20>ۿ<EFBFBD><DBBF><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ĸ<><20><><EFBFBD>Ƽ<EFBFBD> â<><C3A2> <20><>ư<EFBFBD><C6B0> <20>ι<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ϴ<EFBFBD> <20><><EFBFBD>׸<EFBFBD> <20><><EFBFBD><EFBFBD> <20>߰<EFBFBD>
// ResetCapture(); // ResetCapture();
} }
@ -628,7 +628,7 @@ namespace UI
if (m_pLockWindow) if (m_pLockWindow)
return; return;
// GameLayer에 속해 있는 윈도우가 피킹 됐다면 무조건 SetTop을 해준다. // GameLayer<EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>ִ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><20><>ŷ <20>ƴٸ<C6B4> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> SetTop<6F><70> <20><><EFBFBD>ش<EFBFBD>.
TLayerContainer::iterator itor = m_LayerWindowMap.find("UI"); TLayerContainer::iterator itor = m_LayerWindowMap.find("UI");
if (itor == m_LayerWindowMap.end()) if (itor == m_LayerWindowMap.end())
return; return;
@ -896,7 +896,7 @@ namespace UI
{ {
if (m_pLeftCaptureWindow->OnMouseLeftButtonUp()) if (m_pLeftCaptureWindow->OnMouseLeftButtonUp())
{ {
// NOTE : 여기서 m_pLeftCaptureWindow가 NULL 일 수 있습니다!! - [levites] // NOTE : <EFBFBD><EFBFBD><EFBFBD>⼭ m_pLeftCaptureWindow<6F><77> NULL <20><> <20><> <20>ֽ<EFBFBD><D6BD>ϴ<EFBFBD>!! - [levites]
m_pLeftCaptureWindow = NULL; m_pLeftCaptureWindow = NULL;
return; return;
} }
@ -1099,7 +1099,7 @@ namespace UI
return; return;
} }
// NOTE : 전체로 돌리지 않고 Activate되어있는 EditLine에만 보내는 이벤트 // NOTE : <EFBFBD><EFBFBD>ü<EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ʰ<EFBFBD> Activate<74>Ǿ<EFBFBD><C7BE>ִ<EFBFBD> EditLine<6E><65><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>̺<EFBFBD>Ʈ
} }
void CWindowManager::RunChangeCodePage() void CWindowManager::RunChangeCodePage()

View File

@ -3,6 +3,42 @@
#include "PythonSlotWindow.h" #include "PythonSlotWindow.h"
#include "PythonGridSlotWindow.h" #include "PythonGridSlotWindow.h"
#if defined(__BL_CLIP_MASK__)
PyObject* wndMgrSetClippingMaskRect(PyObject* poSelf, PyObject* poArgs)
{
UI::CWindow* pWindow;
if (!PyTuple_GetWindow(poArgs, 0, &pWindow))
return Py_BuildException();
RECT r;
if (!PyTuple_GetLong(poArgs, 1, &r.left))
return Py_BuildException();
if (!PyTuple_GetLong(poArgs, 2, &r.top))
return Py_BuildException();
if (!PyTuple_GetLong(poArgs, 3, &r.right))
return Py_BuildException();
if (!PyTuple_GetLong(poArgs, 4, &r.bottom))
return Py_BuildException();
pWindow->SetClippingMaskRect(r);
return Py_BuildNone();
}
PyObject* wndMgrSetClippingMaskWindow(PyObject* poSelf, PyObject* poArgs)
{
UI::CWindow* pWindow;
if (!PyTuple_GetWindow(poArgs, 0, &pWindow))
return Py_BuildException();
UI::CWindow* pMaskWindow;
if (!PyTuple_GetWindow(poArgs, 1, &pMaskWindow))
return Py_BuildException();
pWindow->SetClippingMaskWindow(pMaskWindow);
return Py_BuildNone();
}
#endif
bool PyTuple_GetWindow(PyObject* poArgs, int pos, UI::CWindow ** ppRetWindow) bool PyTuple_GetWindow(PyObject* poArgs, int pos, UI::CWindow ** ppRetWindow)
{ {
int iHandle; int iHandle;
@ -1260,7 +1296,7 @@ PyObject * wndMgrSetSlotCoolTime(PyObject * poSelf, PyObject * poArgs)
PyObject * wndMgrSetToggleSlot(PyObject * poSelf, PyObject * poArgs) PyObject * wndMgrSetToggleSlot(PyObject * poSelf, PyObject * poArgs)
{ {
assert(!"wndMgrSetToggleSlot - 사용하지 않는 함수"); assert(!"wndMgrSetToggleSlot - <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ʴ<EFBFBD> <20>Լ<EFBFBD>");
return Py_BuildNone(); return Py_BuildNone();
} }
@ -1883,13 +1919,13 @@ PyObject * wndMarkBox_SetImageFilename(PyObject * poSelf, PyObject * poArgs)
PyObject * wndMarkBox_SetImage(PyObject * poSelf, PyObject * poArgs) PyObject * wndMarkBox_SetImage(PyObject * poSelf, PyObject * poArgs)
{ {
// 아무것도 하지 않음 // <EFBFBD>ƹ<EFBFBD><EFBFBD>͵<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
return Py_BuildNone(); return Py_BuildNone();
} }
PyObject * wndMarkBox_Load(PyObject * poSelf, PyObject * poArgs) PyObject * wndMarkBox_Load(PyObject * poSelf, PyObject * poArgs)
{ {
// 아무것도 하지 않음 // <EFBFBD>ƹ<EFBFBD><EFBFBD>͵<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
return Py_BuildNone(); return Py_BuildNone();
} }
@ -2300,6 +2336,11 @@ void initwndMgr()
{ {
static PyMethodDef s_methods[] = static PyMethodDef s_methods[] =
{ {
#if defined(__BL_CLIP_MASK__)
{ "SetClippingMaskRect", wndMgrSetClippingMaskRect, METH_VARARGS },
{ "SetClippingMaskWindow", wndMgrSetClippingMaskWindow, METH_VARARGS },
#endif
// WindowManager // WindowManager
{ "SetMouseHandler", wndMgrSetMouseHandler, METH_VARARGS }, { "SetMouseHandler", wndMgrSetMouseHandler, METH_VARARGS },
{ "SetScreenSize", wndMgrSetScreenSize, METH_VARARGS }, { "SetScreenSize", wndMgrSetScreenSize, METH_VARARGS },
@ -2495,7 +2536,7 @@ void initwndMgr()
PyObject * poModule = Py_InitModule("wndMgr", s_methods); PyObject * poModule = Py_InitModule("wndMgr", s_methods);
// 하나의 딕셔너리에 너무 많은 Function이 포함 되는 것 같아 이런식으로 딕셔너리를 나누는 것을 고려 중 - [levites] // <EFBFBD>ϳ<EFBFBD><EFBFBD><EFBFBD> <20><>ųʸ<C5B3><CAB8><EFBFBD> <20>ʹ<EFBFBD> <20><><EFBFBD><EFBFBD> Function<6F><6E> <20><><EFBFBD><EFBFBD> <20>Ǵ<EFBFBD> <20><> <20><><EFBFBD><EFBFBD> <20>̷<EFBFBD><CCB7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>ųʸ<C5B3><CAB8><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><> - [levites]
// PyObject * poMgrModule = Py_InitModule("wndMgr", s_methods); // PyObject * poMgrModule = Py_InitModule("wndMgr", s_methods);
// PyObject * poTextModule = Py_InitModule("wndText", s_methods); // PyObject * poTextModule = Py_InitModule("wndText", s_methods);
// PyObject * poSlotModule = Py_InitModule("wndSlot", s_methods); // PyObject * poSlotModule = Py_InitModule("wndSlot", s_methods);

View File

@ -5,8 +5,8 @@
#define ENABLE_COSTUME_SYSTEM #define ENABLE_COSTUME_SYSTEM
#define ENABLE_ENERGY_SYSTEM #define ENABLE_ENERGY_SYSTEM
#define ENABLE_DRAGON_SOUL_SYSTEM #define ENABLE_DRAGON_SOUL_SYSTEM
#define ENABLE_NEW_EQUIPMENT_SYSTEM #define ENABLE_NEW_EQUIPMENT_SYSTEM
#define __BL_CLIP_MASK__
bool LocaleService_IsYMIR(); bool LocaleService_IsYMIR();
bool LocaleService_IsJAPAN(); bool LocaleService_IsJAPAN();

View File

@ -1507,6 +1507,12 @@ void initapp()
PyModule_AddIntConstant(poModule, "ENABLE_DRAGON_SOUL_SYSTEM", 0); PyModule_AddIntConstant(poModule, "ENABLE_DRAGON_SOUL_SYSTEM", 0);
#endif #endif
#if defined(__BL_CLIP_MASK__)
PyModule_AddIntConstant(poModule, "__BL_CLIP_MASK__", true);
#else
PyModule_AddIntConstant(poModule, "__BL_CLIP_MASK__", false);
#endif
#ifdef ENABLE_NEW_EQUIPMENT_SYSTEM #ifdef ENABLE_NEW_EQUIPMENT_SYSTEM
PyModule_AddIntConstant(poModule, "ENABLE_NEW_EQUIPMENT_SYSTEM", 1); PyModule_AddIntConstant(poModule, "ENABLE_NEW_EQUIPMENT_SYSTEM", 1);
#else #else

View File

@ -474,7 +474,7 @@ void CPythonChat::AppendChat(int iType, const char * c_szChat)
TChatSet * pChatSet = &(itor->second); TChatSet * pChatSet = &(itor->second);
//pChatLine->SetColor(itor->first, GetChatColor(iType)); //pChatLine->SetColor(itor->first, GetChatColor(iType));
// Edit Mode 를 억지로 끼워 맞추기 위해 추가 // Edit Mode <EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD>߱<EFBFBD> <20><><EFBFBD><EFBFBD> <20>߰<EFBFBD>
if (BOARD_STATE_EDIT == pChatSet->m_iBoardState) if (BOARD_STATE_EDIT == pChatSet->m_iBoardState)
{ {
ArrangeShowingChat(itor->first); ArrangeShowingChat(itor->first);
@ -512,12 +512,12 @@ DWORD CPythonChat::GetChatColor(int iType)
void CPythonChat::IgnoreCharacter(const char * c_szName) void CPythonChat::IgnoreCharacter(const char * c_szName)
{ {
TIgnoreCharacterSet::iterator itor = m_IgnoreCharacterSet.find(c_szName); TIgnoreCharacterSet::iterator itor = m_IgnoreCharacterSet.find(c_szName);
// NOTE : 이미 차단 중이라면.. // NOTE : <EFBFBD>̹<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD>̶<EFBFBD><CCB6>..
if (m_IgnoreCharacterSet.end() != itor) if (m_IgnoreCharacterSet.end() != itor)
{ {
m_IgnoreCharacterSet.erase(itor); m_IgnoreCharacterSet.erase(itor);
} }
// NOTE : 차단이 되지 않은 캐릭터라면.. // NOTE : <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> ij<><C4B3><EFBFBD>Ͷ<EFBFBD><CDB6>..
else else
{ {
m_IgnoreCharacterSet.insert(c_szName); m_IgnoreCharacterSet.insert(c_szName);
@ -771,6 +771,14 @@ void CWhisper::Render(float fx, float fy)
RECT Rect = { fx, fy, fx+m_fWidth, fy+m_fHeight }; RECT Rect = { fx, fy, fx+m_fWidth, fy+m_fHeight };
#if defined(__BL_CLIP_MASK__)
if (GetDefaultCodePage() == CP_ARABIC)
{
Rect.left = fx - m_fWidth;
Rect.right = fx;
}
#endif
for (int i = iStartLine; i >= 0; --i) for (int i = iStartLine; i >= 0; --i)
{ {
assert(i >= 0 && i < int(m_ChatLineDeque.size())); assert(i >= 0 && i < int(m_ChatLineDeque.size()));