diff options
| author | Yuqian Yang <crupest@crupest.life> | 2025-11-16 14:26:12 +0800 |
|---|---|---|
| committer | Yuqian Yang <crupest@crupest.life> | 2025-11-16 14:26:12 +0800 |
| commit | 9feb6a1611a86b90a02b5bfe2b1d4c8189650491 (patch) | |
| tree | 96a66d98a6354f11432246405d0dfaf421d5f08f /src/platform/graphics/direct2d/TextLayout.cpp | |
| parent | 07d662aafc25b145eb20e4123ebc82b5736cdeb7 (diff) | |
| download | cru-9feb6a1611a86b90a02b5bfe2b1d4c8189650491.tar.gz cru-9feb6a1611a86b90a02b5bfe2b1d4c8189650491.tar.bz2 cru-9feb6a1611a86b90a02b5bfe2b1d4c8189650491.zip | |
Fix text edit hittest trailing bug.
Diffstat (limited to 'src/platform/graphics/direct2d/TextLayout.cpp')
| -rw-r--r-- | src/platform/graphics/direct2d/TextLayout.cpp | 16 |
1 files changed, 13 insertions, 3 deletions
diff --git a/src/platform/graphics/direct2d/TextLayout.cpp b/src/platform/graphics/direct2d/TextLayout.cpp index d347e0f7..be9d75ff 100644 --- a/src/platform/graphics/direct2d/TextLayout.cpp +++ b/src/platform/graphics/direct2d/TextLayout.cpp @@ -154,8 +154,8 @@ Rect DWriteTextLayout::TextSinglePoint(Index position, bool trailing) { FLOAT left; FLOAT top; CheckHResult(text_layout_->HitTestTextPosition(static_cast<UINT32>(position), - static_cast<BOOL>(trailing), - &left, &top, &metrics)); + static_cast<BOOL>(trailing), + &left, &top, &metrics)); return Rect{left, top, 0, GetFont()->GetFontSize()}; } @@ -165,7 +165,7 @@ TextHitTestResult DWriteTextLayout::HitTest(const Point& point) { DWRITE_HIT_TEST_METRICS metrics; CheckHResult(text_layout_->HitTestPoint(point.x, point.y, &trailing, &inside, - &metrics)); + &metrics)); TextHitTestResult result; result.position = string::Utf8IndexCodePointToCodeUnit( @@ -174,6 +174,16 @@ TextHitTestResult DWriteTextLayout::HitTest(const Point& point) { reinterpret_cast<const char16_t*>(utf16_text_.data()), utf16_text_.size(), metrics.textPosition)); result.trailing = trailing != 0; + + if (result.trailing) { + Index position_with_trailing; + string::Utf8NextCodePoint(text_.data(), text_.size(), result.position, + &position_with_trailing); + result.position_with_trailing = position_with_trailing; + } else { + result.position_with_trailing = result.position; + } + return result; } } // namespace cru::platform::graphics::direct2d |
