diff options
author | crupest <crupest@outlook.com> | 2022-01-12 21:35:08 +0800 |
---|---|---|
committer | crupest <crupest@outlook.com> | 2022-01-12 21:35:08 +0800 |
commit | 7a42d92c10a4bc686244668dd0e3f903f30f2fae (patch) | |
tree | e48fc4a47afa5eadbdf54cec6d2b73110f500680 /src/win/graphics/direct/TextLayout.cpp | |
parent | 882d843083895f4905571dc273e801ee18fd5984 (diff) | |
download | cru-7a42d92c10a4bc686244668dd0e3f903f30f2fae.tar.gz cru-7a42d92c10a4bc686244668dd0e3f903f30f2fae.tar.bz2 cru-7a42d92c10a4bc686244668dd0e3f903f30f2fae.zip |
...
Diffstat (limited to 'src/win/graphics/direct/TextLayout.cpp')
-rw-r--r-- | src/win/graphics/direct/TextLayout.cpp | 39 |
1 files changed, 39 insertions, 0 deletions
diff --git a/src/win/graphics/direct/TextLayout.cpp b/src/win/graphics/direct/TextLayout.cpp index 6ece8ed1..bec4a972 100644 --- a/src/win/graphics/direct/TextLayout.cpp +++ b/src/win/graphics/direct/TextLayout.cpp @@ -1,4 +1,5 @@ #include "cru/win/graphics/direct/TextLayout.hpp" +#include <dwrite.h> #include "cru/common/Logger.hpp" #include "cru/platform/Check.hpp" @@ -55,6 +56,44 @@ void DWriteTextLayout::SetMaxHeight(float max_height) { ThrowIfFailed(text_layout_->SetMaxHeight(max_height_)); } +bool DWriteTextLayout::IsEditMode() { return edit_mode_; } + +void DWriteTextLayout::SetEditMode(bool enable) { + edit_mode_ = enable; + // TODO: Implement this. +} + +Index DWriteTextLayout::GetLineIndexFromCharIndex(Index char_index) { + if (char_index < 0 || char_index >= text_.size()) { + return -1; + } + + auto line_index = 0; + for (Index i = 0; i < char_index; ++i) { + if (text_[i] == u'\n') { + line_index++; + } + } + + return line_index; +} + +float DWriteTextLayout::GetLineHeight(Index line_index) { + Index count = GetLineCount(); + std::vector<DWRITE_LINE_METRICS> line_metrics(count); + + UINT32 actual_line_count = 0; + text_layout_->GetLineMetrics(line_metrics.data(), static_cast<UINT32>(count), + &actual_line_count); + return line_metrics[line_index].height; +} + +Index DWriteTextLayout::GetLineCount() { + UINT32 line_count = 0; + text_layout_->GetLineMetrics(nullptr, 0, &line_count); + return line_count; +} + Rect DWriteTextLayout::GetTextBounds(bool includingTrailingSpace) { DWRITE_TEXT_METRICS metrics; ThrowIfFailed(text_layout_->GetMetrics(&metrics)); |