2018-04-21 21:24:46 +08:00
|
|
|
|
#include "..\e2dnode.h"
|
2017-10-18 22:13:20 +08:00
|
|
|
|
|
2018-03-30 23:37:42 +08:00
|
|
|
|
|
2018-02-07 16:37:12 +08:00
|
|
|
|
e2d::Text::Text()
|
2018-05-08 17:40:36 +08:00
|
|
|
|
: _TextStyle()
|
|
|
|
|
|
, _pDWriteTextLayout(nullptr)
|
|
|
|
|
|
, _pDWriteTextFormat(nullptr)
|
2017-10-18 22:13:20 +08:00
|
|
|
|
{
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2018-05-07 15:48:06 +08:00
|
|
|
|
e2d::Text::Text(const String& text)
|
2018-05-08 17:40:36 +08:00
|
|
|
|
: _TextStyle()
|
|
|
|
|
|
, _pDWriteTextLayout(nullptr)
|
|
|
|
|
|
, _pDWriteTextFormat(nullptr)
|
|
|
|
|
|
, _sText(text)
|
2017-10-18 22:13:20 +08:00
|
|
|
|
{
|
2018-03-30 23:37:42 +08:00
|
|
|
|
_reset();
|
2017-10-18 22:13:20 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
2018-04-22 00:33:20 +08:00
|
|
|
|
e2d::Text::Text(TextStyle textStyle)
|
2018-05-08 17:40:36 +08:00
|
|
|
|
: _TextStyle(textStyle)
|
|
|
|
|
|
, _pDWriteTextLayout(nullptr)
|
|
|
|
|
|
, _pDWriteTextFormat(nullptr)
|
2017-10-18 22:13:20 +08:00
|
|
|
|
{
|
2018-03-30 23:37:42 +08:00
|
|
|
|
_reset();
|
2017-10-18 22:13:20 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
2018-05-07 15:48:06 +08:00
|
|
|
|
e2d::Text::Text(const String& text, TextStyle textStyle)
|
2018-05-08 17:40:36 +08:00
|
|
|
|
: _TextStyle(textStyle)
|
|
|
|
|
|
, _pDWriteTextLayout(nullptr)
|
|
|
|
|
|
, _pDWriteTextFormat(nullptr)
|
|
|
|
|
|
, _sText(text)
|
2017-10-18 22:13:20 +08:00
|
|
|
|
{
|
2018-03-30 23:37:42 +08:00
|
|
|
|
_reset();
|
2017-10-18 22:13:20 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
2018-04-22 00:33:20 +08:00
|
|
|
|
e2d::Text::Text(
|
2018-05-07 15:48:06 +08:00
|
|
|
|
const String& text,
|
|
|
|
|
|
const String& fontFamily,
|
2018-04-22 00:33:20 +08:00
|
|
|
|
double fontSize,
|
|
|
|
|
|
UINT32 color,
|
|
|
|
|
|
UINT32 fontWeight,
|
|
|
|
|
|
bool italic,
|
2018-04-24 21:22:34 +08:00
|
|
|
|
TextAlign alignment,
|
|
|
|
|
|
bool wrapping,
|
|
|
|
|
|
double wrappingWidth,
|
|
|
|
|
|
double lineSpacing,
|
2018-04-22 00:33:20 +08:00
|
|
|
|
bool hasUnderline,
|
|
|
|
|
|
bool hasStrikethrough,
|
2018-04-22 14:08:29 +08:00
|
|
|
|
bool hasOutline,
|
2018-04-22 00:33:20 +08:00
|
|
|
|
UINT32 outlineColor,
|
|
|
|
|
|
UINT32 outlineWidth
|
|
|
|
|
|
)
|
2018-05-08 17:40:36 +08:00
|
|
|
|
: _TextStyle(
|
2018-04-22 00:33:20 +08:00
|
|
|
|
fontFamily,
|
|
|
|
|
|
fontSize,
|
|
|
|
|
|
color,
|
|
|
|
|
|
fontWeight,
|
|
|
|
|
|
italic,
|
2018-04-24 21:22:34 +08:00
|
|
|
|
alignment,
|
|
|
|
|
|
wrapping,
|
|
|
|
|
|
wrappingWidth,
|
|
|
|
|
|
lineSpacing,
|
2018-04-22 00:33:20 +08:00
|
|
|
|
hasUnderline,
|
|
|
|
|
|
hasStrikethrough,
|
2018-04-22 14:08:29 +08:00
|
|
|
|
hasOutline,
|
2018-04-22 00:33:20 +08:00
|
|
|
|
outlineColor,
|
|
|
|
|
|
outlineWidth
|
|
|
|
|
|
)
|
2018-05-08 17:40:36 +08:00
|
|
|
|
, _pDWriteTextLayout(nullptr)
|
|
|
|
|
|
, _pDWriteTextFormat(nullptr)
|
|
|
|
|
|
, _sText(text)
|
2017-10-18 22:13:20 +08:00
|
|
|
|
{
|
2018-03-30 23:37:42 +08:00
|
|
|
|
_reset();
|
2017-10-18 22:13:20 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
2018-02-07 16:37:12 +08:00
|
|
|
|
e2d::Text::~Text()
|
2017-10-18 22:13:20 +08:00
|
|
|
|
{
|
2018-05-08 17:40:36 +08:00
|
|
|
|
SafeReleaseInterface(&_pDWriteTextFormat);
|
|
|
|
|
|
SafeReleaseInterface(&_pDWriteTextLayout);
|
2017-10-18 22:13:20 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
2018-02-07 16:37:12 +08:00
|
|
|
|
e2d::String e2d::Text::getText() const
|
2017-10-18 22:13:20 +08:00
|
|
|
|
{
|
2018-05-08 17:40:36 +08:00
|
|
|
|
return _sText;
|
2017-10-18 22:13:20 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
2018-04-22 00:33:20 +08:00
|
|
|
|
e2d::TextStyle e2d::Text::getTextStyle() const
|
2018-03-30 23:37:42 +08:00
|
|
|
|
{
|
2018-05-08 17:40:36 +08:00
|
|
|
|
return _TextStyle;
|
2018-03-30 23:37:42 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
e2d::String e2d::Text::getFontFamily() const
|
|
|
|
|
|
{
|
2018-05-08 17:40:36 +08:00
|
|
|
|
return _TextStyle.fontFamily;
|
2018-03-30 23:37:42 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
double e2d::Text::getFontSize() const
|
|
|
|
|
|
{
|
2018-05-08 17:40:36 +08:00
|
|
|
|
return _TextStyle.fontSize;
|
2018-03-30 23:37:42 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
UINT32 e2d::Text::getFontWeight() const
|
2017-10-18 22:13:20 +08:00
|
|
|
|
{
|
2018-05-08 17:40:36 +08:00
|
|
|
|
return _TextStyle.fontWeight;
|
2018-03-30 23:37:42 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
2018-04-22 13:15:57 +08:00
|
|
|
|
e2d::Color e2d::Text::getColor() const
|
2018-03-30 23:37:42 +08:00
|
|
|
|
{
|
2018-05-08 17:40:36 +08:00
|
|
|
|
return _TextStyle.color;
|
2018-04-22 00:33:20 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
2018-04-22 13:15:57 +08:00
|
|
|
|
e2d::Color e2d::Text::getOutlineColor() const
|
2018-04-22 00:33:20 +08:00
|
|
|
|
{
|
2018-05-08 17:40:36 +08:00
|
|
|
|
return _TextStyle.outlineColor;
|
2018-04-22 00:33:20 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
double e2d::Text::getOutlineWidth() const
|
|
|
|
|
|
{
|
2018-05-08 17:40:36 +08:00
|
|
|
|
return _TextStyle.outlineWidth;
|
2018-04-22 00:33:20 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
2018-04-24 21:22:34 +08:00
|
|
|
|
e2d::LineJoin e2d::Text::getOutlineJoin() const
|
2018-04-22 00:33:20 +08:00
|
|
|
|
{
|
2018-05-08 17:40:36 +08:00
|
|
|
|
return _TextStyle.outlineJoin;
|
2018-03-30 23:37:42 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
2018-04-09 01:07:49 +08:00
|
|
|
|
int e2d::Text::getLineCount() const
|
|
|
|
|
|
{
|
2018-05-08 17:40:36 +08:00
|
|
|
|
if (_pDWriteTextLayout)
|
2018-04-09 18:41:56 +08:00
|
|
|
|
{
|
|
|
|
|
|
DWRITE_TEXT_METRICS metrics;
|
2018-05-08 17:40:36 +08:00
|
|
|
|
_pDWriteTextLayout->GetMetrics(&metrics);
|
2018-04-09 18:41:56 +08:00
|
|
|
|
return static_cast<int>(metrics.lineCount);
|
|
|
|
|
|
}
|
|
|
|
|
|
else
|
|
|
|
|
|
{
|
|
|
|
|
|
return 0;
|
|
|
|
|
|
}
|
2018-04-09 01:07:49 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
2018-03-30 23:37:42 +08:00
|
|
|
|
bool e2d::Text::isItalic() const
|
|
|
|
|
|
{
|
2018-05-08 17:40:36 +08:00
|
|
|
|
return _TextStyle.italic;
|
2018-04-22 00:33:20 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
2018-04-22 14:08:29 +08:00
|
|
|
|
bool e2d::Text::hasStrikethrough() const
|
2018-04-22 00:33:20 +08:00
|
|
|
|
{
|
2018-05-08 17:40:36 +08:00
|
|
|
|
return _TextStyle.hasStrikethrough;
|
2018-04-22 14:08:29 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
bool e2d::Text::hasUnderline() const
|
|
|
|
|
|
{
|
2018-05-08 17:40:36 +08:00
|
|
|
|
return _TextStyle.hasUnderline;
|
2018-04-22 14:08:29 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
bool e2d::Text::hasOutline() const
|
|
|
|
|
|
{
|
2018-05-08 17:40:36 +08:00
|
|
|
|
return _TextStyle.hasOutline;
|
2017-10-18 22:13:20 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
2018-05-07 15:48:06 +08:00
|
|
|
|
void e2d::Text::setText(const String& text)
|
2017-10-18 22:13:20 +08:00
|
|
|
|
{
|
2018-05-08 17:40:36 +08:00
|
|
|
|
_sText = text;
|
2018-03-30 23:37:42 +08:00
|
|
|
|
_reset();
|
2017-10-18 22:13:20 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
2018-04-22 00:33:20 +08:00
|
|
|
|
void e2d::Text::setTextStyle(TextStyle textStyle)
|
2017-10-18 22:13:20 +08:00
|
|
|
|
{
|
2018-05-08 17:40:36 +08:00
|
|
|
|
_TextStyle = textStyle;
|
2018-03-30 23:37:42 +08:00
|
|
|
|
_reset();
|
|
|
|
|
|
}
|
2017-10-18 22:13:20 +08:00
|
|
|
|
|
2018-05-07 15:48:06 +08:00
|
|
|
|
void e2d::Text::setFontFamily(const String& fontFamily)
|
2018-03-30 23:37:42 +08:00
|
|
|
|
{
|
2018-05-08 17:40:36 +08:00
|
|
|
|
_TextStyle.fontFamily = fontFamily;
|
2018-03-30 23:37:42 +08:00
|
|
|
|
_reset();
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void e2d::Text::setFontSize(double fontSize)
|
|
|
|
|
|
{
|
2018-05-08 17:40:36 +08:00
|
|
|
|
_TextStyle.fontSize = fontSize;
|
2018-03-30 23:37:42 +08:00
|
|
|
|
_reset();
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2018-04-22 13:15:57 +08:00
|
|
|
|
void e2d::Text::setFontWeight(UINT32 fontWeight)
|
2018-03-30 23:37:42 +08:00
|
|
|
|
{
|
2018-05-08 17:40:36 +08:00
|
|
|
|
_TextStyle.fontWeight = fontWeight;
|
2018-03-30 23:37:42 +08:00
|
|
|
|
_reset();
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2018-04-22 13:15:57 +08:00
|
|
|
|
void e2d::Text::setColor(Color color)
|
2018-03-30 23:37:42 +08:00
|
|
|
|
{
|
2018-05-08 17:40:36 +08:00
|
|
|
|
_TextStyle.color = color;
|
2018-03-30 23:37:42 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void e2d::Text::setItalic(bool value)
|
|
|
|
|
|
{
|
2018-05-08 17:40:36 +08:00
|
|
|
|
_TextStyle.italic = value;
|
2018-03-30 23:37:42 +08:00
|
|
|
|
_reset();
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2018-04-24 21:22:34 +08:00
|
|
|
|
void e2d::Text::setWrapping(bool wrapping)
|
2017-10-18 22:13:20 +08:00
|
|
|
|
{
|
2018-05-08 17:40:36 +08:00
|
|
|
|
if (_TextStyle.wrapping != wrapping)
|
2018-03-30 23:37:42 +08:00
|
|
|
|
{
|
2018-05-08 17:40:36 +08:00
|
|
|
|
_TextStyle.wrapping = wrapping;
|
2018-03-30 23:37:42 +08:00
|
|
|
|
_reset();
|
|
|
|
|
|
}
|
2017-10-18 22:13:20 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
2018-04-24 21:22:34 +08:00
|
|
|
|
void e2d::Text::setWrappingWidth(double fWrappingWidth)
|
|
|
|
|
|
{
|
2018-05-08 17:40:36 +08:00
|
|
|
|
if (_TextStyle.wrappingWidth != fWrappingWidth)
|
2018-04-24 21:22:34 +08:00
|
|
|
|
{
|
2018-05-08 17:40:36 +08:00
|
|
|
|
_TextStyle.wrappingWidth = max(fWrappingWidth, 0);
|
2018-04-24 21:22:34 +08:00
|
|
|
|
|
2018-05-08 17:40:36 +08:00
|
|
|
|
if (_TextStyle.wrapping)
|
2018-04-24 21:22:34 +08:00
|
|
|
|
{
|
|
|
|
|
|
_reset();
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2018-03-30 01:41:29 +08:00
|
|
|
|
void e2d::Text::setLineSpacing(double fLineSpacing)
|
2017-10-18 22:13:20 +08:00
|
|
|
|
{
|
2018-05-08 17:40:36 +08:00
|
|
|
|
if (_TextStyle.lineSpacing != fLineSpacing)
|
2018-03-30 01:41:29 +08:00
|
|
|
|
{
|
2018-05-08 17:40:36 +08:00
|
|
|
|
_TextStyle.lineSpacing = fLineSpacing;
|
2018-03-30 23:37:42 +08:00
|
|
|
|
_reset();
|
2018-03-30 01:41:29 +08:00
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2018-04-24 21:22:34 +08:00
|
|
|
|
void e2d::Text::setAlignment(TextAlign align)
|
2018-03-30 01:41:29 +08:00
|
|
|
|
{
|
2018-05-08 17:40:36 +08:00
|
|
|
|
if (_TextStyle.alignment != align)
|
2018-03-30 01:41:29 +08:00
|
|
|
|
{
|
2018-05-08 17:40:36 +08:00
|
|
|
|
_TextStyle.alignment = align;
|
2018-03-30 23:37:42 +08:00
|
|
|
|
_reset();
|
2018-03-30 01:41:29 +08:00
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void e2d::Text::setUnderline(bool hasUnderline)
|
|
|
|
|
|
{
|
2018-05-08 17:40:36 +08:00
|
|
|
|
if (_TextStyle.hasUnderline != hasUnderline)
|
2018-03-30 01:41:29 +08:00
|
|
|
|
{
|
2018-05-08 17:40:36 +08:00
|
|
|
|
_TextStyle.hasUnderline = hasUnderline;
|
|
|
|
|
|
if (!_pDWriteTextFormat)
|
2018-03-30 23:37:42 +08:00
|
|
|
|
_createFormat();
|
|
|
|
|
|
_createLayout();
|
2018-03-30 01:41:29 +08:00
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void e2d::Text::setStrikethrough(bool hasStrikethrough)
|
|
|
|
|
|
{
|
2018-05-08 17:40:36 +08:00
|
|
|
|
if (_TextStyle.hasStrikethrough != hasStrikethrough)
|
2018-03-30 01:41:29 +08:00
|
|
|
|
{
|
2018-05-08 17:40:36 +08:00
|
|
|
|
_TextStyle.hasStrikethrough = hasStrikethrough;
|
|
|
|
|
|
if (!_pDWriteTextFormat)
|
2018-03-30 23:37:42 +08:00
|
|
|
|
_createFormat();
|
|
|
|
|
|
_createLayout();
|
2018-03-30 01:41:29 +08:00
|
|
|
|
}
|
2017-10-18 22:13:20 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
2018-04-22 14:08:29 +08:00
|
|
|
|
void e2d::Text::setOutline(bool hasOutline)
|
2018-04-22 00:33:20 +08:00
|
|
|
|
{
|
2018-05-08 17:40:36 +08:00
|
|
|
|
_TextStyle.hasOutline = hasOutline;
|
2018-04-22 00:33:20 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
2018-04-22 13:15:57 +08:00
|
|
|
|
void e2d::Text::setOutlineColor(Color outlineColor)
|
2018-04-22 00:33:20 +08:00
|
|
|
|
{
|
2018-05-08 17:40:36 +08:00
|
|
|
|
_TextStyle.outlineColor = outlineColor;
|
2018-04-22 00:33:20 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void e2d::Text::setOutlineWidth(double outlineWidth)
|
|
|
|
|
|
{
|
2018-05-08 17:40:36 +08:00
|
|
|
|
_TextStyle.outlineWidth = outlineWidth;
|
2018-04-22 00:33:20 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
2018-04-24 21:22:34 +08:00
|
|
|
|
void e2d::Text::setOutlineJoin(LineJoin outlineJoin)
|
2018-04-22 00:33:20 +08:00
|
|
|
|
{
|
2018-05-08 17:40:36 +08:00
|
|
|
|
_TextStyle.outlineJoin = outlineJoin;
|
2018-04-22 00:33:20 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
2018-02-07 16:37:12 +08:00
|
|
|
|
void e2d::Text::onRender()
|
2017-10-18 22:13:20 +08:00
|
|
|
|
{
|
2018-05-08 17:40:36 +08:00
|
|
|
|
if (_pDWriteTextLayout)
|
2018-03-30 01:41:29 +08:00
|
|
|
|
{
|
2018-04-22 00:33:20 +08:00
|
|
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD>ı<EFBFBD><C4B1><EFBFBD><EFBFBD><EFBFBD>
|
2018-05-08 17:40:36 +08:00
|
|
|
|
D2D1_RECT_F textLayoutRect = D2D1::RectF(0, 0, _fWidth, _fHeight);
|
2018-04-22 00:33:20 +08:00
|
|
|
|
// <20><><EFBFBD>û<EFBFBD>ˢ<EFBFBD><CBA2>ɫ<EFBFBD><C9AB><EFBFBD><CDB8><EFBFBD><EFBFBD>
|
2018-05-08 17:40:36 +08:00
|
|
|
|
Renderer::getSolidColorBrush()->SetOpacity(_fDisplayOpacity);
|
2018-04-22 00:33:20 +08:00
|
|
|
|
// <20><>ȡ<EFBFBD>ı<EFBFBD><C4B1><EFBFBD>Ⱦ<EFBFBD><C8BE>
|
|
|
|
|
|
auto pTextRenderer = Renderer::getCustomTextRenderer();
|
|
|
|
|
|
pTextRenderer->SetTextStyle(
|
2018-05-08 17:40:36 +08:00
|
|
|
|
_TextStyle.color.toColorF(),
|
|
|
|
|
|
_TextStyle.hasOutline,
|
|
|
|
|
|
_TextStyle.outlineColor.toColorF(),
|
|
|
|
|
|
static_cast<FLOAT>(_TextStyle.outlineWidth),
|
|
|
|
|
|
D2D1_LINE_JOIN(_TextStyle.outlineJoin)
|
2018-03-30 01:41:29 +08:00
|
|
|
|
);
|
2018-05-08 17:40:36 +08:00
|
|
|
|
_pDWriteTextLayout->Draw(NULL, pTextRenderer, 0, 0);
|
2018-03-30 01:41:29 +08:00
|
|
|
|
}
|
2017-10-18 22:13:20 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
2018-03-30 23:37:42 +08:00
|
|
|
|
void e2d::Text::_reset()
|
2017-10-18 22:13:20 +08:00
|
|
|
|
{
|
2018-03-30 23:37:42 +08:00
|
|
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD>ʽ<EFBFBD><CABD>
|
|
|
|
|
|
_createFormat();
|
|
|
|
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֲ<EFBFBD><D6B2><EFBFBD>
|
|
|
|
|
|
_createLayout();
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void e2d::Text::_createFormat()
|
|
|
|
|
|
{
|
2018-05-08 17:40:36 +08:00
|
|
|
|
SafeReleaseInterface(&_pDWriteTextFormat);
|
2018-03-30 23:37:42 +08:00
|
|
|
|
|
|
|
|
|
|
HRESULT hr = Renderer::getIDWriteFactory()->CreateTextFormat(
|
2018-05-08 17:40:36 +08:00
|
|
|
|
_TextStyle.fontFamily,
|
2018-03-30 23:37:42 +08:00
|
|
|
|
NULL,
|
2018-05-08 17:40:36 +08:00
|
|
|
|
DWRITE_FONT_WEIGHT(_TextStyle.fontWeight),
|
|
|
|
|
|
_TextStyle.italic ? DWRITE_FONT_STYLE_ITALIC : DWRITE_FONT_STYLE_NORMAL,
|
2018-03-30 23:37:42 +08:00
|
|
|
|
DWRITE_FONT_STRETCH_NORMAL,
|
2018-05-08 17:40:36 +08:00
|
|
|
|
static_cast<float>(_TextStyle.fontSize),
|
2018-04-17 11:41:33 +08:00
|
|
|
|
L"",
|
2018-05-08 17:40:36 +08:00
|
|
|
|
&_pDWriteTextFormat
|
2018-03-30 23:37:42 +08:00
|
|
|
|
);
|
|
|
|
|
|
|
|
|
|
|
|
ASSERT(SUCCEEDED(hr), "Create IDWriteTextFormat Failed!");
|
|
|
|
|
|
|
2018-05-08 17:40:36 +08:00
|
|
|
|
if (_pDWriteTextFormat)
|
2017-10-18 22:13:20 +08:00
|
|
|
|
{
|
2018-03-30 23:37:42 +08:00
|
|
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֶ<EFBFBD><D6B6>뷽ʽ
|
2018-05-08 17:40:36 +08:00
|
|
|
|
_pDWriteTextFormat->SetTextAlignment(DWRITE_TEXT_ALIGNMENT(_TextStyle.alignment));
|
2018-03-30 23:37:42 +08:00
|
|
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD>м<EFBFBD><D0BC><EFBFBD>
|
2018-05-08 17:40:36 +08:00
|
|
|
|
if (_TextStyle.lineSpacing == 0.0)
|
2018-03-30 23:37:42 +08:00
|
|
|
|
{
|
2018-05-08 17:40:36 +08:00
|
|
|
|
_pDWriteTextFormat->SetLineSpacing(DWRITE_LINE_SPACING_METHOD_DEFAULT, 0, 0);
|
2018-03-30 23:37:42 +08:00
|
|
|
|
}
|
|
|
|
|
|
else
|
|
|
|
|
|
{
|
2018-05-08 17:40:36 +08:00
|
|
|
|
_pDWriteTextFormat->SetLineSpacing(
|
2018-03-30 23:37:42 +08:00
|
|
|
|
DWRITE_LINE_SPACING_METHOD_UNIFORM,
|
2018-05-08 17:40:36 +08:00
|
|
|
|
static_cast<FLOAT>(_TextStyle.lineSpacing),
|
|
|
|
|
|
static_cast<FLOAT>(_TextStyle.lineSpacing) * 0.8f
|
2018-03-30 23:37:42 +08:00
|
|
|
|
);
|
|
|
|
|
|
}
|
|
|
|
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD>ı<EFBFBD><C4B1>Զ<EFBFBD><D4B6><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EFBFBD>û<EFBFBD><C3BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
2018-05-08 17:40:36 +08:00
|
|
|
|
if (_TextStyle.wrapping)
|
2018-03-30 23:37:42 +08:00
|
|
|
|
{
|
2018-05-08 17:40:36 +08:00
|
|
|
|
_pDWriteTextFormat->SetWordWrapping(DWRITE_WORD_WRAPPING_WRAP);
|
2018-03-30 23:37:42 +08:00
|
|
|
|
}
|
|
|
|
|
|
else
|
|
|
|
|
|
{
|
2018-05-08 17:40:36 +08:00
|
|
|
|
_pDWriteTextFormat->SetWordWrapping(DWRITE_WORD_WRAPPING_NO_WRAP);
|
2018-03-30 23:37:42 +08:00
|
|
|
|
}
|
2017-10-18 22:13:20 +08:00
|
|
|
|
}
|
2018-03-30 23:37:42 +08:00
|
|
|
|
}
|
2017-10-18 22:13:20 +08:00
|
|
|
|
|
2018-03-30 23:37:42 +08:00
|
|
|
|
void e2d::Text::_createLayout()
|
|
|
|
|
|
{
|
2018-05-08 17:40:36 +08:00
|
|
|
|
SafeReleaseInterface(&_pDWriteTextLayout);
|
2018-03-30 23:37:42 +08:00
|
|
|
|
|
|
|
|
|
|
// <20>ı<EFBFBD>Ϊ<EFBFBD><CEAA><EFBFBD>ַ<EFBFBD><D6B7><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
2018-05-08 17:40:36 +08:00
|
|
|
|
if (_sText.isEmpty())
|
2017-10-18 22:13:20 +08:00
|
|
|
|
{
|
2018-03-30 23:37:42 +08:00
|
|
|
|
this->setSize(0, 0);
|
|
|
|
|
|
return;
|
2017-10-18 22:13:20 +08:00
|
|
|
|
}
|
2018-03-30 23:37:42 +08:00
|
|
|
|
|
2018-05-08 17:40:36 +08:00
|
|
|
|
if (_pDWriteTextFormat == nullptr)
|
2017-10-18 22:13:20 +08:00
|
|
|
|
{
|
2018-05-08 17:40:36 +08:00
|
|
|
|
WARN_IF(true, "Text::_createLayout failed! _pDWriteTextFormat NULL pointer exception.");
|
2018-03-30 23:37:42 +08:00
|
|
|
|
return;
|
2017-10-18 22:13:20 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
2018-05-08 17:40:36 +08:00
|
|
|
|
UINT32 length = static_cast<UINT32>(_sText.getLength());
|
2017-10-18 22:13:20 +08:00
|
|
|
|
|
2018-03-30 23:37:42 +08:00
|
|
|
|
// <20><><EFBFBD><EFBFBD> TextLayout
|
|
|
|
|
|
HRESULT hr;
|
|
|
|
|
|
// <20><><EFBFBD>ı<EFBFBD><C4B1>Զ<EFBFBD><D4B6><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>½<EFBFBD><C2BD>д<EFBFBD><D0B4><EFBFBD>
|
2018-05-08 17:40:36 +08:00
|
|
|
|
if (_TextStyle.wrapping)
|
2018-03-30 23:37:42 +08:00
|
|
|
|
{
|
|
|
|
|
|
hr = Renderer::getIDWriteFactory()->CreateTextLayout(
|
2018-05-08 17:40:36 +08:00
|
|
|
|
_sText,
|
2018-03-30 23:37:42 +08:00
|
|
|
|
length,
|
2018-05-08 17:40:36 +08:00
|
|
|
|
_pDWriteTextFormat,
|
|
|
|
|
|
static_cast<FLOAT>(_TextStyle.wrappingWidth),
|
2018-03-30 23:37:42 +08:00
|
|
|
|
0,
|
2018-05-08 17:40:36 +08:00
|
|
|
|
&_pDWriteTextLayout
|
2018-03-30 23:37:42 +08:00
|
|
|
|
);
|
2018-05-08 17:40:36 +08:00
|
|
|
|
if (_pDWriteTextLayout)
|
2018-03-30 23:37:42 +08:00
|
|
|
|
{
|
|
|
|
|
|
// <20><>ȡ<EFBFBD>ı<EFBFBD><C4B1><EFBFBD><EFBFBD>ֵĿ<D6B5><C4BF>Ⱥ߶<CDB8>
|
|
|
|
|
|
DWRITE_TEXT_METRICS metrics;
|
2018-05-08 17:40:36 +08:00
|
|
|
|
_pDWriteTextLayout->GetMetrics(&metrics);
|
2018-03-30 23:37:42 +08:00
|
|
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD>ı<EFBFBD><C4B1><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
|
this->setSize(metrics.layoutWidth, metrics.height);
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
else
|
|
|
|
|
|
{
|
2018-05-08 17:40:36 +08:00
|
|
|
|
hr = Renderer::getIDWriteFactory()->CreateTextLayout(_sText, length, _pDWriteTextFormat, 0, 0, &_pDWriteTextLayout);
|
2018-03-30 23:37:42 +08:00
|
|
|
|
// Ϊ<><CEAA>ֹ<EFBFBD>ı<EFBFBD><C4B1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>⣬<EFBFBD><E2A3AC><EFBFBD>ݸղŴ<D5B2><C5B4><EFBFBD><EFBFBD><EFBFBD> layout <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>´<EFBFBD><C2B4><EFBFBD><EFBFBD><EFBFBD>
|
2018-05-08 17:40:36 +08:00
|
|
|
|
if (_pDWriteTextLayout)
|
2018-03-30 23:37:42 +08:00
|
|
|
|
{
|
|
|
|
|
|
// <20><>ȡ<EFBFBD>ı<EFBFBD><C4B1><EFBFBD><EFBFBD>ֵĿ<D6B5><C4BF>Ⱥ߶<CDB8>
|
|
|
|
|
|
DWRITE_TEXT_METRICS metrics;
|
2018-05-08 17:40:36 +08:00
|
|
|
|
_pDWriteTextLayout->GetMetrics(&metrics);
|
2018-03-30 23:37:42 +08:00
|
|
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD>ı<EFBFBD><C4B1><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
|
this->setSize(metrics.width, metrics.height);
|
|
|
|
|
|
// <20><><EFBFBD>´<EFBFBD><C2B4><EFBFBD> layout
|
2018-05-08 17:40:36 +08:00
|
|
|
|
SafeReleaseInterface(&_pDWriteTextLayout);
|
|
|
|
|
|
hr = Renderer::getIDWriteFactory()->CreateTextLayout(_sText, length, _pDWriteTextFormat, _fWidth, 0, &_pDWriteTextLayout);
|
2018-03-30 23:37:42 +08:00
|
|
|
|
}
|
|
|
|
|
|
}
|
2017-10-18 22:13:20 +08:00
|
|
|
|
|
|
|
|
|
|
ASSERT(SUCCEEDED(hr), "Create IDWriteTextFormat Failed!");
|
|
|
|
|
|
|
2018-03-30 01:41:29 +08:00
|
|
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD>»<EFBFBD><C2BB>ߺ<EFBFBD>ɾ<EFBFBD><C9BE><EFBFBD><EFBFBD>
|
2018-04-01 13:28:32 +08:00
|
|
|
|
DWRITE_TEXT_RANGE range = { 0, length };
|
2018-05-08 17:40:36 +08:00
|
|
|
|
if (_TextStyle.hasUnderline)
|
2018-03-30 01:41:29 +08:00
|
|
|
|
{
|
2018-05-08 17:40:36 +08:00
|
|
|
|
_pDWriteTextLayout->SetUnderline(true, range);
|
2018-03-30 01:41:29 +08:00
|
|
|
|
}
|
2018-05-08 17:40:36 +08:00
|
|
|
|
if (_TextStyle.hasStrikethrough)
|
2018-03-30 01:41:29 +08:00
|
|
|
|
{
|
2018-05-08 17:40:36 +08:00
|
|
|
|
_pDWriteTextLayout->SetStrikethrough(true, range);
|
2018-03-30 01:41:29 +08:00
|
|
|
|
}
|
2017-10-18 22:13:20 +08:00
|
|
|
|
}
|