Browse Source

Improve fill aligned text hit testing.

bruvzg 4 years ago
parent
commit
cc4d6eb7f6
1 changed files with 25 additions and 20 deletions
  1. 25 20
      servers/text_server.cpp

+ 25 - 20
servers/text_server.cpp

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