aboutsummaryrefslogtreecommitdiff
path: root/src/platform/graphics/direct2d/TextLayout.cpp
diff options
context:
space:
mode:
authorYuqian Yang <crupest@crupest.life>2025-11-16 14:26:12 +0800
committerYuqian Yang <crupest@crupest.life>2025-11-16 14:26:12 +0800
commit9feb6a1611a86b90a02b5bfe2b1d4c8189650491 (patch)
tree96a66d98a6354f11432246405d0dfaf421d5f08f /src/platform/graphics/direct2d/TextLayout.cpp
parent07d662aafc25b145eb20e4123ebc82b5736cdeb7 (diff)
downloadcru-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.cpp16
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