Magic_Game/core/Node/Text.cpp

158 lines
3.1 KiB
C++
Raw Normal View History

#include "..\enodes.h"
e2d::Text::Text()
: m_bWordWrapping(false)
, m_pFont(nullptr)
, m_fWordWrappingWidth(0)
{
this->setFont(new Font());
}
e2d::Text::Text(String& text)
2017-12-15 21:51:07 +08:00
: m_bWordWrapping(false)
, m_pFont(nullptr)
, m_fWordWrappingWidth(0)
{
this->setText(text);
this->setFont(new Font());
}
e2d::Text::Text(Font * font)
2017-12-15 21:51:07 +08:00
: m_bWordWrapping(false)
, m_pFont(nullptr)
, m_fWordWrappingWidth(0)
{
this->setFont(font);
}
e2d::Text::Text(String& text, Font * font)
2017-12-15 21:51:07 +08:00
: m_bWordWrapping(false)
, m_pFont(nullptr)
, m_fWordWrappingWidth(0)
{
this->setText(text);
this->setFont(font);
}
e2d::Text::Text(String& text, String fontFamily, double fontSize, UINT32 color, UINT32 fontWeight, bool italic)
2017-12-16 15:49:48 +08:00
: m_bWordWrapping(false)
, m_pFont(nullptr)
, m_fWordWrappingWidth(0)
{
this->setText(text);
this->setFont(new Font(fontFamily, fontSize, color, fontWeight, italic));
}
e2d::Text::~Text()
{
2017-10-31 17:19:13 +08:00
SafeRelease(&m_pFont);
}
e2d::String e2d::Text::getText() const
{
return m_sText;
}
2018-02-27 21:07:43 +08:00
double e2d::Text::getWidth() const
{
return m_fWordWrappingWidth * m_fScaleX;
}
2018-02-27 21:07:43 +08:00
double e2d::Text::getRealWidth() const
{
return m_fWordWrappingWidth;
}
e2d::Font * e2d::Text::getFont() const
{
return m_pFont;
}
void e2d::Text::setText(String& text)
{
m_sText = text;
_initTextLayout();
}
void e2d::Text::setFont(Font * font)
{
if (font)
{
2017-10-31 17:19:13 +08:00
SafeRelease(&m_pFont);
m_pFont = font;
font->retain();
_initTextLayout();
}
}
void e2d::Text::setWordWrappingEnable(bool value)
{
m_bWordWrapping = value;
_initTextLayout();
}
2018-02-27 21:07:43 +08:00
void e2d::Text::setWordWrappingWidth(double wordWrapWidth)
{
2018-02-27 21:07:43 +08:00
m_fWordWrappingWidth = max(static_cast<float>(wordWrapWidth), 0);
_initTextLayout();
}
void e2d::Text::onRender()
{
2018-03-29 13:42:22 +08:00
D2D1_RECT_F textLayoutRect = D2D1::RectF(0, 0, m_bWordWrapping ? m_fWordWrappingWidth : m_fWidth, m_fHeight);
Renderer::getSolidColorBrush()->SetColor(D2D1::ColorF(m_pFont->m_Color, m_fDisplayOpacity));
Renderer::getRenderTarget()->DrawTextW(
2017-12-11 18:17:24 +08:00
m_sText,
2018-02-27 16:32:17 +08:00
static_cast<UINT32>(m_sText.getLength()),
m_pFont->_getTextFormat(),
2018-03-29 13:42:22 +08:00
textLayoutRect,
Renderer::getSolidColorBrush()
);
}
void e2d::Text::_initTextLayout()
{
// δ<><CEB4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ַ<EFBFBD><D6B7><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD>ı<EFBFBD><C4B1><EFBFBD><EFBFBD><EFBFBD>Ϊ 0
2017-12-11 18:17:24 +08:00
if (!m_pFont || m_sText.isEmpty())
{
2018-03-01 19:28:22 +08:00
this->setSize(0, 0);
m_fWordWrappingWidth = 0;
return;
}
// δ<><CEB4><EFBFBD><EFBFBD><EFBFBD>ı<EFBFBD><C4B1>Զ<EFBFBD><D4B6><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD> TextFormat <20><><EFBFBD><EFBFBD>Ϊ<EFBFBD><CEAA><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
if (!m_bWordWrapping)
{
m_pFont->_getTextFormat()->SetWordWrapping(DWRITE_WORD_WRAPPING_NO_WRAP);
}
else
{
m_pFont->_getTextFormat()->SetWordWrapping(DWRITE_WORD_WRAPPING_WRAP);
}
// <20><>ȡ TextLayout
IDWriteTextLayout * pDWriteTextLayout = nullptr;
HRESULT hr = Renderer::getIDWriteFactory()->CreateTextLayout(
2017-12-11 18:17:24 +08:00
m_sText,
2018-02-27 16:32:17 +08:00
static_cast<UINT32>(m_sText.getLength()),
m_pFont->_getTextFormat(),
m_bWordWrapping ? m_fWordWrappingWidth : 0,
0,
&pDWriteTextLayout
);
ASSERT(SUCCEEDED(hr), "Create IDWriteTextFormat Failed!");
// <20><>ȡ<EFBFBD>ı<EFBFBD><C4B1><EFBFBD><EFBFBD>ֵĿ<D6B5><C4BF>Ⱥ͸߶<CDB8>
DWRITE_TEXT_METRICS metrics;
pDWriteTextLayout->GetMetrics(&metrics);
2018-03-01 19:28:22 +08:00
this->setSize(metrics.widthIncludingTrailingWhitespace, metrics.height);
m_fWordWrappingWidth = metrics.widthIncludingTrailingWhitespace;
// ɾ<><C9BE><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Դ
SafeReleaseInterface(&pDWriteTextLayout);
}