Improve fill aligned text hit testing.

This commit is contained in:
bruvzg 2020-12-21 11:57:35 +02:00
parent 784f869f0f
commit cc4d6eb7f6
No known key found for this signature in database
GPG Key ID: 009E1BFE42239B95
1 changed files with 27 additions and 22 deletions

View File

@ -1038,31 +1038,36 @@ int TextServer::shaped_text_hit_test_position(RID p_shaped, float p_coords) cons
float off = 0.0f; float off = 0.0f;
for (int i = 0; i < v_size; i++) { for (int i = 0; i < v_size; i++) {
for (int k = 0; k < glyphs[i].repeat; k++) { if (glyphs[i].count > 0) {
if (glyphs[i].count > 0) { float advance = 0.f;
float advance = 0.f; for (int j = 0; j < glyphs[i].count; j++) {
for (int j = 0; j < glyphs[i].count; j++) { advance += glyphs[i + j].advance * glyphs[i + j].repeat;
advance += glyphs[i + j].advance; }
} if (((glyphs[i].flags & GRAPHEME_IS_VIRTUAL) == GRAPHEME_IS_VIRTUAL) && (p_coords >= off && p_coords < off + advance)) {
// Place caret to the left of clicked grapheme. if ((glyphs[i].flags & GRAPHEME_IS_RTL) == GRAPHEME_IS_RTL) {
if (p_coords >= off && p_coords < off + advance / 2) { return glyphs[i].end;
if ((glyphs[i].flags & GRAPHEME_IS_RTL) == GRAPHEME_IS_RTL) { } else {
return glyphs[i].end; return glyphs[i].start;
} else { }
return glyphs[i].start; }
} // Place caret to the left of clicked grapheme.
} if (p_coords >= off && p_coords < off + advance / 2) {
// Place caret to the right of clicked grapheme. if ((glyphs[i].flags & GRAPHEME_IS_RTL) == GRAPHEME_IS_RTL) {
if (p_coords >= off + advance / 2 && p_coords < off + advance) { return glyphs[i].end;
if ((glyphs[i].flags & GRAPHEME_IS_RTL) == GRAPHEME_IS_RTL) { } else {
return glyphs[i].start; return glyphs[i].start;
} else { }
return glyphs[i].end; }
} // Place caret to the right of clicked grapheme.
if (p_coords >= off + advance / 2 && p_coords < off + advance) {
if ((glyphs[i].flags & GRAPHEME_IS_RTL) == GRAPHEME_IS_RTL) {
return glyphs[i].start;
} else {
return glyphs[i].end;
} }
} }
off += glyphs[i].advance;
} }
off += glyphs[i].advance * glyphs[i].repeat;
} }
return 0; return 0;
} }