diff options
Diffstat (limited to 'src/platform/graphics/direct2d')
| -rw-r--r-- | src/platform/graphics/direct2d/Factory.cpp | 6 | ||||
| -rw-r--r-- | src/platform/graphics/direct2d/Font.cpp | 13 | ||||
| -rw-r--r-- | src/platform/graphics/direct2d/Resource.cpp | 2 | ||||
| -rw-r--r-- | src/platform/graphics/direct2d/TextLayout.cpp | 46 | 
4 files changed, 45 insertions, 22 deletions
| diff --git a/src/platform/graphics/direct2d/Factory.cpp b/src/platform/graphics/direct2d/Factory.cpp index cf65c2a5..af3f174d 100644 --- a/src/platform/graphics/direct2d/Factory.cpp +++ b/src/platform/graphics/direct2d/Factory.cpp @@ -82,13 +82,13 @@ DirectGraphicsFactory::CreateGeometryBuilder() {    return std::make_unique<D2DGeometryBuilder>(this);  } -std::unique_ptr<IFont> DirectGraphicsFactory::CreateFont(String font_family, -                                                         float font_size) { +std::unique_ptr<IFont> DirectGraphicsFactory::CreateFont( +    std::string font_family, float font_size) {    return std::make_unique<DWriteFont>(this, std::move(font_family), font_size);  }  std::unique_ptr<ITextLayout> DirectGraphicsFactory::CreateTextLayout( -    std::shared_ptr<IFont> font, String text) { +    std::shared_ptr<IFont> font, std::string text) {    return std::make_unique<DWriteTextLayout>(this, std::move(font),                                              std::move(text));  } diff --git a/src/platform/graphics/direct2d/Font.cpp b/src/platform/graphics/direct2d/Font.cpp index 34bb2ea5..f8dfbf38 100644 --- a/src/platform/graphics/direct2d/Font.cpp +++ b/src/platform/graphics/direct2d/Font.cpp @@ -1,5 +1,6 @@  #include "cru/platform/graphics/direct2d/Font.h" +#include "cru/base/StringUtil.h"  #include "cru/platform/graphics/direct2d/Exception.h"  #include "cru/platform/graphics/direct2d/Factory.h" @@ -7,7 +8,7 @@  #include <utility>  namespace cru::platform::graphics::direct2d { -DWriteFont::DWriteFont(DirectGraphicsFactory* factory, String font_family, +DWriteFont::DWriteFont(DirectGraphicsFactory* factory, std::string font_family,                         float font_size)      : DirectGraphicsResource(factory), font_family_(std::move(font_family)) {    // Get locale @@ -15,19 +16,19 @@ DWriteFont::DWriteFont(DirectGraphicsFactory* factory, String font_family,    if (!::GetUserDefaultLocaleName(buffer.data(),                                    static_cast<int>(buffer.size())))      throw platform::win::Win32Error( -        ::GetLastError(), u"Failed to get locale when create dwrite font."); +        ::GetLastError(), "Failed to get locale when create dwrite font.");    ThrowIfFailed(factory->GetDWriteFactory()->CreateTextFormat( -      reinterpret_cast<const wchar_t*>(font_family_.c_str()), nullptr, -      DWRITE_FONT_WEIGHT_NORMAL, DWRITE_FONT_STYLE_NORMAL, -      DWRITE_FONT_STRETCH_NORMAL, font_size, buffer.data(), &text_format_)); +      string::ToUtf16(font_family_).c_str(), nullptr, DWRITE_FONT_WEIGHT_NORMAL, +      DWRITE_FONT_STYLE_NORMAL, DWRITE_FONT_STRETCH_NORMAL, font_size, +      buffer.data(), &text_format_));    ThrowIfFailed(text_format_->SetTextAlignment(DWRITE_TEXT_ALIGNMENT_LEADING));    ThrowIfFailed(        text_format_->SetParagraphAlignment(DWRITE_PARAGRAPH_ALIGNMENT_NEAR));  } -String DWriteFont::GetFontName() { return font_family_; } +std::string DWriteFont::GetFontName() { return font_family_; }  float DWriteFont::GetFontSize() { return text_format_->GetFontSize(); }  }  // namespace cru::platform::graphics::direct2d diff --git a/src/platform/graphics/direct2d/Resource.cpp b/src/platform/graphics/direct2d/Resource.cpp index b81aa69e..2f1b7654 100644 --- a/src/platform/graphics/direct2d/Resource.cpp +++ b/src/platform/graphics/direct2d/Resource.cpp @@ -3,7 +3,7 @@  #include "cru/platform/graphics/direct2d/Factory.h"  namespace cru::platform::graphics::direct2d { -String DirectResource::kPlatformId = u"Windows Direct"; +std::string DirectResource::kPlatformId = "Windows Direct";  DirectGraphicsResource::DirectGraphicsResource(DirectGraphicsFactory* factory)      : factory_(factory) { diff --git a/src/platform/graphics/direct2d/TextLayout.cpp b/src/platform/graphics/direct2d/TextLayout.cpp index 06bbcaa6..906d64ec 100644 --- a/src/platform/graphics/direct2d/TextLayout.cpp +++ b/src/platform/graphics/direct2d/TextLayout.cpp @@ -1,6 +1,7 @@  #include "cru/platform/graphics/direct2d/TextLayout.h"  #include <dwrite.h> +#include "cru/base/StringUtil.h"  #include "cru/base/log/Logger.h"  #include "cru/platform/Check.h"  #include "cru/platform/graphics/direct2d/Exception.h" @@ -11,27 +12,28 @@  namespace cru::platform::graphics::direct2d {  DWriteTextLayout::DWriteTextLayout(DirectGraphicsFactory* factory, -                                   std::shared_ptr<IFont> font, String text) +                                   std::shared_ptr<IFont> font, +                                   std::string text)      : DirectGraphicsResource(factory), text_(std::move(text)) {    Expects(font);    font_ = CheckPlatform<DWriteFont>(font, GetPlatformId()); +  utf16_text_ = string::ToUtf16(text_);    ThrowIfFailed(factory->GetDWriteFactory()->CreateTextLayout( -      reinterpret_cast<const wchar_t*>(text_.c_str()), -      static_cast<UINT32>(text_.size()), font_->GetComInterface(), max_width_, -      max_height_, &text_layout_)); +      utf16_text_.c_str(), static_cast<UINT32>(utf16_text_.size()), +      font_->GetComInterface(), max_width_, max_height_, &text_layout_));  }  DWriteTextLayout::~DWriteTextLayout() = default; -String DWriteTextLayout::GetText() { return text_; } +std::string DWriteTextLayout::GetText() { return text_; } -void DWriteTextLayout::SetText(String new_text) { +void DWriteTextLayout::SetText(std::string new_text) {    text_ = std::move(new_text); +  utf16_text_ = string::ToUtf16(text_);    ThrowIfFailed(GetDirectFactory()->GetDWriteFactory()->CreateTextLayout( -      reinterpret_cast<const wchar_t*>(text_.c_str()), -      static_cast<UINT32>(text_.size()), font_->GetComInterface(), max_width_, -      max_height_, &text_layout_)); +      utf16_text_.c_str(), static_cast<UINT32>(utf16_text_.size()), +      font_->GetComInterface(), max_width_, max_height_, &text_layout_));  }  std::shared_ptr<IFont> DWriteTextLayout::GetFont() { @@ -70,7 +72,7 @@ Index DWriteTextLayout::GetLineIndexFromCharIndex(Index char_index) {    auto line_index = 0;    for (Index i = 0; i < char_index; ++i) { -    if (text_[i] == u'\n') { +    if (text_[i] == '\n') {        line_index++;      }    } @@ -108,7 +110,19 @@ std::vector<Rect> DWriteTextLayout::TextRangeRect(    if (text_range_arg.count == 0) {      return {};    } -  const auto text_range = text_range_arg.Normalize(); +  const auto text_range = +      Range::FromTwoSides( +          string::Utf16IndexCodePointToCodeUnit( +              reinterpret_cast<const char16_t*>(utf16_text_.data()), +              utf16_text_.size(), +              string::Utf8IndexCodeUnitToCodePoint(text_.data(), text_.size(), +                                                   text_range_arg.GetStart())), +          string::Utf16IndexCodePointToCodeUnit( +              reinterpret_cast<const char16_t*>(utf16_text_.data()), +              utf16_text_.size(), +              string::Utf8IndexCodeUnitToCodePoint(text_.data(), text_.size(), +                                                   text_range_arg.GetEnd()))) +          .Normalize();    DWRITE_TEXT_METRICS text_metrics;    ThrowIfFailed(text_layout_->GetMetrics(&text_metrics)); @@ -137,6 +151,10 @@ std::vector<Rect> DWriteTextLayout::TextRangeRect(  }  Rect DWriteTextLayout::TextSinglePoint(Index position, bool trailing) { +  position = string::Utf16IndexCodePointToCodeUnit( +      reinterpret_cast<const char16_t*>(utf16_text_.data()), utf16_text_.size(), +      string::Utf8IndexCodeUnitToCodePoint(text_.data(), text_.size(), +                                           position));    DWRITE_HIT_TEST_METRICS metrics;    FLOAT left;    FLOAT top; @@ -155,7 +173,11 @@ TextHitTestResult DWriteTextLayout::HitTest(const Point& point) {                                             &metrics));    TextHitTestResult result; -  result.position = metrics.textPosition; +  result.position = string::Utf8IndexCodePointToCodeUnit( +      text_.data(), text_.size(), +      string::Utf16IndexCodeUnitToCodePoint( +          reinterpret_cast<const char16_t*>(utf16_text_.data()), +          utf16_text_.size(), metrics.textPosition));    result.trailing = trailing != 0;    return result;  } | 
