[deploy] add FontStretch

This commit is contained in:
Nomango 2020-08-05 01:55:42 +08:00
parent 7a263cd40a
commit 3d40f5cfe2
7 changed files with 66 additions and 29 deletions

View File

@ -143,7 +143,7 @@ void RenderContextImpl::DrawTextLayout(const TextLayout& layout, const Point& of
if (layout.GetOutlineStrokeStyle()) if (layout.GetOutlineStrokeStyle())
{ {
outline_width = layout.GetOutlineStrokeStyle()->GetStrokeWidth(); outline_width = layout.GetOutlineStrokeStyle()->GetWidth();
} }
HRESULT hr = text_renderer_->DrawTextLayout(native.Get(), offset.x, offset.y, fill_brush.Get(), HRESULT hr = text_renderer_->DrawTextLayout(native.Get(), offset.x, offset.y, fill_brush.Get(),
@ -170,7 +170,7 @@ void RenderContextImpl::DrawShape(const Shape& shape)
auto geometry = NativePtr::Get<ID2D1Geometry>(shape); auto geometry = NativePtr::Get<ID2D1Geometry>(shape);
auto brush = NativePtr::Get<ID2D1Brush>(current_brush_); auto brush = NativePtr::Get<ID2D1Brush>(current_brush_);
auto stroke_style = NativePtr::Get<ID2D1StrokeStyle>(current_stroke_); auto stroke_style = NativePtr::Get<ID2D1StrokeStyle>(current_stroke_);
float stroke_width = current_stroke_ ? current_stroke_->GetStrokeWidth() : 1.0f; float stroke_width = current_stroke_ ? current_stroke_->GetWidth() : 1.0f;
render_target_->DrawGeometry(geometry.Get(), brush.Get(), stroke_width, stroke_style.Get()); render_target_->DrawGeometry(geometry.Get(), brush.Get(), stroke_width, stroke_style.Get());
@ -185,7 +185,7 @@ void RenderContextImpl::DrawLine(const Point& point1, const Point& point2)
auto brush = NativePtr::Get<ID2D1Brush>(current_brush_); auto brush = NativePtr::Get<ID2D1Brush>(current_brush_);
auto stroke_style = NativePtr::Get<ID2D1StrokeStyle>(current_stroke_); auto stroke_style = NativePtr::Get<ID2D1StrokeStyle>(current_stroke_);
float stroke_width = current_stroke_ ? current_stroke_->GetStrokeWidth() : 1.0f; float stroke_width = current_stroke_ ? current_stroke_->GetWidth() : 1.0f;
render_target_->DrawLine(DX::ConvertToPoint2F(point1), DX::ConvertToPoint2F(point2), brush.Get(), stroke_width, render_target_->DrawLine(DX::ConvertToPoint2F(point1), DX::ConvertToPoint2F(point2), brush.Get(), stroke_width,
stroke_style.Get()); stroke_style.Get());
@ -200,7 +200,7 @@ void RenderContextImpl::DrawRectangle(const Rect& rect)
auto brush = NativePtr::Get<ID2D1Brush>(current_brush_); auto brush = NativePtr::Get<ID2D1Brush>(current_brush_);
auto stroke_style = NativePtr::Get<ID2D1StrokeStyle>(current_stroke_); auto stroke_style = NativePtr::Get<ID2D1StrokeStyle>(current_stroke_);
float stroke_width = current_stroke_ ? current_stroke_->GetStrokeWidth() : 1.0f; float stroke_width = current_stroke_ ? current_stroke_->GetWidth() : 1.0f;
render_target_->DrawRectangle(DX::ConvertToRectF(rect), brush.Get(), stroke_width, stroke_style.Get()); render_target_->DrawRectangle(DX::ConvertToRectF(rect), brush.Get(), stroke_width, stroke_style.Get());
@ -214,7 +214,7 @@ void RenderContextImpl::DrawRoundedRectangle(const Rect& rect, const Vec2& radiu
auto brush = NativePtr::Get<ID2D1Brush>(current_brush_); auto brush = NativePtr::Get<ID2D1Brush>(current_brush_);
auto stroke_style = NativePtr::Get<ID2D1StrokeStyle>(current_stroke_); auto stroke_style = NativePtr::Get<ID2D1StrokeStyle>(current_stroke_);
float stroke_width = current_stroke_ ? current_stroke_->GetStrokeWidth() : 1.0f; float stroke_width = current_stroke_ ? current_stroke_->GetWidth() : 1.0f;
render_target_->DrawRoundedRectangle(D2D1::RoundedRect(DX::ConvertToRectF(rect), radius.x, radius.y), brush.Get(), render_target_->DrawRoundedRectangle(D2D1::RoundedRect(DX::ConvertToRectF(rect), radius.x, radius.y), brush.Get(),
stroke_width, stroke_style.Get()); stroke_width, stroke_style.Get());
@ -229,7 +229,7 @@ void RenderContextImpl::DrawEllipse(const Point& center, const Vec2& radius)
auto brush = NativePtr::Get<ID2D1Brush>(current_brush_); auto brush = NativePtr::Get<ID2D1Brush>(current_brush_);
auto stroke_style = NativePtr::Get<ID2D1StrokeStyle>(current_stroke_); auto stroke_style = NativePtr::Get<ID2D1StrokeStyle>(current_stroke_);
float stroke_width = current_stroke_ ? current_stroke_->GetStrokeWidth() : 1.0f; float stroke_width = current_stroke_ ? current_stroke_->GetWidth() : 1.0f;
render_target_->DrawEllipse(D2D1::Ellipse(DX::ConvertToPoint2F(center), radius.x, radius.y), brush.Get(), render_target_->DrawEllipse(D2D1::Ellipse(DX::ConvertToPoint2F(center), radius.x, radius.y), brush.Get(),
stroke_width, stroke_style.Get()); stroke_width, stroke_style.Get());

View File

@ -607,8 +607,8 @@ void RendererImpl::CreateTextLayout(TextLayout& layout, const String& content, c
float font_size = font->GetSize(); float font_size = font->GetSize();
auto font_weight = DWRITE_FONT_WEIGHT(font->GetWeight()); auto font_weight = DWRITE_FONT_WEIGHT(font->GetWeight());
bool is_italic = (font->GetPosture() == FontPosture::Italic); auto font_style = DWRITE_FONT_STYLE(font->GetPosture());
auto font_style = is_italic ? DWRITE_FONT_STYLE_ITALIC : DWRITE_FONT_STYLE_NORMAL; auto font_stretch = DWRITE_FONT_STRETCH(font->GetStretch());
auto collection = NativePtr::Get<IDWriteFontCollection>(font); auto collection = NativePtr::Get<IDWriteFontCollection>(font);
WideString font_family; WideString font_family;
@ -620,8 +620,8 @@ void RendererImpl::CreateTextLayout(TextLayout& layout, const String& content, c
} }
ComPtr<IDWriteTextFormat> format; ComPtr<IDWriteTextFormat> format;
hr = d2d_res_->CreateTextFormat(format, font_family.c_str(), collection, font_weight, font_style, hr = d2d_res_->CreateTextFormat(format, font_family.c_str(), collection, font_weight, font_style, font_stretch,
DWRITE_FONT_STRETCH_NORMAL, font_size); font_size);
if (SUCCEEDED(hr)) if (SUCCEEDED(hr))
{ {

View File

@ -87,14 +87,16 @@ FontPtr Font::Preload(const Resource& resource)
Font::Font() Font::Font()
: size_(18.0f) : size_(18.0f)
, weight_(FontWeight::Normal) , weight_(FontWeight::Normal)
, posture_(FontPosture::Regular) , posture_(FontPosture::Normal)
, stretch_(FontStretch::Normal)
{ {
} }
Font::Font(const String& family_name, float size, uint32_t weight, FontPosture posture) Font::Font(const String& family_name, float size, uint32_t weight, FontPosture posture, FontStretch stretch)
: size_(size) : size_(size)
, weight_(weight) , weight_(weight)
, posture_(posture) , posture_(posture)
, stretch_(stretch)
{ {
if (family_name.empty()) if (family_name.empty())
return; return;

View File

@ -46,7 +46,7 @@ struct FontWeight
Light = 300U, Light = 300U,
Normal = 400U, ///< Õý³£ Normal = 400U, ///< Õý³£
Medium = 500U, Medium = 500U,
Bold = 700U, Bold = 700U, ///< 加粗
ExtraBold = 800U, ExtraBold = 800U,
Black = 900U, Black = 900U,
ExtraBlack = 950U ExtraBlack = 950U
@ -59,10 +59,29 @@ struct FontWeight
*/ */
enum class FontPosture enum class FontPosture
{ {
Regular, ///< Õý³£ Normal, ///< 正常
Oblique, ///< 倾斜体
Italic, ///< бÌå Italic, ///< бÌå
}; };
/**
* \~chinese
* @brief
*/
enum class FontStretch
{
Unknown,
UltraCondensed,
ExtraCondensed,
Condensed, ///< 压缩
SemiCondensed,
Normal, ///< 正常
SemiExpanded,
Expanded, ///< 扩大
ExtraExpanded,
UltraExpanded,
};
/** /**
* \~chinese * \~chinese
* @brief ×ÖÌå * @brief ×ÖÌå
@ -91,7 +110,7 @@ public:
/// @param weight ×ÖÌå´Öϸ /// @param weight ×ÖÌå´Öϸ
/// @param posture ×ÖÌåÐÎ̬ /// @param posture ×ÖÌåÐÎ̬
Font(const String& family_name, float size, uint32_t weight = FontWeight::Normal, Font(const String& family_name, float size, uint32_t weight = FontWeight::Normal,
FontPosture posture = FontPosture::Regular); FontPosture posture = FontPosture::Normal, FontStretch stretch = FontStretch::Normal);
/// \~chinese /// \~chinese
/// @brief »ñÈ¡×ÖÌå×å /// @brief »ñÈ¡×ÖÌå×å
@ -109,6 +128,10 @@ public:
/// @brief »ñÈ¡×ÖÌåÐÎ̬ /// @brief »ñÈ¡×ÖÌåÐÎ̬
FontPosture GetPosture() const; FontPosture GetPosture() const;
/// \~chinese
/// @brief 获取字体拉伸
FontStretch GetStretch() const;
protected: protected:
/// \~chinese /// \~chinese
/// @brief »ñÈ¡×ÖÌå×å /// @brief »ñÈ¡×ÖÌå×å
@ -118,6 +141,7 @@ protected:
float size_; float size_;
uint32_t weight_; uint32_t weight_;
FontPosture posture_; FontPosture posture_;
FontStretch stretch_;
String family_name_; String family_name_;
}; };
@ -195,6 +219,11 @@ inline FontPosture Font::GetPosture() const
return posture_; return posture_;
} }
inline FontStretch Font::GetStretch() const
{
return stretch_;
}
inline void Font::SetFamilyName(const String& name) inline void Font::SetFamilyName(const String& name)
{ {
family_name_ = name; family_name_ = name;

View File

@ -32,7 +32,7 @@ StrokeStyle::StrokeStyle(float width, CapStyle cap, LineJoinStyle line_join)
StrokeStyle::StrokeStyle(float width, CapStyle cap, LineJoinStyle line_join, DashStyle dash, float dash_offset) StrokeStyle::StrokeStyle(float width, CapStyle cap, LineJoinStyle line_join, DashStyle dash, float dash_offset)
: StrokeStyle() : StrokeStyle()
{ {
SetStrokeWidth(width); SetWidth(width);
SetCapStyle(cap); SetCapStyle(cap);
SetLineJoinStyle(line_join); SetLineJoinStyle(line_join);
SetDashStyle(dash); SetDashStyle(dash);
@ -43,7 +43,7 @@ StrokeStyle::StrokeStyle(float width, CapStyle cap, LineJoinStyle line_join, con
float dash_offset) float dash_offset)
: StrokeStyle() : StrokeStyle()
{ {
SetStrokeWidth(width); SetWidth(width);
SetCapStyle(cap); SetCapStyle(cap);
SetLineJoinStyle(line_join); SetLineJoinStyle(line_join);
SetDashStyle(dash_array, dash_size); SetDashStyle(dash_array, dash_size);

View File

@ -115,8 +115,7 @@ public:
/// \~chinese /// \~chinese
/// @brief 获取线条宽度 /// @brief 获取线条宽度
/// @param width ĎßĚőżíśČ float GetWidth() const;
float GetStrokeWidth() const;
/// \~chinese /// \~chinese
/// @brief 获取线条端点样式 /// @brief 获取线条端点样式
@ -137,7 +136,7 @@ public:
/// \~chinese /// \~chinese
/// @brief 设置线条宽度 /// @brief 设置线条宽度
/// @param width 线条宽度 /// @param width 线条宽度
void SetStrokeWidth(float width); void SetWidth(float width);
/// \~chinese /// \~chinese
/// @brief 设置线条端点样式 /// @brief 设置线条端点样式
@ -188,7 +187,7 @@ private:
/** @} */ /** @} */
inline float StrokeStyle::GetStrokeWidth() const inline float StrokeStyle::GetWidth() const
{ {
return stroke_width_; return stroke_width_;
} }
@ -213,7 +212,7 @@ inline float StrokeStyle::GetDashOffset() const
return dash_offset_; return dash_offset_;
} }
inline void StrokeStyle::SetStrokeWidth(float width) inline void StrokeStyle::SetWidth(float width)
{ {
stroke_width_ = width; stroke_width_ = width;
} }

View File

@ -123,16 +123,23 @@ void TextLayout::SetFont(FontPtr font)
auto font_weight = DWRITE_FONT_WEIGHT(font->GetWeight()); auto font_weight = DWRITE_FONT_WEIGHT(font->GetWeight());
hr = native->SetFontWeight(font_weight, { 0, content_length_ }); hr = native->SetFontWeight(font_weight, { 0, content_length_ });
KGE_THROW_IF_FAILED(hr, "IDWriteTextLayout::SetFontSize failed"); KGE_THROW_IF_FAILED(hr, "IDWriteTextLayout::SetFontWeight failed");
} }
// reset font style // reset font style
{ {
bool is_italic = (font->GetPosture() == FontPosture::Italic); auto font_style = DWRITE_FONT_STYLE(font->GetPosture());
auto font_style = is_italic ? DWRITE_FONT_STYLE_ITALIC : DWRITE_FONT_STYLE_NORMAL;
hr = native->SetFontStyle(font_style, { 0, content_length_ }); hr = native->SetFontStyle(font_style, { 0, content_length_ });
KGE_THROW_IF_FAILED(hr, "IDWriteTextLayout::SetFontSize failed"); KGE_THROW_IF_FAILED(hr, "IDWriteTextLayout::SetFontStyle failed");
}
// reset font stretch
{
auto font_stretch = DWRITE_FONT_STRETCH(font->GetStretch());
hr = native->SetFontStretch(font_stretch, { 0, content_length_ });
KGE_THROW_IF_FAILED(hr, "IDWriteTextLayout::SetFontStretch failed");
} }
} }
#else #else