yakov pushed a commit to branch master.
commit d55c3f2bb732b4d730127122c5a00cb8040f7cee
Author: Yakov Goldberg <[email protected]>
Date: Sun Jan 6 09:53:17 2013 +0200
evas/font: fix handling querying char at coords (click on gap)
If query at x coord, which points to rigth half of LTR char,
next position will be returned. The same for left half of RTL char.
Signed-off-by: Yakov Goldberg <[email protected]>
---
ChangeLog | 6 ++++++
NEWS | 1 +
src/lib/evas/common/evas_font_query.c | 29 ++++++++++++++++++++++++++---
src/tests/evas/evas_test_text.c | 30 ++++++++++++++++++++++++++----
4 files changed, 59 insertions(+), 7 deletions(-)
diff --git a/ChangeLog b/ChangeLog
index e3fba57..e6e743b 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,9 @@
+2013-04-04 Yakov Goldberg
+
+ * Evas font: char position, returned by
+ evas_common_font_query_char_at_coords(),
+ depends on left/right half of char and its direction.
+
2013-03-04 Cedric Bail
* Evas: fix crash with Buffer engine with non alpha output.
diff --git a/NEWS b/NEWS
index d3605cc..5cab2bc 100644
--- a/NEWS
+++ b/NEWS
@@ -220,3 +220,4 @@ Fixes:
* Fix evas word start/end find in textblock to be consistent with other
toolkit logic on the matter
* Fix edje entry to respect filters and if input filtered out, don't clear
selections
* Fix evas buffer engine allocation with non alpha output
+ * Evas font: click on left/right half of char does matter now.
diff --git a/src/lib/evas/common/evas_font_query.c
b/src/lib/evas/common/evas_font_query.c
index c87aabf..c2f68de 100644
--- a/src/lib/evas/common/evas_font_query.c
+++ b/src/lib/evas/common/evas_font_query.c
@@ -721,6 +721,7 @@ evas_common_font_query_char_at_coords(RGBA_Font *fn, const
Evas_Text_Props *text
if (found)
{
int item_pos;
+ Evas_Coord cx_it, cw_it, cmid;
Evas_Coord cluster_adv;
cluster_adv = EVAS_FONT_WALK_PEN_X - cluster_start;
@@ -736,12 +737,34 @@ evas_common_font_query_char_at_coords(RGBA_Font *fn,
const Evas_Text_Props *text
part = cluster_adv / items;
item_pos = items - ((int) ((x - cluster_start) / part)) - 1;
}
- if (cx) *cx = EVAS_FONT_WALK_PEN_X +
- ((cluster_adv / items) * (item_pos - 1));
+
+ cx_it = EVAS_FONT_WALK_PEN_X + ((cluster_adv / items) * (item_pos -
1));
+ cw_it = (cluster_adv / items);
+
+ if (cx) *cx = cx_it;
if (cy) *cy = -asc;
- if (cw) *cw = (cluster_adv / items);
+ if (cw) *cw = cw_it;
if (ch) *ch = asc + desc;
ret_val = prev_cluster + item_pos;
+
+ /* Check, if x coord points to RIGHT half part of LTR char
+ * or to LEFT half char of RTL char. If so, increment found position */
+ cmid = cx_it + (cw_it / 2);
+ if (text_props->bidi_dir == EVAS_BIDI_DIRECTION_LTR)
+ {
+ if (x > cmid)
+ {
+ ret_val++;
+ }
+ }
+ else
+ {
+ if (x < cmid)
+ {
+ ret_val++;
+ }
+ }
+
goto end;
}
end:
diff --git a/src/tests/evas/evas_test_text.c b/src/tests/evas/evas_test_text.c
index e0a9fad..9db4fcf 100644
--- a/src/tests/evas/evas_test_text.c
+++ b/src/tests/evas/evas_test_text.c
@@ -117,7 +117,10 @@ START_TEST(evas_text_geometries)
fail_if(x <= px);
px = x;
/* Get back the coords */
- fail_if(i != evas_object_text_char_coords_get(to, x + (w / 2),
+ fail_if(i != evas_object_text_char_coords_get(to, x + (w / 4),
+ y + (h / 2), &x, &y, &w, &h));
+ /* Get back cursor position, if click on right half of char. */
+ fail_if((i + 1) != evas_object_text_char_coords_get(to, x + ((3 * w) /
4),
y + (h / 2), &x, &y, &w, &h));
}
@@ -427,7 +430,20 @@ START_TEST(evas_text_bidi)
fail_if(x >= px);
px = x;
/* Get back the coords */
- fail_if(i != evas_object_text_char_coords_get(to, x + (w / 2),
+ fail_if(i != evas_object_text_char_coords_get(to, x + ((3 * w) / 4),
+ y + (h / 2), &x, &y, &w, &h));
+ }
+
+ /* Get back cursor position, if click on left half of char. */
+ evas_object_text_text_set(to, "שלום...");
+ x = 0;
+ px = 200;
+ for (i = 0 ; i < eina_unicode_utf8_get_len("שלום...") ; i++)
+ {
+ fail_if(!evas_object_text_char_pos_get(to, i, &x, &y, &w, &h));
+ fail_if(x >= px);
+ px = x;
+ fail_if((i + 1) != evas_object_text_char_coords_get(to, x + (w / 4),
y + (h / 2), &x, &y, &w, &h));
}
@@ -449,7 +465,7 @@ START_TEST(evas_text_bidi)
fail_if(!evas_object_text_char_pos_get(to, i, &x, &y, &w, &h));
fail_if(x <= px);
px = x;
- fail_if(i != evas_object_text_char_coords_get(to, x + (w / 2),
+ fail_if(i != evas_object_text_char_coords_get(to, x + ((3 * w) / 4),
y + (h / 2), &x, &y, &w, &h));
i++;
for ( ; i < eina_unicode_utf8_get_len("Test - נסיון") ; i++)
@@ -486,7 +502,13 @@ START_TEST(evas_text_bidi)
fail_if(x >= px);
px = x;
/* Get back the coords */
- fail_if(i != evas_object_text_char_coords_get(to, x + (w / 2),
+ if (w == 0)
+ {
+ int cx;
+ fail_if(!evas_object_text_char_pos_get(to, i - 1, &cx, NULL,
NULL, NULL));
+ w = cx - x;
+ }
+ fail_if(i != evas_object_text_char_coords_get(to, x + (3 * w /4),
y + (h / 2), &x, &y, &w, &h));
}
--
------------------------------------------------------------------------------
Minimize network downtime and maximize team effectiveness.
Reduce network management and security costs.Learn how to hire
the most talented Cisco Certified professionals. Visit the
Employer Resources Portal
http://www.cisco.com/web/learning/employer_resources/index.html