diff options
author | Youngbok Shin <youngb.shin@samsung.com> | 2018-08-20 07:21:53 -0400 |
---|---|---|
committer | Mike Blumenkrantz <zmike@samsung.com> | 2018-08-20 10:29:32 -0400 |
commit | 517018e00897f61136418861563a49144a5fe39a (patch) | |
tree | 694c299402631380a10a7ad6ddbebfbb774e7e91 | |
parent | 8da56ac873d5bb083b7cfe08aeefdaa2ad9a4b99 (diff) |
evas textblock: add/apply cursor cluster APIs based on grapheme cluster
Summary:
Add a feature for moving cursor over a grapheme cluster.
It is applied to edje_entry.c and elm_entry.c for improving
cursor handling just like other modern text editors. ex) gedit
The patch on Evas needs to update libunibreak library.
So, the patch will update libunibreak, too.
@feature
Test Plan:
1. Put "ഹലോ" in your entry.
2. Your cursor can reach at the end of text from the beginning
only in 2 right key event with this feature.
Reviewers: raster, cedric, jpeg, herdsman, zmike, devilhorns
Reviewed By: herdsman, zmike
Subscribers: #reviewers, #committers, zmike, bowonryu, woohyun
Tags: #efl
Differential Revision: https://phab.enlightenment.org/D5490
Diffstat (limited to '')
26 files changed, 2295 insertions, 103 deletions
diff --git a/src/Makefile_Evas.am b/src/Makefile_Evas.am index 0699dde533..b09521cb72 100644 --- a/src/Makefile_Evas.am +++ b/src/Makefile_Evas.am | |||
@@ -193,7 +193,10 @@ static_libs/libunibreak/linebreak.h \ | |||
193 | static_libs/libunibreak/linebreakdef.h \ | 193 | static_libs/libunibreak/linebreakdef.h \ |
194 | static_libs/libunibreak/wordbreakdef.h \ | 194 | static_libs/libunibreak/wordbreakdef.h \ |
195 | static_libs/libunibreak/wordbreak.h \ | 195 | static_libs/libunibreak/wordbreak.h \ |
196 | static_libs/libunibreak/wordbreakdata.c | 196 | static_libs/libunibreak/wordbreakdata.c \ |
197 | static_libs/libunibreak/graphemebreak.h \ | ||
198 | static_libs/libunibreak/graphemebreakdef.h \ | ||
199 | static_libs/libunibreak/graphemebreakdata.c | ||
197 | 200 | ||
198 | # Linebreak | 201 | # Linebreak |
199 | lib_evas_libevas_la_SOURCES = \ | 202 | lib_evas_libevas_la_SOURCES = \ |
@@ -202,7 +205,8 @@ static_libs/libunibreak/unibreakdef.c \ | |||
202 | static_libs/libunibreak/linebreak.c \ | 205 | static_libs/libunibreak/linebreak.c \ |
203 | static_libs/libunibreak/linebreakdata.c \ | 206 | static_libs/libunibreak/linebreakdata.c \ |
204 | static_libs/libunibreak/linebreakdef.c \ | 207 | static_libs/libunibreak/linebreakdef.c \ |
205 | static_libs/libunibreak/wordbreak.c | 208 | static_libs/libunibreak/wordbreak.c \ |
209 | static_libs/libunibreak/graphemebreak.c | ||
206 | 210 | ||
207 | # Main | 211 | # Main |
208 | lib_evas_libevas_la_SOURCES += \ | 212 | lib_evas_libevas_la_SOURCES += \ |
diff --git a/src/lib/edje/edje_entry.c b/src/lib/edje/edje_entry.c index 6c1f8960ff..1ad3c30b65 100644 --- a/src/lib/edje/edje_entry.c +++ b/src/lib/edje/edje_entry.c | |||
@@ -536,7 +536,7 @@ _curs_jump_line(Evas_Textblock_Cursor *c, Evas_Object *o, Entry *en, int ln) | |||
536 | 536 | ||
537 | if (!evas_object_textblock_line_number_geometry_get(o, ln, &lx, &ly, &lw, &lh)) | 537 | if (!evas_object_textblock_line_number_geometry_get(o, ln, &lx, &ly, &lw, &lh)) |
538 | return EINA_FALSE; | 538 | return EINA_FALSE; |
539 | if (evas_textblock_cursor_char_coord_set(c, cx, ly + (lh / 2))) | 539 | if (evas_textblock_cursor_cluster_coord_set(c, cx, ly + (lh / 2))) |
540 | return EINA_TRUE; | 540 | return EINA_TRUE; |
541 | evas_textblock_cursor_line_set(c, ln); | 541 | evas_textblock_cursor_line_set(c, ln); |
542 | if (cx < (lx + (lw / 2))) | 542 | if (cx < (lx + (lw / 2))) |
@@ -1607,24 +1607,33 @@ _delete_emit(Edje *ed, Evas_Textblock_Cursor *c, Entry *en, size_t pos, | |||
1607 | ERR("Running very low on memory"); | 1607 | ERR("Running very low on memory"); |
1608 | return; | 1608 | return; |
1609 | } | 1609 | } |
1610 | char *tmp = evas_textblock_cursor_content_get(c); | 1610 | char *tmp = NULL; |
1611 | 1611 | ||
1612 | info->insert = EINA_FALSE; | 1612 | info->insert = EINA_FALSE; |
1613 | if (backspace) | 1613 | if (backspace) |
1614 | { | 1614 | { |
1615 | info->change.del.start = pos - 1; | 1615 | info->change.del.start = pos - 1; |
1616 | info->change.del.end = pos; | 1616 | info->change.del.end = pos; |
1617 | tmp = evas_textblock_cursor_content_get(c); | ||
1618 | evas_textblock_cursor_char_delete(c); | ||
1617 | } | 1619 | } |
1618 | else | 1620 | else |
1619 | { | 1621 | { |
1620 | info->change.del.start = pos + 1; | 1622 | Evas_Textblock_Cursor *cc = evas_object_textblock_cursor_new(en->rp->object); |
1623 | evas_textblock_cursor_copy(c, cc); | ||
1624 | evas_textblock_cursor_cluster_next(cc); | ||
1625 | |||
1626 | info->change.del.start = evas_textblock_cursor_pos_get(cc); | ||
1621 | info->change.del.end = pos; | 1627 | info->change.del.end = pos; |
1628 | |||
1629 | tmp = evas_textblock_cursor_range_text_get(c, cc, EVAS_TEXTBLOCK_TEXT_MARKUP); | ||
1630 | evas_textblock_cursor_range_delete(c, cc); | ||
1631 | evas_textblock_cursor_free(cc); | ||
1622 | } | 1632 | } |
1623 | 1633 | ||
1624 | info->change.del.content = eina_stringshare_add(tmp); | 1634 | info->change.del.content = eina_stringshare_add(tmp); |
1625 | if (tmp) free(tmp); | 1635 | if (tmp) free(tmp); |
1626 | 1636 | ||
1627 | evas_textblock_cursor_char_delete(c); | ||
1628 | _edje_emit(ed, "entry,changed", en->rp->part->name); | 1637 | _edje_emit(ed, "entry,changed", en->rp->part->name); |
1629 | _edje_emit_full(ed, "entry,changed,user", en->rp->part->name, | 1638 | _edje_emit_full(ed, "entry,changed,user", en->rp->part->name, |
1630 | info, _free_entry_change_info); | 1639 | info, _free_entry_change_info); |
@@ -1855,7 +1864,7 @@ _edje_key_down_cb(void *data, Evas *e EINA_UNUSED, Evas_Object *obj EINA_UNUSED, | |||
1855 | } | 1864 | } |
1856 | } | 1865 | } |
1857 | } | 1866 | } |
1858 | if (evas_textblock_cursor_char_prev(en->cursor)) | 1867 | if (evas_textblock_cursor_cluster_prev(en->cursor)) |
1859 | ev->event_flags |= EVAS_EVENT_FLAG_ON_HOLD; | 1868 | ev->event_flags |= EVAS_EVENT_FLAG_ON_HOLD; |
1860 | #if defined(__APPLE__) && defined(__MACH__) | 1869 | #if defined(__APPLE__) && defined(__MACH__) |
1861 | if (altgr) evas_textblock_cursor_word_start(en->cursor); | 1870 | if (altgr) evas_textblock_cursor_word_start(en->cursor); |
@@ -1903,7 +1912,7 @@ _edje_key_down_cb(void *data, Evas *e EINA_UNUSED, Evas_Object *obj EINA_UNUSED, | |||
1903 | #else | 1912 | #else |
1904 | if (control) evas_textblock_cursor_word_end(en->cursor); | 1913 | if (control) evas_textblock_cursor_word_end(en->cursor); |
1905 | #endif | 1914 | #endif |
1906 | if (evas_textblock_cursor_char_next(en->cursor)) | 1915 | if (evas_textblock_cursor_cluster_next(en->cursor)) |
1907 | ev->event_flags |= EVAS_EVENT_FLAG_ON_HOLD; | 1916 | ev->event_flags |= EVAS_EVENT_FLAG_ON_HOLD; |
1908 | if (en->select_allow) | 1917 | if (en->select_allow) |
1909 | { | 1918 | { |
@@ -1921,7 +1930,7 @@ _edje_key_down_cb(void *data, Evas *e EINA_UNUSED, Evas_Object *obj EINA_UNUSED, | |||
1921 | // del to start of previous word | 1930 | // del to start of previous word |
1922 | _sel_start(en->cursor, rp->object, en); | 1931 | _sel_start(en->cursor, rp->object, en); |
1923 | 1932 | ||
1924 | evas_textblock_cursor_char_prev(en->cursor); | 1933 | evas_textblock_cursor_cluster_prev(en->cursor); |
1925 | evas_textblock_cursor_word_start(en->cursor); | 1934 | evas_textblock_cursor_word_start(en->cursor); |
1926 | 1935 | ||
1927 | _sel_preextend(ed, en->cursor, rp->object, en); | 1936 | _sel_preextend(ed, en->cursor, rp->object, en); |
@@ -1961,7 +1970,7 @@ _edje_key_down_cb(void *data, Evas *e EINA_UNUSED, Evas_Object *obj EINA_UNUSED, | |||
1961 | _sel_start(en->cursor, rp->object, en); | 1970 | _sel_start(en->cursor, rp->object, en); |
1962 | 1971 | ||
1963 | evas_textblock_cursor_word_end(en->cursor); | 1972 | evas_textblock_cursor_word_end(en->cursor); |
1964 | evas_textblock_cursor_char_next(en->cursor); | 1973 | evas_textblock_cursor_cluster_next(en->cursor); |
1965 | 1974 | ||
1966 | _sel_extend(ed, en->cursor, rp->object, en); | 1975 | _sel_extend(ed, en->cursor, rp->object, en); |
1967 | 1976 | ||
@@ -2400,7 +2409,7 @@ _edje_key_up_cb(void *data, Evas *e EINA_UNUSED, Evas_Object *obj EINA_UNUSED, v | |||
2400 | } | 2409 | } |
2401 | 2410 | ||
2402 | static Evas_Textblock_Cursor * | 2411 | static Evas_Textblock_Cursor * |
2403 | _edje_cursor_char_coord_set(Edje_Real_Part *rp, Evas_Coord canvasx, Evas_Coord canvasy, Evas_Coord *cx, Evas_Coord *cy) | 2412 | _edje_cursor_cluster_coord_set(Edje_Real_Part *rp, Evas_Coord canvasx, Evas_Coord canvasy, Evas_Coord *cx, Evas_Coord *cy) |
2404 | { | 2413 | { |
2405 | Entry *en; | 2414 | Entry *en; |
2406 | Evas_Coord x, y, lh = 0, cly = 0; | 2415 | Evas_Coord x, y, lh = 0, cly = 0; |
@@ -2432,7 +2441,7 @@ _edje_cursor_char_coord_set(Edje_Real_Part *rp, Evas_Coord canvasx, Evas_Coord c | |||
2432 | evas_textblock_cursor_free(line_cur); | 2441 | evas_textblock_cursor_free(line_cur); |
2433 | /* No need to check return value if not able to set the char coord Textblock | 2442 | /* No need to check return value if not able to set the char coord Textblock |
2434 | * will take care */ | 2443 | * will take care */ |
2435 | evas_textblock_cursor_char_coord_set(en->cursor, *cx, *cy); | 2444 | evas_textblock_cursor_cluster_coord_set(en->cursor, *cx, *cy); |
2436 | 2445 | ||
2437 | return tc; | 2446 | return tc; |
2438 | } | 2447 | } |
@@ -2530,7 +2539,7 @@ _edje_part_mouse_down_cb(void *data, Evas *e EINA_UNUSED, Evas_Object *obj EINA_ | |||
2530 | else | 2539 | else |
2531 | { | 2540 | { |
2532 | evas_textblock_cursor_word_end(en->cursor); | 2541 | evas_textblock_cursor_word_end(en->cursor); |
2533 | evas_textblock_cursor_char_next(en->cursor); | 2542 | evas_textblock_cursor_cluster_next(en->cursor); |
2534 | } | 2543 | } |
2535 | _sel_extend(en->ed, en->cursor, rp->object, en); | 2544 | _sel_extend(en->ed, en->cursor, rp->object, en); |
2536 | } | 2545 | } |
@@ -2544,13 +2553,13 @@ _edje_part_mouse_down_cb(void *data, Evas *e EINA_UNUSED, Evas_Object *obj EINA_ | |||
2544 | evas_textblock_cursor_word_start(en->cursor); | 2553 | evas_textblock_cursor_word_start(en->cursor); |
2545 | _sel_start(en->cursor, rp->object, en); | 2554 | _sel_start(en->cursor, rp->object, en); |
2546 | evas_textblock_cursor_word_end(en->cursor); | 2555 | evas_textblock_cursor_word_end(en->cursor); |
2547 | evas_textblock_cursor_char_next(en->cursor); | 2556 | evas_textblock_cursor_cluster_next(en->cursor); |
2548 | _sel_extend(en->ed, en->cursor, rp->object, en); | 2557 | _sel_extend(en->ed, en->cursor, rp->object, en); |
2549 | } | 2558 | } |
2550 | goto end; | 2559 | goto end; |
2551 | } | 2560 | } |
2552 | } | 2561 | } |
2553 | tc = _edje_cursor_char_coord_set(rp, ev->canvas.x, ev->canvas.y, &cx, &cy); | 2562 | tc = _edje_cursor_cluster_coord_set(rp, ev->canvas.x, ev->canvas.y, &cx, &cy); |
2554 | 2563 | ||
2555 | if (dosel) | 2564 | if (dosel) |
2556 | { | 2565 | { |
@@ -2670,7 +2679,7 @@ _edje_part_mouse_up_cb(void *data, Evas *e EINA_UNUSED, Evas_Object *obj EINA_UN | |||
2670 | #endif | 2679 | #endif |
2671 | 2680 | ||
2672 | /* cx cy are unused but needed in mouse down, please bear with it */ | 2681 | /* cx cy are unused but needed in mouse down, please bear with it */ |
2673 | tc = _edje_cursor_char_coord_set(rp, ev->canvas.x, ev->canvas.y, &cx, &cy); | 2682 | tc = _edje_cursor_cluster_coord_set(rp, ev->canvas.x, ev->canvas.y, &cx, &cy); |
2674 | 2683 | ||
2675 | if (en->select_allow) | 2684 | if (en->select_allow) |
2676 | { | 2685 | { |
@@ -2748,7 +2757,7 @@ _edje_part_mouse_move_cb(void *data, Evas *e EINA_UNUSED, Evas_Object *obj EINA_ | |||
2748 | evas_object_geometry_get(rp->object, &x, &y, &w, &h); | 2757 | evas_object_geometry_get(rp->object, &x, &y, &w, &h); |
2749 | cx = ev->cur.canvas.x - x; | 2758 | cx = ev->cur.canvas.x - x; |
2750 | cy = ev->cur.canvas.y - y; | 2759 | cy = ev->cur.canvas.y - y; |
2751 | if (!evas_textblock_cursor_char_coord_set(en->cursor, cx, cy)) | 2760 | if (!evas_textblock_cursor_cluster_coord_set(en->cursor, cx, cy)) |
2752 | { | 2761 | { |
2753 | Evas_Coord lx, ly, lw, lh; | 2762 | Evas_Coord lx, ly, lw, lh; |
2754 | 2763 | ||
@@ -2760,7 +2769,7 @@ _edje_part_mouse_move_cb(void *data, Evas *e EINA_UNUSED, Evas_Object *obj EINA_ | |||
2760 | { | 2769 | { |
2761 | evas_textblock_cursor_paragraph_first(en->cursor); | 2770 | evas_textblock_cursor_paragraph_first(en->cursor); |
2762 | evas_textblock_cursor_line_geometry_get(en->cursor, &lx, &ly, &lw, &lh); | 2771 | evas_textblock_cursor_line_geometry_get(en->cursor, &lx, &ly, &lw, &lh); |
2763 | if (!evas_textblock_cursor_char_coord_set(en->cursor, cx, ly + (lh / 2))) | 2772 | if (!evas_textblock_cursor_cluster_coord_set(en->cursor, cx, ly + (lh / 2))) |
2764 | _curs_end(en->cursor, rp->object, en); | 2773 | _curs_end(en->cursor, rp->object, en); |
2765 | } | 2774 | } |
2766 | } | 2775 | } |
@@ -4029,7 +4038,7 @@ _edje_text_cursor_next(Edje_Real_Part *rp, Efl_Text_Cursor_Cursor *c) | |||
4029 | 4038 | ||
4030 | _edje_entry_imf_context_reset(rp); | 4039 | _edje_entry_imf_context_reset(rp); |
4031 | 4040 | ||
4032 | if (!evas_textblock_cursor_char_next(c)) | 4041 | if (!evas_textblock_cursor_cluster_next(c)) |
4033 | { | 4042 | { |
4034 | return EINA_FALSE; | 4043 | return EINA_FALSE; |
4035 | } | 4044 | } |
@@ -4062,7 +4071,7 @@ _edje_text_cursor_prev(Edje_Real_Part *rp, Efl_Text_Cursor_Cursor *c) | |||
4062 | 4071 | ||
4063 | _edje_entry_imf_context_reset(rp); | 4072 | _edje_entry_imf_context_reset(rp); |
4064 | 4073 | ||
4065 | if (!evas_textblock_cursor_char_prev(c)) | 4074 | if (!evas_textblock_cursor_cluster_prev(c)) |
4066 | { | 4075 | { |
4067 | if (evas_textblock_cursor_paragraph_prev(c)) goto ok; | 4076 | if (evas_textblock_cursor_paragraph_prev(c)) goto ok; |
4068 | else return EINA_FALSE; | 4077 | else return EINA_FALSE; |
@@ -4106,7 +4115,7 @@ _edje_text_cursor_up(Edje_Real_Part *rp, Efl_Text_Cursor_Cursor *c) | |||
4106 | &lx, &ly, &lw, &lh)) | 4115 | &lx, &ly, &lw, &lh)) |
4107 | return EINA_FALSE; | 4116 | return EINA_FALSE; |
4108 | evas_textblock_cursor_char_geometry_get(c, &cx, &cy, &cw, &ch); | 4117 | evas_textblock_cursor_char_geometry_get(c, &cx, &cy, &cw, &ch); |
4109 | if (!evas_textblock_cursor_char_coord_set(c, cx, ly + (lh / 2))) | 4118 | if (!evas_textblock_cursor_cluster_coord_set(c, cx, ly + (lh / 2))) |
4110 | evas_textblock_cursor_line_char_last(c); | 4119 | evas_textblock_cursor_line_char_last(c); |
4111 | _sel_update(en->ed, c, rp->object, rp->typedata.text->entry_data); | 4120 | _sel_update(en->ed, c, rp->object, rp->typedata.text->entry_data); |
4112 | 4121 | ||
@@ -4145,7 +4154,7 @@ _edje_text_cursor_down(Edje_Real_Part *rp, Efl_Text_Cursor_Cursor *c) | |||
4145 | &lx, &ly, &lw, &lh)) | 4154 | &lx, &ly, &lw, &lh)) |
4146 | return EINA_FALSE; | 4155 | return EINA_FALSE; |
4147 | evas_textblock_cursor_char_geometry_get(c, &cx, &cy, &cw, &ch); | 4156 | evas_textblock_cursor_char_geometry_get(c, &cx, &cy, &cw, &ch); |
4148 | if (!evas_textblock_cursor_char_coord_set(c, cx, ly + (lh / 2))) | 4157 | if (!evas_textblock_cursor_cluster_coord_set(c, cx, ly + (lh / 2))) |
4149 | evas_textblock_cursor_line_char_last(c); | 4158 | evas_textblock_cursor_line_char_last(c); |
4150 | 4159 | ||
4151 | _sel_update(en->ed, c, rp->object, rp->typedata.text->entry_data); | 4160 | _sel_update(en->ed, c, rp->object, rp->typedata.text->entry_data); |
@@ -4347,7 +4356,7 @@ _edje_text_cursor_coord_set(Edje_Real_Part *rp, Efl_Text_Cursor_Cursor *c, | |||
4347 | _edje_emit(en->ed, "selection,changed", rp->part->name); | 4356 | _edje_emit(en->ed, "selection,changed", rp->part->name); |
4348 | } | 4357 | } |
4349 | } | 4358 | } |
4350 | return evas_textblock_cursor_char_coord_set(c, x, y); | 4359 | return evas_textblock_cursor_cluster_coord_set(c, x, y); |
4351 | } | 4360 | } |
4352 | 4361 | ||
4353 | Eina_Bool | 4362 | Eina_Bool |
diff --git a/src/lib/efl/interfaces/efl_text_cursor.eo b/src/lib/efl/interfaces/efl_text_cursor.eo index 973c7d85bd..b0e4c28b51 100644 --- a/src/lib/efl/interfaces/efl_text_cursor.eo +++ b/src/lib/efl/interfaces/efl_text_cursor.eo | |||
@@ -145,6 +145,20 @@ interface Efl.Text_Cursor { | |||
145 | /* @inout */ cur: ptr(Efl.Text_Cursor_Cursor); [[Cursor object]] | 145 | /* @inout */ cur: ptr(Efl.Text_Cursor_Cursor); [[Cursor object]] |
146 | } | 146 | } |
147 | } | 147 | } |
148 | cursor_cluster_next { | ||
149 | [[Advances to the next grapheme cluster]] | ||
150 | legacy: null; | ||
151 | params { | ||
152 | /* @inout */ cur: ptr(Efl.Text_Cursor_Cursor); [[Cursor object]] | ||
153 | } | ||
154 | } | ||
155 | cursor_cluster_prev { | ||
156 | [[Advances to the previous grapheme cluster]] | ||
157 | legacy: null; | ||
158 | params { | ||
159 | /* @inout */ cur: ptr(Efl.Text_Cursor_Cursor); [[Cursor object]] | ||
160 | } | ||
161 | } | ||
148 | cursor_paragraph_char_first { | 162 | cursor_paragraph_char_first { |
149 | [[Advances to the first character in this paragraph]] | 163 | [[Advances to the first character in this paragraph]] |
150 | legacy: null; | 164 | legacy: null; |
@@ -232,6 +246,17 @@ interface Efl.Text_Cursor { | |||
232 | @in y: int; [[Y coord to set by.]] | 246 | @in y: int; [[Y coord to set by.]] |
233 | } | 247 | } |
234 | } | 248 | } |
249 | cursor_cluster_coord_set { | ||
250 | [[Set cursor coordinates according to grapheme clusters. | ||
251 | It does not allow to put a cursor to the middle of a grapheme cluster. | ||
252 | ]] | ||
253 | legacy: null; | ||
254 | params { | ||
255 | /* @inout */ cur: ptr(Efl.Text_Cursor_Cursor); [[Cursor object]] | ||
256 | @in x: int; [[X coord to set by.]] | ||
257 | @in y: int; [[Y coord to set by.]] | ||
258 | } | ||
259 | } | ||
235 | cursor_text_insert { | 260 | cursor_text_insert { |
236 | [[Adds text to the current cursor position and set the cursor to | 261 | [[Adds text to the current cursor position and set the cursor to |
237 | *after* the start of the text just added. | 262 | *after* the start of the text just added. |
diff --git a/src/lib/evas/canvas/efl_canvas_text.eo b/src/lib/evas/canvas/efl_canvas_text.eo index b24139e34a..6c82adf82a 100644 --- a/src/lib/evas/canvas/efl_canvas_text.eo +++ b/src/lib/evas/canvas/efl_canvas_text.eo | |||
@@ -327,6 +327,8 @@ class Efl.Canvas.Text (Efl.Canvas.Object, Efl.Text, | |||
327 | Efl.Text_Cursor.cursor_copy; | 327 | Efl.Text_Cursor.cursor_copy; |
328 | Efl.Text_Cursor.cursor_char_next; | 328 | Efl.Text_Cursor.cursor_char_next; |
329 | Efl.Text_Cursor.cursor_char_prev; | 329 | Efl.Text_Cursor.cursor_char_prev; |
330 | Efl.Text_Cursor.cursor_cluster_next; | ||
331 | Efl.Text_Cursor.cursor_cluster_prev; | ||
330 | Efl.Text_Cursor.cursor_paragraph_char_first; | 332 | Efl.Text_Cursor.cursor_paragraph_char_first; |
331 | Efl.Text_Cursor.cursor_paragraph_char_last; | 333 | Efl.Text_Cursor.cursor_paragraph_char_last; |
332 | Efl.Text_Cursor.cursor_word_start; | 334 | Efl.Text_Cursor.cursor_word_start; |
@@ -339,6 +341,7 @@ class Efl.Canvas.Text (Efl.Canvas.Object, Efl.Text, | |||
339 | Efl.Text_Cursor.cursor_paragraph_prev; | 341 | Efl.Text_Cursor.cursor_paragraph_prev; |
340 | Efl.Text_Cursor.cursor_line_jump_by; | 342 | Efl.Text_Cursor.cursor_line_jump_by; |
341 | Efl.Text_Cursor.cursor_coord_set; | 343 | Efl.Text_Cursor.cursor_coord_set; |
344 | Efl.Text_Cursor.cursor_cluster_coord_set; | ||
342 | Efl.Text_Cursor.cursor_text_insert; | 345 | Efl.Text_Cursor.cursor_text_insert; |
343 | Efl.Text_Cursor.cursor_char_delete; | 346 | Efl.Text_Cursor.cursor_char_delete; |
344 | Efl.Text_Annotate.annotation { set; get; } | 347 | Efl.Text_Annotate.annotation { set; get; } |
diff --git a/src/lib/evas/canvas/evas_object_textblock.c b/src/lib/evas/canvas/evas_object_textblock.c index f523f131e9..16f717ce41 100644 --- a/src/lib/evas/canvas/evas_object_textblock.c +++ b/src/lib/evas/canvas/evas_object_textblock.c | |||
@@ -77,6 +77,7 @@ | |||
77 | 77 | ||
78 | #include "linebreak.h" | 78 | #include "linebreak.h" |
79 | #include "wordbreak.h" | 79 | #include "wordbreak.h" |
80 | #include "graphemebreak.h" | ||
80 | 81 | ||
81 | #include "evas_filter.h" | 82 | #include "evas_filter.h" |
82 | #include "efl_canvas_filter_internal.eo.h" | 83 | #include "efl_canvas_filter_internal.eo.h" |
@@ -9271,20 +9272,122 @@ _efl_canvas_text_efl_text_cursor_cursor_word_end(Eo *eo_obj, Efl_Canvas_Text_Dat | |||
9271 | efl_event_callback_legacy_call(eo_obj, EFL_CANVAS_TEXT_EVENT_CURSOR_CHANGED, NULL); | 9272 | efl_event_callback_legacy_call(eo_obj, EFL_CANVAS_TEXT_EVENT_CURSOR_CHANGED, NULL); |
9272 | } | 9273 | } |
9273 | 9274 | ||
9274 | EAPI Eina_Bool | 9275 | static char * |
9275 | evas_textblock_cursor_char_next(Efl_Text_Cursor_Cursor *cur) | 9276 | _evas_textblock_grapheme_breaks_new(Evas_Object_Textblock_Item *it, size_t len) |
9276 | { | 9277 | { |
9277 | int ind; | 9278 | char *grapheme_breaks = NULL; |
9279 | const char *lang = (it->format->font.fdesc) ? it->format->font.fdesc->lang : ""; | ||
9280 | |||
9281 | grapheme_breaks = malloc(len); | ||
9282 | if (!grapheme_breaks) return NULL; | ||
9283 | |||
9284 | set_graphemebreaks_utf32((const utf32_t *) | ||
9285 | eina_ustrbuf_string_get( | ||
9286 | it->text_node->unicode), | ||
9287 | len, lang, grapheme_breaks); | ||
9288 | |||
9289 | return grapheme_breaks; | ||
9290 | } | ||
9291 | |||
9292 | static size_t | ||
9293 | _evas_textblock_cursor_cluster_pos_get(Evas_Textblock_Cursor *cur, Eina_Bool inc) | ||
9294 | { | ||
9295 | Evas_Object_Textblock_Paragraph *par; | ||
9296 | Efl_Canvas_Text_Data *o; | ||
9297 | size_t cur_pos = cur->pos; | ||
9298 | size_t ret = cur->pos; | ||
9299 | |||
9300 | if (!inc) cur_pos--; | ||
9301 | |||
9302 | if (!cur->node->par) | ||
9303 | { | ||
9304 | o = efl_data_scope_get(cur->obj, MY_CLASS); | ||
9305 | if (o) _relayout_if_needed(cur->obj, o); | ||
9306 | } | ||
9307 | |||
9308 | par = cur->node->par; | ||
9309 | |||
9310 | if (par) | ||
9311 | { | ||
9312 | Eina_List *l; | ||
9313 | Evas_Object_Textblock_Item *it, *last_it = NULL; | ||
9314 | EINA_LIST_FOREACH(par->logical_items, l, it) | ||
9315 | { | ||
9316 | if (it->text_pos > cur_pos) | ||
9317 | { | ||
9318 | if (!last_it) last_it = it; | ||
9319 | break; | ||
9320 | } | ||
9321 | last_it = it; | ||
9322 | } | ||
9323 | |||
9324 | if (last_it) | ||
9325 | { | ||
9326 | it = last_it; | ||
9327 | if (it->type == EVAS_TEXTBLOCK_ITEM_TEXT) | ||
9328 | { | ||
9329 | size_t len = eina_ustrbuf_length_get(it->text_node->unicode); | ||
9330 | char *grapheme_breaks = _evas_textblock_grapheme_breaks_new(it, len); | ||
9331 | |||
9332 | if (grapheme_breaks) | ||
9333 | { | ||
9334 | size_t grapheme_breaks_index = cur_pos; | ||
9335 | |||
9336 | if (inc) | ||
9337 | { | ||
9338 | while ((grapheme_breaks_index < len) && | ||
9339 | (grapheme_breaks[grapheme_breaks_index] != GRAPHEMEBREAK_BREAK)) | ||
9340 | { | ||
9341 | grapheme_breaks_index++; | ||
9342 | } | ||
9343 | |||
9344 | ret = grapheme_breaks_index + 1; | ||
9345 | } | ||
9346 | else | ||
9347 | { | ||
9348 | while ((grapheme_breaks_index > 0) && | ||
9349 | (grapheme_breaks[grapheme_breaks_index - 1] != GRAPHEMEBREAK_BREAK)) | ||
9350 | { | ||
9351 | grapheme_breaks_index--; | ||
9352 | } | ||
9353 | |||
9354 | ret = grapheme_breaks_index; | ||
9355 | } | ||
9356 | |||
9357 | free(grapheme_breaks); | ||
9358 | } | ||
9359 | } | ||
9360 | } | ||
9361 | } | ||
9362 | |||
9363 | return ret; | ||
9364 | } | ||
9365 | |||
9366 | static Eina_Bool | ||
9367 | _evas_textblock_cursor_next(Evas_Textblock_Cursor *cur, Eina_Bool per_cluster) | ||
9368 | { | ||
9369 | Evas_Object_Protected_Data *obj; | ||
9278 | const Eina_Unicode *text; | 9370 | const Eina_Unicode *text; |
9371 | int ind; | ||
9279 | 9372 | ||
9280 | if (!cur) return EINA_FALSE; | 9373 | if (!cur) return EINA_FALSE; |
9281 | Evas_Object_Protected_Data *obj = efl_data_scope_get(cur->obj, EFL_CANVAS_OBJECT_CLASS); | ||
9282 | evas_object_async_block(obj); | ||
9283 | TB_NULL_CHECK(cur->node, EINA_FALSE); | 9374 | TB_NULL_CHECK(cur->node, EINA_FALSE); |
9284 | 9375 | ||
9376 | obj = efl_data_scope_get(cur->obj, EFL_CANVAS_OBJECT_CLASS); | ||
9377 | evas_object_async_block(obj); | ||
9378 | |||
9285 | ind = cur->pos; | 9379 | ind = cur->pos; |
9286 | text = eina_ustrbuf_string_get(cur->node->unicode); | 9380 | text = eina_ustrbuf_string_get(cur->node->unicode); |
9287 | if (text[ind]) ind++; | 9381 | |
9382 | if (text[ind]) | ||
9383 | { | ||
9384 | if (per_cluster) | ||
9385 | ind = _evas_textblock_cursor_cluster_pos_get(cur, EINA_TRUE); | ||
9386 | |||
9387 | if (ind <= (int)cur->pos) | ||
9388 | ind = cur->pos + 1; | ||
9389 | } | ||
9390 | |||
9288 | /* Only allow pointing a null if it's the last paragraph. | 9391 | /* Only allow pointing a null if it's the last paragraph. |
9289 | * because we don't have a PS there. */ | 9392 | * because we don't have a PS there. */ |
9290 | if (text[ind]) | 9393 | if (text[ind]) |
@@ -9311,23 +9414,30 @@ evas_textblock_cursor_char_next(Efl_Text_Cursor_Cursor *cur) | |||
9311 | } | 9414 | } |
9312 | } | 9415 | } |
9313 | 9416 | ||
9314 | EOLIAN static void | ||
9315 | _efl_canvas_text_efl_text_cursor_cursor_char_next(Eo *eo_obj, Efl_Canvas_Text_Data *o EINA_UNUSED, Efl_Text_Cursor_Cursor *cur) | ||
9316 | { | ||
9317 | ASYNC_BLOCK; | ||
9318 | evas_textblock_cursor_char_next(cur); | ||
9319 | efl_event_callback_legacy_call(eo_obj, EFL_CANVAS_TEXT_EVENT_CURSOR_CHANGED, NULL); | ||
9320 | } | ||
9321 | |||
9322 | static Eina_Bool | 9417 | static Eina_Bool |
9323 | _evas_textblock_cursor_char_prev(Efl_Text_Cursor_Cursor *cur) | 9418 | _evas_textblock_cursor_prev(Evas_Textblock_Cursor *cur, Eina_Bool per_cluster) |
9324 | { | 9419 | { |
9420 | Evas_Object_Protected_Data *obj; | ||
9325 | 9421 | ||
9326 | if (!cur) return EINA_FALSE; | 9422 | if (!cur) return EINA_FALSE; |
9327 | TB_NULL_CHECK(cur->node, EINA_FALSE); | 9423 | TB_NULL_CHECK(cur->node, EINA_FALSE); |
9328 | 9424 | ||
9425 | obj = efl_data_scope_get(cur->obj, EFL_CANVAS_OBJECT_CLASS); | ||
9426 | evas_object_async_block(obj); | ||
9427 | |||
9329 | if (cur->pos != 0) | 9428 | if (cur->pos != 0) |
9330 | { | 9429 | { |
9430 | if (per_cluster) | ||
9431 | { | ||
9432 | size_t ret = _evas_textblock_cursor_cluster_pos_get(cur, EINA_FALSE); | ||
9433 | |||
9434 | if (ret != cur->pos) | ||
9435 | { | ||
9436 | cur->pos = ret; | ||
9437 | return EINA_TRUE; | ||
9438 | } | ||
9439 | } | ||
9440 | |||
9331 | cur->pos--; | 9441 | cur->pos--; |
9332 | return EINA_TRUE; | 9442 | return EINA_TRUE; |
9333 | } | 9443 | } |
@@ -9335,18 +9445,59 @@ _evas_textblock_cursor_char_prev(Efl_Text_Cursor_Cursor *cur) | |||
9335 | } | 9445 | } |
9336 | 9446 | ||
9337 | EAPI Eina_Bool | 9447 | EAPI Eina_Bool |
9448 | evas_textblock_cursor_char_next(Efl_Text_Cursor_Cursor *cur) | ||
9449 | { | ||
9450 | return _evas_textblock_cursor_next(cur, EINA_FALSE); | ||
9451 | } | ||
9452 | |||
9453 | EOLIAN static void | ||
9454 | _efl_canvas_text_efl_text_cursor_cursor_char_next(Eo *eo_obj, Efl_Canvas_Text_Data *o EINA_UNUSED, Efl_Text_Cursor_Cursor *cur) | ||
9455 | { | ||
9456 | ASYNC_BLOCK; | ||
9457 | if (_evas_textblock_cursor_next(cur, EINA_FALSE)) | ||
9458 | efl_event_callback_legacy_call(eo_obj, EFL_CANVAS_TEXT_EVENT_CURSOR_CHANGED, NULL); | ||
9459 | } | ||
9460 | |||
9461 | EAPI Eina_Bool | ||
9338 | evas_textblock_cursor_char_prev(Efl_Text_Cursor_Cursor *cur) | 9462 | evas_textblock_cursor_char_prev(Efl_Text_Cursor_Cursor *cur) |
9339 | { | 9463 | { |
9340 | if (!cur) return EINA_FALSE; | 9464 | return _evas_textblock_cursor_prev(cur, EINA_FALSE); |
9341 | return _evas_textblock_cursor_char_prev(cur); | ||
9342 | } | 9465 | } |
9343 | 9466 | ||
9344 | EOLIAN static void | 9467 | EOLIAN static void |
9345 | _efl_canvas_text_efl_text_cursor_cursor_char_prev(Eo *eo_obj EINA_UNUSED, Efl_Canvas_Text_Data *o EINA_UNUSED, Efl_Text_Cursor_Cursor *cur) | 9468 | _efl_canvas_text_efl_text_cursor_cursor_char_prev(Eo *eo_obj EINA_UNUSED, Efl_Canvas_Text_Data *o EINA_UNUSED, Efl_Text_Cursor_Cursor *cur) |
9346 | { | 9469 | { |
9347 | ASYNC_BLOCK; | 9470 | ASYNC_BLOCK; |
9348 | _evas_textblock_cursor_char_prev(cur); | 9471 | if (_evas_textblock_cursor_prev(cur, EINA_FALSE)) |
9349 | efl_event_callback_legacy_call(eo_obj, EFL_CANVAS_TEXT_EVENT_CURSOR_CHANGED, NULL); | 9472 | efl_event_callback_legacy_call(eo_obj, EFL_CANVAS_TEXT_EVENT_CURSOR_CHANGED, NULL); |
9473 | } | ||
9474 | |||
9475 | EAPI Eina_Bool | ||
9476 | evas_textblock_cursor_cluster_next(Efl_Text_Cursor_Cursor *cur) | ||
9477 | { | ||
9478 | return _evas_textblock_cursor_next(cur, EINA_TRUE); | ||
9479 | } | ||
9480 | |||
9481 | EOLIAN static void | ||
9482 | _efl_canvas_text_efl_text_cursor_cursor_cluster_next(Eo *eo_obj, Efl_Canvas_Text_Data *o EINA_UNUSED, Efl_Text_Cursor_Cursor *cur) | ||
9483 | { | ||
9484 | ASYNC_BLOCK; | ||
9485 | if (_evas_textblock_cursor_next(cur, EINA_TRUE)) | ||
9486 | efl_event_callback_legacy_call(eo_obj, EFL_CANVAS_TEXT_EVENT_CURSOR_CHANGED, NULL); | ||
9487 | } | ||
9488 | |||
9489 | EAPI Eina_Bool | ||
9490 | evas_textblock_cursor_cluster_prev(Efl_Text_Cursor_Cursor *cur) | ||
9491 | { | ||
9492 | return _evas_textblock_cursor_prev(cur, EINA_TRUE); | ||
9493 | } | ||
9494 | |||
9495 | EOLIAN static void | ||
9496 | _efl_canvas_text_efl_text_cursor_cursor_cluster_prev(Eo *eo_obj, Efl_Canvas_Text_Data *o EINA_UNUSED, Efl_Text_Cursor_Cursor *cur) | ||
9497 | { | ||
9498 | ASYNC_BLOCK; | ||
9499 | if (_evas_textblock_cursor_prev(cur, EINA_TRUE)) | ||
9500 | efl_event_callback_legacy_call(eo_obj, EFL_CANVAS_TEXT_EVENT_CURSOR_CHANGED, NULL); | ||
9350 | } | 9501 | } |
9351 | 9502 | ||
9352 | EAPI void | 9503 | EAPI void |
@@ -12031,15 +12182,16 @@ _efl_canvas_text_visible_range_get(Eo *eo_obj EINA_UNUSED, | |||
12031 | return EINA_TRUE; | 12182 | return EINA_TRUE; |
12032 | } | 12183 | } |
12033 | 12184 | ||
12034 | 12185 | static Eina_Bool | |
12035 | EAPI Eina_Bool | 12186 | _evas_textblock_cursor_coord_set(Evas_Textblock_Cursor *cur, Evas_Coord x, Evas_Coord y, Eina_Bool per_cluster) |
12036 | evas_textblock_cursor_char_coord_set(Evas_Textblock_Cursor *cur, Evas_Coord x, Evas_Coord y) | ||
12037 | { | 12187 | { |
12038 | Evas_Object_Textblock_Paragraph *found_par; | 12188 | Evas_Object_Textblock_Paragraph *found_par; |
12039 | Evas_Object_Textblock_Line *ln; | 12189 | Evas_Object_Textblock_Line *ln; |
12040 | Evas_Object_Textblock_Item *it = NULL; | 12190 | Evas_Object_Textblock_Item *it = NULL; |
12041 | Eina_Bool ret = EINA_FALSE; | 12191 | Eina_Bool ret = EINA_FALSE; |
12042 | 12192 | ||
12193 | if (!cur) return ret; | ||
12194 | |||
12043 | Evas_Object_Protected_Data *obj = efl_data_scope_get(cur->obj, EFL_CANVAS_OBJECT_CLASS); | 12195 | Evas_Object_Protected_Data *obj = efl_data_scope_get(cur->obj, EFL_CANVAS_OBJECT_CLASS); |
12044 | evas_object_async_block(obj); | 12196 | evas_object_async_block(obj); |
12045 | Efl_Canvas_Text_Data *o = efl_data_scope_get(cur->obj, MY_CLASS); | 12197 | Efl_Canvas_Text_Data *o = efl_data_scope_get(cur->obj, MY_CLASS); |
@@ -12112,6 +12264,63 @@ evas_textblock_cursor_char_coord_set(Evas_Textblock_Cursor *cur, Evas_Coord x, | |||
12112 | &cx, &cy, &cw, &ch); | 12264 | &cx, &cy, &cw, &ch); |
12113 | if (pos < 0) | 12265 | if (pos < 0) |
12114 | goto end; | 12266 | goto end; |
12267 | |||
12268 | if ((pos > 0) && per_cluster) | ||
12269 | { | ||
12270 | size_t len = eina_ustrbuf_length_get(it->text_node->unicode); | ||
12271 | char *grapheme_breaks = _evas_textblock_grapheme_breaks_new(it, len); | ||
12272 | |||
12273 | /* If current position is not breakable, | ||
12274 | * try to move cursor to a nearest breakable position. */ | ||
12275 | if (grapheme_breaks && (grapheme_breaks[pos + it->text_pos - 1] != GRAPHEMEBREAK_BREAK)) | ||
12276 | { | ||
12277 | size_t left_index = pos + it->text_pos - 1; | ||
12278 | size_t right_index = pos + it->text_pos - 1; | ||
12279 | int lx, rx; | ||
12280 | |||
12281 | /* To the left */ | ||
12282 | while ((left_index > 0) && | ||
12283 | (grapheme_breaks[left_index] != GRAPHEMEBREAK_BREAK)) | ||
12284 | { | ||
12285 | left_index--; | ||
12286 | } | ||
12287 | |||
12288 | ENFN->font_pen_coords_get(ENC, | ||
12289 | ti->parent.format->font.font, | ||
12290 | &ti->text_props, | ||
12291 | left_index - it->text_pos + 1, | ||
12292 | &lx, NULL, NULL, NULL); | ||
12293 | |||
12294 | /* To the right */ | ||
12295 | while ((right_index < len) && | ||
12296 | (grapheme_breaks[right_index] != GRAPHEMEBREAK_BREAK)) | ||
12297 | { | ||
12298 | right_index++; | ||
12299 | } | ||
12300 | |||
12301 | ENFN->font_pen_coords_get(ENC, | ||
12302 | ti->parent.format->font.font, | ||
12303 | &ti->text_props, | ||
12304 | right_index - it->text_pos + 1, | ||
12305 | &rx, NULL, NULL, NULL); | ||
12306 | |||
12307 | /* Decide a nearest position by checking its geometry. */ | ||
12308 | if (((ti->text_props.bidi_dir != EVAS_BIDI_DIRECTION_RTL) && | ||
12309 | ((ln->x + it->x + rx - x) >= (x - (lx + ln->x + it->x)))) || | ||
12310 | ((ti->text_props.bidi_dir == EVAS_BIDI_DIRECTION_RTL) && | ||
12311 | ((ln->x + it->x + lx - x) >= (x - (rx + ln->x + it->x))))) | ||
12312 | { | ||
12313 | pos = left_index - it->text_pos + 1; | ||
12314 | } | ||
12315 | else | ||
12316 | { | ||
12317 | pos = right_index - it->text_pos + 1; | ||
12318 | } | ||
12319 | } | ||
12320 | |||
12321 | free(grapheme_breaks); | ||
12322 | } | ||
12323 | |||
12115 | cur->pos = pos + it->text_pos; | 12324 | cur->pos = pos + it->text_pos; |
12116 | cur->node = it->text_node; | 12325 | cur->node = it->text_node; |
12117 | ret = EINA_TRUE; | 12326 | ret = EINA_TRUE; |
@@ -12167,6 +12376,18 @@ end: | |||
12167 | return ret; | 12376 | return ret; |
12168 | } | 12377 | } |
12169 | 12378 | ||
12379 | EAPI Eina_Bool | ||
12380 | evas_textblock_cursor_char_coord_set(Evas_Textblock_Cursor *cur, Evas_Coord x, Evas_Coord y) | ||
12381 | { | ||
12382 | return _evas_textblock_cursor_coord_set(cur, x, y, EINA_FALSE); | ||
12383 | } | ||
12384 | |||
12385 | EAPI Eina_Bool | ||
12386 | evas_textblock_cursor_cluster_coord_set(Evas_Textblock_Cursor *cur, Evas_Coord x, Evas_Coord y) | ||
12387 | { | ||
12388 | return _evas_textblock_cursor_coord_set(cur, x, y, EINA_TRUE); | ||
12389 | } | ||
12390 | |||
12170 | EOLIAN static void | 12391 | EOLIAN static void |
12171 | _efl_canvas_text_efl_text_cursor_cursor_coord_set(Eo *eo_obj EINA_UNUSED, Efl_Canvas_Text_Data *o EINA_UNUSED, Efl_Text_Cursor_Cursor *cur EINA_UNUSED, | 12392 | _efl_canvas_text_efl_text_cursor_cursor_coord_set(Eo *eo_obj EINA_UNUSED, Efl_Canvas_Text_Data *o EINA_UNUSED, Efl_Text_Cursor_Cursor *cur EINA_UNUSED, |
12172 | Evas_Coord x, Evas_Coord y) | 12393 | Evas_Coord x, Evas_Coord y) |
@@ -12175,6 +12396,14 @@ _efl_canvas_text_efl_text_cursor_cursor_coord_set(Eo *eo_obj EINA_UNUSED, Efl_Ca | |||
12175 | evas_textblock_cursor_char_coord_set(cur, x, y); | 12396 | evas_textblock_cursor_char_coord_set(cur, x, y); |
12176 | } | 12397 | } |
12177 | 12398 | ||
12399 | EOLIAN static void | ||
12400 | _efl_canvas_text_efl_text_cursor_cursor_cluster_coord_set(Eo *eo_obj EINA_UNUSED, Efl_Canvas_Text_Data *o EINA_UNUSED, Efl_Text_Cursor_Cursor *cur EINA_UNUSED, | ||
12401 | Evas_Coord x, Evas_Coord y) | ||
12402 | { | ||
12403 | ASYNC_BLOCK; | ||
12404 | evas_textblock_cursor_cluster_coord_set(cur, x, y); | ||
12405 | } | ||
12406 | |||
12178 | EAPI int | 12407 | EAPI int |
12179 | evas_textblock_cursor_line_coord_set(Evas_Textblock_Cursor *cur, Evas_Coord y) | 12408 | evas_textblock_cursor_line_coord_set(Evas_Textblock_Cursor *cur, Evas_Coord y) |
12180 | { | 12409 | { |
@@ -13279,6 +13508,7 @@ evas_object_textblock_init(Evas_Object *eo_obj) | |||
13279 | linebreak_init = EINA_TRUE; | 13508 | linebreak_init = EINA_TRUE; |
13280 | init_linebreak(); | 13509 | init_linebreak(); |
13281 | init_wordbreak(); | 13510 | init_wordbreak(); |
13511 | init_graphemebreak(); | ||
13282 | } | 13512 | } |
13283 | 13513 | ||
13284 | o = obj->private_data; | 13514 | o = obj->private_data; |
@@ -15194,7 +15424,7 @@ _efl_canvas_text_efl_text_annotate_range_annotations_get(const Eo *eo_obj, Efl_C | |||
15194 | if (!it->start_node || !it->end_node) continue; | 15424 | if (!it->start_node || !it->end_node) continue; |
15195 | _textblock_cursor_pos_at_fnode_set(eo_obj, &start2, it->start_node); | 15425 | _textblock_cursor_pos_at_fnode_set(eo_obj, &start2, it->start_node); |
15196 | _textblock_cursor_pos_at_fnode_set(eo_obj, &end2, it->end_node); | 15426 | _textblock_cursor_pos_at_fnode_set(eo_obj, &end2, it->end_node); |
15197 | _evas_textblock_cursor_char_prev(&end2); | 15427 | evas_textblock_cursor_char_prev(&end2); |
15198 | if (!((evas_textblock_cursor_compare(&start2, end) > 0) || | 15428 | if (!((evas_textblock_cursor_compare(&start2, end) > 0) || |
15199 | (evas_textblock_cursor_compare(&end2, start) < 0))) | 15429 | (evas_textblock_cursor_compare(&end2, start) < 0))) |
15200 | { | 15430 | { |
diff --git a/src/lib/evas/canvas/evas_textblock_legacy.h b/src/lib/evas/canvas/evas_textblock_legacy.h index 0d84075fa0..2c8ee05f57 100644 --- a/src/lib/evas/canvas/evas_textblock_legacy.h +++ b/src/lib/evas/canvas/evas_textblock_legacy.h | |||
@@ -605,6 +605,22 @@ EAPI Eina_Bool evas_textblock_cursor_char_prev(Evas_Textblock_Cursor *obj); | |||
605 | EAPI Eina_Bool evas_textblock_cursor_char_next(Evas_Textblock_Cursor *obj); | 605 | EAPI Eina_Bool evas_textblock_cursor_char_next(Evas_Textblock_Cursor *obj); |
606 | 606 | ||
607 | /** | 607 | /** |
608 | * @brief Advances the cursor one grapheme cluster backwards. | ||
609 | * | ||
610 | * @return @c true on success, @c false otherwise. | ||
611 | */ | ||
612 | EAPI Eina_Bool evas_textblock_cursor_cluster_prev(Evas_Textblock_Cursor *obj); | ||
613 | |||
614 | /** | ||
615 | * @brief Advances the cursor one grapheme cluster forward. | ||
616 | * | ||
617 | * @return @c true on success, @c false otherwise. | ||
618 | * | ||
619 | * @ingroup Evas_Textblock_Cursor | ||
620 | */ | ||
621 | EAPI Eina_Bool evas_textblock_cursor_cluster_next(Evas_Textblock_Cursor *obj); | ||
622 | |||
623 | /** | ||
608 | * @brief Advances to the start of the next text node | 624 | * @brief Advances to the start of the next text node |
609 | * | 625 | * |
610 | * @return @c true if managed to advance, @c false otherwise | 626 | * @return @c true if managed to advance, @c false otherwise |
@@ -860,6 +876,16 @@ EAPI Evas_Textblock_Cursor *evas_object_textblock_cursor_new(const Evas_Object * | |||
860 | EAPI Eina_Bool evas_textblock_cursor_char_coord_set(Evas_Textblock_Cursor *obj, Evas_Coord x, Evas_Coord y); | 876 | EAPI Eina_Bool evas_textblock_cursor_char_coord_set(Evas_Textblock_Cursor *obj, Evas_Coord x, Evas_Coord y); |
861 | 877 | ||
862 | /** | 878 | /** |
879 | * @brief Sets the position of the cursor according to the X and Y coordinates and | ||
880 | * grapheme clusters of text. | ||
881 | * | ||
882 | * @param[in] y y coord to set by. | ||
883 | * | ||
884 | * @return @c true on success, @c false otherwise. | ||
885 | */ | ||
886 | EAPI Eina_Bool evas_textblock_cursor_cluster_coord_set(Evas_Textblock_Cursor *obj, Evas_Coord x, Evas_Coord y); | ||
887 | |||
888 | /** | ||
863 | * Free the cursor and unassociate it from the object. | 889 | * Free the cursor and unassociate it from the object. |
864 | * @note do not use it to free unassociated cursors. | 890 | * @note do not use it to free unassociated cursors. |
865 | * | 891 | * |
diff --git a/src/static_libs/libunibreak/ChangeLog b/src/static_libs/libunibreak/ChangeLog index cad33cfd26..8df529f0c9 100644 --- a/src/static_libs/libunibreak/ChangeLog +++ b/src/static_libs/libunibreak/ChangeLog | |||
@@ -1,3 +1,95 @@ | |||
1 | 2016-12-15 Wu Yongwei <wuyongwei@gmail.com> | ||
2 | |||
3 | * src/Makefile.am (include_HEADERS): Move graphemebreakdef.h to | ||
4 | EXTRA_DIST. | ||
5 | (EXTRA_DIST): Add graphemebreakdef.h and test_skips.h. | ||
6 | |||
7 | 2016-12-14 Wu Yongwei <wuyongwei@gmail.com> | ||
8 | |||
9 | * src/linebreak.c: Adjust documentation comment. | ||
10 | * src/wordbreak.c: Ditto. | ||
11 | * src/graphemebreak.c: Ditto. | ||
12 | |||
13 | 2016-12-14 Wu Yongwei <wuyongwei@gmail.com> | ||
14 | |||
15 | * Doxyfile (FULL_PATH_NAMES): Set to `NO'. | ||
16 | (DOT_IMAGE_FORMAT): Set to `svg'. | ||
17 | (SEARCHENGINE): Set to `YES'. | ||
18 | |||
19 | 2016-12-10 Wu Yongwei <wuyongwei@gmail.com> | ||
20 | |||
21 | Update for the libunibreak 4.0 release. | ||
22 | * NEWS: Add information about libunibreak 4.0. | ||
23 | * Doxyfile (PROJECT_NUMBER): Change to `4.0'. | ||
24 | * configure.ac (AC_INIT): Change the library version to `4.0'. | ||
25 | * src/Makefile.am (libunibreak_la_LDFLAGS): Set the version-info to | ||
26 | `4:0:1'. | ||
27 | * src/unibreakbase.h (UNIBREAK_VERSION): Set to 0x0400. | ||
28 | |||
29 | 2016-12-10 Wu Yongwei <wuyongwei@gmail.com> | ||
30 | |||
31 | * src/Makefile.am (include_HEADERS): Add a missing file | ||
32 | graphemebreakdef.h. | ||
33 | |||
34 | 2016-12-10 Wu Yongwei <wuyongwei@gmail.com> | ||
35 | |||
36 | * bootstrap: Add a missing `--copy' argument to glibtoolize. | ||
37 | |||
38 | 2016-12-10 Wu Yongwei <wuyongwei@gmail.com> | ||
39 | |||
40 | * README.md: Update for grapheme break and links. | ||
41 | * LICENCE: Add Andreas Röver and update copyright information. | ||
42 | |||
43 | 2016-12-10 Wu Yongwei <wuyongwei@gmail.com> | ||
44 | |||
45 | * Doxyfile (EXCLUDE): Add `src/tests.c'. | ||
46 | |||
47 | 2016-12-10 Wu Yongwei <wuyongwei@gmail.com> | ||
48 | |||
49 | * src/wordbreak.c: Update Unicode version and link information. | ||
50 | * src/wordbreak.h: Ditto. | ||
51 | * src/wordbreakdef.h: Ditto. | ||
52 | * src/graphemebreak.c: Ditto. | ||
53 | * src/graphemebreak.h: Ditto. | ||
54 | * src/graphemebreakdef.h: Ditto. | ||
55 | |||
56 | 2016-12-10 Wu Yongwei <wuyongwei@gmail.com> | ||
57 | |||
58 | * src/linebreak.c: Remove `@version' and update copyright header. | ||
59 | * src/linebreak.h: Ditto. | ||
60 | * src/linebreakdef.c: Ditto. | ||
61 | * src/linebreakdef.h: Ditto. | ||
62 | * src/wordbreak.c: Ditto. | ||
63 | * src/wordbreak.h: Ditto. | ||
64 | * src/wordbreakdef.h: Ditto. | ||
65 | * src/graphemebreak.c: Ditto. | ||
66 | * src/graphemebreak.h: Ditto. | ||
67 | * src/graphemebreakdef.h: Ditto. | ||
68 | * src/unibreakbase.c: Ditto. | ||
69 | * src/unibreakbase.h: Ditto. | ||
70 | * src/unibreakdef.c: Ditto. | ||
71 | * src/unibreakdef.h: Ditto. | ||
72 | |||
73 | 2016-12-10 Wu Yongwei <wuyongwei@gmail.com> | ||
74 | |||
75 | * src/Makefile.msvc: Add graphemebreak.c. | ||
76 | * src/graphemebreak.c: Add a workaround of stdbool.h for MSVC | ||
77 | versions earlier than 2013. | ||
78 | * src/graphemebreak.h: Make include order consistent. | ||
79 | * src/linebreak.c (ends_with): Make the code compile under C89. | ||
80 | |||
81 | 2016-12-10 Wu Yongwei <wuyongwei@gmail.com> | ||
82 | |||
83 | * src/Makefile.gcc (CFILES): Add graphemebreak.c. | ||
84 | (graphemebreakdata): New phony target. | ||
85 | (GraphemeBreakProperty.txt): New target. | ||
86 | (distclean): Add WordBreakProperty.txt and GraphemeBreakProperty.txt | ||
87 | as well. | ||
88 | |||
89 | 2016-12-05 Tom Hacohen <tom@stosb.com> | ||
90 | |||
91 | * src/test_skips.h: New file. | ||
92 | |||
1 | 2016-12-04 Wu Yongwei <wuyongwei@gmail.com> | 93 | 2016-12-04 Wu Yongwei <wuyongwei@gmail.com> |
2 | 94 | ||
3 | Simpify implementation about RI pairing. | 95 | Simpify implementation about RI pairing. |
diff --git a/src/static_libs/libunibreak/LICENCE b/src/static_libs/libunibreak/LICENCE index 3eda8d5061..3fba16ad53 100644 --- a/src/static_libs/libunibreak/LICENCE +++ b/src/static_libs/libunibreak/LICENCE | |||
@@ -1,6 +1,7 @@ | |||
1 | Copyright (C) 2008-2015 Wu Yongwei <wuyongwei at gmail dot com> | 1 | Copyright (C) 2008-2016 Wu Yongwei <wuyongwei at gmail dot com> |
2 | Copyright (C) 2012-2015 Tom Hacohen <tom at stosb dot com> | 2 | Copyright (C) 2012-2016 Tom Hacohen <tom at stosb dot com> |
3 | Copyright (C) 2013 Petr Filipsky <philodej at gmail dot com> | 3 | Copyright (C) 2013 Petr Filipsky <philodej at gmail dot com> |
4 | Copyright (C) 2016 Andreas Röver <roever at users dot sf dot net> | ||
4 | 5 | ||
5 | This software is provided 'as-is', without any express or implied | 6 | This software is provided 'as-is', without any express or implied |
6 | warranty. In no event will the author be held liable for any damages | 7 | warranty. In no event will the author be held liable for any damages |
diff --git a/src/static_libs/libunibreak/NEWS b/src/static_libs/libunibreak/NEWS index 7de7feba18..d217628da8 100644 --- a/src/static_libs/libunibreak/NEWS +++ b/src/static_libs/libunibreak/NEWS | |||
@@ -1,3 +1,10 @@ | |||
1 | New in libunibreak 4.0 | ||
2 | |||
3 | - Update the code and data to conform to Unicode 9.0.0 | ||
4 | - Add grapheme breaking support | ||
5 | - Tested and enhanced according to the Unicode test suite | ||
6 | - Make bug fixes | ||
7 | |||
1 | New in libunibreak 3.0 | 8 | New in libunibreak 3.0 |
2 | 9 | ||
3 | - Update the code and data to conform to Unicode 7.0.0 | 10 | - Update the code and data to conform to Unicode 7.0.0 |
diff --git a/src/static_libs/libunibreak/README.md b/src/static_libs/libunibreak/README.md index 52cd7388b5..f37fd902aa 100644 --- a/src/static_libs/libunibreak/README.md +++ b/src/static_libs/libunibreak/README.md | |||
@@ -9,8 +9,8 @@ breaking and word breaking algorithms as described in [Unicode Standard | |||
9 | Annex 14] [1] and [Unicode Standard Annex 29] [2]. Check the project's | 9 | Annex 14] [1] and [Unicode Standard Annex 29] [2]. Check the project's |
10 | [home page] [3] for up-to-date information. | 10 | [home page] [3] for up-to-date information. |
11 | 11 | ||
12 | [1]: http://www.unicode.org/reports/tr14/tr14-30.html | 12 | [1]: http://www.unicode.org/reports/tr14/tr14-37.html |
13 | [2]: http://www.unicode.org/reports/tr29/tr29-21.html | 13 | [2]: http://www.unicode.org/reports/tr29/tr29-29.html |
14 | [3]: https://github.com/adah1972/libunibreak | 14 | [3]: https://github.com/adah1972/libunibreak |
15 | 15 | ||
16 | 16 | ||
@@ -46,6 +46,8 @@ There are three ways to build the library: | |||
46 | *LineBreak.txt*. | 46 | *LineBreak.txt*. |
47 | - type `make wordbreakdata` to regenerate *wordbreakdata.c* from | 47 | - type `make wordbreakdata` to regenerate *wordbreakdata.c* from |
48 | *WordBreakProperty.txt*. | 48 | *WordBreakProperty.txt*. |
49 | - type `make graphemebreakdata` to regenerate *graphemebreakdata.c* | ||
50 | from *GraphemeBreakProperty.txt*. | ||
49 | 51 | ||
50 | 2. On systems where GCC and Binutils are supported, one can type | 52 | 2. On systems where GCC and Binutils are supported, one can type |
51 | 53 | ||
@@ -61,6 +63,8 @@ There are three ways to build the library: | |||
61 | *LineBreak.txt*. | 63 | *LineBreak.txt*. |
62 | - type `make wordbreakdata` to regenerate *wordbreakdata.c* from | 64 | - type `make wordbreakdata` to regenerate *wordbreakdata.c* from |
63 | *WordBreakProperty.txt*. | 65 | *WordBreakProperty.txt*. |
66 | - type `make graphemebreakdata` to regenerate *graphemebreakdata.c* | ||
67 | from *GraphemeBreakProperty.txt*. | ||
64 | 68 | ||
65 | 3. On Windows, apart from using method 1 (Cygwin/MSYS) and method 2 | 69 | 3. On Windows, apart from using method 1 (Cygwin/MSYS) and method 2 |
66 | (MinGW), MSVC can also be used. Type | 70 | (MinGW), MSVC can also be used. Type |
@@ -77,9 +81,9 @@ There are three ways to build the library: | |||
77 | Documentation | 81 | Documentation |
78 | ------------- | 82 | ------------- |
79 | 83 | ||
80 | Check the generated document *doc/html/linebreak\_8h.html* and | 84 | Check the generated document *doc/html/linebreak\_8h.html*, |
81 | *doc/html/wordbreak\_8h.html* in the downloaded file for the public | 85 | *doc/html/wordbreak\_8h.html*, and *doc/html/graphemebreak\_8h.html* in |
82 | interfaces exposed to applications. | 86 | the downloaded file for the public interfaces exposed to applications. |
83 | 87 | ||
84 | 88 | ||
85 | <!-- | 89 | <!-- |
diff --git a/src/static_libs/libunibreak/graphemebreak.c b/src/static_libs/libunibreak/graphemebreak.c new file mode 100644 index 0000000000..77c3d5f55c --- /dev/null +++ b/src/static_libs/libunibreak/graphemebreak.c | |||
@@ -0,0 +1,283 @@ | |||
1 | /* | ||
2 | * Grapheme breaking in a Unicode sequence. Designed to be used in a | ||
3 | * generic text renderer. | ||
4 | * | ||
5 | * Copyright (C) 2016 Andreas Röver <roever at users dot sf dot net> | ||
6 | * | ||
7 | * This software is provided 'as-is', without any express or implied | ||
8 | * warranty. In no event will the author be held liable for any damages | ||
9 | * arising from the use of this software. | ||
10 | * | ||
11 | * Permission is granted to anyone to use this software for any purpose, | ||
12 | * including commercial applications, and to alter it and redistribute | ||
13 | * it freely, subject to the following restrictions: | ||
14 | * | ||
15 | * 1. The origin of this software must not be misrepresented; you must | ||
16 | * not claim that you wrote the original software. If you use this | ||
17 | * software in a product, an acknowledgement in the product | ||
18 | * documentation would be appreciated but is not required. | ||
19 | * 2. Altered source versions must be plainly marked as such, and must | ||
20 | * not be misrepresented as being the original software. | ||
21 | * 3. This notice may not be removed or altered from any source | ||
22 | * distribution. | ||
23 | * | ||
24 | * The main reference is Unicode Standard Annex 29 (UAX #29): | ||
25 | * <URL:http://unicode.org/reports/tr29> | ||
26 | * | ||
27 | * When this library was designed, this annex was at Revision 29, for | ||
28 | * Unicode 9.0.0: | ||
29 | * <URL:http://www.unicode.org/reports/tr29/tr29-29.html> | ||
30 | * | ||
31 | * The Unicode Terms of Use are available at | ||
32 | * <URL:http://www.unicode.org/copyright.html> | ||
33 | */ | ||
34 | |||
35 | /** | ||
36 | * @file graphemebreak.c | ||
37 | * | ||
38 | * Implementation of the grapheme breaking algorithm as described in Unicode | ||
39 | * Standard Annex 29. | ||
40 | * | ||
41 | * @author Andreas Roever | ||
42 | */ | ||
43 | |||
44 | #if defined(_MSC_VER) && _MSC_VER < 1800 | ||
45 | typedef int bool; | ||
46 | #define false 0 | ||
47 | #define true 1 | ||
48 | #else | ||
49 | #include <stdbool.h> | ||
50 | #endif | ||
51 | |||
52 | #include <string.h> | ||
53 | #include "graphemebreak.h" | ||
54 | #include "graphemebreakdata.c" | ||
55 | #include "unibreakdef.h" | ||
56 | |||
57 | #define ARRAY_LEN(x) (sizeof(x) / sizeof(x[0])) | ||
58 | |||
59 | /** | ||
60 | * Initializes the wordbreak internals. It currently does nothing, but | ||
61 | * it may in the future. | ||
62 | */ | ||
63 | void init_graphemebreak(void) | ||
64 | { | ||
65 | } | ||
66 | |||
67 | /** | ||
68 | * Gets the grapheme breaking class of a character. | ||
69 | * | ||
70 | * @param ch character to check | ||
71 | * @return the grapheme breaking class if found; \c GBP_Other otherwise | ||
72 | */ | ||
73 | static enum GraphemeBreakClass get_char_gb_class(utf32_t ch) | ||
74 | { | ||
75 | int min = 0; | ||
76 | int max = ARRAY_LEN(gb_prop_default) - 1; | ||
77 | int mid; | ||
78 | |||
79 | do | ||
80 | { | ||
81 | mid = (min + max) / 2; | ||
82 | |||
83 | if (ch < gb_prop_default[mid].start) | ||
84 | max = mid - 1; | ||
85 | else if (ch > gb_prop_default[mid].end) | ||
86 | min = mid + 1; | ||
87 | else | ||
88 | return gb_prop_default[mid].prop; | ||
89 | } while (min <= max); | ||
90 | |||
91 | return GBP_Other; | ||
92 | } | ||
93 | |||
94 | /** | ||
95 | * Sets the grapheme breaking information for a generic input string. | ||
96 | * | ||
97 | * @param[in] s input string | ||
98 | * @param[in] len length of the input | ||
99 | * @param[out] brks pointer to the output breaking data, containing | ||
100 | * #GRAPHEMEBREAK_BREAK or #GRAPHEMEBREAK_NOBREAK | ||
101 | * @param[in] get_next_char function to get the next UTF-32 character | ||
102 | */ | ||
103 | static void set_graphemebreaks(const void *s, size_t len, char *brks, | ||
104 | get_next_char_t get_next_char) | ||
105 | { | ||
106 | size_t posNext = 0; | ||
107 | bool rule10Left = false; // is the left side of rule 10 fulfilled? | ||
108 | bool evenRegionalIndicators = true; // is the number of preceeding | ||
109 | // GBP_RegionalIndicator characters | ||
110 | // even | ||
111 | |||
112 | utf32_t ch = get_next_char(s, len, &posNext); | ||
113 | enum GraphemeBreakClass current_class = get_char_gb_class(ch); | ||
114 | |||
115 | // initialize whole output to inside char | ||
116 | memset(brks, GRAPHEMEBREAK_INSIDEACHAR, len); | ||
117 | |||
118 | while (true) | ||
119 | { | ||
120 | enum GraphemeBreakClass prev_class = current_class; | ||
121 | |||
122 | // safe position if current character so that we can store the | ||
123 | // result there later on | ||
124 | size_t brksPos = posNext - 1; | ||
125 | |||
126 | // get nect character | ||
127 | ch = get_next_char(s, len, &posNext); | ||
128 | |||
129 | if (ch == EOS) | ||
130 | { | ||
131 | // done, place one final break after the last character as per | ||
132 | // algorithm rule GB1 | ||
133 | brks[brksPos] = GRAPHEMEBREAK_BREAK; | ||
134 | break; | ||
135 | } | ||
136 | |||
137 | // get class of current character | ||
138 | current_class = get_char_gb_class(ch); | ||
139 | |||
140 | // update some helper variables | ||
141 | if ((prev_class == GBP_E_Base) || (prev_class == GBP_E_Base_GAZ)) | ||
142 | { | ||
143 | rule10Left = true; | ||
144 | } | ||
145 | else if (prev_class != GBP_Extend) | ||
146 | { | ||
147 | rule10Left = false; | ||
148 | } | ||
149 | |||
150 | if (prev_class == GBP_Regional_Indicator) | ||
151 | { | ||
152 | evenRegionalIndicators = !evenRegionalIndicators; | ||
153 | } | ||
154 | else | ||
155 | { | ||
156 | evenRegionalIndicators = true; | ||
157 | } | ||
158 | |||
159 | // check all rules | ||
160 | if (prev_class == GBP_CR && current_class == GBP_LF) | ||
161 | { | ||
162 | brks[brksPos] = GRAPHEMEBREAK_NOBREAK; // Rule: GB3 | ||
163 | } | ||
164 | else if ((prev_class == GBP_CR) || (prev_class == GBP_LF) || | ||
165 | (prev_class == GBP_Control) || (current_class == GBP_CR) || | ||
166 | (current_class == GBP_LF) || | ||
167 | (current_class == GBP_Control)) | ||
168 | { | ||
169 | brks[brksPos] = GRAPHEMEBREAK_BREAK; // Rule: GB4 + GB5 | ||
170 | } | ||
171 | else if ((prev_class == GBP_L) && | ||
172 | ((current_class == GBP_L) || (current_class == GBP_V) || | ||
173 | (current_class == GBP_LV) || (current_class == GBP_LVT))) | ||
174 | { | ||
175 | brks[brksPos] = GRAPHEMEBREAK_NOBREAK; // Rule: GB6 | ||
176 | } | ||
177 | else if (((prev_class == GBP_LV) || (prev_class == GBP_V)) && | ||
178 | ((current_class == GBP_V) || (current_class == GBP_T))) | ||
179 | { | ||
180 | brks[brksPos] = GRAPHEMEBREAK_NOBREAK; // Rule: GB7 | ||
181 | } | ||
182 | else if (((prev_class == GBP_LVT) || (prev_class == GBP_T)) && | ||
183 | (current_class == GBP_T)) | ||
184 | { | ||
185 | brks[brksPos] = GRAPHEMEBREAK_NOBREAK; // Rule: GB8 | ||
186 | } | ||
187 | else if ((current_class == GBP_Extend) || | ||
188 | (current_class == GBP_ZWJ)) | ||
189 | { | ||
190 | brks[brksPos] = GRAPHEMEBREAK_NOBREAK; // Rule: GB9 | ||
191 | } | ||
192 | else if (current_class == GBP_SpacingMark) | ||
193 | { | ||
194 | brks[brksPos] = GRAPHEMEBREAK_NOBREAK; // Rule: GB9a | ||
195 | } | ||
196 | else if (prev_class == GBP_Prepend) | ||
197 | { | ||
198 | brks[brksPos] = GRAPHEMEBREAK_NOBREAK; // Rule: GB9b | ||
199 | } | ||
200 | else if (rule10Left && (current_class == GBP_E_Modifier)) | ||
201 | { | ||
202 | brks[brksPos] = GRAPHEMEBREAK_NOBREAK; // Rule: GB10 | ||
203 | } | ||
204 | else if ((prev_class == GBP_ZWJ) && | ||
205 | ((current_class == GBP_Glue_After_Zwj) || | ||
206 | (current_class == GBP_E_Base_GAZ))) | ||
207 | { | ||
208 | brks[brksPos] = GRAPHEMEBREAK_NOBREAK; // Rule: GB11 | ||
209 | } | ||
210 | else if (!evenRegionalIndicators && | ||
211 | (current_class == GBP_Regional_Indicator)) | ||
212 | { | ||
213 | brks[brksPos] = GRAPHEMEBREAK_NOBREAK; // Rule: GB12 + GB13 | ||
214 | } | ||
215 | else | ||
216 | { | ||
217 | brks[brksPos] = GRAPHEMEBREAK_BREAK; // Rule: GB999 | ||
218 | } | ||
219 | } | ||
220 | } | ||
221 | |||
222 | /** | ||
223 | * Sets the grapheme breaking information for a UTF-8 input string. | ||
224 | * | ||
225 | * @param[in] s input UTF-8 string | ||
226 | * @param[in] len length of the input | ||
227 | * @param[in] lang language of the input (reserved for future use) | ||
228 | * @param[out] brks pointer to the output breaking data, containing | ||
229 | * #GRAPHEMEBREAK_BREAK or #GRAPHEMEBREAK_NOBREAK. | ||
230 | * First element in output array is for the break behind | ||
231 | * the first character the pointer must point to an | ||
232 | * array with at least as many elements as there | ||
233 | * are characters in the string | ||
234 | */ | ||
235 | void set_graphemebreaks_utf8(const utf8_t *s, size_t len, const char *lang, | ||
236 | char *brks) | ||
237 | { | ||
238 | (void)lang; | ||
239 | set_graphemebreaks(s, len, brks, | ||
240 | (get_next_char_t)ub_get_next_char_utf8); | ||
241 | } | ||
242 | |||
243 | /** | ||
244 | * Sets the grapheme breaking information for a UTF-16 input string. | ||
245 | * | ||
246 | * @param[in] s input UTF-16 string | ||
247 | * @param[in] len length of the input | ||
248 | * @param[in] lang language of the input (reserved for future use) | ||
249 | * @param[out] brks pointer to the output breaking data, containing | ||
250 | * #GRAPHEMEBREAK_BREAK or #GRAPHEMEBREAK_NOBREAK. | ||
251 | * First element in output array is for the break behind | ||
252 | * the first character the pointer must point to an | ||
253 | * array with at least as many elements as there | ||
254 | * are characters in the string | ||
255 | */ | ||
256 | void set_graphemebreaks_utf16(const utf16_t *s, size_t len, | ||
257 | const char *lang, char *brks) | ||
258 | { | ||
259 | (void)lang; | ||
260 | set_graphemebreaks(s, len, brks, | ||
261 | (get_next_char_t)ub_get_next_char_utf16); | ||
262 | } | ||
263 | |||
264 | /** | ||
265 | * Sets the grapheme breaking information for a UTF-32 input string. | ||
266 | * | ||
267 | * @param[in] s input UTF-32 string | ||
268 | * @param[in] len length of the input | ||
269 | * @param[in] lang language of the input (reserved for future use) | ||
270 | * @param[out] brks pointer to the output breaking data, containing | ||
271 | * #GRAPHEMEBREAK_BREAK or #GRAPHEMEBREAK_NOBREAK. | ||
272 | * First element in output array is for the break behind | ||
273 | * the first character the pointer must point to an | ||
274 | * array with at least as many elements as there | ||
275 | * are characters in the string | ||
276 | */ | ||
277 | void set_graphemebreaks_utf32(const utf32_t *s, size_t len, | ||
278 | const char *lang, char *brks) | ||
279 | { | ||
280 | (void)lang; | ||
281 | set_graphemebreaks(s, len, brks, | ||
282 | (get_next_char_t)ub_get_next_char_utf32); | ||
283 | } | ||
diff --git a/src/static_libs/libunibreak/graphemebreak.h b/src/static_libs/libunibreak/graphemebreak.h new file mode 100644 index 0000000000..c01768233a --- /dev/null +++ b/src/static_libs/libunibreak/graphemebreak.h | |||
@@ -0,0 +1,69 @@ | |||
1 | /* | ||
2 | * Grapheme breaking in a Unicode sequence. Designed to be used in a | ||
3 | * generic text renderer. | ||
4 | * | ||
5 | * Copyright (C) 2016 Andreas Röver <roever at users dot sf dot net> | ||
6 | * | ||
7 | * This software is provided 'as-is', without any express or implied | ||
8 | * warranty. In no event will the author be held liable for any damages | ||
9 | * arising from the use of this software. | ||
10 | * | ||
11 | * Permission is granted to anyone to use this software for any purpose, | ||
12 | * including commercial applications, and to alter it and redistribute | ||
13 | * it freely, subject to the following restrictions: | ||
14 | * | ||
15 | * 1. The origin of this software must not be misrepresented; you must | ||
16 | * not claim that you wrote the original software. If you use this | ||
17 | * software in a product, an acknowledgement in the product | ||
18 | * documentation would be appreciated but is not required. | ||
19 | * 2. Altered source versions must be plainly marked as such, and must | ||
20 | * not be misrepresented as being the original software. | ||
21 | * 3. This notice may not be removed or altered from any source | ||
22 | * distribution. | ||
23 | * | ||
24 | * The main reference is Unicode Standard Annex 29 (UAX #29): | ||
25 | * <URL:http://unicode.org/reports/tr29> | ||
26 | * | ||
27 | * When this library was designed, this annex was at Revision 29, for | ||
28 | * Unicode 9.0.0: | ||
29 | * <URL:http://www.unicode.org/reports/tr29/tr29-29.html> | ||
30 | * | ||
31 | * The Unicode Terms of Use are available at | ||
32 | * <URL:http://www.unicode.org/copyright.html> | ||
33 | */ | ||
34 | |||
35 | /** | ||
36 | * @file graphemebreak.h | ||
37 | * | ||
38 | * Header file for the grapheme breaking algorithm. | ||
39 | * | ||
40 | * @author Andreas Röver | ||
41 | */ | ||
42 | |||
43 | #ifndef GRAPHEMEBREAK_H | ||
44 | #define GRAPHEMEBREAK_H | ||
45 | |||
46 | #include <stddef.h> | ||
47 | #include "unibreakbase.h" | ||
48 | |||
49 | #ifdef __cplusplus | ||
50 | extern "C" { | ||
51 | #endif | ||
52 | |||
53 | #define GRAPHEMEBREAK_BREAK 0 /**< Between 2 graphemes */ | ||
54 | #define GRAPHEMEBREAK_NOBREAK 1 /**< Inside a grapheme */ | ||
55 | #define GRAPHEMEBREAK_INSIDEACHAR 2 /**< Inside a unicode character */ | ||
56 | |||
57 | void init_graphemebreak(void); | ||
58 | void set_graphemebreaks_utf8(const utf8_t *s, size_t len, const char *lang, | ||
59 | char *brks); | ||
60 | void set_graphemebreaks_utf16(const utf16_t *s, size_t len, | ||
61 | const char *lang, char *brks); | ||
62 | void set_graphemebreaks_utf32(const utf32_t *s, size_t len, | ||
63 | const char *lang, char *brks); | ||
64 | |||
65 | #ifdef __cplusplus | ||
66 | } | ||
67 | #endif | ||
68 | |||
69 | #endif | ||
diff --git a/src/static_libs/libunibreak/graphemebreakdata.c b/src/static_libs/libunibreak/graphemebreakdata.c new file mode 100644 index 0000000000..cab9bebd80 --- /dev/null +++ b/src/static_libs/libunibreak/graphemebreakdata.c | |||
@@ -0,0 +1,1337 @@ | |||
1 | /* The content of this file is generated from: | ||
2 | # GraphemeBreakProperty-9.0.0.txt | ||
3 | # Date: 2016-06-03, 22:23:55 GMT | ||
4 | */ | ||
5 | |||
6 | #include "graphemebreakdef.h" | ||
7 | |||
8 | static const struct GraphemeBreakProperties gb_prop_default[] = { | ||
9 | {0x0000, 0x0009, GBP_Control}, | ||
10 | {0x000A, 0x000A, GBP_LF}, | ||
11 | {0x000B, 0x000C, GBP_Control}, | ||
12 | {0x000D, 0x000D, GBP_CR}, | ||
13 | {0x000E, 0x001F, GBP_Control}, | ||
14 | {0x007F, 0x009F, GBP_Control}, | ||
15 | {0x00AD, 0x00AD, GBP_Control}, | ||
16 | {0x0300, 0x036F, GBP_Extend}, | ||
17 | {0x0483, 0x0487, GBP_Extend}, | ||
18 | {0x0488, 0x0489, GBP_Extend}, | ||
19 | {0x0591, 0x05BD, GBP_Extend}, | ||
20 | {0x05BF, 0x05BF, GBP_Extend}, | ||
21 | {0x05C1, 0x05C2, GBP_Extend}, | ||
22 | {0x05C4, 0x05C5, GBP_Extend}, | ||
23 | {0x05C7, 0x05C7, GBP_Extend}, | ||
24 | {0x0600, 0x0605, GBP_Prepend}, | ||
25 | {0x0610, 0x061A, GBP_Extend}, | ||
26 | {0x061C, 0x061C, GBP_Control}, | ||
27 | {0x064B, 0x065F, GBP_Extend}, | ||
28 | {0x0670, 0x0670, GBP_Extend}, | ||
29 | {0x06D6, 0x06DC, GBP_Extend}, | ||
30 | {0x06DD, 0x06DD, GBP_Prepend}, | ||
31 | {0x06DF, 0x06E4, GBP_Extend}, | ||
32 | {0x06E7, 0x06E8, GBP_Extend}, | ||
33 | {0x06EA, 0x06ED, GBP_Extend}, | ||
34 | {0x070F, 0x070F, GBP_Prepend}, | ||
35 | {0x0711, 0x0711, GBP_Extend}, | ||
36 | {0x0730, 0x074A, GBP_Extend}, | ||
37 | {0x07A6, 0x07B0, GBP_Extend}, | ||
38 | {0x07EB, 0x07F3, GBP_Extend}, | ||
39 | {0x0816, 0x0819, GBP_Extend}, | ||
40 | {0x081B, 0x0823, GBP_Extend}, | ||
41 | {0x0825, 0x0827, GBP_Extend}, | ||
42 | {0x0829, 0x082D, GBP_Extend}, | ||
43 | {0x0859, 0x085B, GBP_Extend}, | ||
44 | {0x08D4, 0x08E1, GBP_Extend}, | ||
45 | {0x08E2, 0x08E2, GBP_Prepend}, | ||
46 | {0x08E3, 0x0902, GBP_Extend}, | ||
47 | {0x0903, 0x0903, GBP_SpacingMark}, | ||
48 | {0x093A, 0x093A, GBP_Extend}, | ||
49 | {0x093B, 0x093B, GBP_SpacingMark}, | ||
50 | {0x093C, 0x093C, GBP_Extend}, | ||
51 | {0x093E, 0x0940, GBP_SpacingMark}, | ||
52 | {0x0941, 0x0948, GBP_Extend}, | ||
53 | {0x0949, 0x094C, GBP_SpacingMark}, | ||
54 | {0x094D, 0x094D, GBP_Extend}, | ||
55 | {0x094E, 0x094F, GBP_SpacingMark}, | ||
56 | {0x0951, 0x0957, GBP_Extend}, | ||
57 | {0x0962, 0x0963, GBP_Extend}, | ||
58 | {0x0981, 0x0981, GBP_Extend}, | ||
59 | {0x0982, 0x0983, GBP_SpacingMark}, | ||
60 | {0x09BC, 0x09BC, GBP_Extend}, | ||
61 | {0x09BE, 0x09BE, GBP_Extend}, | ||
62 | {0x09BF, 0x09C0, GBP_SpacingMark}, | ||
63 | {0x09C1, 0x09C4, GBP_Extend}, | ||
64 | {0x09C7, 0x09C8, GBP_SpacingMark}, | ||
65 | {0x09CB, 0x09CC, GBP_SpacingMark}, | ||
66 | {0x09CD, 0x09CD, GBP_Extend}, | ||
67 | {0x09D7, 0x09D7, GBP_Extend}, | ||
68 | {0x09E2, 0x09E3, GBP_Extend}, | ||
69 | {0x0A01, 0x0A02, GBP_Extend}, | ||
70 | {0x0A03, 0x0A03, GBP_SpacingMark}, | ||
71 | {0x0A3C, 0x0A3C, GBP_Extend}, | ||
72 | {0x0A3E, 0x0A40, GBP_SpacingMark}, | ||
73 | {0x0A41, 0x0A42, GBP_Extend}, | ||
74 | {0x0A47, 0x0A48, GBP_Extend}, | ||
75 | {0x0A4B, 0x0A4D, GBP_Extend}, | ||
76 | {0x0A51, 0x0A51, GBP_Extend}, | ||
77 | {0x0A70, 0x0A71, GBP_Extend}, | ||
78 | {0x0A75, 0x0A75, GBP_Extend}, | ||
79 | {0x0A81, 0x0A82, GBP_Extend}, | ||
80 | {0x0A83, 0x0A83, GBP_SpacingMark}, | ||
81 | {0x0ABC, 0x0ABC, GBP_Extend}, | ||
82 | {0x0ABE, 0x0AC0, GBP_SpacingMark}, | ||
83 | {0x0AC1, 0x0AC5, GBP_Extend}, | ||
84 | {0x0AC7, 0x0AC8, GBP_Extend}, | ||
85 | {0x0AC9, 0x0AC9, GBP_SpacingMark}, | ||
86 | {0x0ACB, 0x0ACC, GBP_SpacingMark}, | ||
87 | {0x0ACD, 0x0ACD, GBP_Extend}, | ||
88 | {0x0AE2, 0x0AE3, GBP_Extend}, | ||
89 | {0x0B01, 0x0B01, GBP_Extend}, | ||
90 | {0x0B02, 0x0B03, GBP_SpacingMark}, | ||
91 | {0x0B3C, 0x0B3C, GBP_Extend}, | ||
92 | {0x0B3E, 0x0B3E, GBP_Extend}, | ||
93 | {0x0B3F, 0x0B3F, GBP_Extend}, | ||
94 | {0x0B40, 0x0B40, GBP_SpacingMark}, | ||
95 | {0x0B41, 0x0B44, GBP_Extend}, | ||
96 | {0x0B47, 0x0B48, GBP_SpacingMark}, | ||
97 | {0x0B4B, 0x0B4C, GBP_SpacingMark}, | ||
98 | {0x0B4D, 0x0B4D, GBP_Extend}, | ||
99 | {0x0B56, 0x0B56, GBP_Extend}, | ||
100 | {0x0B57, 0x0B57, GBP_Extend}, | ||
101 | {0x0B62, 0x0B63, GBP_Extend}, | ||
102 | {0x0B82, 0x0B82, GBP_Extend}, | ||
103 | {0x0BBE, 0x0BBE, GBP_Extend}, | ||
104 | {0x0BBF, 0x0BBF, GBP_SpacingMark}, | ||
105 | {0x0BC0, 0x0BC0, GBP_Extend}, | ||
106 | {0x0BC1, 0x0BC2, GBP_SpacingMark}, | ||
107 | {0x0BC6, 0x0BC8, GBP_SpacingMark}, | ||
108 | {0x0BCA, 0x0BCC, GBP_SpacingMark}, | ||
109 | {0x0BCD, 0x0BCD, GBP_Extend}, | ||
110 | {0x0BD7, 0x0BD7, GBP_Extend}, | ||
111 | {0x0C00, 0x0C00, GBP_Extend}, | ||
112 | {0x0C01, 0x0C03, GBP_SpacingMark}, | ||
113 | {0x0C3E, 0x0C40, GBP_Extend}, | ||
114 | {0x0C41, 0x0C44, GBP_SpacingMark}, | ||
115 | {0x0C46, 0x0C48, GBP_Extend}, | ||
116 | {0x0C4A, 0x0C4D, GBP_Extend}, | ||
117 | {0x0C55, 0x0C56, GBP_Extend}, | ||
118 | {0x0C62, 0x0C63, GBP_Extend}, | ||
119 | {0x0C81, 0x0C81, GBP_Extend}, | ||
120 | {0x0C82, 0x0C83, GBP_SpacingMark}, | ||
121 | {0x0CBC, 0x0CBC, GBP_Extend}, | ||
122 | {0x0CBE, 0x0CBE, GBP_SpacingMark}, | ||
123 | {0x0CBF, 0x0CBF, GBP_Extend}, | ||
124 | {0x0CC0, 0x0CC1, GBP_SpacingMark}, | ||
125 | {0x0CC2, 0x0CC2, GBP_Extend}, | ||
126 | {0x0CC3, 0x0CC4, GBP_SpacingMark}, | ||
127 | {0x0CC6, 0x0CC6, GBP_Extend}, | ||
128 | {0x0CC7, 0x0CC8, GBP_SpacingMark}, | ||
129 | {0x0CCA, 0x0CCB, GBP_SpacingMark}, | ||
130 | {0x0CCC, 0x0CCD, GBP_Extend}, | ||
131 | {0x0CD5, 0x0CD6, GBP_Extend}, | ||
132 | {0x0CE2, 0x0CE3, GBP_Extend}, | ||
133 | {0x0D01, 0x0D01, GBP_Extend}, | ||
134 | {0x0D02, 0x0D03, GBP_SpacingMark}, | ||
135 | {0x0D3E, 0x0D3E, GBP_Extend}, | ||
136 | {0x0D3F, 0x0D40, GBP_SpacingMark}, | ||
137 | {0x0D41, 0x0D44, GBP_Extend}, | ||
138 | {0x0D46, 0x0D48, GBP_SpacingMark}, | ||
139 | {0x0D4A, 0x0D4C, GBP_SpacingMark}, | ||
140 | {0x0D4D, 0x0D4D, GBP_Extend}, | ||
141 | {0x0D4E, 0x0D4E, GBP_Prepend}, | ||
142 | {0x0D57, 0x0D57, GBP_Extend}, | ||
143 | {0x0D62, 0x0D63, GBP_Extend}, | ||
144 | {0x0D82, 0x0D83, GBP_SpacingMark}, | ||
145 | {0x0DCA, 0x0DCA, GBP_Extend}, | ||
146 | {0x0DCF, 0x0DCF, GBP_Extend}, | ||
147 | {0x0DD0, 0x0DD1, GBP_SpacingMark}, | ||
148 | {0x0DD2, 0x0DD4, GBP_Extend}, | ||
149 | {0x0DD6, 0x0DD6, GBP_Extend}, | ||
150 | {0x0DD8, 0x0DDE, GBP_SpacingMark}, | ||
151 | {0x0DDF, 0x0DDF, GBP_Extend}, | ||
152 | {0x0DF2, 0x0DF3, GBP_SpacingMark}, | ||
153 | {0x0E31, 0x0E31, GBP_Extend}, | ||
154 | {0x0E33, 0x0E33, GBP_SpacingMark}, | ||
155 | {0x0E34, 0x0E3A, GBP_Extend}, | ||
156 | {0x0E47, 0x0E4E, GBP_Extend}, | ||
157 | {0x0EB1, 0x0EB1, GBP_Extend}, | ||
158 | {0x0EB3, 0x0EB3, GBP_SpacingMark}, | ||
159 | {0x0EB4, 0x0EB9, GBP_Extend}, | ||
160 | {0x0EBB, 0x0EBC, GBP_Extend}, | ||
161 | {0x0EC8, 0x0ECD, GBP_Extend}, | ||
162 | {0x0F18, 0x0F19, GBP_Extend}, | ||
163 | {0x0F35, 0x0F35, GBP_Extend}, | ||
164 | {0x0F37, 0x0F37, GBP_Extend}, | ||
165 | {0x0F39, 0x0F39, GBP_Extend}, | ||
166 | {0x0F3E, 0x0F3F, GBP_SpacingMark}, | ||
167 | {0x0F71, 0x0F7E, GBP_Extend}, | ||
168 | {0x0F7F, 0x0F7F, GBP_SpacingMark}, | ||
169 | {0x0F80, 0x0F84, GBP_Extend}, | ||
170 | {0x0F86, 0x0F87, GBP_Extend}, | ||
171 | {0x0F8D, 0x0F97, GBP_Extend}, | ||
172 | {0x0F99, 0x0FBC, GBP_Extend}, | ||
173 | {0x0FC6, 0x0FC6, GBP_Extend}, | ||
174 | {0x102D, 0x1030, GBP_Extend}, | ||
175 | {0x1031, 0x1031, GBP_SpacingMark}, | ||
176 | {0x1032, 0x1037, GBP_Extend}, | ||
177 | {0x1039, 0x103A, GBP_Extend}, | ||
178 | {0x103B, 0x103C, GBP_SpacingMark}, | ||
179 | {0x103D, 0x103E, GBP_Extend}, | ||
180 | {0x1056, 0x1057, GBP_SpacingMark}, | ||
181 | {0x1058, 0x1059, GBP_Extend}, | ||
182 | {0x105E, 0x1060, GBP_Extend}, | ||
183 | {0x1071, 0x1074, GBP_Extend}, | ||
184 | {0x1082, 0x1082, GBP_Extend}, | ||
185 | {0x1084, 0x1084, GBP_SpacingMark}, | ||
186 | {0x1085, 0x1086, GBP_Extend}, | ||
187 | {0x108D, 0x108D, GBP_Extend}, | ||
188 | {0x109D, 0x109D, GBP_Extend}, | ||
189 | {0x1100, 0x115F, GBP_L}, | ||
190 | {0x1160, 0x11A7, GBP_V}, | ||
191 | {0x11A8, 0x11FF, GBP_T}, | ||
192 | {0x135D, 0x135F, GBP_Extend}, | ||
193 | {0x1712, 0x1714, GBP_Extend}, | ||
194 | {0x1732, 0x1734, GBP_Extend}, | ||
195 | {0x1752, 0x1753, GBP_Extend}, | ||
196 | {0x1772, 0x1773, GBP_Extend}, | ||
197 | {0x17B4, 0x17B5, GBP_Extend}, | ||
198 | {0x17B6, 0x17B6, GBP_SpacingMark}, | ||
199 | {0x17B7, 0x17BD, GBP_Extend}, | ||
200 | {0x17BE, 0x17C5, GBP_SpacingMark}, | ||
201 | {0x17C6, 0x17C6, GBP_Extend}, | ||
202 | {0x17C7, 0x17C8, GBP_SpacingMark}, | ||
203 | {0x17C9, 0x17D3, GBP_Extend}, | ||
204 | {0x17DD, 0x17DD, GBP_Extend}, | ||
205 | {0x180B, 0x180D, GBP_Extend}, | ||
206 | {0x180E, 0x180E, GBP_Control}, | ||
207 | {0x1885, 0x1886, GBP_Extend}, | ||
208 | {0x18A9, 0x18A9, GBP_Extend}, | ||
209 | {0x1920, 0x1922, GBP_Extend}, | ||
210 | {0x1923, 0x1926, GBP_SpacingMark}, | ||
211 | {0x1927, 0x1928, GBP_Extend}, | ||
212 | {0x1929, 0x192B, GBP_SpacingMark}, | ||
213 | {0x1930, 0x1931, GBP_SpacingMark}, | ||
214 | {0x1932, 0x1932, GBP_Extend}, | ||
215 | {0x1933, 0x1938, GBP_SpacingMark}, | ||
216 | {0x1939, 0x193B, GBP_Extend}, | ||
217 | {0x1A17, 0x1A18, GBP_Extend}, | ||
218 | {0x1A19, 0x1A1A, GBP_SpacingMark}, | ||
219 | {0x1A1B, 0x1A1B, GBP_Extend}, | ||
220 | {0x1A55, 0x1A55, GBP_SpacingMark}, | ||
221 | {0x1A56, 0x1A56, GBP_Extend}, | ||
222 | {0x1A57, 0x1A57, GBP_SpacingMark}, | ||
223 | {0x1A58, 0x1A5E, GBP_Extend}, | ||
224 | {0x1A60, 0x1A60, GBP_Extend}, | ||
225 | {0x1A62, 0x1A62, GBP_Extend}, | ||
226 | {0x1A65, 0x1A6C, GBP_Extend}, | ||
227 | {0x1A6D, 0x1A72, GBP_SpacingMark}, | ||
228 | {0x1A73, 0x1A7C, GBP_Extend}, | ||
229 | {0x1A7F, 0x1A7F, GBP_Extend}, | ||
230 | {0x1AB0, 0x1ABD, GBP_Extend}, | ||
231 | {0x1ABE, 0x1ABE, GBP_Extend}, | ||
232 | {0x1B00, 0x1B03, GBP_Extend}, | ||
233 | {0x1B04, 0x1B04, GBP_SpacingMark}, | ||
234 | {0x1B34, 0x1B34, GBP_Extend}, | ||
235 | {0x1B35, 0x1B35, GBP_SpacingMark}, | ||
236 | {0x1B36, 0x1B3A, GBP_Extend}, | ||
237 | {0x1B3B, 0x1B3B, GBP_SpacingMark}, | ||
238 | {0x1B3C, 0x1B3C, GBP_Extend}, | ||
239 | {0x1B3D, 0x1B41, GBP_SpacingMark}, | ||
240 | {0x1B42, 0x1B42, GBP_Extend}, | ||
241 | {0x1B43, 0x1B44, GBP_SpacingMark}, | ||
242 | {0x1B6B, 0x1B73, GBP_Extend}, | ||
243 | {0x1B80, 0x1B81, GBP_Extend}, | ||
244 | {0x1B82, 0x1B82, GBP_SpacingMark}, | ||
245 | {0x1BA1, 0x1BA1, GBP_SpacingMark}, | ||
246 | {0x1BA2, 0x1BA5, GBP_Extend}, | ||
247 | {0x1BA6, 0x1BA7, GBP_SpacingMark}, | ||
248 | {0x1BA8, 0x1BA9, GBP_Extend}, | ||
249 | {0x1BAA, 0x1BAA, GBP_SpacingMark}, | ||
250 | {0x1BAB, 0x1BAD, GBP_Extend}, | ||
251 | {0x1BE6, 0x1BE6, GBP_Extend}, | ||
252 | {0x1BE7, 0x1BE7, GBP_SpacingMark}, | ||
253 | {0x1BE8, 0x1BE9, GBP_Extend}, | ||
254 | {0x1BEA, 0x1BEC, GBP_SpacingMark}, | ||
255 | {0x1BED, 0x1BED, GBP_Extend}, | ||
256 | {0x1BEE, 0x1BEE, GBP_SpacingMark}, | ||
257 | {0x1BEF, 0x1BF1, GBP_Extend}, | ||
258 | {0x1BF2, 0x1BF3, GBP_SpacingMark}, | ||
259 | {0x1C24, 0x1C2B, GBP_SpacingMark}, | ||
260 | {0x1C2C, 0x1C33, GBP_Extend}, | ||
261 | {0x1C34, 0x1C35, GBP_SpacingMark}, | ||
262 | {0x1C36, 0x1C37, GBP_Extend}, | ||
263 | {0x1CD0, 0x1CD2, GBP_Extend}, | ||
264 | {0x1CD4, 0x1CE0, GBP_Extend}, | ||
265 | {0x1CE1, 0x1CE1, GBP_SpacingMark}, | ||
266 | {0x1CE2, 0x1CE8, GBP_Extend}, | ||
267 | {0x1CED, 0x1CED, GBP_Extend}, | ||
268 | {0x1CF2, 0x1CF3, GBP_SpacingMark}, | ||
269 | {0x1CF4, 0x1CF4, GBP_Extend}, | ||
270 | {0x1CF8, 0x1CF9, GBP_Extend}, | ||
271 | {0x1DC0, 0x1DF5, GBP_Extend}, | ||
272 | {0x1DFB, 0x1DFF, GBP_Extend}, | ||
273 | {0x200B, 0x200B, GBP_Control}, | ||
274 | {0x200C, 0x200C, GBP_Extend}, | ||
275 | {0x200D, 0x200D, GBP_ZWJ}, | ||
276 | {0x200E, 0x200F, GBP_Control}, | ||
277 | {0x2028, 0x2028, GBP_Control}, | ||
278 | {0x2029, 0x2029, GBP_Control}, | ||
279 | {0x202A, 0x202E, GBP_Control}, | ||
280 | {0x2060, 0x2064, GBP_Control}, | ||
281 | {0x2065, 0x2065, GBP_Control}, | ||
282 | {0x2066, 0x206F, GBP_Control}, | ||
283 | {0x20D0, 0x20DC, GBP_Extend}, | ||
284 | {0x20DD, 0x20E0, GBP_Extend}, | ||
285 | {0x20E1, 0x20E1, GBP_Extend}, | ||
286 | {0x20E2, 0x20E4, GBP_Extend}, | ||
287 | {0x20E5, 0x20F0, GBP_Extend}, | ||
288 | {0x261D, 0x261D, GBP_E_Base}, | ||
289 | {0x26F9, 0x26F9, GBP_E_Base}, | ||
290 | {0x270A, 0x270D, GBP_E_Base}, | ||
291 | {0x2764, 0x2764, GBP_Glue_After_Zwj}, | ||
292 | {0x2CEF, 0x2CF1, GBP_Extend}, | ||
293 | {0x2D7F, 0x2D7F, GBP_Extend}, | ||
294 | {0x2DE0, 0x2DFF, GBP_Extend}, | ||
295 | {0x302A, 0x302D, GBP_Extend}, | ||
296 | {0x302E, 0x302F, GBP_Extend}, | ||
297 | {0x3099, 0x309A, GBP_Extend}, | ||
298 | {0xA66F, 0xA66F, GBP_Extend}, | ||
299 | {0xA670, 0xA672, GBP_Extend}, | ||
300 | {0xA674, 0xA67D, GBP_Extend}, | ||
301 | {0xA69E, 0xA69F, GBP_Extend}, | ||
302 | {0xA6F0, 0xA6F1, GBP_Extend}, | ||
303 | {0xA802, 0xA802, GBP_Extend}, | ||
304 | {0xA806, 0xA806, GBP_Extend}, | ||
305 | {0xA80B, 0xA80B, GBP_Extend}, | ||
306 | {0xA823, 0xA824, GBP_SpacingMark}, | ||
307 | {0xA825, 0xA826, GBP_Extend}, | ||
308 | {0xA827, 0xA827, GBP_SpacingMark}, | ||
309 | {0xA880, 0xA881, GBP_SpacingMark}, | ||
310 | {0xA8B4, 0xA8C3, GBP_SpacingMark}, | ||
311 | {0xA8C4, 0xA8C5, GBP_Extend}, | ||
312 | {0xA8E0, 0xA8F1, GBP_Extend}, | ||
313 | {0xA926, 0xA92D, GBP_Extend}, | ||
314 | {0xA947, 0xA951, GBP_Extend}, | ||
315 | {0xA952, 0xA953, GBP_SpacingMark}, | ||
316 | {0xA960, 0xA97C, GBP_L}, | ||
317 | {0xA980, 0xA982, GBP_Extend}, | ||
318 | {0xA983, 0xA983, GBP_SpacingMark}, | ||
319 | {0xA9B3, 0xA9B3, GBP_Extend}, | ||
320 | {0xA9B4, 0xA9B5, GBP_SpacingMark}, | ||
321 | {0xA9B6, 0xA9B9, GBP_Extend}, | ||
322 | {0xA9BA, 0xA9BB, GBP_SpacingMark}, | ||
323 | {0xA9BC, 0xA9BC, GBP_Extend}, | ||
324 | {0xA9BD, 0xA9C0, GBP_SpacingMark}, | ||
325 | {0xA9E5, 0xA9E5, GBP_Extend}, | ||
326 | {0xAA29, 0xAA2E, GBP_Extend}, | ||
327 | {0xAA2F, 0xAA30, GBP_SpacingMark}, | ||
328 | {0xAA31, 0xAA32, GBP_Extend}, | ||
329 | {0xAA33, 0xAA34, GBP_SpacingMark}, | ||
330 | {0xAA35, 0xAA36, GBP_Extend}, | ||
331 | {0xAA43, 0xAA43, GBP_Extend}, | ||
332 | {0xAA4C, 0xAA4C, GBP_Extend}, | ||
333 | {0xAA4D, 0xAA4D, GBP_SpacingMark}, | ||
334 | {0xAA7C, 0xAA7C, GBP_Extend}, | ||
335 | {0xAAB0, 0xAAB0, GBP_Extend}, | ||
336 | {0xAAB2, 0xAAB4, GBP_Extend}, | ||
337 | {0xAAB7, 0xAAB8, GBP_Extend}, | ||
338 | {0xAABE, 0xAABF, GBP_Extend}, | ||
339 | {0xAAC1, 0xAAC1, GBP_Extend}, | ||
340 | {0xAAEB, 0xAAEB, GBP_SpacingMark}, | ||
341 | {0xAAEC, 0xAAED, GBP_Extend}, | ||
342 | {0xAAEE, 0xAAEF, GBP_SpacingMark}, | ||
343 | {0xAAF5, 0xAAF5, GBP_SpacingMark}, | ||
344 | {0xAAF6, 0xAAF6, GBP_Extend}, | ||
345 | {0xABE3, 0xABE4, GBP_SpacingMark}, | ||
346 | {0xABE5, 0xABE5, GBP_Extend}, | ||
347 | {0xABE6, 0xABE7, GBP_SpacingMark}, | ||
348 | {0xABE8, 0xABE8, GBP_Extend}, | ||
349 | {0xABE9, 0xABEA, GBP_SpacingMark}, | ||
350 | {0xABEC, 0xABEC, GBP_SpacingMark}, | ||
351 | {0xABED, 0xABED, GBP_Extend}, | ||
352 | {0xAC00, 0xAC00, GBP_LV}, | ||
353 | {0xAC01, 0xAC1B, GBP_LVT}, | ||
354 | {0xAC1C, 0xAC1C, GBP_LV}, | ||
355 | {0xAC1D, 0xAC37, GBP_LVT}, | ||
356 | {0xAC38, 0xAC38, GBP_LV}, | ||
357 | {0xAC39, 0xAC53, GBP_LVT}, | ||
358 | {0xAC54, 0xAC54, GBP_LV}, | ||
359 | {0xAC55, 0xAC6F, GBP_LVT}, | ||
360 | {0xAC70, 0xAC70, GBP_LV}, | ||
361 | {0xAC71, 0xAC8B, GBP_LVT}, | ||
362 | {0xAC8C, 0xAC8C, GBP_LV}, | ||
363 | {0xAC8D, 0xACA7, GBP_LVT}, | ||
364 | {0xACA8, 0xACA8, GBP_LV}, | ||
365 | {0xACA9, 0xACC3, GBP_LVT}, | ||
366 | {0xACC4, 0xACC4, GBP_LV}, | ||
367 | {0xACC5, 0xACDF, GBP_LVT}, | ||
368 | {0xACE0, 0xACE0, GBP_LV}, | ||
369 | {0xACE1, 0xACFB, GBP_LVT}, | ||
370 | {0xACFC, 0xACFC, GBP_LV}, | ||
371 | {0xACFD, 0xAD17, GBP_LVT}, | ||
372 | {0xAD18, 0xAD18, GBP_LV}, | ||
373 | {0xAD19, 0xAD33, GBP_LVT}, | ||
374 | {0xAD34, 0xAD34, GBP_LV}, | ||
375 | {0xAD35, 0xAD4F, GBP_LVT}, | ||
376 | {0xAD50, 0xAD50, GBP_LV}, | ||
377 | {0xAD51, 0xAD6B, GBP_LVT}, | ||
378 | {0xAD6C, 0xAD6C, GBP_LV}, | ||
379 | {0xAD6D, 0xAD87, GBP_LVT}, | ||
380 | {0xAD88, 0xAD88, GBP_LV}, | ||
381 | {0xAD89, 0xADA3, GBP_LVT}, | ||
382 | {0xADA4, 0xADA4, GBP_LV}, | ||
383 | {0xADA5, 0xADBF, GBP_LVT}, | ||
384 | {0xADC0, 0xADC0, GBP_LV}, | ||
385 | {0xADC1, 0xADDB, GBP_LVT}, | ||
386 | {0xADDC, 0xADDC, GBP_LV}, | ||
387 | {0xADDD, 0xADF7, GBP_LVT}, | ||
388 | {0xADF8, 0xADF8, GBP_LV}, | ||
389 | {0xADF9, 0xAE13, GBP_LVT}, | ||
390 | {0xAE14, 0xAE14, GBP_LV}, | ||
391 | {0xAE15, 0xAE2F, GBP_LVT}, | ||
392 | {0xAE30, 0xAE30, GBP_LV}, | ||
393 | {0xAE31, 0xAE4B, GBP_LVT}, | ||
394 | {0xAE4C, 0xAE4C, GBP_LV}, | ||
395 | {0xAE4D, 0xAE67, GBP_LVT}, | ||
396 | {0xAE68, 0xAE68, GBP_LV}, | ||
397 | {0xAE69, 0xAE83, GBP_LVT}, | ||
398 | {0xAE84, 0xAE84, GBP_LV}, | ||
399 | {0xAE85, 0xAE9F, GBP_LVT}, | ||
400 | {0xAEA0, 0xAEA0, GBP_LV}, | ||
401 | {0xAEA1, 0xAEBB, GBP_LVT}, | ||
402 | {0xAEBC, 0xAEBC, GBP_LV}, | ||
403 | {0xAEBD, 0xAED7, GBP_LVT}, | ||
404 | {0xAED8, 0xAED8, GBP_LV}, | ||
405 | {0xAED9, 0xAEF3, GBP_LVT}, | ||
406 | {0xAEF4, 0xAEF4, GBP_LV}, | ||
407 | {0xAEF5, 0xAF0F, GBP_LVT}, | ||
408 | {0xAF10, 0xAF10, GBP_LV}, | ||
409 | {0xAF11, 0xAF2B, GBP_LVT}, | ||
410 | {0xAF2C, 0xAF2C, GBP_LV}, | ||
411 | {0xAF2D, 0xAF47, GBP_LVT}, | ||
412 | {0xAF48, 0xAF48, GBP_LV}, | ||
413 | {0xAF49, 0xAF63, GBP_LVT}, | ||
414 | {0xAF64, 0xAF64, GBP_LV}, | ||
415 | {0xAF65, 0xAF7F, GBP_LVT}, | ||
416 | {0xAF80, 0xAF80, GBP_LV}, | ||
417 | {0xAF81, 0xAF9B, GBP_LVT}, | ||
418 | {0xAF9C, 0xAF9C, GBP_LV}, | ||
419 | {0xAF9D, 0xAFB7, GBP_LVT}, | ||
420 | {0xAFB8, 0xAFB8, GBP_LV}, | ||
421 | {0xAFB9, 0xAFD3, GBP_LVT}, | ||
422 | {0xAFD4, 0xAFD4, GBP_LV}, | ||
423 | {0xAFD5, 0xAFEF, GBP_LVT}, | ||
424 | {0xAFF0, 0xAFF0, GBP_LV}, | ||
425 | {0xAFF1, 0xB00B, GBP_LVT}, | ||
426 | {0xB00C, 0xB00C, GBP_LV}, | ||
427 | {0xB00D, 0xB027, GBP_LVT}, | ||
428 | {0xB028, 0xB028, GBP_LV}, | ||
429 | {0xB029, 0xB043, GBP_LVT}, | ||
430 | {0xB044, 0xB044, GBP_LV}, | ||
431 | {0xB045, 0xB05F, GBP_LVT}, | ||
432 | {0xB060, 0xB060, GBP_LV}, | ||
433 | {0xB061, 0xB07B, GBP_LVT}, | ||
434 | {0xB07C, 0xB07C, GBP_LV}, | ||
435 | {0xB07D, 0xB097, GBP_LVT}, | ||
436 | {0xB098, 0xB098, GBP_LV}, | ||
437 | {0xB099, 0xB0B3, GBP_LVT}, | ||
438 | {0xB0B4, 0xB0B4, GBP_LV}, | ||
439 | {0xB0B5, 0xB0CF, GBP_LVT}, | ||
440 | {0xB0D0, 0xB0D0, GBP_LV}, | ||
441 | {0xB0D1, 0xB0EB, GBP_LVT}, | ||
442 | {0xB0EC, 0xB0EC, GBP_LV}, | ||
443 | {0xB0ED, 0xB107, GBP_LVT}, | ||
444 | {0xB108, 0xB108, GBP_LV}, | ||
445 | {0xB109, 0xB123, GBP_LVT}, | ||
446 | {0xB124, 0xB124, GBP_LV}, | ||
447 | {0xB125, 0xB13F, GBP_LVT}, | ||
448 | {0xB140, 0xB140, GBP_LV}, | ||
449 | {0xB141, 0xB15B, GBP_LVT}, | ||
450 | {0xB15C, 0xB15C, GBP_LV}, | ||
451 | {0xB15D, 0xB177, GBP_LVT}, | ||
452 | {0xB178, 0xB178, GBP_LV}, | ||
453 | {0xB179, 0xB193, GBP_LVT}, | ||
454 | {0xB194, 0xB194, GBP_LV}, | ||
455 | {0xB195, 0xB1AF, GBP_LVT}, | ||
456 | {0xB1B0, 0xB1B0, GBP_LV}, | ||
457 | {0xB1B1, 0xB1CB, GBP_LVT}, | ||
458 | {0xB1CC, 0xB1CC, GBP_LV}, | ||
459 | {0xB1CD, 0xB1E7, GBP_LVT}, | ||
460 | {0xB1E8, 0xB1E8, GBP_LV}, | ||
461 | {0xB1E9, 0xB203, GBP_LVT}, | ||
462 | {0xB204, 0xB204, GBP_LV}, | ||
463 | {0xB205, 0xB21F, GBP_LVT}, | ||
464 | {0xB220, 0xB220, GBP_LV}, | ||
465 | {0xB221, 0xB23B, GBP_LVT}, | ||
466 | {0xB23C, 0xB23C, GBP_LV}, | ||
467 | {0xB23D, 0xB257, GBP_LVT}, | ||
468 | {0xB258, 0xB258, GBP_LV}, | ||
469 | {0xB259, 0xB273, GBP_LVT}, | ||
470 | {0xB274, 0xB274, GBP_LV}, | ||
471 | {0xB275, 0xB28F, GBP_LVT}, | ||
472 | {0xB290, 0xB290, GBP_LV}, | ||
473 | {0xB291, 0xB2AB, GBP_LVT}, | ||
474 | {0xB2AC, 0xB2AC, GBP_LV}, | ||
475 | {0xB2AD, 0xB2C7, GBP_LVT}, | ||
476 | {0xB2C8, 0xB2C8, GBP_LV}, | ||
477 | {0xB2C9, 0xB2E3, GBP_LVT}, | ||
478 | {0xB2E4, 0xB2E4, GBP_LV}, | ||
479 | {0xB2E5, 0xB2FF, GBP_LVT}, | ||
480 | {0xB300, 0xB300, GBP_LV}, | ||
481 | {0xB301, 0xB31B, GBP_LVT}, | ||
482 | {0xB31C, 0xB31C, GBP_LV}, | ||
483 | {0xB31D, 0xB337, GBP_LVT}, | ||
484 | {0xB338, 0xB338, GBP_LV}, | ||
485 | {0xB339, 0xB353, GBP_LVT}, | ||
486 | {0xB354, 0xB354, GBP_LV}, | ||
487 | {0xB355, 0xB36F, GBP_LVT}, | ||
488 | {0xB370, 0xB370, GBP_LV}, | ||
489 | {0xB371, 0xB38B, GBP_LVT}, | ||
490 | {0xB38C, 0xB38C, GBP_LV}, | ||
491 | {0xB38D, 0xB3A7, GBP_LVT}, | ||
492 | {0xB3A8, 0xB3A8, GBP_LV}, | ||
493 | {0xB3A9, 0xB3C3, GBP_LVT}, | ||
494 | {0xB3C4, 0xB3C4, GBP_LV}, | ||
495 | {0xB3C5, 0xB3DF, GBP_LVT}, | ||
496 | {0xB3E0, 0xB3E0, GBP_LV}, | ||
497 | {0xB3E1, 0xB3FB, GBP_LVT}, | ||
498 | {0xB3FC, 0xB3FC, GBP_LV}, | ||
499 | {0xB3FD, 0xB417, GBP_LVT}, | ||
500 | {0xB418, 0xB418, GBP_LV}, | ||
501 | {0xB419, 0xB433, GBP_LVT}, | ||
502 | {0xB434, 0xB434, GBP_LV}, | ||
503 | {0xB435, 0xB44F, GBP_LVT}, | ||
504 | {0xB450, 0xB450, GBP_LV}, | ||
505 | {0xB451, 0xB46B, GBP_LVT}, | ||
506 | {0xB46C, 0xB46C, GBP_LV}, | ||
507 | {0xB46D, 0xB487, GBP_LVT}, | ||
508 | {0xB488, 0xB488, GBP_LV}, | ||
509 | {0xB489, 0xB4A3, GBP_LVT}, | ||
510 | {0xB4A4, 0xB4A4, GBP_LV}, | ||
511 | {0xB4A5, 0xB4BF, GBP_LVT}, | ||
512 | {0xB4C0, 0xB4C0, GBP_LV}, | ||
513 | {0xB4C1, 0xB4DB, GBP_LVT}, | ||
514 | {0xB4DC, 0xB4DC, GBP_LV}, | ||
515 | {0xB4DD, 0xB4F7, GBP_LVT}, | ||
516 | {0xB4F8, 0xB4F8, GBP_LV}, | ||
517 | {0xB4F9, 0xB513, GBP_LVT}, | ||
518 | {0xB514, 0xB514, GBP_LV}, | ||
519 | {0xB515, 0xB52F, GBP_LVT}, | ||
520 | {0xB530, 0xB530, GBP_LV}, | ||
521 | {0xB531, 0xB54B, GBP_LVT}, | ||
522 | {0xB54C, 0xB54C, GBP_LV}, | ||
523 | {0xB54D, 0xB567, GBP_LVT}, | ||
524 | {0xB568, 0xB568, GBP_LV}, | ||
525 | {0xB569, 0xB583, GBP_LVT}, | ||
526 | {0xB584, 0xB584, GBP_LV}, | ||
527 | {0xB585, 0xB59F, GBP_LVT}, | ||
528 | {0xB5A0, 0xB5A0, GBP_LV}, | ||
529 | {0xB5A1, 0xB5BB, GBP_LVT}, | ||
530 | {0xB5BC, 0xB5BC, GBP_LV}, | ||
531 | {0xB5BD, 0xB5D7, GBP_LVT}, | ||
532 | {0xB5D8, 0xB5D8, GBP_LV}, | ||
533 | {0xB5D9, 0xB5F3, GBP_LVT}, | ||
534 | {0xB5F4, 0xB5F4, GBP_LV}, | ||
535 | {0xB5F5, 0xB60F, GBP_LVT}, | ||
536 | {0xB610, 0xB610, GBP_LV}, | ||
537 | {0xB611, 0xB62B, GBP_LVT}, | ||
538 | {0xB62C, 0xB62C, GBP_LV}, | ||
539 | {0xB62D, 0xB647, GBP_LVT}, | ||
540 | {0xB648, 0xB648, GBP_LV}, | ||
541 | {0xB649, 0xB663, GBP_LVT}, | ||
542 | {0xB664, 0xB664, GBP_LV}, | ||
543 | {0xB665, 0xB67F, GBP_LVT}, | ||
544 | {0xB680, 0xB680, GBP_LV}, | ||
545 | {0xB681, 0xB69B, GBP_LVT}, | ||
546 | {0xB69C, 0xB69C, GBP_LV}, | ||
547 | {0xB69D, 0xB6B7, GBP_LVT}, | ||
548 | {0xB6B8, 0xB6B8, GBP_LV}, | ||
549 | {0xB6B9, 0xB6D3, GBP_LVT}, | ||
550 | {0xB6D4, 0xB6D4, GBP_LV}, | ||
551 | {0xB6D5, 0xB6EF, GBP_LVT}, | ||
552 | {0xB6F0, 0xB6F0, GBP_LV}, | ||
553 | {0xB6F1, 0xB70B, GBP_LVT}, | ||
554 | {0xB70C, 0xB70C, GBP_LV}, | ||
555 | {0xB70D, 0xB727, GBP_LVT}, | ||
556 | {0xB728, 0xB728, GBP_LV}, | ||
557 | {0xB729, 0xB743, GBP_LVT}, | ||
558 | {0xB744, 0xB744, GBP_LV}, | ||
559 | {0xB745, 0xB75F, GBP_LVT}, | ||
560 | {0xB760, 0xB760, GBP_LV}, | ||
561 | {0xB761, 0xB77B, GBP_LVT}, | ||
562 | {0xB77C, 0xB77C, GBP_LV}, | ||
563 | {0xB77D, 0xB797, GBP_LVT}, | ||
564 | {0xB798, 0xB798, GBP_LV}, | ||
565 | {0xB799, 0xB7B3, GBP_LVT}, | ||
566 | {0xB7B4, 0xB7B4, GBP_LV}, | ||
567 | {0xB7B5, 0xB7CF, GBP_LVT}, | ||
568 | {0xB7D0, 0xB7D0, GBP_LV}, | ||
569 | {0xB7D1, 0xB7EB, GBP_LVT}, | ||
570 | {0xB7EC, 0xB7EC, GBP_LV}, | ||
571 | {0xB7ED, 0xB807, GBP_LVT}, | ||
572 | {0xB808, 0xB808, GBP_LV}, | ||
573 | {0xB809, 0xB823, GBP_LVT}, | ||
574 | {0xB824, 0xB824, GBP_LV}, | ||
575 | {0xB825, 0xB83F, GBP_LVT}, | ||
576 | {0xB840, 0xB840, GBP_LV}, | ||
577 | {0xB841, 0xB85B, GBP_LVT}, | ||
578 | {0xB85C, 0xB85C, GBP_LV}, | ||
579 | {0xB85D, 0xB877, GBP_LVT}, | ||
580 | {0xB878, 0xB878, GBP_LV}, | ||
581 | {0xB879, 0xB893, GBP_LVT}, | ||
582 | {0xB894, 0xB894, GBP_LV}, | ||
583 | {0xB895, 0xB8AF, GBP_LVT}, | ||
584 | {0xB8B0, 0xB8B0, GBP_LV}, | ||
585 | {0xB8B1, 0xB8CB, GBP_LVT}, | ||
586 | {0xB8CC, 0xB8CC, GBP_LV}, | ||
587 | {0xB8CD, 0xB8E7, GBP_LVT}, | ||
588 | {0xB8E8, 0xB8E8, GBP_LV}, | ||
589 | {0xB8E9, 0xB903, GBP_LVT}, | ||
590 | {0xB904, 0xB904, GBP_LV}, | ||
591 | {0xB905, 0xB91F, GBP_LVT}, | ||
592 | {0xB920, 0xB920, GBP_LV}, | ||
593 | {0xB921, 0xB93B, GBP_LVT}, | ||
594 | {0xB93C, 0xB93C, GBP_LV}, | ||
595 | {0xB93D, 0xB957, GBP_LVT}, | ||
596 | {0xB958, 0xB958, GBP_LV}, | ||
597 | {0xB959, 0xB973, GBP_LVT}, | ||
598 | {0xB974, 0xB974, GBP_LV}, | ||
599 | {0xB975, 0xB98F, GBP_LVT}, | ||
600 | {0xB990, 0xB990, GBP_LV}, | ||
601 | {0xB991, 0xB9AB, GBP_LVT}, | ||
602 | {0xB9AC, 0xB9AC, GBP_LV}, | ||
603 | {0xB9AD, 0xB9C7, GBP_LVT}, | ||
604 | {0xB9C8, 0xB9C8, GBP_LV}, | ||
605 | {0xB9C9, 0xB9E3, GBP_LVT}, | ||
606 | {0xB9E4, 0xB9E4, GBP_LV}, | ||
607 | {0xB9E5, 0xB9FF, GBP_LVT}, | ||
608 | {0xBA00, 0xBA00, GBP_LV}, | ||
609 | {0xBA01, 0xBA1B, GBP_LVT}, | ||
610 | {0xBA1C, 0xBA1C, GBP_LV}, | ||
611 | {0xBA1D, 0xBA37, GBP_LVT}, | ||
612 | {0xBA38, 0xBA38, GBP_LV}, | ||
613 | {0xBA39, 0xBA53, GBP_LVT}, | ||
614 | {0xBA54, 0xBA54, GBP_LV}, | ||
615 | {0xBA55, 0xBA6F, GBP_LVT}, | ||
616 | {0xBA70, 0xBA70, GBP_LV}, | ||
617 | {0xBA71, 0xBA8B, GBP_LVT}, | ||
618 | {0xBA8C, 0xBA8C, GBP_LV}, | ||
619 | {0xBA8D, 0xBAA7, GBP_LVT}, | ||
620 | {0xBAA8, 0xBAA8, GBP_LV}, | ||
621 | {0xBAA9, 0xBAC3, GBP_LVT}, | ||
622 | {0xBAC4, 0xBAC4, GBP_LV}, | ||
623 | {0xBAC5, 0xBADF, GBP_LVT}, | ||
624 | {0xBAE0, 0xBAE0, GBP_LV}, | ||
625 | {0xBAE1, 0xBAFB, GBP_LVT}, | ||
626 | {0xBAFC, 0xBAFC, GBP_LV}, | ||
627 | {0xBAFD, 0xBB17, GBP_LVT}, | ||
628 | {0xBB18, 0xBB18, GBP_LV}, | ||
629 | {0xBB19, 0xBB33, GBP_LVT}, | ||
630 | {0xBB34, 0xBB34, GBP_LV}, | ||
631 | {0xBB35, 0xBB4F, GBP_LVT}, | ||
632 | {0xBB50, 0xBB50, GBP_LV}, | ||
633 | {0xBB51, 0xBB6B, GBP_LVT}, | ||
634 | {0xBB6C, 0xBB6C, GBP_LV}, | ||
635 | {0xBB6D, 0xBB87, GBP_LVT}, | ||
636 | {0xBB88, 0xBB88, GBP_LV}, | ||
637 | {0xBB89, 0xBBA3, GBP_LVT}, | ||
638 | {0xBBA4, 0xBBA4, GBP_LV}, | ||
639 | {0xBBA5, 0xBBBF, GBP_LVT}, | ||
640 | {0xBBC0, 0xBBC0, GBP_LV}, | ||
641 | {0xBBC1, 0xBBDB, GBP_LVT}, | ||
642 | {0xBBDC, 0xBBDC, GBP_LV}, | ||
643 | {0xBBDD, 0xBBF7, GBP_LVT}, | ||
644 | {0xBBF8, 0xBBF8, GBP_LV}, | ||
645 | {0xBBF9, 0xBC13, GBP_LVT}, | ||
646 | {0xBC14, 0xBC14, GBP_LV}, | ||
647 | {0xBC15, 0xBC2F, GBP_LVT}, | ||
648 | {0xBC30, 0xBC30, GBP_LV}, | ||
649 | {0xBC31, 0xBC4B, GBP_LVT}, | ||
650 | {0xBC4C, 0xBC4C, GBP_LV}, | ||
651 | {0xBC4D, 0xBC67, GBP_LVT}, | ||
652 | {0xBC68, 0xBC68, GBP_LV}, | ||
653 | {0xBC69, 0xBC83, GBP_LVT}, | ||
654 | {0xBC84, 0xBC84, GBP_LV}, | ||
655 | {0xBC85, 0xBC9F, GBP_LVT}, | ||
656 | {0xBCA0, 0xBCA0, GBP_LV}, | ||
657 | {0xBCA1, 0xBCBB, GBP_LVT}, | ||
658 | {0xBCBC, 0xBCBC, GBP_LV}, | ||
659 | {0xBCBD, 0xBCD7, GBP_LVT}, | ||
660 | {0xBCD8, 0xBCD8, GBP_LV}, | ||
661 | {0xBCD9, 0xBCF3, GBP_LVT}, | ||
662 | {0xBCF4, 0xBCF4, GBP_LV}, | ||
663 | {0xBCF5, 0xBD0F, GBP_LVT}, | ||
664 | {0xBD10, 0xBD10, GBP_LV}, | ||
665 | {0xBD11, 0xBD2B, GBP_LVT}, | ||
666 | {0xBD2C, 0xBD2C, GBP_LV}, | ||
667 | {0xBD2D, 0xBD47, GBP_LVT}, | ||
668 | {0xBD48, 0xBD48, GBP_LV}, | ||
669 | {0xBD49, 0xBD63, GBP_LVT}, | ||
670 | {0xBD64, 0xBD64, GBP_LV}, | ||
671 | {0xBD65, 0xBD7F, GBP_LVT}, | ||
672 | {0xBD80, 0xBD80, GBP_LV}, | ||
673 | {0xBD81, 0xBD9B, GBP_LVT}, | ||
674 | {0xBD9C, 0xBD9C, GBP_LV}, | ||
675 | {0xBD9D, 0xBDB7, GBP_LVT}, | ||
676 | {0xBDB8, 0xBDB8, GBP_LV}, | ||
677 | {0xBDB9, 0xBDD3, GBP_LVT}, | ||
678 | {0xBDD4, 0xBDD4, GBP_LV}, | ||
679 | {0xBDD5, 0xBDEF, GBP_LVT}, | ||
680 | {0xBDF0, 0xBDF0, GBP_LV}, | ||
681 | {0xBDF1, 0xBE0B, GBP_LVT}, | ||
682 | {0xBE0C, 0xBE0C, GBP_LV}, | ||
683 | {0xBE0D, 0xBE27, GBP_LVT}, | ||
684 | {0xBE28, 0xBE28, GBP_LV}, | ||
685 | {0xBE29, 0xBE43, GBP_LVT}, | ||
686 | {0xBE44, 0xBE44, GBP_LV}, | ||
687 | {0xBE45, 0xBE5F, GBP_LVT}, | ||
688 | {0xBE60, 0xBE60, GBP_LV}, | ||
689 | {0xBE61, 0xBE7B, GBP_LVT}, | ||
690 | {0xBE7C, 0xBE7C, GBP_LV}, | ||
691 | {0xBE7D, 0xBE97, GBP_LVT}, | ||
692 | {0xBE98, 0xBE98, GBP_LV}, | ||
693 | {0xBE99, 0xBEB3, GBP_LVT}, | ||
694 | {0xBEB4, 0xBEB4, GBP_LV}, | ||
695 | {0xBEB5, 0xBECF, GBP_LVT}, | ||
696 | {0xBED0, 0xBED0, GBP_LV}, | ||
697 | {0xBED1, 0xBEEB, GBP_LVT}, | ||
698 | {0xBEEC, 0xBEEC, GBP_LV}, | ||
699 | {0xBEED, 0xBF07, GBP_LVT}, | ||
700 | {0xBF08, 0xBF08, GBP_LV}, | ||
701 | {0xBF09, 0xBF23, GBP_LVT}, | ||
702 | {0xBF24, 0xBF24, GBP_LV}, | ||
703 | {0xBF25, 0xBF3F, GBP_LVT}, | ||
704 | {0xBF40, 0xBF40, GBP_LV}, | ||
705 | {0xBF41, 0xBF5B, GBP_LVT}, | ||
706 | {0xBF5C, 0xBF5C, GBP_LV}, | ||
707 | {0xBF5D, 0xBF77, GBP_LVT}, | ||
708 | {0xBF78, 0xBF78, GBP_LV}, | ||
709 | {0xBF79, 0xBF93, GBP_LVT}, | ||
710 | {0xBF94, 0xBF94, GBP_LV}, | ||
711 | {0xBF95, 0xBFAF, GBP_LVT}, | ||
712 | {0xBFB0, 0xBFB0, GBP_LV}, | ||
713 | {0xBFB1, 0xBFCB, GBP_LVT}, | ||
714 | {0xBFCC, 0xBFCC, GBP_LV}, | ||
715 | {0xBFCD, 0xBFE7, GBP_LVT}, | ||
716 | {0xBFE8, 0xBFE8, GBP_LV}, | ||
717 | {0xBFE9, 0xC003, GBP_LVT}, | ||
718 | {0xC004, 0xC004, GBP_LV}, | ||
719 | {0xC005, 0xC01F, GBP_LVT}, | ||
720 | {0xC020, 0xC020, GBP_LV}, | ||
721 | {0xC021, 0xC03B, GBP_LVT}, | ||
722 | {0xC03C, 0xC03C, GBP_LV}, | ||
723 | {0xC03D, 0xC057, GBP_LVT}, | ||
724 | {0xC058, 0xC058, GBP_LV}, | ||
725 | {0xC059, 0xC073, GBP_LVT}, | ||
726 | {0xC074, 0xC074, GBP_LV}, | ||
727 | {0xC075, 0xC08F, GBP_LVT}, | ||
728 | {0xC090, 0xC090, GBP_LV}, | ||
729 | {0xC091, 0xC0AB, GBP_LVT}, | ||
730 | {0xC0AC, 0xC0AC, GBP_LV}, | ||
731 | {0xC0AD, 0xC0C7, GBP_LVT}, | ||
732 | {0xC0C8, 0xC0C8, GBP_LV}, | ||
733 | {0xC0C9, 0xC0E3, GBP_LVT}, | ||
734 | {0xC0E4, 0xC0E4, GBP_LV}, | ||
735 | {0xC0E5, 0xC0FF, GBP_LVT}, | ||
736 | {0xC100, 0xC100, GBP_LV}, | ||
737 | {0xC101, 0xC11B, GBP_LVT}, | ||
738 | {0xC11C, 0xC11C, GBP_LV}, | ||
739 | {0xC11D, 0xC137, GBP_LVT}, | ||
740 | {0xC138, 0xC138, GBP_LV}, | ||
741 | {0xC139, 0xC153, GBP_LVT}, | ||
742 | {0xC154, 0xC154, GBP_LV}, | ||
743 | {0xC155, 0xC16F, GBP_LVT}, | ||
744 | {0xC170, 0xC170, GBP_LV}, | ||
745 | {0xC171, 0xC18B, GBP_LVT}, | ||
746 | {0xC18C, 0xC18C, GBP_LV}, | ||
747 | {0xC18D, 0xC1A7, GBP_LVT}, | ||
748 | {0xC1A8, 0xC1A8, GBP_LV}, | ||
749 | {0xC1A9, 0xC1C3, GBP_LVT}, | ||
750 | {0xC1C4, 0xC1C4, GBP_LV}, | ||
751 | {0xC1C5, 0xC1DF, GBP_LVT}, | ||
752 | {0xC1E0, 0xC1E0, GBP_LV}, | ||
753 | {0xC1E1, 0xC1FB, GBP_LVT}, | ||
754 | {0xC1FC, 0xC1FC, GBP_LV}, | ||
755 | {0xC1FD, 0xC217, GBP_LVT}, | ||
756 | {0xC218, 0xC218, GBP_LV}, | ||
757 | {0xC219, 0xC233, GBP_LVT}, | ||
758 | {0xC234, 0xC234, GBP_LV}, | ||
759 | {0xC235, 0xC24F, GBP_LVT}, | ||
760 | {0xC250, 0xC250, GBP_LV}, | ||
761 | {0xC251, 0xC26B, GBP_LVT}, | ||
762 | {0xC26C, 0xC26C, GBP_LV}, | ||
763 | {0xC26D, 0xC287, GBP_LVT}, | ||
764 | {0xC288, 0xC288, GBP_LV}, | ||
765 | {0xC289, 0xC2A3, GBP_LVT}, | ||
766 | {0xC2A4, 0xC2A4, GBP_LV}, | ||
767 | {0xC2A5, 0xC2BF, GBP_LVT}, | ||
768 | {0xC2C0, 0xC2C0, GBP_LV}, | ||
769 | {0xC2C1, 0xC2DB, GBP_LVT}, | ||
770 | {0xC2DC, 0xC2DC, GBP_LV}, | ||
771 | {0xC2DD, 0xC2F7, GBP_LVT}, | ||
772 | {0xC2F8, 0xC2F8, GBP_LV}, | ||
773 | {0xC2F9, 0xC313, GBP_LVT}, | ||
774 | {0xC314, 0xC314, GBP_LV}, | ||
775 | {0xC315, 0xC32F, GBP_LVT}, | ||
776 | {0xC330, 0xC330, GBP_LV}, | ||
777 | {0xC331, 0xC34B, GBP_LVT}, | ||
778 | {0xC34C, 0xC34C, GBP_LV}, | ||
779 | {0xC34D, 0xC367, GBP_LVT}, | ||
780 | {0xC368, 0xC368, GBP_LV}, | ||
781 | {0xC369, 0xC383, GBP_LVT}, | ||
782 | {0xC384, 0xC384, GBP_LV}, | ||
783 | {0xC385, 0xC39F, GBP_LVT}, | ||
784 | {0xC3A0, 0xC3A0, GBP_LV}, | ||
785 | {0xC3A1, 0xC3BB, GBP_LVT}, | ||
786 | {0xC3BC, 0xC3BC, GBP_LV}, | ||
787 | {0xC3BD, 0xC3D7, GBP_LVT}, | ||
788 | {0xC3D8, 0xC3D8, GBP_LV}, | ||
789 | {0xC3D9, 0xC3F3, GBP_LVT}, | ||
790 | {0xC3F4, 0xC3F4, GBP_LV}, | ||
791 | {0xC3F5, 0xC40F, GBP_LVT}, | ||
792 | {0xC410, 0xC410, GBP_LV}, | ||
793 | {0xC411, 0xC42B, GBP_LVT}, | ||
794 | {0xC42C, 0xC42C, GBP_LV}, | ||
795 | {0xC42D, 0xC447, GBP_LVT}, | ||
796 | {0xC448, 0xC448, GBP_LV}, | ||
797 | {0xC449, 0xC463, GBP_LVT}, | ||
798 | {0xC464, 0xC464, GBP_LV}, | ||
799 | {0xC465, 0xC47F, GBP_LVT}, | ||
800 | {0xC480, 0xC480, GBP_LV}, | ||
801 | {0xC481, 0xC49B, GBP_LVT}, | ||
802 | {0xC49C, 0xC49C, GBP_LV}, | ||
803 | {0xC49D, 0xC4B7, GBP_LVT}, | ||
804 | {0xC4B8, 0xC4B8, GBP_LV}, | ||
805 | {0xC4B9, 0xC4D3, GBP_LVT}, | ||
806 | {0xC4D4, 0xC4D4, GBP_LV}, | ||
807 | {0xC4D5, 0xC4EF, GBP_LVT}, | ||
808 | {0xC4F0, 0xC4F0, GBP_LV}, | ||
809 | {0xC4F1, 0xC50B, GBP_LVT}, | ||
810 | {0xC50C, 0xC50C, GBP_LV}, | ||
811 | {0xC50D, 0xC527, GBP_LVT}, | ||
812 | {0xC528, 0xC528, GBP_LV}, | ||
813 | {0xC529, 0xC543, GBP_LVT}, | ||
814 | {0xC544, 0xC544, GBP_LV}, | ||
815 | {0xC545, 0xC55F, GBP_LVT}, | ||
816 | {0xC560, 0xC560, GBP_LV}, | ||
817 | {0xC561, 0xC57B, GBP_LVT}, | ||
818 | {0xC57C, 0xC57C, GBP_LV}, | ||
819 | {0xC57D, 0xC597, GBP_LVT}, | ||
820 | {0xC598, 0xC598, GBP_LV}, | ||
821 | {0xC599, 0xC5B3, GBP_LVT}, | ||
822 | {0xC5B4, 0xC5B4, GBP_LV}, | ||
823 | {0xC5B5, 0xC5CF, GBP_LVT}, | ||
824 | {0xC5D0, 0xC5D0, GBP_LV}, | ||
825 | {0xC5D1, 0xC5EB, GBP_LVT}, | ||
826 | {0xC5EC, 0xC5EC, GBP_LV}, | ||
827 | {0xC5ED, 0xC607, GBP_LVT}, | ||
828 | {0xC608, 0xC608, GBP_LV}, | ||
829 | {0xC609, 0xC623, GBP_LVT}, | ||
830 | {0xC624, 0xC624, GBP_LV}, | ||
831 | {0xC625, 0xC63F, GBP_LVT}, | ||
832 | {0xC640, 0xC640, GBP_LV}, | ||
833 | {0xC641, 0xC65B, GBP_LVT}, | ||
834 | {0xC65C, 0xC65C, GBP_LV}, | ||
835 | {0xC65D, 0xC677, GBP_LVT}, | ||
836 | {0xC678, 0xC678, GBP_LV}, | ||
837 | {0xC679, 0xC693, GBP_LVT}, | ||
838 | {0xC694, 0xC694, GBP_LV}, | ||
839 | {0xC695, 0xC6AF, GBP_LVT}, | ||
840 | {0xC6B0, 0xC6B0, GBP_LV}, | ||
841 | {0xC6B1, 0xC6CB, GBP_LVT}, | ||
842 | {0xC6CC, 0xC6CC, GBP_LV}, | ||
843 | {0xC6CD, 0xC6E7, GBP_LVT}, | ||
844 | {0xC6E8, 0xC6E8, GBP_LV}, | ||
845 | {0xC6E9, 0xC703, GBP_LVT}, | ||
846 | {0xC704, 0xC704, GBP_LV}, | ||
847 | {0xC705, 0xC71F, GBP_LVT}, | ||
848 | {0xC720, 0xC720, GBP_LV}, | ||
849 | {0xC721, 0xC73B, GBP_LVT}, | ||
850 | {0xC73C, 0xC73C, GBP_LV}, | ||
851 | {0xC73D, 0xC757, GBP_LVT}, | ||
852 | {0xC758, 0xC758, GBP_LV}, | ||
853 | {0xC759, 0xC773, GBP_LVT}, | ||
854 | {0xC774, 0xC774, GBP_LV}, | ||
855 | {0xC775, 0xC78F, GBP_LVT}, | ||
856 | {0xC790, 0xC790, GBP_LV}, | ||
857 | {0xC791, 0xC7AB, GBP_LVT}, | ||
858 | {0xC7AC, 0xC7AC, GBP_LV}, | ||
859 | {0xC7AD, 0xC7C7, GBP_LVT}, | ||
860 | {0xC7C8, 0xC7C8, GBP_LV}, | ||
861 | {0xC7C9, 0xC7E3, GBP_LVT}, | ||
862 | {0xC7E4, 0xC7E4, GBP_LV}, | ||
863 | {0xC7E5, 0xC7FF, GBP_LVT}, | ||
864 | {0xC800, 0xC800, GBP_LV}, | ||
865 | {0xC801, 0xC81B, GBP_LVT}, | ||
866 | {0xC81C, 0xC81C, GBP_LV}, | ||
867 | {0xC81D, 0xC837, GBP_LVT}, | ||
868 | {0xC838, 0xC838, GBP_LV}, | ||
869 | {0xC839, 0xC853, GBP_LVT}, | ||
870 | {0xC854, 0xC854, GBP_LV}, | ||
871 | {0xC855, 0xC86F, GBP_LVT}, | ||
872 | {0xC870, 0xC870, GBP_LV}, | ||
873 | {0xC871, 0xC88B, GBP_LVT}, | ||
874 | {0xC88C, 0xC88C, GBP_LV}, | ||
875 | {0xC88D, 0xC8A7, GBP_LVT}, | ||
876 | {0xC8A8, 0xC8A8, GBP_LV}, | ||
877 | {0xC8A9, 0xC8C3, GBP_LVT}, | ||
878 | {0xC8C4, 0xC8C4, GBP_LV}, | ||
879 | {0xC8C5, 0xC8DF, GBP_LVT}, | ||
880 | {0xC8E0, 0xC8E0, GBP_LV}, | ||
881 | {0xC8E1, 0xC8FB, GBP_LVT}, | ||
882 | {0xC8FC, 0xC8FC, GBP_LV}, | ||
883 | {0xC8FD, 0xC917, GBP_LVT}, | ||
884 | {0xC918, 0xC918, GBP_LV}, | ||
885 | {0xC919, 0xC933, GBP_LVT}, | ||
886 | {0xC934, 0xC934, GBP_LV}, | ||
887 | {0xC935, 0xC94F, GBP_LVT}, | ||
888 | {0xC950, 0xC950, GBP_LV}, | ||
889 | {0xC951, 0xC96B, GBP_LVT}, | ||
890 | {0xC96C, 0xC96C, GBP_LV}, | ||
891 | {0xC96D, 0xC987, GBP_LVT}, | ||
892 | {0xC988, 0xC988, GBP_LV}, | ||
893 | {0xC989, 0xC9A3, GBP_LVT}, | ||
894 | {0xC9A4, 0xC9A4, GBP_LV}, | ||
895 | {0xC9A5, 0xC9BF, GBP_LVT}, | ||
896 | {0xC9C0, 0xC9C0, GBP_LV}, | ||
897 | {0xC9C1, 0xC9DB, GBP_LVT}, | ||
898 | {0xC9DC, 0xC9DC, GBP_LV}, | ||
899 | {0xC9DD, 0xC9F7, GBP_LVT}, | ||
900 | {0xC9F8, 0xC9F8, GBP_LV}, | ||
901 | {0xC9F9, 0xCA13, GBP_LVT}, | ||
902 | {0xCA14, 0xCA14, GBP_LV}, | ||
903 | {0xCA15, 0xCA2F, GBP_LVT}, | ||
904 | {0xCA30, 0xCA30, GBP_LV}, | ||
905 | {0xCA31, 0xCA4B, GBP_LVT}, | ||
906 | {0xCA4C, 0xCA4C, GBP_LV}, | ||
907 | {0xCA4D, 0xCA67, GBP_LVT}, | ||
908 | {0xCA68, 0xCA68, GBP_LV}, | ||
909 | {0xCA69, 0xCA83, GBP_LVT}, | ||
910 | {0xCA84, 0xCA84, GBP_LV}, | ||
911 | {0xCA85, 0xCA9F, GBP_LVT}, | ||
912 | {0xCAA0, 0xCAA0, GBP_LV}, | ||
913 | {0xCAA1, 0xCABB, GBP_LVT}, | ||
914 | {0xCABC, 0xCABC, GBP_LV}, | ||
915 | {0xCABD, 0xCAD7, GBP_LVT}, | ||
916 | {0xCAD8, 0xCAD8, GBP_LV}, | ||
917 | {0xCAD9, 0xCAF3, GBP_LVT}, | ||
918 | {0xCAF4, 0xCAF4, GBP_LV}, | ||
919 | {0xCAF5, 0xCB0F, GBP_LVT}, | ||
920 | {0xCB10, 0xCB10, GBP_LV}, | ||
921 | {0xCB11, 0xCB2B, GBP_LVT}, | ||
922 | {0xCB2C, 0xCB2C, GBP_LV}, | ||
923 | {0xCB2D, 0xCB47, GBP_LVT}, | ||
924 | {0xCB48, 0xCB48, GBP_LV}, | ||
925 | {0xCB49, 0xCB63, GBP_LVT}, | ||
926 | {0xCB64, 0xCB64, GBP_LV}, | ||
927 | {0xCB65, 0xCB7F, GBP_LVT}, | ||
928 | {0xCB80, 0xCB80, GBP_LV}, | ||
929 | {0xCB81, 0xCB9B, GBP_LVT}, | ||
930 | {0xCB9C, 0xCB9C, GBP_LV}, | ||
931 | {0xCB9D, 0xCBB7, GBP_LVT}, | ||
932 | {0xCBB8, 0xCBB8, GBP_LV}, | ||
933 | {0xCBB9, 0xCBD3, GBP_LVT}, | ||
934 | {0xCBD4, 0xCBD4, GBP_LV}, | ||
935 | {0xCBD5, 0xCBEF, GBP_LVT}, | ||
936 | {0xCBF0, 0xCBF0, GBP_LV}, | ||
937 | {0xCBF1, 0xCC0B, GBP_LVT}, | ||
938 | {0xCC0C, 0xCC0C, GBP_LV}, | ||
939 | {0xCC0D, 0xCC27, GBP_LVT}, | ||
940 | {0xCC28, 0xCC28, GBP_LV}, | ||
941 | {0xCC29, 0xCC43, GBP_LVT}, | ||
942 | {0xCC44, 0xCC44, GBP_LV}, | ||
943 | {0xCC45, 0xCC5F, GBP_LVT}, | ||
944 | {0xCC60, 0xCC60, GBP_LV}, | ||
945 | {0xCC61, 0xCC7B, GBP_LVT}, | ||
946 | {0xCC7C, 0xCC7C, GBP_LV}, | ||
947 | {0xCC7D, 0xCC97, GBP_LVT}, | ||
948 | {0xCC98, 0xCC98, GBP_LV}, | ||
949 | {0xCC99, 0xCCB3, GBP_LVT}, | ||
950 | {0xCCB4, 0xCCB4, GBP_LV}, | ||
951 | {0xCCB5, 0xCCCF, GBP_LVT}, | ||
952 | {0xCCD0, 0xCCD0, GBP_LV}, | ||
953 | {0xCCD1, 0xCCEB, GBP_LVT}, | ||
954 | {0xCCEC, 0xCCEC, GBP_LV}, | ||
955 | {0xCCED, 0xCD07, GBP_LVT}, | ||
956 | {0xCD08, 0xCD08, GBP_LV}, | ||
957 | {0xCD09, 0xCD23, GBP_LVT}, | ||
958 | {0xCD24, 0xCD24, GBP_LV}, | ||
959 | {0xCD25, 0xCD3F, GBP_LVT}, | ||
960 | {0xCD40, 0xCD40, GBP_LV}, | ||
961 | {0xCD41, 0xCD5B, GBP_LVT}, | ||
962 | {0xCD5C, 0xCD5C, GBP_LV}, | ||
963 | {0xCD5D, 0xCD77, GBP_LVT}, | ||
964 | {0xCD78, 0xCD78, GBP_LV}, | ||
965 | {0xCD79, 0xCD93, GBP_LVT}, | ||
966 | {0xCD94, 0xCD94, GBP_LV}, | ||
967 | {0xCD95, 0xCDAF, GBP_LVT}, | ||
968 | {0xCDB0, 0xCDB0, GBP_LV}, | ||
969 | {0xCDB1, 0xCDCB, GBP_LVT}, | ||
970 | {0xCDCC, 0xCDCC, GBP_LV}, | ||
971 | {0xCDCD, 0xCDE7, GBP_LVT}, | ||
972 | {0xCDE8, 0xCDE8, GBP_LV}, | ||
973 | {0xCDE9, 0xCE03, GBP_LVT}, | ||
974 | {0xCE04, 0xCE04, GBP_LV}, | ||
975 | {0xCE05, 0xCE1F, GBP_LVT}, | ||
976 | {0xCE20, 0xCE20, GBP_LV}, | ||
977 | {0xCE21, 0xCE3B, GBP_LVT}, | ||
978 | {0xCE3C, 0xCE3C, GBP_LV}, | ||
979 | {0xCE3D, 0xCE57, GBP_LVT}, | ||
980 | {0xCE58, 0xCE58, GBP_LV}, | ||
981 | {0xCE59, 0xCE73, GBP_LVT}, | ||
982 | {0xCE74, 0xCE74, GBP_LV}, | ||
983 | {0xCE75, 0xCE8F, GBP_LVT}, | ||
984 | {0xCE90, 0xCE90, GBP_LV}, | ||
985 | {0xCE91, 0xCEAB, GBP_LVT}, | ||
986 | {0xCEAC, 0xCEAC, GBP_LV}, | ||
987 | {0xCEAD, 0xCEC7, GBP_LVT}, | ||
988 | {0xCEC8, 0xCEC8, GBP_LV}, | ||
989 | {0xCEC9, 0xCEE3, GBP_LVT}, | ||
990 | {0xCEE4, 0xCEE4, GBP_LV}, | ||
991 | {0xCEE5, 0xCEFF, GBP_LVT}, | ||
992 | {0xCF00, 0xCF00, GBP_LV}, | ||
993 | {0xCF01, 0xCF1B, GBP_LVT}, | ||
994 | {0xCF1C, 0xCF1C, GBP_LV}, | ||
995 | {0xCF1D, 0xCF37, GBP_LVT}, | ||
996 | {0xCF38, 0xCF38, GBP_LV}, | ||
997 | {0xCF39, 0xCF53, GBP_LVT}, | ||
998 | {0xCF54, 0xCF54, GBP_LV}, | ||
999 | {0xCF55, 0xCF6F, GBP_LVT}, | ||
1000 | {0xCF70, 0xCF70, GBP_LV}, | ||
1001 | {0xCF71, 0xCF8B, GBP_LVT}, | ||
1002 | {0xCF8C, 0xCF8C, GBP_LV}, | ||
1003 | {0xCF8D, 0xCFA7, GBP_LVT}, | ||
1004 | {0xCFA8, 0xCFA8, GBP_LV}, | ||
1005 | {0xCFA9, 0xCFC3, GBP_LVT}, | ||
1006 | {0xCFC4, 0xCFC4, GBP_LV}, | ||
1007 | {0xCFC5, 0xCFDF, GBP_LVT}, | ||
1008 | {0xCFE0, 0xCFE0, GBP_LV}, | ||
1009 | {0xCFE1, 0xCFFB, GBP_LVT}, | ||
1010 | {0xCFFC, 0xCFFC, GBP_LV}, | ||
1011 | {0xCFFD, 0xD017, GBP_LVT}, | ||
1012 | {0xD018, 0xD018, GBP_LV}, | ||
1013 | {0xD019, 0xD033, GBP_LVT}, | ||
1014 | {0xD034, 0xD034, GBP_LV}, | ||
1015 | {0xD035, 0xD04F, GBP_LVT}, | ||
1016 | {0xD050, 0xD050, GBP_LV}, | ||
1017 | {0xD051, 0xD06B, GBP_LVT}, | ||
1018 | {0xD06C, 0xD06C, GBP_LV}, | ||
1019 | {0xD06D, 0xD087, GBP_LVT}, | ||
1020 | {0xD088, 0xD088, GBP_LV}, | ||
1021 | {0xD089, 0xD0A3, GBP_LVT}, | ||
1022 | {0xD0A4, 0xD0A4, GBP_LV}, | ||
1023 | {0xD0A5, 0xD0BF, GBP_LVT}, | ||
1024 | {0xD0C0, 0xD0C0, GBP_LV}, | ||
1025 | {0xD0C1, 0xD0DB, GBP_LVT}, | ||
1026 | {0xD0DC, 0xD0DC, GBP_LV}, | ||
1027 | {0xD0DD, 0xD0F7, GBP_LVT}, | ||
1028 | {0xD0F8, 0xD0F8, GBP_LV}, | ||
1029 | {0xD0F9, 0xD113, GBP_LVT}, | ||
1030 | {0xD114, 0xD114, GBP_LV}, | ||
1031 | {0xD115, 0xD12F, GBP_LVT}, | ||
1032 | {0xD130, 0xD130, GBP_LV}, | ||
1033 | {0xD131, 0xD14B, GBP_LVT}, | ||
1034 | {0xD14C, 0xD14C, GBP_LV}, | ||
1035 | {0xD14D, 0xD167, GBP_LVT}, | ||
1036 | {0xD168, 0xD168, GBP_LV}, | ||
1037 | {0xD169, 0xD183, GBP_LVT}, | ||
1038 | {0xD184, 0xD184, GBP_LV}, | ||
1039 | {0xD185, 0xD19F, GBP_LVT}, | ||
1040 | {0xD1A0, 0xD1A0, GBP_LV}, | ||
1041 | {0xD1A1, 0xD1BB, GBP_LVT}, | ||
1042 | {0xD1BC, 0xD1BC, GBP_LV}, | ||
1043 | {0xD1BD, 0xD1D7, GBP_LVT}, | ||
1044 | {0xD1D8, 0xD1D8, GBP_LV}, | ||
1045 | {0xD1D9, 0xD1F3, GBP_LVT}, | ||
1046 | {0xD1F4, 0xD1F4, GBP_LV}, | ||
1047 | {0xD1F5, 0xD20F, GBP_LVT}, | ||
1048 | {0xD210, 0xD210, GBP_LV}, | ||
1049 | {0xD211, 0xD22B, GBP_LVT}, | ||
1050 | {0xD22C, 0xD22C, GBP_LV}, | ||
1051 | {0xD22D, 0xD247, GBP_LVT}, | ||
1052 | {0xD248, 0xD248, GBP_LV}, | ||
1053 | {0xD249, 0xD263, GBP_LVT}, | ||
1054 | {0xD264, 0xD264, GBP_LV}, | ||
1055 | {0xD265, 0xD27F, GBP_LVT}, | ||
1056 | {0xD280, 0xD280, GBP_LV}, | ||
1057 | {0xD281, 0xD29B, GBP_LVT}, | ||
1058 | {0xD29C, 0xD29C, GBP_LV}, | ||
1059 | {0xD29D, 0xD2B7, GBP_LVT}, | ||
1060 | {0xD2B8, 0xD2B8, GBP_LV}, | ||
1061 | {0xD2B9, 0xD2D3, GBP_LVT}, | ||
1062 | {0xD2D4, 0xD2D4, GBP_LV}, | ||
1063 | {0xD2D5, 0xD2EF, GBP_LVT}, | ||
1064 | {0xD2F0, 0xD2F0, GBP_LV}, | ||
1065 | {0xD2F1, 0xD30B, GBP_LVT}, | ||
1066 | {0xD30C, 0xD30C, GBP_LV}, | ||
1067 | {0xD30D, 0xD327, GBP_LVT}, | ||
1068 | {0xD328, 0xD328, GBP_LV}, | ||
1069 | {0xD329, 0xD343, GBP_LVT}, | ||
1070 | {0xD344, 0xD344, GBP_LV}, | ||
1071 | {0xD345, 0xD35F, GBP_LVT}, | ||
1072 | {0xD360, 0xD360, GBP_LV}, | ||
1073 | {0xD361, 0xD37B, GBP_LVT}, | ||
1074 | {0xD37C, 0xD37C, GBP_LV}, | ||
1075 | {0xD37D, 0xD397, GBP_LVT}, | ||
1076 | {0xD398, 0xD398, GBP_LV}, | ||
1077 | {0xD399, 0xD3B3, GBP_LVT}, | ||
1078 | {0xD3B4, 0xD3B4, GBP_LV}, | ||
1079 | {0xD3B5, 0xD3CF, GBP_LVT}, | ||
1080 | {0xD3D0, 0xD3D0, GBP_LV}, | ||
1081 | {0xD3D1, 0xD3EB, GBP_LVT}, | ||
1082 | {0xD3EC, 0xD3EC, GBP_LV}, | ||
1083 | {0xD3ED, 0xD407, GBP_LVT}, | ||
1084 | {0xD408, 0xD408, GBP_LV}, | ||
1085 | {0xD409, 0xD423, GBP_LVT}, | ||
1086 | {0xD424, 0xD424, GBP_LV}, | ||
1087 | {0xD425, 0xD43F, GBP_LVT}, | ||
1088 | {0xD440, 0xD440, GBP_LV}, | ||
1089 | {0xD441, 0xD45B, GBP_LVT}, | ||
1090 | {0xD45C, 0xD45C, GBP_LV}, | ||
1091 | {0xD45D, 0xD477, GBP_LVT}, | ||
1092 | {0xD478, 0xD478, GBP_LV}, | ||
1093 | {0xD479, 0xD493, GBP_LVT}, | ||
1094 | {0xD494, 0xD494, GBP_LV}, | ||
1095 | {0xD495, 0xD4AF, GBP_LVT}, | ||
1096 | {0xD4B0, 0xD4B0, GBP_LV}, | ||
1097 | {0xD4B1, 0xD4CB, GBP_LVT}, | ||
1098 | {0xD4CC, 0xD4CC, GBP_LV}, | ||
1099 | {0xD4CD, 0xD4E7, GBP_LVT}, | ||
1100 | {0xD4E8, 0xD4E8, GBP_LV}, | ||
1101 | {0xD4E9, 0xD503, GBP_LVT}, | ||
1102 | {0xD504, 0xD504, GBP_LV}, | ||
1103 | {0xD505, 0xD51F, GBP_LVT}, | ||
1104 | {0xD520, 0xD520, GBP_LV}, | ||
1105 | {0xD521, 0xD53B, GBP_LVT}, | ||
1106 | {0xD53C, 0xD53C, GBP_LV}, | ||
1107 | {0xD53D, 0xD557, GBP_LVT}, | ||
1108 | {0xD558, 0xD558, GBP_LV}, | ||
1109 | {0xD559, 0xD573, GBP_LVT}, | ||
1110 | {0xD574, 0xD574, GBP_LV}, | ||
1111 | {0xD575, 0xD58F, GBP_LVT}, | ||
1112 | {0xD590, 0xD590, GBP_LV}, | ||
1113 | {0xD591, 0xD5AB, GBP_LVT}, | ||
1114 | {0xD5AC, 0xD5AC, GBP_LV}, | ||
1115 | {0xD5AD, 0xD5C7, GBP_LVT}, | ||
1116 | {0xD5C8, 0xD5C8, GBP_LV}, | ||
1117 | {0xD5C9, 0xD5E3, GBP_LVT}, | ||
1118 | {0xD5E4, 0xD5E4, GBP_LV}, | ||
1119 | {0xD5E5, 0xD5FF, GBP_LVT}, | ||
1120 | {0xD600, 0xD600, GBP_LV}, | ||
1121 | {0xD601, 0xD61B, GBP_LVT}, | ||
1122 | {0xD61C, 0xD61C, GBP_LV}, | ||
1123 | {0xD61D, 0xD637, GBP_LVT}, | ||
1124 | {0xD638, 0xD638, GBP_LV}, | ||
1125 | {0xD639, 0xD653, GBP_LVT}, | ||
1126 | {0xD654, 0xD654, GBP_LV}, | ||
1127 | {0xD655, 0xD66F, GBP_LVT}, | ||
1128 | {0xD670, 0xD670, GBP_LV}, | ||
1129 | {0xD671, 0xD68B, GBP_LVT}, | ||
1130 | {0xD68C, 0xD68C, GBP_LV}, | ||
1131 | {0xD68D, 0xD6A7, GBP_LVT}, | ||
1132 | {0xD6A8, 0xD6A8, GBP_LV}, | ||
1133 | {0xD6A9, 0xD6C3, GBP_LVT}, | ||
1134 | {0xD6C4, 0xD6C4, GBP_LV}, | ||
1135 | {0xD6C5, 0xD6DF, GBP_LVT}, | ||
1136 | {0xD6E0, 0xD6E0, GBP_LV}, | ||
1137 | {0xD6E1, 0xD6FB, GBP_LVT}, | ||
1138 | {0xD6FC, 0xD6FC, GBP_LV}, | ||
1139 | {0xD6FD, 0xD717, GBP_LVT}, | ||
1140 | {0xD718, 0xD718, GBP_LV}, | ||
1141 | {0xD719, 0xD733, GBP_LVT}, | ||
1142 | {0xD734, 0xD734, GBP_LV}, | ||
1143 | {0xD735, 0xD74F, GBP_LVT}, | ||
1144 | {0xD750, 0xD750, GBP_LV}, | ||
1145 | {0xD751, 0xD76B, GBP_LVT}, | ||
1146 | {0xD76C, 0xD76C, GBP_LV}, | ||
1147 | {0xD76D, 0xD787, GBP_LVT}, | ||
1148 | {0xD788, 0xD788, GBP_LV}, | ||
1149 | {0xD789, 0xD7A3, GBP_LVT}, | ||
1150 | {0xD7B0, 0xD7C6, GBP_V}, | ||
1151 | {0xD7CB, 0xD7FB, GBP_T}, | ||
1152 | {0xD800, 0xDFFF, GBP_Control}, | ||
1153 | {0xFB1E, 0xFB1E, GBP_Extend}, | ||
1154 | {0xFE00, 0xFE0F, GBP_Extend}, | ||
1155 | {0xFE20, 0xFE2F, GBP_Extend}, | ||
1156 | {0xFEFF, 0xFEFF, GBP_Control}, | ||
1157 | {0xFF9E, 0xFF9F, GBP_Extend}, | ||
1158 | {0xFFF0, 0xFFF8, GBP_Control}, | ||
1159 | {0xFFF9, 0xFFFB, GBP_Control}, | ||
1160 | {0x101FD, 0x101FD, GBP_Extend}, | ||
1161 | {0x102E0, 0x102E0, GBP_Extend}, | ||
1162 | {0x10376, 0x1037A, GBP_Extend}, | ||
1163 | {0x10A01, 0x10A03, GBP_Extend}, | ||
1164 | {0x10A05, 0x10A06, GBP_Extend}, | ||
1165 | {0x10A0C, 0x10A0F, GBP_Extend}, | ||
1166 | {0x10A38, 0x10A3A, GBP_Extend}, | ||
1167 | {0x10A3F, 0x10A3F, GBP_Extend}, | ||
1168 | {0x10AE5, 0x10AE6, GBP_Extend}, | ||
1169 | {0x11000, 0x11000, GBP_SpacingMark}, | ||
1170 | {0x11001, 0x11001, GBP_Extend}, | ||
1171 | {0x11002, 0x11002, GBP_SpacingMark}, | ||
1172 | {0x11038, 0x11046, GBP_Extend}, | ||
1173 | {0x1107F, 0x11081, GBP_Extend}, | ||
1174 | {0x11082, 0x11082, GBP_SpacingMark}, | ||
1175 | {0x110B0, 0x110B2, GBP_SpacingMark}, | ||
1176 | {0x110B3, 0x110B6, GBP_Extend}, | ||
1177 | {0x110B7, 0x110B8, GBP_SpacingMark}, | ||
1178 | {0x110B9, 0x110BA, GBP_Extend}, | ||
1179 | {0x110BD, 0x110BD, GBP_Prepend}, | ||
1180 | {0x11100, 0x11102, GBP_Extend}, | ||
1181 | {0x11127, 0x1112B, GBP_Extend}, | ||
1182 | {0x1112C, 0x1112C, GBP_SpacingMark}, | ||
1183 | {0x1112D, 0x11134, GBP_Extend}, | ||
1184 | {0x11173, 0x11173, GBP_Extend}, | ||
1185 | {0x11180, 0x11181, GBP_Extend}, | ||
1186 | {0x11182, 0x11182, GBP_SpacingMark}, | ||
1187 | {0x111B3, 0x111B5, GBP_SpacingMark}, | ||
1188 | {0x111B6, 0x111BE, GBP_Extend}, | ||
1189 | {0x111BF, 0x111C0, GBP_SpacingMark}, | ||
1190 | {0x111C2, 0x111C3, GBP_Prepend}, | ||
1191 | {0x111CA, 0x111CC, GBP_Extend}, | ||
1192 | {0x1122C, 0x1122E, GBP_SpacingMark}, | ||
1193 | {0x1122F, 0x11231, GBP_Extend}, | ||
1194 | {0x11232, 0x11233, GBP_SpacingMark}, | ||
1195 | {0x11234, 0x11234, GBP_Extend}, | ||
1196 | {0x11235, 0x11235, GBP_SpacingMark}, | ||
1197 | {0x11236, 0x11237, GBP_Extend}, | ||
1198 | {0x1123E, 0x1123E, GBP_Extend}, | ||
1199 | {0x112DF, 0x112DF, GBP_Extend}, | ||
1200 | {0x112E0, 0x112E2, GBP_SpacingMark}, | ||
1201 | {0x112E3, 0x112EA, GBP_Extend}, | ||
1202 | {0x11300, 0x11301, GBP_Extend}, | ||
1203 | {0x11302, 0x11303, GBP_SpacingMark}, | ||
1204 | {0x1133C, 0x1133C, GBP_Extend}, | ||
1205 | {0x1133E, 0x1133E, GBP_Extend}, | ||
1206 | {0x1133F, 0x1133F, GBP_SpacingMark}, | ||
1207 | {0x11340, 0x11340, GBP_Extend}, | ||
1208 | {0x11341, 0x11344, GBP_SpacingMark}, | ||
1209 | {0x11347, 0x11348, GBP_SpacingMark}, | ||
1210 | {0x1134B, 0x1134D, GBP_SpacingMark}, | ||
1211 | {0x11357, 0x11357, GBP_Extend}, | ||
1212 | {0x11362, 0x11363, GBP_SpacingMark}, | ||
1213 | {0x11366, 0x1136C, GBP_Extend}, | ||
1214 | {0x11370, 0x11374, GBP_Extend}, | ||
1215 | {0x11435, 0x11437, GBP_SpacingMark}, | ||
1216 | {0x11438, 0x1143F, GBP_Extend}, | ||
1217 | {0x11440, 0x11441, GBP_SpacingMark}, | ||
1218 | {0x11442, 0x11444, GBP_Extend}, | ||
1219 | {0x11445, 0x11445, GBP_SpacingMark}, | ||
1220 | {0x11446, 0x11446, GBP_Extend}, | ||
1221 | {0x114B0, 0x114B0, GBP_Extend}, | ||
1222 | {0x114B1, 0x114B2, GBP_SpacingMark}, | ||
1223 | {0x114B3, 0x114B8, GBP_Extend}, | ||
1224 | {0x114B9, 0x114B9, GBP_SpacingMark}, | ||
1225 | {0x114BA, 0x114BA, GBP_Extend}, | ||
1226 | {0x114BB, 0x114BC, GBP_SpacingMark}, | ||
1227 | {0x114BD, 0x114BD, GBP_Extend}, | ||
1228 | {0x114BE, 0x114BE, GBP_SpacingMark}, | ||
1229 | {0x114BF, 0x114C0, GBP_Extend}, | ||
1230 | {0x114C1, 0x114C1, GBP_SpacingMark}, | ||
1231 | {0x114C2, 0x114C3, GBP_Extend}, | ||
1232 | {0x115AF, 0x115AF, GBP_Extend}, | ||
1233 | {0x115B0, 0x115B1, GBP_SpacingMark}, | ||
1234 | {0x115B2, 0x115B5, GBP_Extend}, | ||
1235 | {0x115B8, 0x115BB, GBP_SpacingMark}, | ||
1236 | {0x115BC, 0x115BD, GBP_Extend}, | ||
1237 | {0x115BE, 0x115BE, GBP_SpacingMark}, | ||
1238 | {0x115BF, 0x115C0, GBP_Extend}, | ||
1239 | {0x115DC, 0x115DD, GBP_Extend}, | ||
1240 | {0x11630, 0x11632, GBP_SpacingMark}, | ||
1241 | {0x11633, 0x1163A, GBP_Extend}, | ||
1242 | {0x1163B, 0x1163C, GBP_SpacingMark}, | ||
1243 | {0x1163D, 0x1163D, GBP_Extend}, | ||
1244 | {0x1163E, 0x1163E, GBP_SpacingMark}, | ||
1245 | {0x1163F, 0x11640, GBP_Extend}, | ||
1246 | {0x116AB, 0x116AB, GBP_Extend}, | ||
1247 | {0x116AC, 0x116AC, GBP_SpacingMark}, | ||
1248 | {0x116AD, 0x116AD, GBP_Extend}, | ||
1249 | {0x116AE, 0x116AF, GBP_SpacingMark}, | ||
1250 | {0x116B0, 0x116B5, GBP_Extend}, | ||
1251 | {0x116B6, 0x116B6, GBP_SpacingMark}, | ||
1252 | {0x116B7, 0x116B7, GBP_Extend}, | ||
1253 | {0x1171D, 0x1171F, GBP_Extend}, | ||
1254 | {0x11720, 0x11721, GBP_SpacingMark}, | ||
1255 | {0x11722, 0x11725, GBP_Extend}, | ||
1256 | {0x11726, 0x11726, GBP_SpacingMark}, | ||
1257 | {0x11727, 0x1172B, GBP_Extend}, | ||
1258 | {0x11C2F, 0x11C2F, GBP_SpacingMark}, | ||
1259 | {0x11C30, 0x11C36, GBP_Extend}, | ||
1260 | {0x11C38, 0x11C3D, GBP_Extend}, | ||
1261 | {0x11C3E, 0x11C3E, GBP_SpacingMark}, | ||
1262 | {0x11C3F, 0x11C3F, GBP_Extend}, | ||
1263 | {0x11C92, 0x11CA7, GBP_Extend}, | ||
1264 | {0x11CA9, 0x11CA9, GBP_SpacingMark}, | ||
1265 | {0x11CAA, 0x11CB0, GBP_Extend}, | ||
1266 | {0x11CB1, 0x11CB1, GBP_SpacingMark}, | ||
1267 | {0x11CB2, 0x11CB3, GBP_Extend}, | ||
1268 | {0x11CB4, 0x11CB4, GBP_SpacingMark}, | ||
1269 | {0x11CB5, 0x11CB6, GBP_Extend}, | ||
1270 | {0x16AF0, 0x16AF4, GBP_Extend}, | ||
1271 | {0x16B30, 0x16B36, GBP_Extend}, | ||
1272 | {0x16F51, 0x16F7E, GBP_SpacingMark}, | ||
1273 | {0x16F8F, 0x16F92, GBP_Extend}, | ||
1274 | {0x1BC9D, 0x1BC9E, GBP_Extend}, | ||
1275 | {0x1BCA0, 0x1BCA3, GBP_Control}, | ||
1276 | {0x1D165, 0x1D165, GBP_Extend}, | ||
1277 | {0x1D166, 0x1D166, GBP_SpacingMark}, | ||
1278 | {0x1D167, 0x1D169, GBP_Extend}, | ||
1279 | {0x1D16D, 0x1D16D, GBP_SpacingMark}, | ||
1280 | {0x1D16E, 0x1D172, GBP_Extend}, | ||
1281 | {0x1D173, 0x1D17A, GBP_Control}, | ||
1282 | {0x1D17B, 0x1D182, GBP_Extend}, | ||
1283 | {0x1D185, 0x1D18B, GBP_Extend}, | ||
1284 | {0x1D1AA, 0x1D1AD, GBP_Extend}, | ||
1285 | {0x1D242, 0x1D244, GBP_Extend}, | ||
1286 | {0x1DA00, 0x1DA36, GBP_Extend}, | ||
1287 | {0x1DA3B, 0x1DA6C, GBP_Extend}, | ||
1288 | {0x1DA75, 0x1DA75, GBP_Extend}, | ||
1289 | {0x1DA84, 0x1DA84, GBP_Extend}, | ||
1290 | {0x1DA9B, 0x1DA9F, GBP_Extend}, | ||
1291 | {0x1DAA1, 0x1DAAF, GBP_Extend}, | ||
1292 | {0x1E000, 0x1E006, GBP_Extend}, | ||
1293 | {0x1E008, 0x1E018, GBP_Extend}, | ||
1294 | {0x1E01B, 0x1E021, GBP_Extend}, | ||
1295 | {0x1E023, 0x1E024, GBP_Extend}, | ||
1296 | {0x1E026, 0x1E02A, GBP_Extend}, | ||
1297 | {0x1E8D0, 0x1E8D6, GBP_Extend}, | ||
1298 | {0x1E944, 0x1E94A, GBP_Extend}, | ||
1299 | {0x1F1E6, 0x1F1FF, GBP_Regional_Indicator}, | ||
1300 | {0x1F385, 0x1F385, GBP_E_Base}, | ||
1301 | {0x1F3C3, 0x1F3C4, GBP_E_Base}, | ||
1302 | {0x1F3CA, 0x1F3CB, GBP_E_Base}, | ||
1303 | {0x1F3FB, 0x1F3FF, GBP_E_Modifier}, | ||
1304 | {0x1F442, 0x1F443, GBP_E_Base}, | ||
1305 | {0x1F446, 0x1F450, GBP_E_Base}, | ||
1306 | {0x1F466, 0x1F469, GBP_E_Base_GAZ}, | ||
1307 | {0x1F46E, 0x1F46E, GBP_E_Base}, | ||
1308 | {0x1F470, 0x1F478, GBP_E_Base}, | ||
1309 | {0x1F47C, 0x1F47C, GBP_E_Base}, | ||
1310 | {0x1F481, 0x1F483, GBP_E_Base}, | ||
1311 | {0x1F485, 0x1F487, GBP_E_Base}, | ||
1312 | {0x1F48B, 0x1F48B, GBP_Glue_After_Zwj}, | ||
1313 | {0x1F4AA, 0x1F4AA, GBP_E_Base}, | ||
1314 | {0x1F575, 0x1F575, GBP_E_Base}, | ||
1315 | {0x1F57A, 0x1F57A, GBP_E_Base}, | ||
1316 | {0x1F590, 0x1F590, GBP_E_Base}, | ||
1317 | {0x1F595, 0x1F596, GBP_E_Base}, | ||
1318 | {0x1F5E8, 0x1F5E8, GBP_Glue_After_Zwj}, | ||
1319 | {0x1F645, 0x1F647, GBP_E_Base}, | ||
1320 | {0x1F64B, 0x1F64F, GBP_E_Base}, | ||
1321 | {0x1F6A3, 0x1F6A3, GBP_E_Base}, | ||
1322 | {0x1F6B4, 0x1F6B6, GBP_E_Base}, | ||
1323 | {0x1F6C0, 0x1F6C0, GBP_E_Base}, | ||
1324 | {0x1F918, 0x1F91E, GBP_E_Base}, | ||
1325 | {0x1F926, 0x1F926, GBP_E_Base}, | ||
1326 | {0x1F930, 0x1F930, GBP_E_Base}, | ||
1327 | {0x1F933, 0x1F939, GBP_E_Base}, | ||
1328 | {0x1F93C, 0x1F93E, GBP_E_Base}, | ||
1329 | {0xE0000, 0xE0000, GBP_Control}, | ||
1330 | {0xE0001, 0xE0001, GBP_Control}, | ||
1331 | {0xE0002, 0xE001F, GBP_Control}, | ||
1332 | {0xE0020, 0xE007F, GBP_Extend}, | ||
1333 | {0xE0080, 0xE00FF, GBP_Control}, | ||
1334 | {0xE0100, 0xE01EF, GBP_Extend}, | ||
1335 | {0xE01F0, 0xE0FFF, GBP_Control}, | ||
1336 | {0xFFFFFFFF, 0xFFFFFFFF, GBP_Undefined} | ||
1337 | }; | ||
diff --git a/src/static_libs/libunibreak/graphemebreakdef.h b/src/static_libs/libunibreak/graphemebreakdef.h new file mode 100644 index 0000000000..0de1f3d623 --- /dev/null +++ b/src/static_libs/libunibreak/graphemebreakdef.h | |||
@@ -0,0 +1,82 @@ | |||
1 | /* | ||
2 | * Grapheme breaking in a Unicode sequence. Designed to be used in a | ||
3 | * generic text renderer. | ||
4 | * | ||
5 | * Copyright (C) 2016 Andreas Röver <roever at users dot sf dot net> | ||
6 | * | ||
7 | * This software is provided 'as-is', without any express or implied | ||
8 | * warranty. In no event will the author be held liable for any damages | ||
9 | * arising from the use of this software. | ||
10 | * | ||
11 | * Permission is granted to anyone to use this software for any purpose, | ||
12 | * including commercial applications, and to alter it and redistribute | ||
13 | * it freely, subject to the following restrictions: | ||
14 | * | ||
15 | * 1. The origin of this software must not be misrepresented; you must | ||
16 | * not claim that you wrote the original software. If you use this | ||
17 | * software in a product, an acknowledgement in the product | ||
18 | * documentation would be appreciated but is not required. | ||
19 | * 2. Altered source versions must be plainly marked as such, and must | ||
20 | * not be misrepresented as being the original software. | ||
21 | * 3. This notice may not be removed or altered from any source | ||
22 | * distribution. | ||
23 | * | ||
24 | * The main reference is Unicode Standard Annex 29 (UAX #29): | ||
25 | * <URL:http://unicode.org/reports/tr29> | ||
26 | * | ||
27 | * When this library was designed, this annex was at Revision 29, for | ||
28 | * Unicode 9.0.0: | ||
29 | * <URL:http://www.unicode.org/reports/tr29/tr29-29.html> | ||
30 | * | ||
31 | * The Unicode Terms of Use are available at | ||
32 | * <URL:http://www.unicode.org/copyright.html> | ||
33 | */ | ||
34 | |||
35 | /** | ||
36 | * @file graphemebreakdef.h | ||
37 | * | ||
38 | * Definitions of internal data structures, declarations of global | ||
39 | * variables, and function prototypes for the grapheme breaking algorithm. | ||
40 | * | ||
41 | * @author Andreas Röver | ||
42 | */ | ||
43 | |||
44 | #include "unibreakdef.h" | ||
45 | |||
46 | /** | ||
47 | * Word break classes. This is a direct mapping of Table 2 of Unicode | ||
48 | * Standard Annex 29 | ||
49 | */ | ||
50 | enum GraphemeBreakClass | ||
51 | { | ||
52 | GBP_CR, | ||
53 | GBP_LF, | ||
54 | GBP_Control, | ||
55 | GBP_Extend, | ||
56 | GBP_ZWJ, | ||
57 | GBP_Regional_Indicator, | ||
58 | GBP_Prepend, | ||
59 | GBP_SpacingMark, | ||
60 | GBP_L, | ||
61 | GBP_V, | ||
62 | GBP_T, | ||
63 | GBP_LV, | ||
64 | GBP_LVT, | ||
65 | GBP_E_Base, | ||
66 | GBP_E_Modifier, | ||
67 | GBP_Glue_After_Zwj, | ||
68 | GBP_E_Base_GAZ, | ||
69 | GBP_Other, | ||
70 | GBP_Undefined | ||
71 | }; | ||
72 | |||
73 | /** | ||
74 | * Struct for entries of grapheme break properties. The array of the | ||
75 | * entries \e must be sorted. | ||
76 | */ | ||
77 | struct GraphemeBreakProperties | ||
78 | { | ||
79 | utf32_t start; /**< Starting coding point */ | ||
80 | utf32_t end; /**< End coding point, including */ | ||
81 | enum GraphemeBreakClass prop; /**< The grapheme breaking property */ | ||
82 | }; | ||
diff --git a/src/static_libs/libunibreak/linebreak.c b/src/static_libs/libunibreak/linebreak.c index 3d87a0413d..41f23c1c08 100644 --- a/src/static_libs/libunibreak/linebreak.c +++ b/src/static_libs/libunibreak/linebreak.c | |||
@@ -45,7 +45,6 @@ | |||
45 | * Implementation of the line breaking algorithm as described in Unicode | 45 | * Implementation of the line breaking algorithm as described in Unicode |
46 | * Standard Annex 14. | 46 | * Standard Annex 14. |
47 | * | 47 | * |
48 | * @version 3.2, 2016/12/04 | ||
49 | * @author Wu Yongwei | 48 | * @author Wu Yongwei |
50 | * @author Petr Filipsky | 49 | * @author Petr Filipsky |
51 | */ | 50 | */ |
@@ -68,7 +67,7 @@ | |||
68 | 67 | ||
69 | /** | 68 | /** |
70 | * Enumeration of break actions. They are used in the break action | 69 | * Enumeration of break actions. They are used in the break action |
71 | * pair table below. | 70 | * pair table #baTable. |
72 | */ | 71 | */ |
73 | enum BreakAction | 72 | enum BreakAction |
74 | { | 73 | { |
@@ -81,7 +80,7 @@ enum BreakAction | |||
81 | 80 | ||
82 | /** | 81 | /** |
83 | * Break action pair table. This is a direct mapping of Table 2 of | 82 | * Break action pair table. This is a direct mapping of Table 2 of |
84 | * Unicode Standard Annex 14, Revision 37. | 83 | * Unicode Standard Annex 14, Revision 37, except the "CB" part. |
85 | */ | 84 | */ |
86 | static enum BreakAction baTable[LBP_CB][LBP_CB] = { | 85 | static enum BreakAction baTable[LBP_CB][LBP_CB] = { |
87 | { /* OP */ | 86 | { /* OP */ |
@@ -313,11 +312,12 @@ static struct LineBreakPropertiesIndex lb_prop_index[LINEBREAK_INDEX_SIZE] = | |||
313 | static __inline int ends_with(const char *str, const char *suffix, | 312 | static __inline int ends_with(const char *str, const char *suffix, |
314 | unsigned suffixLen) | 313 | unsigned suffixLen) |
315 | { | 314 | { |
315 | unsigned len; | ||
316 | if (str == NULL) | 316 | if (str == NULL) |
317 | { | 317 | { |
318 | return 0; | 318 | return 0; |
319 | } | 319 | } |
320 | unsigned len = strlen(str); | 320 | len = strlen(str); |
321 | if (len >= suffixLen && | 321 | if (len >= suffixLen && |
322 | memcmp(str + len - suffixLen, suffix, suffixLen) == 0) | 322 | memcmp(str + len - suffixLen, suffix, suffixLen) == 0) |
323 | { | 323 | { |
@@ -706,6 +706,23 @@ int lb_process_next_char( | |||
706 | /** | 706 | /** |
707 | * Sets the line breaking information for a generic input string. | 707 | * Sets the line breaking information for a generic input string. |
708 | * | 708 | * |
709 | * Currently, this implementation has customization for the following | ||
710 | * ISO 639-1 language codes (for \a lang): | ||
711 | * | ||
712 | * - de (German) | ||
713 | * - en (English) | ||
714 | * - es (Spanish) | ||
715 | * - fr (French) | ||
716 | * - ja (Japanese) | ||
717 | * - ko (Korean) | ||
718 | * - ru (Russian) | ||
719 | * - zh (Chinese) | ||
720 | * | ||
721 | * In addition, a suffix <code>"-strict"</code> may be added to indicate | ||
722 | * strict (as versus normal) line-breaking behaviour. See the <a | ||
723 | * href="http://www.unicode.org/reports/tr14/#CJ">Conditional Japanese | ||
724 | * Starter section of UAX #14</a> for more details. | ||
725 | * | ||
709 | * @param[in] s input string | 726 | * @param[in] s input string |
710 | * @param[in] len length of the input | 727 | * @param[in] len length of the input |
711 | * @param[in] lang language of the input | 728 | * @param[in] lang language of the input |
@@ -766,6 +783,7 @@ void set_linebreaks( | |||
766 | * @param[out] brks pointer to the output breaking data, containing | 783 | * @param[out] brks pointer to the output breaking data, containing |
767 | * #LINEBREAK_MUSTBREAK, #LINEBREAK_ALLOWBREAK, | 784 | * #LINEBREAK_MUSTBREAK, #LINEBREAK_ALLOWBREAK, |
768 | * #LINEBREAK_NOBREAK, or #LINEBREAK_INSIDEACHAR | 785 | * #LINEBREAK_NOBREAK, or #LINEBREAK_INSIDEACHAR |
786 | * @see #set_linebreaks for a note about \a lang. | ||
769 | */ | 787 | */ |
770 | void set_linebreaks_utf8( | 788 | void set_linebreaks_utf8( |
771 | const utf8_t *s, | 789 | const utf8_t *s, |
@@ -786,6 +804,7 @@ void set_linebreaks_utf8( | |||
786 | * @param[out] brks pointer to the output breaking data, containing | 804 | * @param[out] brks pointer to the output breaking data, containing |
787 | * #LINEBREAK_MUSTBREAK, #LINEBREAK_ALLOWBREAK, | 805 | * #LINEBREAK_MUSTBREAK, #LINEBREAK_ALLOWBREAK, |
788 | * #LINEBREAK_NOBREAK, or #LINEBREAK_INSIDEACHAR | 806 | * #LINEBREAK_NOBREAK, or #LINEBREAK_INSIDEACHAR |
807 | * @see #set_linebreaks for a note about \a lang. | ||
789 | */ | 808 | */ |
790 | void set_linebreaks_utf16( | 809 | void set_linebreaks_utf16( |
791 | const utf16_t *s, | 810 | const utf16_t *s, |
@@ -806,6 +825,7 @@ void set_linebreaks_utf16( | |||
806 | * @param[out] brks pointer to the output breaking data, containing | 825 | * @param[out] brks pointer to the output breaking data, containing |
807 | * #LINEBREAK_MUSTBREAK, #LINEBREAK_ALLOWBREAK, | 826 | * #LINEBREAK_MUSTBREAK, #LINEBREAK_ALLOWBREAK, |
808 | * #LINEBREAK_NOBREAK, or #LINEBREAK_INSIDEACHAR | 827 | * #LINEBREAK_NOBREAK, or #LINEBREAK_INSIDEACHAR |
828 | * @see #set_linebreaks for a note about \a lang. | ||
809 | */ | 829 | */ |
810 | void set_linebreaks_utf32( | 830 | void set_linebreaks_utf32( |
811 | const utf32_t *s, | 831 | const utf32_t *s, |
diff --git a/src/static_libs/libunibreak/linebreak.h b/src/static_libs/libunibreak/linebreak.h index 7753b3d83b..fd7351191b 100644 --- a/src/static_libs/libunibreak/linebreak.h +++ b/src/static_libs/libunibreak/linebreak.h | |||
@@ -43,7 +43,6 @@ | |||
43 | * | 43 | * |
44 | * Header file for the line breaking algorithm. | 44 | * Header file for the line breaking algorithm. |
45 | * | 45 | * |
46 | * @version 3.1, 2016/09/10 | ||
47 | * @author Wu Yongwei | 46 | * @author Wu Yongwei |
48 | */ | 47 | */ |
49 | 48 | ||
diff --git a/src/static_libs/libunibreak/linebreakdef.c b/src/static_libs/libunibreak/linebreakdef.c index 04c3db3487..6b485cecbd 100644 --- a/src/static_libs/libunibreak/linebreakdef.c +++ b/src/static_libs/libunibreak/linebreakdef.c | |||
@@ -43,7 +43,6 @@ | |||
43 | * | 43 | * |
44 | * Definition of language-specific data. | 44 | * Definition of language-specific data. |
45 | * | 45 | * |
46 | * @version 3.1, 2016/09/10 | ||
47 | * @author Wu Yongwei | 46 | * @author Wu Yongwei |
48 | */ | 47 | */ |
49 | 48 | ||
diff --git a/src/static_libs/libunibreak/linebreakdef.h b/src/static_libs/libunibreak/linebreakdef.h index 9432ed3326..37ec7b546e 100644 --- a/src/static_libs/libunibreak/linebreakdef.h +++ b/src/static_libs/libunibreak/linebreakdef.h | |||
@@ -45,7 +45,6 @@ | |||
45 | * Definitions of internal data structures, declarations of global | 45 | * Definitions of internal data structures, declarations of global |
46 | * variables, and function prototypes for the line breaking algorithm. | 46 | * variables, and function prototypes for the line breaking algorithm. |
47 | * | 47 | * |
48 | * @version 3.2, 2016/12/03 | ||
49 | * @author Wu Yongwei | 48 | * @author Wu Yongwei |
50 | * @author Petr Filipsky | 49 | * @author Petr Filipsky |
51 | */ | 50 | */ |
diff --git a/src/static_libs/libunibreak/unibreakbase.c b/src/static_libs/libunibreak/unibreakbase.c index b0d8f3b729..686852a990 100644 --- a/src/static_libs/libunibreak/unibreakbase.c +++ b/src/static_libs/libunibreak/unibreakbase.c | |||
@@ -4,7 +4,7 @@ | |||
4 | * Break processing in a Unicode sequence. Designed to be used in a | 4 | * Break processing in a Unicode sequence. Designed to be used in a |
5 | * generic text renderer. | 5 | * generic text renderer. |
6 | * | 6 | * |
7 | * Copyright (C) 2015 Wu Yongwei <wuyongwei at gmail dot com> | 7 | * Copyright (C) 2015-2016 Wu Yongwei <wuyongwei at gmail dot com> |
8 | * | 8 | * |
9 | * This software is provided 'as-is', without any express or implied | 9 | * This software is provided 'as-is', without any express or implied |
10 | * warranty. In no event will the author be held liable for any damages | 10 | * warranty. In no event will the author be held liable for any damages |
@@ -29,7 +29,6 @@ | |||
29 | * | 29 | * |
30 | * Definition of basic libunibreak information. | 30 | * Definition of basic libunibreak information. |
31 | * | 31 | * |
32 | * @version 3.0, 2015/05/10 | ||
33 | * @author Wu Yongwei | 32 | * @author Wu Yongwei |
34 | */ | 33 | */ |
35 | 34 | ||
diff --git a/src/static_libs/libunibreak/unibreakbase.h b/src/static_libs/libunibreak/unibreakbase.h index 08c012737c..ff9a6ce8a9 100644 --- a/src/static_libs/libunibreak/unibreakbase.h +++ b/src/static_libs/libunibreak/unibreakbase.h | |||
@@ -4,7 +4,7 @@ | |||
4 | * Break processing in a Unicode sequence. Designed to be used in a | 4 | * Break processing in a Unicode sequence. Designed to be used in a |
5 | * generic text renderer. | 5 | * generic text renderer. |
6 | * | 6 | * |
7 | * Copyright (C) 2015 Wu Yongwei <wuyongwei at gmail dot com> | 7 | * Copyright (C) 2015-2016 Wu Yongwei <wuyongwei at gmail dot com> |
8 | * | 8 | * |
9 | * This software is provided 'as-is', without any express or implied | 9 | * This software is provided 'as-is', without any express or implied |
10 | * warranty. In no event will the author be held liable for any damages | 10 | * warranty. In no event will the author be held liable for any damages |
@@ -29,7 +29,6 @@ | |||
29 | * | 29 | * |
30 | * Header file for common definitions in the libunibreak library. | 30 | * Header file for common definitions in the libunibreak library. |
31 | * | 31 | * |
32 | * @version 3.0, 2015/05/10 | ||
33 | * @author Wu Yongwei | 32 | * @author Wu Yongwei |
34 | */ | 33 | */ |
35 | 34 | ||
@@ -40,7 +39,7 @@ | |||
40 | extern "C" { | 39 | extern "C" { |
41 | #endif | 40 | #endif |
42 | 41 | ||
43 | #define UNIBREAK_VERSION 0x0300 /**< Version of the library linebreak */ | 42 | #define UNIBREAK_VERSION 0x0400 /**< Version of the library linebreak */ |
44 | extern const int unibreak_version; | 43 | extern const int unibreak_version; |
45 | 44 | ||
46 | #ifndef UNIBREAK_UTF_TYPES_DEFINED | 45 | #ifndef UNIBREAK_UTF_TYPES_DEFINED |
diff --git a/src/static_libs/libunibreak/unibreakdef.c b/src/static_libs/libunibreak/unibreakdef.c index 20ce2b3484..4d4f2b2863 100644 --- a/src/static_libs/libunibreak/unibreakdef.c +++ b/src/static_libs/libunibreak/unibreakdef.c | |||
@@ -4,7 +4,7 @@ | |||
4 | * Break processing in a Unicode sequence. Designed to be used in a | 4 | * Break processing in a Unicode sequence. Designed to be used in a |
5 | * generic text renderer. | 5 | * generic text renderer. |
6 | * | 6 | * |
7 | * Copyright (C) 2015 Wu Yongwei <wuyongwei at gmail dot com> | 7 | * Copyright (C) 2015-2016 Wu Yongwei <wuyongwei at gmail dot com> |
8 | * | 8 | * |
9 | * This software is provided 'as-is', without any express or implied | 9 | * This software is provided 'as-is', without any express or implied |
10 | * warranty. In no event will the author be held liable for any damages | 10 | * warranty. In no event will the author be held liable for any damages |
@@ -29,7 +29,6 @@ | |||
29 | * | 29 | * |
30 | * Definition of utility functions used by the libunibreak library. | 30 | * Definition of utility functions used by the libunibreak library. |
31 | * | 31 | * |
32 | * @version 3.0, 2015/05/10 | ||
33 | * @author Wu Yongwei | 32 | * @author Wu Yongwei |
34 | */ | 33 | */ |
35 | 34 | ||
diff --git a/src/static_libs/libunibreak/unibreakdef.h b/src/static_libs/libunibreak/unibreakdef.h index f5d5744990..e13016d8cd 100644 --- a/src/static_libs/libunibreak/unibreakdef.h +++ b/src/static_libs/libunibreak/unibreakdef.h | |||
@@ -4,7 +4,7 @@ | |||
4 | * Break processing in a Unicode sequence. Designed to be used in a | 4 | * Break processing in a Unicode sequence. Designed to be used in a |
5 | * generic text renderer. | 5 | * generic text renderer. |
6 | * | 6 | * |
7 | * Copyright (C) 2015 Wu Yongwei <wuyongwei at gmail dot com> | 7 | * Copyright (C) 2015-2016 Wu Yongwei <wuyongwei at gmail dot com> |
8 | * | 8 | * |
9 | * This software is provided 'as-is', without any express or implied | 9 | * This software is provided 'as-is', without any express or implied |
10 | * warranty. In no event will the author be held liable for any damages | 10 | * warranty. In no event will the author be held liable for any damages |
@@ -29,7 +29,6 @@ | |||
29 | * | 29 | * |
30 | * Header file for private definitions in the libunibreak library. | 30 | * Header file for private definitions in the libunibreak library. |
31 | * | 31 | * |
32 | * @version 3.0, 2015/05/10 | ||
33 | * @author Wu Yongwei | 32 | * @author Wu Yongwei |
34 | */ | 33 | */ |
35 | 34 | ||
diff --git a/src/static_libs/libunibreak/wordbreak.c b/src/static_libs/libunibreak/wordbreak.c index d90d77b799..aece4b3c45 100644 --- a/src/static_libs/libunibreak/wordbreak.c +++ b/src/static_libs/libunibreak/wordbreak.c | |||
@@ -4,7 +4,7 @@ | |||
4 | * Word breaking in a Unicode sequence. Designed to be used in a | 4 | * Word breaking in a Unicode sequence. Designed to be used in a |
5 | * generic text renderer. | 5 | * generic text renderer. |
6 | * | 6 | * |
7 | * Copyright (C) 2013-2015 Tom Hacohen <tom at stosb dot com> | 7 | * Copyright (C) 2013-2016 Tom Hacohen <tom at stosb dot com> |
8 | * | 8 | * |
9 | * This software is provided 'as-is', without any express or implied | 9 | * This software is provided 'as-is', without any express or implied |
10 | * warranty. In no event will the author be held liable for any damages | 10 | * warranty. In no event will the author be held liable for any damages |
@@ -30,9 +30,9 @@ | |||
30 | * Unicode 6.0.0: | 30 | * Unicode 6.0.0: |
31 | * <URL:http://www.unicode.org/reports/tr29/tr29-17.html> | 31 | * <URL:http://www.unicode.org/reports/tr29/tr29-17.html> |
32 | * | 32 | * |
33 | * This library has been updated according to Revision 27, for | 33 | * This library has been updated according to Revision 29, for |
34 | * Unicode 8.0.0: | 34 | * Unicode 9.0.0: |
35 | * <URL:http://www.unicode.org/reports/tr29/tr29-27.html> | 35 | * <URL:http://www.unicode.org/reports/tr29/tr29-29.html> |
36 | * | 36 | * |
37 | * The Unicode Terms of Use are available at | 37 | * The Unicode Terms of Use are available at |
38 | * <URL:http://www.unicode.org/copyright.html> | 38 | * <URL:http://www.unicode.org/copyright.html> |
@@ -44,7 +44,6 @@ | |||
44 | * Implementation of the word breaking algorithm as described in Unicode | 44 | * Implementation of the word breaking algorithm as described in Unicode |
45 | * Standard Annex 29. | 45 | * Standard Annex 29. |
46 | * | 46 | * |
47 | * @version 3.1, 2015/05/18 | ||
48 | * @author Tom Hacohen | 47 | * @author Tom Hacohen |
49 | */ | 48 | */ |
50 | 49 | ||
@@ -149,7 +148,7 @@ static void set_brks_to( | |||
149 | * | 148 | * |
150 | * @param[in] s input string | 149 | * @param[in] s input string |
151 | * @param[in] len length of the input | 150 | * @param[in] len length of the input |
152 | * @param[in] lang language of the input | 151 | * @param[in] lang language of the input (reserved for future use) |
153 | * @param[out] brks pointer to the output breaking data, containing | 152 | * @param[out] brks pointer to the output breaking data, containing |
154 | * #WORDBREAK_BREAK, #WORDBREAK_NOBREAK, or | 153 | * #WORDBREAK_BREAK, #WORDBREAK_NOBREAK, or |
155 | * #WORDBREAK_INSIDEACHAR | 154 | * #WORDBREAK_INSIDEACHAR |
@@ -210,13 +209,7 @@ static void set_wordbreaks( | |||
210 | posLast = posCur; | 209 | posLast = posCur; |
211 | break; | 210 | break; |
212 | } | 211 | } |
213 | #ifndef __has_attribute | 212 | /* Fall off */ |
214 | # define __has_attribute(x) 0 | ||
215 | #endif | ||
216 | #if __has_attribute(fallthrough) | ||
217 | __attribute__((fallthrough)); | ||
218 | #endif | ||
219 | /* Fall off */ | ||
220 | 213 | ||
221 | case WBP_Newline: | 214 | case WBP_Newline: |
222 | /* WB3a,3b */ | 215 | /* WB3a,3b */ |
@@ -329,13 +322,7 @@ static void set_wordbreaks( | |||
329 | wbcSeqStart = wbcCur; | 322 | wbcSeqStart = wbcCur; |
330 | posLast = posCur; | 323 | posLast = posCur; |
331 | } | 324 | } |
332 | #ifndef __has_attribute | 325 | /* No break on purpose */ |
333 | # define __has_attribute(x) 0 | ||
334 | #endif | ||
335 | #if __has_attribute(fallthrough) | ||
336 | __attribute__((fallthrough)); | ||
337 | #endif | ||
338 | /* No break on purpose */ | ||
339 | case WBP_MidNumLet: | 326 | case WBP_MidNumLet: |
340 | if (((wbcLast == WBP_ALetter) || | 327 | if (((wbcLast == WBP_ALetter) || |
341 | (wbcLast == WBP_Hebrew_Letter)) || /* WB6,7 */ | 328 | (wbcLast == WBP_Hebrew_Letter)) || /* WB6,7 */ |
@@ -511,7 +498,7 @@ static void set_wordbreaks( | |||
511 | * | 498 | * |
512 | * @param[in] s input UTF-8 string | 499 | * @param[in] s input UTF-8 string |
513 | * @param[in] len length of the input | 500 | * @param[in] len length of the input |
514 | * @param[in] lang language of the input | 501 | * @param[in] lang language of the input (reserved for future use) |
515 | * @param[out] brks pointer to the output breaking data, containing | 502 | * @param[out] brks pointer to the output breaking data, containing |
516 | * #WORDBREAK_BREAK, #WORDBREAK_NOBREAK, or | 503 | * #WORDBREAK_BREAK, #WORDBREAK_NOBREAK, or |
517 | * #WORDBREAK_INSIDEACHAR | 504 | * #WORDBREAK_INSIDEACHAR |
@@ -531,7 +518,7 @@ void set_wordbreaks_utf8( | |||
531 | * | 518 | * |
532 | * @param[in] s input UTF-16 string | 519 | * @param[in] s input UTF-16 string |
533 | * @param[in] len length of the input | 520 | * @param[in] len length of the input |
534 | * @param[in] lang language of the input | 521 | * @param[in] lang language of the input (reserved for future use) |
535 | * @param[out] brks pointer to the output breaking data, containing | 522 | * @param[out] brks pointer to the output breaking data, containing |
536 | * #WORDBREAK_BREAK, #WORDBREAK_NOBREAK, or | 523 | * #WORDBREAK_BREAK, #WORDBREAK_NOBREAK, or |
537 | * #WORDBREAK_INSIDEACHAR | 524 | * #WORDBREAK_INSIDEACHAR |
@@ -551,7 +538,7 @@ void set_wordbreaks_utf16( | |||
551 | * | 538 | * |
552 | * @param[in] s input UTF-32 string | 539 | * @param[in] s input UTF-32 string |
553 | * @param[in] len length of the input | 540 | * @param[in] len length of the input |
554 | * @param[in] lang language of the input | 541 | * @param[in] lang language of the input (reserved for future use) |
555 | * @param[out] brks pointer to the output breaking data, containing | 542 | * @param[out] brks pointer to the output breaking data, containing |
556 | * #WORDBREAK_BREAK, #WORDBREAK_NOBREAK, or | 543 | * #WORDBREAK_BREAK, #WORDBREAK_NOBREAK, or |
557 | * #WORDBREAK_INSIDEACHAR | 544 | * #WORDBREAK_INSIDEACHAR |
diff --git a/src/static_libs/libunibreak/wordbreak.h b/src/static_libs/libunibreak/wordbreak.h index b9124d7b52..1040c13280 100644 --- a/src/static_libs/libunibreak/wordbreak.h +++ b/src/static_libs/libunibreak/wordbreak.h | |||
@@ -4,7 +4,7 @@ | |||
4 | * Word breaking in a Unicode sequence. Designed to be used in a | 4 | * Word breaking in a Unicode sequence. Designed to be used in a |
5 | * generic text renderer. | 5 | * generic text renderer. |
6 | * | 6 | * |
7 | * Copyright (C) 2013-2015 Tom Hacohen <tom at stosb dot com> | 7 | * Copyright (C) 2013-2016 Tom Hacohen <tom at stosb dot com> |
8 | * | 8 | * |
9 | * This software is provided 'as-is', without any express or implied | 9 | * This software is provided 'as-is', without any express or implied |
10 | * warranty. In no event will the author be held liable for any damages | 10 | * warranty. In no event will the author be held liable for any damages |
@@ -30,9 +30,9 @@ | |||
30 | * Unicode 6.0.0: | 30 | * Unicode 6.0.0: |
31 | * <URL:http://www.unicode.org/reports/tr29/tr29-17.html> | 31 | * <URL:http://www.unicode.org/reports/tr29/tr29-17.html> |
32 | * | 32 | * |
33 | * This library has been updated according to Revision 25, for | 33 | * This library has been updated according to Revision 29, for |
34 | * Unicode 7.0.0: | 34 | * Unicode 9.0.0: |
35 | * <URL:http://www.unicode.org/reports/tr29/tr29-25.html> | 35 | * <URL:http://www.unicode.org/reports/tr29/tr29-29.html> |
36 | * | 36 | * |
37 | * The Unicode Terms of Use are available at | 37 | * The Unicode Terms of Use are available at |
38 | * <URL:http://www.unicode.org/copyright.html> | 38 | * <URL:http://www.unicode.org/copyright.html> |
@@ -43,7 +43,6 @@ | |||
43 | * | 43 | * |
44 | * Header file for the word breaking (segmentation) algorithm. | 44 | * Header file for the word breaking (segmentation) algorithm. |
45 | * | 45 | * |
46 | * @version 3.0, 2015/05/10 | ||
47 | * @author Tom Hacohen | 46 | * @author Tom Hacohen |
48 | */ | 47 | */ |
49 | 48 | ||
diff --git a/src/static_libs/libunibreak/wordbreakdef.h b/src/static_libs/libunibreak/wordbreakdef.h index b00aff33e9..82cd98e7c3 100644 --- a/src/static_libs/libunibreak/wordbreakdef.h +++ b/src/static_libs/libunibreak/wordbreakdef.h | |||
@@ -4,7 +4,7 @@ | |||
4 | * Word breaking in a Unicode sequence. Designed to be used in a | 4 | * Word breaking in a Unicode sequence. Designed to be used in a |
5 | * generic text renderer. | 5 | * generic text renderer. |
6 | * | 6 | * |
7 | * Copyright (C) 2013-15 Tom Hacohen <tom at stosb dot com> | 7 | * Copyright (C) 2013-16 Tom Hacohen <tom at stosb dot com> |
8 | * | 8 | * |
9 | * This software is provided 'as-is', without any express or implied | 9 | * This software is provided 'as-is', without any express or implied |
10 | * warranty. In no event will the author be held liable for any damages | 10 | * warranty. In no event will the author be held liable for any damages |
@@ -30,9 +30,9 @@ | |||
30 | * Unicode 6.0.0: | 30 | * Unicode 6.0.0: |
31 | * <URL:http://www.unicode.org/reports/tr29/tr29-17.html> | 31 | * <URL:http://www.unicode.org/reports/tr29/tr29-17.html> |
32 | * | 32 | * |
33 | * This library has been updated according to Revision 25, for | 33 | * This library has been updated according to Revision 29, for |
34 | * Unicode 7.0.0: | 34 | * Unicode 9.0.0: |
35 | * <URL:http://www.unicode.org/reports/tr29/tr29-25.html> | 35 | * <URL:http://www.unicode.org/reports/tr29/tr29-29.html> |
36 | * | 36 | * |
37 | * The Unicode Terms of Use are available at | 37 | * The Unicode Terms of Use are available at |
38 | * <URL:http://www.unicode.org/copyright.html> | 38 | * <URL:http://www.unicode.org/copyright.html> |
@@ -44,7 +44,6 @@ | |||
44 | * Definitions of internal data structures, declarations of global | 44 | * Definitions of internal data structures, declarations of global |
45 | * variables, and function prototypes for the word breaking algorithm. | 45 | * variables, and function prototypes for the word breaking algorithm. |
46 | * | 46 | * |
47 | * @version 3.0, 2015/05/10 | ||
48 | * @author Tom Hacohen | 47 | * @author Tom Hacohen |
49 | */ | 48 | */ |
50 | 49 | ||
diff --git a/src/tests/evas/evas_test_textblock.c b/src/tests/evas/evas_test_textblock.c index 1f6cb139b2..49f7577374 100644 --- a/src/tests/evas/evas_test_textblock.c +++ b/src/tests/evas/evas_test_textblock.c | |||
@@ -105,8 +105,9 @@ while (0) | |||
105 | EFL_START_TEST(evas_textblock_cursor) | 105 | EFL_START_TEST(evas_textblock_cursor) |
106 | { | 106 | { |
107 | START_TB_TEST(); | 107 | START_TB_TEST(); |
108 | Evas_Textblock_Cursor *cur2; | ||
108 | Evas_Coord x, y, w, h; | 109 | Evas_Coord x, y, w, h; |
109 | size_t i, len; | 110 | size_t i, j, len; |
110 | Evas_Coord nw, nh; | 111 | Evas_Coord nw, nh; |
111 | Evas_BiDi_Direction dir; | 112 | Evas_BiDi_Direction dir; |
112 | const char *buf = "This is a<br/> test.<ps/>Lets see if this works.<ps/>עוד פסקה."; | 113 | const char *buf = "This is a<br/> test.<ps/>Lets see if this works.<ps/>עוד פסקה."; |
@@ -973,6 +974,27 @@ EFL_START_TEST(evas_textblock_cursor) | |||
973 | } | 974 | } |
974 | evas_textblock_cursor_free(cur2); | 975 | evas_textblock_cursor_free(cur2); |
975 | } | 976 | } |
977 | |||
978 | /* Testing for grapheme cluster */ | ||
979 | cur2 = evas_object_textblock_cursor_new(tb); | ||
980 | evas_object_textblock_text_markup_set(tb, "ഹലോ"); | ||
981 | evas_textblock_cursor_pos_set(cur, 0); | ||
982 | evas_textblock_cursor_pos_set(cur2, 0); | ||
983 | |||
984 | i = j = 0; | ||
985 | while (evas_textblock_cursor_cluster_next(cur)) i++; | ||
986 | ck_assert_int_eq(i, 2); | ||
987 | |||
988 | while (evas_textblock_cursor_char_next(cur2)) j++; | ||
989 | ck_assert_int_eq(j, 4); | ||
990 | |||
991 | i = j = 0; | ||
992 | while (evas_textblock_cursor_cluster_prev(cur)) i++; | ||
993 | ck_assert_int_eq(i, 2); | ||
994 | |||
995 | while (evas_textblock_cursor_char_prev(cur2)) j++; | ||
996 | ck_assert_int_eq(j, 4); | ||
997 | |||
976 | END_TB_TEST(); | 998 | END_TB_TEST(); |
977 | } | 999 | } |
978 | EFL_END_TEST | 1000 | EFL_END_TEST |