From: Enlightenment S. <no-...@en...> - 2010-08-10 15:12:14
|
Log: Evas: Updated Evas_BiDi docs. Author: tasn Date: 2010-08-10 08:12:05 -0700 (Tue, 10 Aug 2010) New Revision: 50966 Modified: trunk/evas/src/lib/engines/common/evas_bidi_utils.c trunk/evas/src/lib/engines/common/evas_bidi_utils.h Modified: trunk/evas/src/lib/engines/common/evas_bidi_utils.c =================================================================== --- trunk/evas/src/lib/engines/common/evas_bidi_utils.c 2010-08-10 14:36:48 UTC (rev 50965) +++ trunk/evas/src/lib/engines/common/evas_bidi_utils.c 2010-08-10 15:12:05 UTC (rev 50966) @@ -9,7 +9,24 @@ #ifdef BIDI_SUPPORT #include <fribidi/fribidi.h> +/** + * @internal + * @addtogroup Evas_Utils + * + * @{ + */ +/** + * @internal + * @addtogroup Evas_BiDi + * + * @{ + */ +/** + * @internal + * @def _SAFE_FREE(x) + * checks if x is not NULL, if it's not, it's freed and set to NULL. + */ #define _SAFE_FREE(x) \ do { \ if (x) \ @@ -19,20 +36,27 @@ } \ } while(0) +/** + * @internal + * Checks if the string has RTL characters. + * + * @param str The string to be checked + * @return #EINA_TRUE if true, #EINA_FALSE otherwise. + */ Eina_Bool evas_bidi_is_rtl_str(const Eina_Unicode *str) { int i = 0; int ch; EvasBiDiCharType type; - + if (!str) return EINA_FALSE; for ( ; *str ; str++) { type = fribidi_get_bidi_type(*str); - if (FRIBIDI_IS_LETTER(type) && FRIBIDI_IS_RTL(type)) + if (FRIBIDI_IS_LETTER(type) && FRIBIDI_IS_RTL(type)) { return EINA_TRUE; } @@ -40,6 +64,15 @@ return EINA_FALSE; } +/** + * @internal + * Shapes the string ustr according to the bidi properties. + * + * @param str The string to shape + * @param bidi_props the bidi props to shaped according. + * @param len the length of th string. + * @return #EINA_TRUE on success, #EINA_FALSE otherwise. + */ Eina_Bool evas_bidi_shape_string(Eina_Unicode *ustr, const Evas_BiDi_Props *bidi_props, size_t len) { @@ -47,7 +80,7 @@ join_types = (EvasBiDiJoiningType *) malloc(sizeof(EvasBiDiJoiningType) * len); if (!join_types) { - return -2; + return EINA_FALSE; } fribidi_get_joining_types(ustr, len, join_types); @@ -62,6 +95,18 @@ return EINA_TRUE; } +/** + * @internal + * Updates the bidi properties according to ustr. First checks to see if the + * passed has rtl chars, if not, it cleans intl_props and returns. + * Otherwise, it essentially frees the old fields, allocates new fields, and + * populates them. + * On error: bidi_props is cleaned. + * + * @param ustr The string to update according to. + * @param bidi_props the bidi_props to update. + * @return returns the length of the string on success, a negative value on error. + */ int evas_bidi_update_props(const Eina_Unicode *ustr, Evas_BiDi_Paragraph_Props *bidi_props) { @@ -80,7 +125,7 @@ len = eina_unicode_strlen(ustr); - /* Prep work for reordering */ + /* Prep work for reordering */ char_types = (EvasBiDiCharType *) malloc(sizeof(EvasBiDiCharType) * len); if (!char_types) { @@ -100,24 +145,24 @@ len = -2; goto cleanup; } - - + + /* clean up */ - if (bidi_props->embedding_levels) + if (bidi_props->embedding_levels) { free(bidi_props->embedding_levels); } bidi_props->embedding_levels = embedding_levels; /* clean up */ - - if (bidi_props->char_types) + + if (bidi_props->char_types) { free(bidi_props->char_types); } bidi_props->char_types = char_types; - + return len; /* Cleanup */ @@ -128,14 +173,23 @@ return len; } -int +/** + * @internal + * Reorders ustr according to the bidi props. + * + * @param ustr the string to reorder. + * @param intl_props the intl properties to rerorder according to. + * @param _v_to_l The visual to logical map to populate - if NULL it won't populate it. + * @return #EINA_FALSE on success, #EINA_TRUE on error. + */ +Eina_Bool evas_bidi_props_reorder_line(Eina_Unicode *ustr, const Evas_BiDi_Props *intl_props, EvasBiDiStrIndex **_v_to_l) { EvasBiDiStrIndex *v_to_l = NULL; size_t len; if (!EVAS_BIDI_IS_BIDI_PROP(intl_props->props)) - return 0; + return EINA_FALSE; len = eina_unicode_strlen(ustr); @@ -155,22 +209,33 @@ /* Shaping must be done *BEFORE* breaking to lines so there's no choice but doing it in textblock. */ - if (!fribidi_reorder_line (FRIBIDI_FLAGS_DEFAULT, intl_props->props->char_types + intl_props->start, - len, 0, intl_props->props->direction, - intl_props->props->embedding_levels + intl_props->start, ustr, v_to_l)) + if (!fribidi_reorder_line (FRIBIDI_FLAGS_DEFAULT, + intl_props->props->char_types + intl_props->start, + len, 0, intl_props->props->direction, + intl_props->props->embedding_levels + intl_props->start, + ustr, v_to_l)) { goto error; } - - return 0; + + return EINA_FALSE; /* ERROR HANDLING */ error: _SAFE_FREE(v_to_l); - return 1; + return EINA_TRUE; } +/** + * @internal + * Returns the visual string index from the logical string index. + * + * @param v_to_l the visual to logical map + * @param len the length of the map. + * @param position the position to convert. + * @return on success the visual position, on failure the same position. + */ EvasBiDiStrIndex evas_bidi_position_logical_to_visual(EvasBiDiStrIndex *v_to_l, int len, EvasBiDiStrIndex position) { @@ -178,8 +243,8 @@ EvasBiDiStrIndex *ind; if (position >= len || !v_to_l) return position; - - for (i = 0, ind = v_to_l ; i < len ; i++, ind++) + + for (i = 0, ind = v_to_l ; i < len ; i++, ind++) { if (*ind == position) { @@ -189,6 +254,15 @@ return position; } +/** + * @internal + * Checks if the char is rtl oriented. I.e even a neutral char can become rtl + * if surrounded by rtl chars. + * + * @param embedded_level_list the bidi embedding list. + * @param index the index of the string. + * @return #EINA_TRUE if true, #EINA_FALSE otherwise. + */ Eina_Bool evas_bidi_is_rtl_char(EvasBiDiLevel *embedded_level_list, EvasBiDiStrIndex index) { @@ -197,12 +271,25 @@ return (FRIBIDI_IS_RTL(embedded_level_list[index])) ? EINA_TRUE : EINA_FALSE; } +/** + * @internal + * Cleans the paragraph properties. + * + * @param bidi_props the properties to clean. + */ void evas_bidi_paragraph_props_clean(Evas_BiDi_Paragraph_Props *bidi_props) { _SAFE_FREE(bidi_props->embedding_levels); _SAFE_FREE(bidi_props->char_types); } + +/** + * @internal + * Cleans the bidi properties. + * + * @param bidi_props the properties to clean. + */ void evas_bidi_props_clean(Evas_BiDi_Props *bidi_props) { @@ -210,4 +297,11 @@ evas_bidi_paragraph_props_clean(bidi_props->props); bidi_props->props = NULL; } +/** + * @} + */ +/** + * @} + */ #endif + Modified: trunk/evas/src/lib/engines/common/evas_bidi_utils.h =================================================================== --- trunk/evas/src/lib/engines/common/evas_bidi_utils.h 2010-08-10 14:36:48 UTC (rev 50965) +++ trunk/evas/src/lib/engines/common/evas_bidi_utils.h 2010-08-10 15:12:05 UTC (rev 50966) @@ -1,6 +1,21 @@ #ifndef _EVAS_BIDI_UTILS #define _EVAS_BIDI_UTILS +/** + * @internal + * @addtogroup Evas_Utils + * + * @{ + */ +/** + * @internal + * @defgroup Evas_BiDi Evas BiDi utility functions + * + * This set of functions and types helps evas handle BiDi strings correctly. + * @todo Document types, structures and macros. + * + * @{ + */ #ifdef HAVE_CONFIG_H # include "config.h" #endif @@ -43,7 +58,7 @@ typedef struct _Evas_BiDi_Paragraph_Props Evas_BiDi_Paragraph_Props; typedef struct _Evas_BiDi_Props Evas_BiDi_Props; -/* This structure defines a set of properties of a BiDi string. In case of a +/* This structure defines a set of properties of a BiDi string. In case of a * non-bidi string, all values should be NULL. * To check if a structure describes a bidi string or not, use the macro * EVAS_BIDI_IS_BIDI_PROP. RTL-only strings are also treated as bidi ATM. @@ -69,48 +84,37 @@ # define evas_bidi_position_visual_to_logical(list, position) \ (list) ? list[position] : position; -/* Gets a v_to_l list, it's len and a logical character index, and returns the - * the visual index of that character. - */ EvasBiDiStrIndex evas_bidi_position_logical_to_visual(EvasBiDiStrIndex *v_to_l, int len, EvasBiDiStrIndex position); -/* Returns true if the string has rtl characters, false otherwise */ Eina_Bool evas_bidi_is_rtl_str(const Eina_Unicode *str); -/* Returns true if the embedding level of the index is rtl, false otherwise */ Eina_Bool evas_bidi_is_rtl_char(EvasBiDiLevel *embedded_level_list, EvasBiDiStrIndex index); -/* Overallocates a bit, if anyone cares, he should realloc, though usually, - * the string get freed very fast so there's really no need to care about it - * (rellaoc-ing is slower than not) - */ -int +Eina_Bool evas_bidi_props_reorder_line(Eina_Unicode *text, const Evas_BiDi_Props *intl_props, EvasBiDiStrIndex **_v_to_l); -/* Updates the international properties according to the text. First checks to see - * if the text in question has rtl chars, if not, it cleans intl_props and returns. - * Otherwise, it essentially frees the old fields, allocates new fields, and - * populates them. - * On error, intl_props gets cleaned. - * Return value: the length of the string. - */ int evas_bidi_update_props(const Eina_Unicode *text, Evas_BiDi_Paragraph_Props *intl_props) EINA_ARG_NONNULL(1, 2); -/* Actually shape the string */ Eina_Bool evas_bidi_shape_string(Eina_Unicode *ustr, const Evas_BiDi_Props *intl_props, size_t len); -/* Cleans and frees the international properties. - Just the content, not the - * poitner itself. - */ + void evas_bidi_props_clean(Evas_BiDi_Props *intl_props) EINA_ARG_NONNULL(1); + void evas_bidi_paragraph_props_clean(Evas_BiDi_Paragraph_Props *bidi_props) EINA_ARG_NONNULL(1); #endif +/** + * @} + */ +/** + * @} + */ #endif + |
From: Enlightenment S. <no-...@en...> - 2010-08-16 12:51:40
|
Log: Evas bidi: Added saftey conversions to make sure FriBidiChar and Eina_Unicode are really the same size. Author: tasn Date: 2010-08-16 05:51:30 -0700 (Mon, 16 Aug 2010) New Revision: 51208 Modified: trunk/evas/src/lib/engines/common/evas_bidi_utils.c Modified: trunk/evas/src/lib/engines/common/evas_bidi_utils.c =================================================================== --- trunk/evas/src/lib/engines/common/evas_bidi_utils.c 2010-08-16 12:50:32 UTC (rev 51207) +++ trunk/evas/src/lib/engines/common/evas_bidi_utils.c 2010-08-16 12:51:30 UTC (rev 51208) @@ -36,6 +36,30 @@ } \ } while(0) +/* Convert bidichar to eina_unicode assume both are valid pointers */ +static Eina_Unicode * +_evas_bidi_fribidichar_to_unicode(Eina_Unicode *dest, const FriBidiChar *src) +{ + Eina_Unicode *ret = dest; + + while (*src) + *dest++ = *src++; + *dest = 0; + return ret; +} + +/* Convert eina_unicode to bidi_char assume both are valid pointers */ +static FriBidiChar * +_evas_bidi_unicode_to_fribidichar(FriBidiChar *dest, const Eina_Unicode *src) +{ + FriBidiChar *ret = dest; + + while (*src) + *dest++ = *src++; + *dest = 0; + return ret; +} + /** * @internal * Checks if the string has RTL characters. @@ -53,7 +77,7 @@ for ( ; *str ; str++) { - type = fribidi_get_bidi_type(*str); + type = fribidi_get_bidi_type((FriBidiChar) *str); if (FRIBIDI_IS_LETTER(type) && FRIBIDI_IS_RTL(type)) { return EINA_TRUE; @@ -72,11 +96,27 @@ * @return #EINA_TRUE on success, #EINA_FALSE otherwise. */ Eina_Bool -evas_bidi_shape_string(Eina_Unicode *ustr, const Evas_BiDi_Props *bidi_props, size_t len) +evas_bidi_shape_string(Eina_Unicode *eina_ustr, const Evas_BiDi_Props *bidi_props, size_t len) { + FriBidiChar *ustr, *base_ustr = NULL; + if (!EVAS_BIDI_IS_BIDI_PROP(bidi_props->props)) return EINA_FALSE; + /* The size of fribidichar is different than eina_unicode, convert */ + /*FIXME: Make this comparison at compile time and compile out + * unwanted code. - In all of this source file. */ + if (sizeof(Eina_Unicode) != sizeof(FriBidiChar)) + { + base_ustr = ustr = calloc(len + 1, sizeof(FriBidiChar)); + ustr = _evas_bidi_unicode_to_fribidichar(ustr, eina_ustr); + } + else + { + ustr = (FriBidiChar *) eina_ustr; + } + + EvasBiDiJoiningType *join_types = NULL; join_types = (EvasBiDiJoiningType *) malloc(sizeof(EvasBiDiJoiningType) * len); if (!join_types) @@ -93,6 +133,13 @@ bidi_props->props->embedding_levels + bidi_props->start, len, join_types, ustr); if (join_types) free(join_types); + + /* Convert back */ + if (sizeof(Eina_Unicode) != sizeof(FriBidiChar)) + { + eina_ustr = _evas_bidi_fribidichar_to_unicode(eina_ustr, ustr); + if (base_ustr) free(base_ustr); + } return EINA_TRUE; } @@ -109,23 +156,38 @@ * @return returns the length of the string on success, a negative value on error. */ int -evas_bidi_update_props(const Eina_Unicode *ustr, Evas_BiDi_Paragraph_Props *bidi_props) +evas_bidi_update_props(const Eina_Unicode *eina_ustr, Evas_BiDi_Paragraph_Props *bidi_props) { EvasBiDiCharType *char_types = NULL; EvasBiDiLevel *embedding_levels = NULL; + const FriBidiChar *ustr; + FriBidiChar *base_ustr = NULL; size_t len; - if (!ustr) + if (!eina_ustr) return -2; - if (!evas_bidi_is_rtl_str(ustr)) /* No need to handle bidi */ + + len = eina_unicode_strlen(eina_ustr); + /* The size of fribidichar s different than eina_unicode, convert */ + if (sizeof(Eina_Unicode) != sizeof(FriBidiChar)) { + base_ustr = calloc(len + 1, sizeof(FriBidiChar)); + base_ustr = _evas_bidi_unicode_to_fribidichar(base_ustr, eina_ustr); + ustr = base_ustr; + } + else + { + ustr = (const FriBidiChar *) eina_ustr; + } + + + if (!evas_bidi_is_rtl_str(eina_ustr)) /* No need to handle bidi */ + { len = -1; goto cleanup; } - len = eina_unicode_strlen(ustr); - /* Prep work for reordering */ char_types = (EvasBiDiCharType *) malloc(sizeof(EvasBiDiCharType) * len); if (!char_types) @@ -163,13 +225,16 @@ } bidi_props->char_types = char_types; + if (base_ustr) free(base_ustr); + return len; /* Cleanup */ cleanup: if (char_types) free(char_types); if (embedding_levels) free(embedding_levels); + if (base_ustr) free(base_ustr); evas_bidi_paragraph_props_clean(bidi_props); /*Mark that we don't need bidi handling */ return len; } @@ -184,16 +249,28 @@ * @return #EINA_FALSE on success, #EINA_TRUE on error. */ Eina_Bool -evas_bidi_props_reorder_line(Eina_Unicode *ustr, const Evas_BiDi_Props *intl_props, EvasBiDiStrIndex **_v_to_l) +evas_bidi_props_reorder_line(Eina_Unicode *eina_ustr, const Evas_BiDi_Props *intl_props, EvasBiDiStrIndex **_v_to_l) { EvasBiDiStrIndex *v_to_l = NULL; + FriBidiChar *ustr, *base_ustr = NULL; size_t len; if (!EVAS_BIDI_IS_BIDI_PROP(intl_props->props)) return EINA_FALSE; - len = eina_unicode_strlen(ustr); + len = eina_unicode_strlen(eina_ustr); + /* The size of fribidichar is different than eina_unicode, convert */ + if (sizeof(Eina_Unicode) != sizeof(FriBidiChar)) + { + base_ustr = ustr = calloc(len + 1, sizeof(FriBidiChar)); + ustr = _evas_bidi_unicode_to_fribidichar(ustr, eina_ustr); + } + else + { + ustr = (FriBidiChar *) eina_ustr; + } + if (_v_to_l) { int i; v_to_l = *_v_to_l = calloc(len, sizeof(EvasBiDiStrIndex)); @@ -220,9 +297,16 @@ } + /* The size of fribidichar is different than eina_unicode, convert */ + if (sizeof(Eina_Unicode) != sizeof(FriBidiChar)) + { + eina_ustr = _evas_bidi_fribidichar_to_unicode(eina_ustr, base_ustr); + free(base_ustr); + } return EINA_FALSE; /* ERROR HANDLING */ error: + if (base_ustr) free(base_ustr); _SAFE_FREE(v_to_l); return EINA_TRUE; } |
From: Enlightenment S. <no-...@en...> - 2010-08-17 15:59:12
|
Log: Evas font draw: Fixed a typo in font draw Author: tasn Date: 2010-08-17 08:59:03 -0700 (Tue, 17 Aug 2010) New Revision: 51254 Modified: trunk/evas/src/lib/engines/common/evas_font_draw.c Modified: trunk/evas/src/lib/engines/common/evas_font_draw.c =================================================================== --- trunk/evas/src/lib/engines/common/evas_font_draw.c 2010-08-17 14:58:31 UTC (rev 51253) +++ trunk/evas/src/lib/engines/common/evas_font_draw.c 2010-08-17 15:59:03 UTC (rev 51254) @@ -556,7 +556,7 @@ #endif { - if (evas_common_font_query_kerning(fi, index, prev_index, &kern)) + if (evas_common_font_query_kerning(fi, prev_index, index, &kern)) pen_x += kern; } } |
From: Enlightenment S. <no-...@en...> - 2010-09-02 11:53:48
|
Log: Evas textblock: Fixed compilation without fribidi. Author: tasn Date: 2010-09-02 04:53:40 -0700 (Thu, 02 Sep 2010) New Revision: 51836 Modified: trunk/evas/src/lib/engines/common/evas_font_query.c Modified: trunk/evas/src/lib/engines/common/evas_font_query.c =================================================================== --- trunk/evas/src/lib/engines/common/evas_font_query.c 2010-09-02 11:50:52 UTC (rev 51835) +++ trunk/evas/src/lib/engines/common/evas_font_query.c 2010-09-02 11:53:40 UTC (rev 51836) @@ -368,7 +368,7 @@ asc = evas_common_font_max_ascent_get(fn); desc = evas_common_font_max_descent_get(fn); -#ifdef BIDI_SUPPORT +#ifdef BIDI_SUPPORT /* Get the position in the visual string because those are the coords we care about */ position = evas_bidi_position_logical_to_visual(visual_to_logical, len, pos); #else @@ -379,6 +379,7 @@ { /* if it's rtl then the location is the left of the string, * otherwise, the right. */ +#ifdef BIDI_SUPPORT if (intl_props && EVAS_BIDI_PARAGRAPH_DIRECTION_IS_RTL(intl_props->props)) { @@ -386,6 +387,7 @@ if (ch) *ch = asc + desc; } else +#endif { evas_common_font_query_size(fn, text, intl_props, cx, ch); } |
From: Enlightenment S. <no-...@en...> - 2010-09-02 11:57:59
|
Log: Evas textblock: updated docs. Author: tasn Date: 2010-09-02 04:57:52 -0700 (Thu, 02 Sep 2010) New Revision: 51837 Modified: trunk/evas/src/lib/engines/common/evas_font_query.c Modified: trunk/evas/src/lib/engines/common/evas_font_query.c =================================================================== --- trunk/evas/src/lib/engines/common/evas_font_query.c 2010-09-02 11:53:40 UTC (rev 51836) +++ trunk/evas/src/lib/engines/common/evas_font_query.c 2010-09-02 11:57:52 UTC (rev 51837) @@ -307,7 +307,8 @@ if (h_adv) *h_adv = pen_x - start_x; } -/* x y w h for char at char pos +/* x y w h for char at char pos for null it returns the position right after + * the last char with 0 as width and height. * BiDi handling: We recieve the shaped string + other props from intl_props, * We care about the actual drawing location of the string, this is why we need * the visual string. We need to know how it's printed. After that we need to calculate |
From: Enlightenment S. <no-...@en...> - 2010-09-05 09:45:34
|
Log: Evas bidi: Fixed docs. Author: tasn Date: 2010-09-05 02:45:28 -0700 (Sun, 05 Sep 2010) New Revision: 51900 Modified: trunk/evas/src/lib/engines/common/evas_bidi_utils.c Modified: trunk/evas/src/lib/engines/common/evas_bidi_utils.c =================================================================== --- trunk/evas/src/lib/engines/common/evas_bidi_utils.c 2010-09-05 08:29:52 UTC (rev 51899) +++ trunk/evas/src/lib/engines/common/evas_bidi_utils.c 2010-09-05 09:45:28 UTC (rev 51900) @@ -259,7 +259,7 @@ * @internal * Reorders ustr according to the bidi props. * - * @param ustr the string to reorder. + * @param ustr the string to reorder. - Null is ok, will just populate the map. * @param intl_props the intl properties to rerorder according to. * @param _v_to_l The visual to logical map to populate - if NULL it won't populate it. * @return #EINA_FALSE on success, #EINA_TRUE on error. |
From: Enlightenment S. <no-...@en...> - 2010-09-15 09:11:26
|
Log: Evas font: removed old (already removed a long time ago) functions from evas_font.h. Author: tasn Date: 2010-09-15 02:11:19 -0700 (Wed, 15 Sep 2010) New Revision: 52293 Modified: trunk/evas/src/lib/engines/common/evas_font.h Modified: trunk/evas/src/lib/engines/common/evas_font.h =================================================================== --- trunk/evas/src/lib/engines/common/evas_font.h 2010-09-15 08:41:41 UTC (rev 52292) +++ trunk/evas/src/lib/engines/common/evas_font.h 2010-09-15 09:11:19 UTC (rev 52293) @@ -15,11 +15,6 @@ EAPI int evas_common_font_max_descent_get (RGBA_Font *fn); EAPI int evas_common_font_get_line_advance (RGBA_Font *fn); -EINA_DEPRECATED EAPI int evas_common_font_utf8_get_next (const unsigned char *buf, int *iindex); -EINA_DEPRECATED EAPI int evas_common_font_utf8_get_prev (const unsigned char *buf, int *iindex); -EINA_DEPRECATED EAPI int evas_common_font_utf8_get_last (const unsigned char *buf, int buflen); -EINA_DEPRECATED EAPI int evas_common_font_utf8_get_len (const unsigned char *buf); - /* draw */ EAPI void evas_common_font_draw (RGBA_Image *dst, RGBA_Draw_Context *dc, RGBA_Font *fn, int x, int y, const Eina_Unicode *text, const Evas_BiDi_Props *intl_props); |
From: Enlightenment S. <no-...@en...> - 2010-10-05 14:05:29
|
Log: Evas textblock and font engine: Fixed cursor position to be at the end of the current item, and not the end of the line, this looks nicer in bidi strings. Fixed querying char coords to return the current position of the NULL according to the text's alignment, not the paragraph's. Author: tasn Date: 2010-10-05 07:05:23 -0700 (Tue, 05 Oct 2010) New Revision: 53061 Modified: trunk/evas/src/lib/engines/common/evas_font_query.c Modified: trunk/evas/src/lib/engines/common/evas_font_query.c =================================================================== --- trunk/evas/src/lib/engines/common/evas_font_query.c 2010-10-05 13:30:31 UTC (rev 53060) +++ trunk/evas/src/lib/engines/common/evas_font_query.c 2010-10-05 14:05:23 UTC (rev 53061) @@ -384,8 +384,7 @@ /* if it's rtl then the location is the left of the string, * otherwise, the right. */ #ifdef BIDI_SUPPORT - if (intl_props && - EVAS_BIDI_PARAGRAPH_DIRECTION_IS_RTL(intl_props->props)) + if (evas_bidi_is_rtl_char(intl_props, 0)) { if (cx) *cx = 0; if (ch) *ch = asc + desc; |
From: Enlightenment S. <no-...@en...> - 2010-10-24 10:59:59
|
Log: Evas font-engine: Hacked around a wrong setting of clipping in textblock. - Email in ML will soon follow. Author: tasn Date: 2010-10-24 03:59:52 -0700 (Sun, 24 Oct 2010) New Revision: 53828 Modified: trunk/evas/src/lib/engines/common/evas_font_draw.c Modified: trunk/evas/src/lib/engines/common/evas_font_draw.c =================================================================== --- trunk/evas/src/lib/engines/common/evas_font_draw.c 2010-10-24 08:48:02 UTC (rev 53827) +++ trunk/evas/src/lib/engines/common/evas_font_draw.c 2010-10-24 10:59:52 UTC (rev 53828) @@ -614,6 +614,16 @@ { if (dx + w > (ext_x + ext_w)) in_w += (dx + w) - (ext_x + ext_w); + /* FIXME: Hack around the bug + * with clipping not taking + * textblock's size into + * account */ + if (dx < x) + { + in_w += x - dx; + in_x = x - dx; + dx = x; + } if (dx < ext_x) { in_w += ext_x - dx; |
From: Enlightenment S. <no-...@en...> - 2010-10-24 12:28:42
|
Log: Evas font-engine: Reverted my hack in 53828 because cedric already implemented clipping to object geometry. Author: tasn Date: 2010-10-24 05:28:36 -0700 (Sun, 24 Oct 2010) New Revision: 53830 Modified: trunk/evas/src/lib/engines/common/evas_font_draw.c Modified: trunk/evas/src/lib/engines/common/evas_font_draw.c =================================================================== --- trunk/evas/src/lib/engines/common/evas_font_draw.c 2010-10-24 11:24:57 UTC (rev 53829) +++ trunk/evas/src/lib/engines/common/evas_font_draw.c 2010-10-24 12:28:36 UTC (rev 53830) @@ -614,16 +614,6 @@ { if (dx + w > (ext_x + ext_w)) in_w += (dx + w) - (ext_x + ext_w); - /* FIXME: Hack around the bug - * with clipping not taking - * textblock's size into - * account */ - if (dx < x) - { - in_w += x - dx; - in_x = x - dx; - dx = x; - } if (dx < ext_x) { in_w += ext_x - dx; |
From: Enlightenment S. <no-...@en...> - 2010-10-25 11:24:31
|
Log: Evas font-engine: Silence gcc about a possible use of unitialized value which can't really happen. Add parenthesis where needed. Author: tasn Date: 2010-10-25 04:24:25 -0700 (Mon, 25 Oct 2010) New Revision: 53855 Modified: trunk/evas/src/lib/engines/common/evas_font_query.c Modified: trunk/evas/src/lib/engines/common/evas_font_query.c =================================================================== --- trunk/evas/src/lib/engines/common/evas_font_query.c 2010-10-25 11:10:59 UTC (rev 53854) +++ trunk/evas/src/lib/engines/common/evas_font_query.c 2010-10-25 11:24:25 UTC (rev 53855) @@ -88,7 +88,7 @@ for (chr = 0, char_index = 0; *text; text++, char_index ++) { FT_UInt index; - RGBA_Font_Glyph *fg; + RGBA_Font_Glyph *fg = NULL; int chr_x, chr_y, advw; int gl, kern; @@ -117,7 +117,7 @@ * involved.*/ if (intl_props && evas_bidi_is_rtl_char(intl_props, char_index) && - fg->glyph->advance.x >> 16 > 0) + ((fg->glyph->advance.x >> 16) > 0)) { if (evas_common_font_query_kerning(fi, index, prev_index, &kern)) pen_x += kern; @@ -666,7 +666,7 @@ for (char_index = 0; *text; text++, char_index++) { FT_UInt index; - RGBA_Font_Glyph *fg; + RGBA_Font_Glyph *fg = NULL; int chr_x, chr_y, chr_w; int gl, kern; @@ -695,7 +695,7 @@ * involved.*/ if (intl_props && evas_bidi_is_rtl_char(intl_props, char_index) && - fg->glyph->advance.x >> 16 > 0) + ((fg->glyph->advance.x >> 16) > 0)) { if (evas_common_font_query_kerning(fi, index, prev_index, &kern)) |
From: Enlightenment S. <no-...@en...> - 2010-11-04 16:32:48
|
Log: Evas font-engine: Don't break if there was a previous miss. This is a workaround for a bug in the font index caching mechanism that happens if you cache the index miss before all the fonts were changed. We should probably just put a "dirty" flag on font sets that loaded more fonts or something like that. Author: tasn Date: 2010-11-04 09:32:42 -0700 (Thu, 04 Nov 2010) New Revision: 54157 Modified: trunk/evas/src/lib/engines/common/evas_font_draw.c Modified: trunk/evas/src/lib/engines/common/evas_font_draw.c =================================================================== --- trunk/evas/src/lib/engines/common/evas_font_draw.c 2010-11-04 15:48:17 UTC (rev 54156) +++ trunk/evas/src/lib/engines/common/evas_font_draw.c 2010-11-04 16:32:42 UTC (rev 54157) @@ -326,7 +326,13 @@ *fi_ret = fm->fint; return fm->index; } +#if 0 + /* Returning here because of a previous miss when searching the + * glyph causes a bug when glyph caching was before all the + * fonts were loaded, I have no idea how to fix it cleanly, + * not at the moment anyway. -- TAsn */ else if (fm->index == -1) return 0; +#endif } } |
From: Enlightenment S. <no-...@en...> - 2010-11-11 13:07:11
|
Log: Evas font-engine: Fixed the first miss breaks font bug and removed the work around. My tests show it work, but just to make sure, if it doesn't for you, let me know. Author: tasn Date: 2010-11-11 05:07:04 -0800 (Thu, 11 Nov 2010) New Revision: 54456 Modified: trunk/evas/src/lib/engines/common/evas_font_draw.c Modified: trunk/evas/src/lib/engines/common/evas_font_draw.c =================================================================== --- trunk/evas/src/lib/engines/common/evas_font_draw.c 2010-11-11 11:39:16 UTC (rev 54455) +++ trunk/evas/src/lib/engines/common/evas_font_draw.c 2010-11-11 13:07:04 UTC (rev 54456) @@ -326,13 +326,7 @@ *fi_ret = fm->fint; return fm->index; } -#if 0 - /* Returning here because of a previous miss when searching the - * glyph causes a bug when glyph caching was before all the - * fonts were loaded, I have no idea how to fix it cleanly, - * not at the moment anyway. -- TAsn */ else if (fm->index == -1) return 0; -#endif } } @@ -366,40 +360,8 @@ if (!fi->src->ft.face) /* Charmap not loaded, FI/FS blank */ { evas_common_font_int_reload(fi); -// if (evas_common_font_source_load_complete(fi->src)) -// return 0; -#if 0 /* FIXME: disable this. this can eat a LOT of memory and in my tests with expedite at any rate shows no visible improvements */ -/* - index = FT_Get_Char_Index(fi->src->ft.face, gl); - if (index == 0) - { - // Load Hash - FT_ULong charcode; - FT_UInt gindex; - - fi->src->charmap = evas_array_hash_new(); - charcode = FT_Get_First_Char(fi->src->ft.face, &gindex); - while (gindex != 0) - { - evas_array_hash_add(fi->src->charmap, charcode, gindex); - charcode = FT_Get_Next_Char(fi->src->ft.face, charcode, &gindex); - } - - // Free face - FT_Done_Face(fi->src->ft.face); - fi->src->ft.face = NULL; - } - else - { - evas_common_font_int_load_complete(fi); - - *fi_ret = fi; - return index; - } - */ -#endif } - else /* Charmap not loaded, FS loaded */ + if (fi->src->ft.face) { index = _evas_common_get_char_index(fi, gl); if (index != 0) |
From: Enlightenment S. <no-...@en...> - 2011-01-30 10:33:20
|
Log: Evas font engine: Added skipping of invisible chars to the font drawing function - this means we can't draw them until we add a specil "draw inivisble" mode. Author: tasn Date: 2011-01-30 02:33:14 -0800 (Sun, 30 Jan 2011) New Revision: 56424 Trac: http://trac.enlightenment.org/e/changeset/56424 Modified: trunk/evas/src/lib/engines/common/evas_font_draw.c Modified: trunk/evas/src/lib/engines/common/evas_font_draw.c =================================================================== --- trunk/evas/src/lib/engines/common/evas_font_draw.c 2011-01-30 10:33:06 UTC (rev 56423) +++ trunk/evas/src/lib/engines/common/evas_font_draw.c 2011-01-30 10:33:14 UTC (rev 56424) @@ -5,7 +5,13 @@ #include "evas_bidi_utils.h" /*defines BIDI_SUPPORT if possible */ #include "evas_font_private.h" /* for Frame-Queuing support */ -#define WORD_CACHE_MAXLEN 50 +#define EVAS_FONT_CHARACTER_IS_INVISIBLE(x) ( \ + ((0x200C <= (x)) && ((x) <= 0x200D)) || /* ZWNJ..ZWH */ \ + ((0x200E <= (x)) && ((x) <= 0x200F)) || /* BIDI stuff */ \ + ((0x202A <= (x)) && ((x) <= 0x202E)) /* BIDI stuff */ \ + ) + +#define WORD_CACHE_MAXLEN 50 /* How many to cache */ #define WORD_CACHE_NWORDS 40 static int max_cached_words = WORD_CACHE_NWORDS; @@ -530,6 +536,8 @@ int gl, kern; gl = *text; + if (EVAS_FONT_CHARACTER_IS_INVISIBLE(gl)) + continue; index = evas_common_font_glyph_search(fn, &fi, gl); LKL(fi->ft_mutex); |
From: Enlightenment S. <no-...@en...> - 2011-01-30 10:33:38
|
Log: Evas font engine: Fixed query_size and query advance. Author: tasn Date: 2011-01-30 02:33:32 -0800 (Sun, 30 Jan 2011) New Revision: 56427 Trac: http://trac.enlightenment.org/e/changeset/56427 Modified: trunk/evas/src/lib/engines/common/evas_font_query.c Modified: trunk/evas/src/lib/engines/common/evas_font_query.c =================================================================== --- trunk/evas/src/lib/engines/common/evas_font_query.c 2011-01-30 10:33:24 UTC (rev 56426) +++ trunk/evas/src/lib/engines/common/evas_font_query.c 2011-01-30 10:33:32 UTC (rev 56427) @@ -139,7 +139,7 @@ EAPI void evas_common_font_query_size(RGBA_Font *fn, const Eina_Unicode *text, const Evas_BiDi_Props *intl_props __UNUSED__, int *w, int *h) { - int keep_width; + int keep_width = 0; int use_kerning; RGBA_Font_Int *fi; EVAS_FONT_WALK_TEXT_INIT(); @@ -149,7 +149,7 @@ { EVAS_FONT_WALK_TEXT_WORK(); /* Keep the width because we'll need it for the last char */ - keep_width = width; + keep_width = width + bear_x; } EVAS_FONT_WALK_TEXT_END(); if (w) *w = pen_x + keep_width; @@ -167,7 +167,7 @@ EAPI void evas_common_font_query_advance(RGBA_Font *fn, const Eina_Unicode *text, const Evas_BiDi_Props *intl_props, int *h_adv, int *v_adv) { - int keep_adv; + int keep_adv = 0; int use_kerning; RGBA_Font_Int *fi; EVAS_FONT_WALK_TEXT_INIT(); |
From: Enlightenment S. <no-...@en...> - 2011-01-30 10:33:50
|
Log: Evas font-engine: handle invisible chars in font query. Author: tasn Date: 2011-01-30 02:33:43 -0800 (Sun, 30 Jan 2011) New Revision: 56429 Trac: http://trac.enlightenment.org/e/changeset/56429 Modified: trunk/evas/src/lib/engines/common/evas_font_draw.c trunk/evas/src/lib/engines/common/evas_font_private.h Modified: trunk/evas/src/lib/engines/common/evas_font_draw.c =================================================================== --- trunk/evas/src/lib/engines/common/evas_font_draw.c 2011-01-30 10:33:37 UTC (rev 56428) +++ trunk/evas/src/lib/engines/common/evas_font_draw.c 2011-01-30 10:33:43 UTC (rev 56429) @@ -5,12 +5,6 @@ #include "evas_bidi_utils.h" /*defines BIDI_SUPPORT if possible */ #include "evas_font_private.h" /* for Frame-Queuing support */ -#define EVAS_FONT_CHARACTER_IS_INVISIBLE(x) ( \ - ((0x200C <= (x)) && ((x) <= 0x200D)) || /* ZWNJ..ZWH */ \ - ((0x200E <= (x)) && ((x) <= 0x200F)) || /* BIDI stuff */ \ - ((0x202A <= (x)) && ((x) <= 0x202E)) /* BIDI stuff */ \ - ) - #define WORD_CACHE_MAXLEN 50 /* How many to cache */ #define WORD_CACHE_NWORDS 40 Modified: trunk/evas/src/lib/engines/common/evas_font_private.h =================================================================== --- trunk/evas/src/lib/engines/common/evas_font_private.h 2011-01-30 10:33:37 UTC (rev 56428) +++ trunk/evas/src/lib/engines/common/evas_font_private.h 2011-01-30 10:33:43 UTC (rev 56429) @@ -29,6 +29,13 @@ void evas_common_font_int_unload(RGBA_Font_Int *fi); void evas_common_font_int_reload(RGBA_Font_Int *fi); /* Macros for text walking */ + +#define EVAS_FONT_CHARACTER_IS_INVISIBLE(x) ( \ + ((0x200C <= (x)) && ((x) <= 0x200D)) || /* ZWNJ..ZWH */ \ + ((0x200E <= (x)) && ((x) <= 0x200F)) || /* BIDI stuff */ \ + ((0x202A <= (x)) && ((x) <= 0x202E)) /* BIDI stuff */ \ + ) + /** * @def EVAS_FONT_UPDATE_KERN() * @internal @@ -106,6 +113,7 @@ do \ { \ int adv; \ + int visible; \ prev_index = 0; \ last_adv = 0; \ for (char_index = 0 ; *text ; text++, char_index++) \ @@ -136,10 +144,19 @@ continue; \ } \ kern = 0; \ - bear_x = fg->glyph_out->left; \ - bear_y = fg->glyph_out->top; \ - adv = fg->glyph->advance.x >> 16; \ - width = fg->glyph_out->bitmap.width; \ + if (EVAS_FONT_CHARACTER_IS_INVISIBLE(gl)) \ + { \ + adv = width = bear_x = bear_y = 0; \ + visible = 0; \ + } \ + else \ + { \ + bear_x = fg->glyph_out->left; \ + bear_y = fg->glyph_out->top; \ + adv = fg->glyph->advance.x >> 16; \ + width = fg->glyph_out->bitmap.width; \ + visible = 1; \ + } \ /* hmmm kerning means i can't sanely do my own cached metric */ \ /* tables! grrr - this means font face sharing is kinda... not */ \ /* an option if you want performance */ \ @@ -153,8 +170,11 @@ LKU(fi->ft_mutex); \ /* If the current one is not a compositing char, do the */ \ /* previous advance and set the current advance as the next */ \ - /* advance to do */ \ - if (adv > 0) \ + /* advance to do. If it's an invisible char (i.e one that shouldn't + * be printed anyhow, we want to advance everything as if it's + * a visible char. FIXME: use a proper way to detect diacritic + * instead. */ \ + if ((adv > 0) || !visible) \ { \ pen_x += last_adv; \ last_adv = adv; \ |
From: Enlightenment S. <no-...@en...> - 2011-01-30 10:34:03
|
Log: Evas font engine: The position of the NULL returned from coords should depend on query_advance, not query_size. Author: tasn Date: 2011-01-30 02:33:57 -0800 (Sun, 30 Jan 2011) New Revision: 56431 Trac: http://trac.enlightenment.org/e/changeset/56431 Modified: trunk/evas/src/lib/engines/common/evas_font_query.c Modified: trunk/evas/src/lib/engines/common/evas_font_query.c =================================================================== --- trunk/evas/src/lib/engines/common/evas_font_query.c 2011-01-30 10:33:50 UTC (rev 56430) +++ trunk/evas/src/lib/engines/common/evas_font_query.c 2011-01-30 10:33:57 UTC (rev 56431) @@ -252,7 +252,7 @@ else #endif { - evas_common_font_query_size(fn, text, intl_props, cx, ch); + evas_common_font_query_advance(fn, text, intl_props, cx, ch); } if (cy) *cy = 0; if (cw) *cw = 0; |
From: Enlightenment S. <no-...@en...> - 2011-01-30 10:35:17
|
Log: Evas font-engine: suppress warnings when BiDi is disabled. Author: tasn Date: 2011-01-30 02:35:10 -0800 (Sun, 30 Jan 2011) New Revision: 56442 Trac: http://trac.enlightenment.org/e/changeset/56442 Modified: trunk/evas/src/lib/engines/common/evas_font_query.c Modified: trunk/evas/src/lib/engines/common/evas_font_query.c =================================================================== --- trunk/evas/src/lib/engines/common/evas_font_query.c 2011-01-30 10:35:04 UTC (rev 56441) +++ trunk/evas/src/lib/engines/common/evas_font_query.c 2011-01-30 10:35:10 UTC (rev 56442) @@ -174,6 +174,10 @@ RGBA_Font_Int *fi; EVAS_FONT_WALK_TEXT_INIT(); _INIT_FI_AND_KERNING(); +#ifndef BIDI_SUPPORT + /* Suppress warnings */ + (void) intl_props; +#endif EVAS_FONT_WALK_TEXT_START() { @@ -407,6 +411,10 @@ RGBA_Font_Int *fi; EVAS_FONT_WALK_TEXT_INIT(); _INIT_FI_AND_KERNING(); +#ifndef BIDI_SUPPORT + /* Suppress warnings */ + (void) intl_props; +#endif #ifdef BIDI_SUPPORT int len = 0; |
From: Enlightenment S. <no-...@en...> - 2011-01-30 10:36:20
|
Log: Evas font: Added HARFBUZZ's cflags. Author: tasn Date: 2011-01-30 02:36:14 -0800 (Sun, 30 Jan 2011) New Revision: 56452 Trac: http://trac.enlightenment.org/e/changeset/56452 Modified: trunk/evas/src/lib/engines/common/Makefile.am Modified: trunk/evas/src/lib/engines/common/Makefile.am =================================================================== --- trunk/evas/src/lib/engines/common/Makefile.am 2011-01-30 10:36:08 UTC (rev 56451) +++ trunk/evas/src/lib/engines/common/Makefile.am 2011-01-30 10:36:14 UTC (rev 56452) @@ -13,7 +13,7 @@ @FREETYPE_CFLAGS@ @VALGRIND_CFLAGS@ \ @EET_CFLAGS@ @pthread_cflags@ \ @WIN32_CFLAGS@ @EINA_CFLAGS@ \ - @FRIBIDI_CFLAGS@ + @FRIBIDI_CFLAGS@ @HARFBUZZ_CFLAGS@ noinst_LTLIBRARIES = libevas_engine_common.la libevas_engine_common_la_SOURCES = \ |
From: Enlightenment S. <no-...@en...> - 2011-01-30 10:37:00
|
Log: Evas font-engine: Fixed an issue with cursor position with RTL text when OT is off. Author: tasn Date: 2011-01-30 02:36:53 -0800 (Sun, 30 Jan 2011) New Revision: 56457 Trac: http://trac.enlightenment.org/e/changeset/56457 Modified: trunk/evas/src/lib/engines/common/evas_font_query.c Modified: trunk/evas/src/lib/engines/common/evas_font_query.c =================================================================== --- trunk/evas/src/lib/engines/common/evas_font_query.c 2011-01-30 10:36:47 UTC (rev 56456) +++ trunk/evas/src/lib/engines/common/evas_font_query.c 2011-01-30 10:36:53 UTC (rev 56457) @@ -365,7 +365,7 @@ /* we need to see if the char at the visual position is the char wanted */ if (EVAS_FONT_WALK_DEFAULT_POS == (size_t) position) { - if (cx) *cx = chr_x + EVAS_FONT_WALK_DEFAULT_WIDTH; + if (cx) *cx = chr_x; if (cy) *cy = -asc; if (cw) *cw = chr_w; if (ch) *ch = asc + desc; @@ -523,16 +523,14 @@ { if (EVAS_FONT_WALK_DEFAULT_X_ADV > 0) { - if (cpen_x) *cpen_x = pen_x + - EVAS_FONT_WALK_DEFAULT_X_ADV; + if (cpen_x) *cpen_x = pen_x; if (cadv) *cadv = EVAS_FONT_WALK_DEFAULT_X_ADV; } else { if (cpen_x) *cpen_x = pen_x + EVAS_FONT_WALK_DEFAULT_X_OFF + - EVAS_FONT_WALK_DEFAULT_X_BEAR + - EVAS_FONT_WALK_DEFAULT_WIDTH; + EVAS_FONT_WALK_DEFAULT_X_BEAR; if (cadv) *cadv = EVAS_FONT_WALK_DEFAULT_WIDTH; } } |
From: Enlightenment S. <no-...@en...> - 2011-01-30 10:37:18
|
Log: Evas font-engine: Fixed an issue with cluster handling that broke cursor position in some cases. Author: tasn Date: 2011-01-30 02:37:12 -0800 (Sun, 30 Jan 2011) New Revision: 56460 Trac: http://trac.enlightenment.org/e/changeset/56460 Modified: trunk/evas/src/lib/engines/common/evas_font_ot_walk.x trunk/evas/src/lib/engines/common/evas_font_query.c Modified: trunk/evas/src/lib/engines/common/evas_font_ot_walk.x =================================================================== --- trunk/evas/src/lib/engines/common/evas_font_ot_walk.x 2011-01-30 10:37:05 UTC (rev 56459) +++ trunk/evas/src/lib/engines/common/evas_font_ot_walk.x 2011-01-30 10:37:12 UTC (rev 56460) @@ -145,7 +145,6 @@ } \ prev_index = index; \ } \ - /* FIXME: clean up */ \ } \ while(0) Modified: trunk/evas/src/lib/engines/common/evas_font_query.c =================================================================== --- trunk/evas/src/lib/engines/common/evas_font_query.c 2011-01-30 10:37:05 UTC (rev 56459) +++ trunk/evas/src/lib/engines/common/evas_font_query.c 2011-01-30 10:37:12 UTC (rev 56460) @@ -300,7 +300,7 @@ if ((intl_props->bidi.dir == EVAS_BIDI_DIRECTION_LTR) && (EVAS_FONT_WALK_OT_POS <= (size_t) position) && ((((size_t) position) < EVAS_FONT_WALK_OT_POS_NEXT) || - (EVAS_FONT_WALK_OT_POS == EVAS_FONT_WALK_OT_POS_NEXT))) + (EVAS_FONT_WALK_OT_IS_LAST))) { found = 1; items = EVAS_FONT_WALK_OT_POS_NEXT - EVAS_FONT_WALK_OT_POS; @@ -315,7 +315,7 @@ } else if ((intl_props->bidi.dir == EVAS_BIDI_DIRECTION_RTL) && ((EVAS_FONT_WALK_OT_POS_PREV > (size_t) position) || - (EVAS_FONT_WALK_OT_POS == EVAS_FONT_WALK_OT_POS_PREV)) && + (EVAS_FONT_WALK_OT_IS_LAST)) && (((size_t) position) >= EVAS_FONT_WALK_OT_POS)) { found = 1; @@ -440,7 +440,7 @@ if ((intl_props->bidi.dir == EVAS_BIDI_DIRECTION_LTR) && (EVAS_FONT_WALK_OT_POS <= (size_t) position) && ((((size_t) position) < EVAS_FONT_WALK_OT_POS_NEXT) || - (EVAS_FONT_WALK_OT_POS == EVAS_FONT_WALK_OT_POS_NEXT))) + (EVAS_FONT_WALK_OT_IS_LAST))) { found = 1; items = EVAS_FONT_WALK_OT_POS_NEXT - EVAS_FONT_WALK_OT_POS; @@ -455,7 +455,7 @@ } else if ((intl_props->bidi.dir == EVAS_BIDI_DIRECTION_RTL) && ((EVAS_FONT_WALK_OT_POS_PREV > (size_t) position) || - (EVAS_FONT_WALK_OT_POS == EVAS_FONT_WALK_OT_POS_PREV)) && + (EVAS_FONT_WALK_OT_IS_LAST)) && (((size_t) position) >= EVAS_FONT_WALK_OT_POS)) { found = 1; |
From: Enlightenment S. <no-...@en...> - 2011-01-30 10:37:25
|
Log: Evas font-engine: Fixed pen/char query. In RTL first is actually the last. Author: tasn Date: 2011-01-30 02:37:18 -0800 (Sun, 30 Jan 2011) New Revision: 56461 Trac: http://trac.enlightenment.org/e/changeset/56461 Modified: trunk/evas/src/lib/engines/common/evas_font_query.c Modified: trunk/evas/src/lib/engines/common/evas_font_query.c =================================================================== --- trunk/evas/src/lib/engines/common/evas_font_query.c 2011-01-30 10:37:12 UTC (rev 56460) +++ trunk/evas/src/lib/engines/common/evas_font_query.c 2011-01-30 10:37:18 UTC (rev 56461) @@ -315,7 +315,7 @@ } else if ((intl_props->bidi.dir == EVAS_BIDI_DIRECTION_RTL) && ((EVAS_FONT_WALK_OT_POS_PREV > (size_t) position) || - (EVAS_FONT_WALK_OT_IS_LAST)) && + (EVAS_FONT_WALK_OT_IS_FIRST)) && (((size_t) position) >= EVAS_FONT_WALK_OT_POS)) { found = 1; @@ -455,7 +455,7 @@ } else if ((intl_props->bidi.dir == EVAS_BIDI_DIRECTION_RTL) && ((EVAS_FONT_WALK_OT_POS_PREV > (size_t) position) || - (EVAS_FONT_WALK_OT_IS_LAST)) && + (EVAS_FONT_WALK_OT_IS_FIRST)) && (((size_t) position) >= EVAS_FONT_WALK_OT_POS)) { found = 1; |
From: Enlightenment S. <no-...@en...> - 2011-01-30 10:37:35
|
Log: Evas font-engine: Add cluster support to the font-engine. Cursor handling is now correct for clusters as well. Author: tasn Date: 2011-01-30 02:37:29 -0800 (Sun, 30 Jan 2011) New Revision: 56462 Trac: http://trac.enlightenment.org/e/changeset/56462 Modified: trunk/evas/src/lib/engines/common/evas_font_ot.c trunk/evas/src/lib/engines/common/evas_font_query.c Modified: trunk/evas/src/lib/engines/common/evas_font_ot.c =================================================================== --- trunk/evas/src/lib/engines/common/evas_font_ot.c 2011-01-30 10:37:18 UTC (rev 56461) +++ trunk/evas/src/lib/engines/common/evas_font_ot.c 2011-01-30 10:37:29 UTC (rev 56462) @@ -31,8 +31,59 @@ return EINA_FALSE; } +#ifdef OT_SUPPORT +/* FIXME: doc. returns #items */ +EAPI int +evas_common_font_ot_cluster_size_get(Evas_Text_Props *props, size_t char_index, int orig_len) +{ + int i; + int items; + int left_bound, right_bound; + size_t base_cluster = EVAS_FONT_OT_POS_GET(props->ot_data->items[char_index]); + for (i = (int) char_index ; + (i >= 0) && + (EVAS_FONT_OT_POS_GET(props->ot_data->items[i]) == base_cluster) ; + i--) + ; + left_bound = i; + for (i = (int) char_index + 1; + (i < (int) props->ot_data->len) && + (EVAS_FONT_OT_POS_GET(props->ot_data->items[i]) == base_cluster) ; + i++) + ; + right_bound = i; + if (right_bound == left_bound) + { + items = 1; + } + else if (props->bidi.dir == EVAS_BIDI_DIRECTION_RTL) + { + if (left_bound < 0) + { + items = orig_len - + props->ot_data->items[left_bound + 1].source_pos; + } + else + { + items = props->ot_data->items[left_bound].source_pos - + props->ot_data->items[left_bound + 1].source_pos; + } + } + else + { + if (right_bound == (int) props->ot_data->len) + { + items = orig_len - props->ot_data->items[left_bound].source_pos; + } + else + { + items = props->ot_data->items[right_bound - 1].source_pos - + props->ot_data->items[right_bound].source_pos; + } + } + return (items > 0) ? items : 1; +} -#ifdef OT_SUPPORT static void _evas_common_font_ot_shape(hb_buffer_t *buffer, FT_Face face) { Modified: trunk/evas/src/lib/engines/common/evas_font_query.c =================================================================== --- trunk/evas/src/lib/engines/common/evas_font_query.c 2011-01-30 10:37:18 UTC (rev 56461) +++ trunk/evas/src/lib/engines/common/evas_font_query.c 2011-01-30 10:37:29 UTC (rev 56462) @@ -279,23 +279,29 @@ #ifdef OT_SUPPORT if (evas_common_font_ot_is_enabled() && intl_props->ot_data) { + Evas_Coord cluster_start, last_end; + int prev_cluster = -1; + int found = 0, items = 0, item_pos = 1; + int last_is_visible; EVAS_FONT_WALK_OT_TEXT_VISUAL_START() { - int chr_x, chr_w; - int found = 0, items = 1, item_pos = 1; + EVAS_FONT_WALK_OT_TEXT_WORK(EINA_TRUE); - EVAS_FONT_WALK_OT_TEXT_WORK(EINA_TRUE); - if (visible) + if (prev_cluster != (int) EVAS_FONT_WALK_OT_POS) { - chr_x = (pen_x) + EVAS_FONT_WALK_OT_X_OFF + - EVAS_FONT_WALK_OT_X_BEAR; - chr_w = EVAS_FONT_WALK_OT_WIDTH; + if (found) + { + break; + } + else + { + cluster_start = (pen_x) + EVAS_FONT_WALK_OT_X_OFF + + EVAS_FONT_WALK_OT_X_BEAR; + } } - else - { - chr_x = pen_x; - chr_w = 0; - } + last_is_visible = visible; + last_end = pen_x + EVAS_FONT_WALK_OT_X_OFF + + EVAS_FONT_WALK_OT_X_BEAR + EVAS_FONT_WALK_OT_WIDTH; /* we need to see if the char at the visual position is the char wanted */ if ((intl_props->bidi.dir == EVAS_BIDI_DIRECTION_LTR) && (EVAS_FONT_WALK_OT_POS <= (size_t) position) && @@ -303,14 +309,8 @@ (EVAS_FONT_WALK_OT_IS_LAST))) { found = 1; - items = EVAS_FONT_WALK_OT_POS_NEXT - EVAS_FONT_WALK_OT_POS; - if (EVAS_FONT_WALK_OT_POS == EVAS_FONT_WALK_OT_POS_NEXT) - { - /* If there was only one char, take the original lens - * for the number of items. */ - items = EVAS_FONT_WALK_ORIG_LEN - - EVAS_FONT_WALK_OT_POS; - } + items = evas_common_font_ot_cluster_size_get(intl_props, + char_index, EVAS_FONT_WALK_ORIG_LEN); item_pos = position - EVAS_FONT_WALK_OT_POS + 1; } else if ((intl_props->bidi.dir == EVAS_BIDI_DIRECTION_RTL) && @@ -319,29 +319,35 @@ (((size_t) position) >= EVAS_FONT_WALK_OT_POS)) { found = 1; - items = EVAS_FONT_WALK_OT_POS_PREV - EVAS_FONT_WALK_OT_POS; - if (EVAS_FONT_WALK_OT_POS == EVAS_FONT_WALK_OT_POS_PREV) - { - /* If there was only one char, take the original lens - * for the number of items. */ - items = EVAS_FONT_WALK_ORIG_LEN - - EVAS_FONT_WALK_OT_POS; - } + items = evas_common_font_ot_cluster_size_get(intl_props, + char_index, EVAS_FONT_WALK_ORIG_LEN); item_pos = items - (position - EVAS_FONT_WALK_OT_POS); } - if (found) + prev_cluster = EVAS_FONT_WALK_OT_POS; + } + EVAS_FONT_WALK_OT_TEXT_END(); + if (found) + { + Evas_Coord cluster_w; + cluster_w = last_end - cluster_start; + if (cy) *cy = -asc; + if (ch) *ch = asc + desc; + if (last_is_visible) { - if (cx) *cx = chr_x + - (EVAS_FONT_WALK_OT_WIDTH / items) * (item_pos - 1); - if (cy) *cy = -asc; - if (cw) *cw = chr_w / items; - if (ch) *ch = asc + desc; - ret_val = 1; - goto end; + if (cx) *cx = cluster_start + + (cluster_w / items) * + (item_pos - 1); + if (cw) *cw = (cluster_w / items); } + else + { + if (cx) *cx = cluster_start; + if (cw) *cw = 0; + } + ret_val = 1; + goto end; } - EVAS_FONT_WALK_OT_TEXT_END(); } else #endif @@ -432,25 +438,35 @@ #ifdef OT_SUPPORT if (evas_common_font_ot_is_enabled() && intl_props->ot_data) { + Evas_Coord cluster_start; + int prev_cluster = -1; + int found = 0, items = 0, item_pos = 1; + int last_is_visible = 1; EVAS_FONT_WALK_OT_TEXT_VISUAL_START() { - int found = 0, items = 1, item_pos = 1; EVAS_FONT_WALK_OT_TEXT_WORK(EINA_TRUE); - /* we need to see if the char at the visual position is the char wanted */ + + if (prev_cluster != (int) EVAS_FONT_WALK_OT_POS) + { + if (found) + { + break; + } + else + { + cluster_start = pen_x; + } + } + last_is_visible = visible; + if ((intl_props->bidi.dir == EVAS_BIDI_DIRECTION_LTR) && (EVAS_FONT_WALK_OT_POS <= (size_t) position) && ((((size_t) position) < EVAS_FONT_WALK_OT_POS_NEXT) || (EVAS_FONT_WALK_OT_IS_LAST))) { found = 1; - items = EVAS_FONT_WALK_OT_POS_NEXT - EVAS_FONT_WALK_OT_POS; - if (EVAS_FONT_WALK_OT_POS == EVAS_FONT_WALK_OT_POS_NEXT) - { - /* If there was only one char, take the original lens - * for the number of items. */ - items = EVAS_FONT_WALK_ORIG_LEN - - EVAS_FONT_WALK_OT_POS; - } + items = evas_common_font_ot_cluster_size_get(intl_props, + char_index, EVAS_FONT_WALK_ORIG_LEN); item_pos = position - EVAS_FONT_WALK_OT_POS + 1; } else if ((intl_props->bidi.dir == EVAS_BIDI_DIRECTION_RTL) && @@ -459,52 +475,36 @@ (((size_t) position) >= EVAS_FONT_WALK_OT_POS)) { found = 1; - items = EVAS_FONT_WALK_OT_POS_PREV - EVAS_FONT_WALK_OT_POS; - if (EVAS_FONT_WALK_OT_POS == EVAS_FONT_WALK_OT_POS_PREV) - { - /* If there was only one char, take the original lens - * for the number of items. */ - items = EVAS_FONT_WALK_ORIG_LEN - - EVAS_FONT_WALK_OT_POS; - } + items = evas_common_font_ot_cluster_size_get(intl_props, + char_index, EVAS_FONT_WALK_ORIG_LEN); item_pos = items - (position - EVAS_FONT_WALK_OT_POS); } - if (found) + prev_cluster = EVAS_FONT_WALK_OT_POS; + } + EVAS_FONT_WALK_OT_TEXT_END(); + + if (found) + { + Evas_Coord cluster_adv; + cluster_adv = pen_x - cluster_start; + if (cy) *cy = -asc; + if (ch) *ch = asc + desc; + if (last_is_visible) { - if (cy) *cy = -asc; - if (ch) *ch = asc + desc; - /* FIXME: A hack to make combining chars work nice, should - * change to take the base char's adv. */ - if (visible) - { - if (EVAS_FONT_WALK_OT_X_ADV > 0) - { - if (cpen_x) *cpen_x = pen_x + - (EVAS_FONT_WALK_OT_X_ADV / items) * - (item_pos - 1); - if (cadv) *cadv = (EVAS_FONT_WALK_OT_X_ADV / items); - } - else - { - if (cpen_x) *cpen_x = pen_x + - EVAS_FONT_WALK_OT_X_OFF + - EVAS_FONT_WALK_OT_X_BEAR + - (EVAS_FONT_WALK_OT_WIDTH / items) * - (item_pos - 1); - if (cadv) *cadv = (EVAS_FONT_WALK_OT_WIDTH / items); - } - } - else - { - if (cpen_x) *cpen_x = pen_x; - if (cadv) *cadv = 0; - } - ret_val = 1; - goto end; + if (cpen_x) *cpen_x = cluster_start + + (cluster_adv / items) * + (item_pos - 1); + if (cadv) *cadv = (cluster_adv / items); } + else + { + if (cpen_x) *cpen_x = pen_x; + if (cadv) *cadv = 0; + } + ret_val = 1; + goto end; } - EVAS_FONT_WALK_OT_TEXT_END(); } else #endif @@ -577,9 +577,24 @@ #ifdef OT_SUPPORT if (evas_common_font_ot_is_enabled() && intl_props->ot_data) { + Evas_Coord cluster_start; + int prev_cluster = -1; + int found = 0, items = 0; EVAS_FONT_WALK_OT_TEXT_VISUAL_START() { EVAS_FONT_WALK_OT_TEXT_WORK(EINA_TRUE); + if (prev_cluster != (int) EVAS_FONT_WALK_OT_POS) + { + if (found) + { + break; + } + else + { + cluster_start = pen_x; + } + } + if (!visible) continue; /* we need to see if the char at the visual position is the char, @@ -588,47 +603,40 @@ if ((x >= pen_x) && (x <= (pen_x + EVAS_FONT_WALK_OT_X_ADV)) && (y >= -asc) && (y <= desc)) { - int items = 1, item_pos = 1; + items = evas_common_font_ot_cluster_size_get(intl_props, + char_index, EVAS_FONT_WALK_ORIG_LEN); + found = 1; + } - if (intl_props->bidi.dir == EVAS_BIDI_DIRECTION_LTR) - { - double part; - items = EVAS_FONT_WALK_OT_POS_NEXT - - EVAS_FONT_WALK_OT_POS; - /* If it's the last/first char in a ltr/rtl string */ - if (items == 0) - { - items = EVAS_FONT_WALK_ORIG_LEN - - EVAS_FONT_WALK_OT_POS; - } - part = EVAS_FONT_WALK_OT_X_ADV / items; - item_pos = (int) ((x - pen_x) / part); - } - else - { - double part; - items = EVAS_FONT_WALK_OT_POS_PREV - - EVAS_FONT_WALK_OT_POS; - /* If it's the last/first char in a ltr/rtl string */ - if (items == 0) - { - items = EVAS_FONT_WALK_ORIG_LEN - - EVAS_FONT_WALK_OT_POS; - } - part = EVAS_FONT_WALK_OT_X_ADV / items; - item_pos = items - ((int) ((x - pen_x) / part)) - 1; - } - if (cx) *cx = pen_x + EVAS_FONT_WALK_OT_X_OFF + - EVAS_FONT_WALK_OT_X_BEAR + - ((EVAS_FONT_WALK_OT_X_ADV / items) * (item_pos - 1)); - if (cy) *cy = -asc; - if (cw) *cw = (EVAS_FONT_WALK_OT_X_ADV / items); - if (ch) *ch = asc + desc; - ret_val = EVAS_FONT_WALK_OT_POS + item_pos; - goto end; + prev_cluster = EVAS_FONT_WALK_OT_POS; + } + EVAS_FONT_WALK_OT_TEXT_END(); + if (found) + { + int item_pos; + Evas_Coord cluster_adv; + cluster_adv = pen_x - cluster_start; + + if (intl_props->bidi.dir == EVAS_BIDI_DIRECTION_LTR) + { + double part; + part = cluster_adv / items; + item_pos = (int) ((x - cluster_start) / part); } + else + { + double part; + part = cluster_adv / items; + item_pos = items - ((int) ((x - cluster_start) / part)) - 1; + } + if (cx) *cx = pen_x + + ((cluster_adv / items) * (item_pos - 1)); + if (cy) *cy = -asc; + if (cw) *cw = (cluster_adv / items); + if (ch) *ch = asc + desc; + ret_val = prev_cluster + item_pos; + goto end; } - EVAS_FONT_WALK_OT_TEXT_END(); } else #endif |
From: Enlightenment S. <no-...@en...> - 2011-01-30 10:37:41
|
Log: Evas font-ot: renamed internal source_pos to source_cluster and added the forgotten evas_common_font_ot_cluster_size_get to the .h file. Author: tasn Date: 2011-01-30 02:37:34 -0800 (Sun, 30 Jan 2011) New Revision: 56463 Trac: http://trac.enlightenment.org/e/changeset/56463 Modified: trunk/evas/src/lib/engines/common/evas_font_ot.c trunk/evas/src/lib/engines/common/evas_font_ot.h Modified: trunk/evas/src/lib/engines/common/evas_font_ot.c =================================================================== --- trunk/evas/src/lib/engines/common/evas_font_ot.c 2011-01-30 10:37:29 UTC (rev 56462) +++ trunk/evas/src/lib/engines/common/evas_font_ot.c 2011-01-30 10:37:34 UTC (rev 56463) @@ -34,7 +34,7 @@ #ifdef OT_SUPPORT /* FIXME: doc. returns #items */ EAPI int -evas_common_font_ot_cluster_size_get(Evas_Text_Props *props, size_t char_index, int orig_len) +evas_common_font_ot_cluster_size_get(const Evas_Text_Props *props, size_t char_index, int orig_len) { int i; int items; @@ -61,24 +61,24 @@ if (left_bound < 0) { items = orig_len - - props->ot_data->items[left_bound + 1].source_pos; + props->ot_data->items[left_bound + 1].source_cluster; } else { - items = props->ot_data->items[left_bound].source_pos - - props->ot_data->items[left_bound + 1].source_pos; + items = props->ot_data->items[left_bound].source_cluster - + props->ot_data->items[left_bound + 1].source_cluster; } } else { if (right_bound == (int) props->ot_data->len) { - items = orig_len - props->ot_data->items[left_bound].source_pos; + items = orig_len - props->ot_data->items[left_bound].source_cluster; } else { - items = props->ot_data->items[right_bound - 1].source_pos - - props->ot_data->items[right_bound].source_pos; + items = props->ot_data->items[right_bound - 1].source_cluster - + props->ot_data->items[right_bound].source_cluster; } } return (items > 0) ? items : 1; @@ -158,7 +158,7 @@ for (i = 0 ; i < props->ot_data->len ; i++) { props->ot_data->items[i].index = infos[i].codepoint; - props->ot_data->items[i].source_pos = infos[i].cluster; + props->ot_data->items[i].source_cluster = infos[i].cluster; props->ot_data->items[i].x_advance = positions[i].x_advance; props->ot_data->items[i].x_offset = positions[i].x_offset; props->ot_data->items[i].y_offset = positions[i].y_offset; Modified: trunk/evas/src/lib/engines/common/evas_font_ot.h =================================================================== --- trunk/evas/src/lib/engines/common/evas_font_ot.h 2011-01-30 10:37:29 UTC (rev 56462) +++ trunk/evas/src/lib/engines/common/evas_font_ot.h 2011-01-30 10:37:34 UTC (rev 56463) @@ -28,7 +28,7 @@ struct _Evas_Font_OT_Data_Item { unsigned int index; /* Should conform to FT */ - size_t source_pos; + size_t source_cluster; Evas_Coord x_offset; Evas_Coord y_offset; Evas_Coord x_advance; @@ -43,7 +43,7 @@ # define EVAS_FONT_OT_X_ADV_GET(a) ((a).x_advance) //# define EVAS_FONT_OT_Y_ADV_GET(a) ((a).y_advance) # define EVAS_FONT_OT_INDEX_GET(a) ((a).index) -# define EVAS_FONT_OT_POS_GET(a) ((a).source_pos) +# define EVAS_FONT_OT_POS_GET(a) ((a).source_cluster) #else # define EVAS_FONT_OT_X_OFF_GET(a) (0) # define EVAS_FONT_OT_Y_OFF_GET(a) (0) @@ -63,6 +63,9 @@ evas_common_font_ot_props_unref(Evas_Font_OT_Data *data); #include "evas_text_utils.h" +EAPI int +evas_common_font_ot_cluster_size_get(const Evas_Text_Props *props, size_t char_index, int orig_len); + EAPI Eina_Bool evas_common_font_ot_populate_text_props(void *fn, const Eina_Unicode *text, Evas_Text_Props *props, int len); |
From: Enlightenment S. <no-...@en...> - 2011-01-30 10:37:51
|
Log: Evas font-ot: Fixed mistakes that caused ilegal reads. Author: tasn Date: 2011-01-30 02:37:40 -0800 (Sun, 30 Jan 2011) New Revision: 56464 Trac: http://trac.enlightenment.org/e/changeset/56464 Modified: trunk/evas/src/lib/engines/common/evas_font_ot.c Modified: trunk/evas/src/lib/engines/common/evas_font_ot.c =================================================================== --- trunk/evas/src/lib/engines/common/evas_font_ot.c 2011-01-30 10:37:34 UTC (rev 56463) +++ trunk/evas/src/lib/engines/common/evas_font_ot.c 2011-01-30 10:37:40 UTC (rev 56464) @@ -73,12 +73,13 @@ { if (right_bound == (int) props->ot_data->len) { - items = orig_len - props->ot_data->items[left_bound].source_cluster; + items = orig_len - + props->ot_data->items[right_bound - 1].source_cluster; } else { - items = props->ot_data->items[right_bound - 1].source_cluster - - props->ot_data->items[right_bound].source_cluster; + items = props->ot_data->items[right_bound].source_cluster - + props->ot_data->items[right_bound - 1].source_cluster; } } return (items > 0) ? items : 1; |