From 5c805e494425a88da1813902b1ad8a1ab351e30d Mon Sep 17 00:00:00 2001 From: crupest Date: Sun, 5 Jul 2020 23:06:02 +0800 Subject: ... --- src/win/graph/direct/TextLayout.cpp | 51 +++++++++++++------------------------ 1 file changed, 18 insertions(+), 33 deletions(-) (limited to 'src/win/graph/direct/TextLayout.cpp') diff --git a/src/win/graph/direct/TextLayout.cpp b/src/win/graph/direct/TextLayout.cpp index 16db77f0..7b5b230f 100644 --- a/src/win/graph/direct/TextLayout.cpp +++ b/src/win/graph/direct/TextLayout.cpp @@ -5,38 +5,33 @@ #include "cru/win/graph/direct/Exception.hpp" #include "cru/win/graph/direct/Factory.hpp" #include "cru/win/graph/direct/Font.hpp" -#include "cru/win/String.hpp" #include namespace cru::platform::graph::win::direct { -using cru::platform::win::IndexUtf16ToUtf8; -using cru::platform::win::IndexUtf8ToUtf16; - DWriteTextLayout::DWriteTextLayout(DirectGraphFactory* factory, std::shared_ptr font, - std::string text) + std::u16string text) : DirectGraphResource(factory), text_(std::move(text)) { Expects(font); font_ = CheckPlatform(font, GetPlatformId()); - w_text_ = cru::platform::win::ToUtf16String(text_); - ThrowIfFailed(factory->GetDWriteFactory()->CreateTextLayout( - w_text_.c_str(), static_cast(w_text_.size()), - font_->GetComInterface(), max_width_, max_height_, &text_layout_)); + reinterpret_cast(text_.c_str()), + static_cast(text_.size()), font_->GetComInterface(), max_width_, + max_height_, &text_layout_)); } DWriteTextLayout::~DWriteTextLayout() = default; -std::string DWriteTextLayout::GetText() { return text_; } +std::u16string DWriteTextLayout::GetText() { return text_; } -void DWriteTextLayout::SetText(std::string new_text) { +void DWriteTextLayout::SetText(std::u16string new_text) { text_.swap(new_text); - w_text_ = cru::platform::win::ToUtf16String(text_); ThrowIfFailed(GetDirectFactory()->GetDWriteFactory()->CreateTextLayout( - w_text_.c_str(), static_cast(w_text_.size()), - font_->GetComInterface(), max_width_, max_height_, &text_layout_)); + reinterpret_cast(text_.c_str()), + static_cast(text_.size()), font_->GetComInterface(), max_width_, + max_height_, &text_layout_)); } std::shared_ptr DWriteTextLayout::GetFont() { @@ -46,8 +41,9 @@ std::shared_ptr DWriteTextLayout::GetFont() { void DWriteTextLayout::SetFont(std::shared_ptr font) { font_ = CheckPlatform(font, GetPlatformId()); ThrowIfFailed(GetDirectFactory()->GetDWriteFactory()->CreateTextLayout( - w_text_.c_str(), static_cast(w_text_.size()), - font_->GetComInterface(), max_width_, max_height_, &text_layout_)); + reinterpret_cast(text_.c_str()), + static_cast(text_.size()), font_->GetComInterface(), max_width_, + max_height_, &text_layout_)); } void DWriteTextLayout::SetMaxWidth(float max_width) { @@ -73,12 +69,6 @@ std::vector DWriteTextLayout::TextRangeRect( } const auto text_range = text_range_arg.Normalize(); - // TODO: This can be faster with one iteration. - const int start_index = - IndexUtf8ToUtf16(text_, static_cast(text_range.position), w_text_); - const int end_index = IndexUtf8ToUtf16( - text_, static_cast(text_range.position + text_range.count), w_text_); - DWRITE_TEXT_METRICS text_metrics; ThrowIfFailed(text_layout_->GetMetrics(&text_metrics)); const auto metrics_count = @@ -87,9 +77,9 @@ std::vector DWriteTextLayout::TextRangeRect( std::vector hit_test_metrics(metrics_count); UINT32 actual_count; ThrowIfFailed(text_layout_->HitTestTextRange( - static_cast(start_index), - static_cast(end_index - start_index), 0, 0, - hit_test_metrics.data(), metrics_count, &actual_count)); + static_cast(text_range.position), + static_cast(text_range.count), 0, 0, hit_test_metrics.data(), + metrics_count, &actual_count)); hit_test_metrics.erase(hit_test_metrics.cbegin() + actual_count, hit_test_metrics.cend()); @@ -105,14 +95,11 @@ std::vector DWriteTextLayout::TextRangeRect( return result; } -Point DWriteTextLayout::TextSinglePoint(gsl::index position, bool trailing) { - const auto index = - IndexUtf8ToUtf16(text_, static_cast(position), w_text_); - +Point DWriteTextLayout::TextSinglePoint(Index position, bool trailing) { DWRITE_HIT_TEST_METRICS metrics; FLOAT left; FLOAT top; - ThrowIfFailed(text_layout_->HitTestTextPosition(static_cast(index), + ThrowIfFailed(text_layout_->HitTestTextPosition(static_cast(position), static_cast(trailing), &left, &top, &metrics)); return Point{left, top}; @@ -126,10 +113,8 @@ TextHitTestResult DWriteTextLayout::HitTest(const Point& point) { ThrowIfFailed(text_layout_->HitTestPoint(point.x, point.y, &trailing, &inside, &metrics)); - const auto index = - IndexUtf16ToUtf8(w_text_, static_cast(metrics.textPosition), text_); TextHitTestResult result; - result.position = index; + result.position = metrics.textPosition; result.trailing = trailing != 0; result.insideText = inside != 0; return result; -- cgit v1.2.3