summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--src/Makefile_Evas.am8
-rw-r--r--src/lib/edje/edje_entry.c51
-rw-r--r--src/lib/efl/interfaces/efl_text_cursor.eo25
-rw-r--r--src/lib/evas/canvas/efl_canvas_text.eo3
-rw-r--r--src/lib/evas/canvas/evas_object_textblock.c276
-rw-r--r--src/lib/evas/canvas/evas_textblock_legacy.h26
-rw-r--r--src/static_libs/libunibreak/ChangeLog92
-rw-r--r--src/static_libs/libunibreak/LICENCE5
-rw-r--r--src/static_libs/libunibreak/NEWS7
-rw-r--r--src/static_libs/libunibreak/README.md14
-rw-r--r--src/static_libs/libunibreak/graphemebreak.c283
-rw-r--r--src/static_libs/libunibreak/graphemebreak.h69
-rw-r--r--src/static_libs/libunibreak/graphemebreakdata.c1337
-rw-r--r--src/static_libs/libunibreak/graphemebreakdef.h82
-rw-r--r--src/static_libs/libunibreak/linebreak.c28
-rw-r--r--src/static_libs/libunibreak/linebreak.h1
-rw-r--r--src/static_libs/libunibreak/linebreakdef.c1
-rw-r--r--src/static_libs/libunibreak/linebreakdef.h1
-rw-r--r--src/static_libs/libunibreak/unibreakbase.c3
-rw-r--r--src/static_libs/libunibreak/unibreakbase.h5
-rw-r--r--src/static_libs/libunibreak/unibreakdef.c3
-rw-r--r--src/static_libs/libunibreak/unibreakdef.h3
-rw-r--r--src/static_libs/libunibreak/wordbreak.c33
-rw-r--r--src/static_libs/libunibreak/wordbreak.h9
-rw-r--r--src/static_libs/libunibreak/wordbreakdef.h9
-rw-r--r--src/tests/evas/evas_test_textblock.c24
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 \
193static_libs/libunibreak/linebreakdef.h \ 193static_libs/libunibreak/linebreakdef.h \
194static_libs/libunibreak/wordbreakdef.h \ 194static_libs/libunibreak/wordbreakdef.h \
195static_libs/libunibreak/wordbreak.h \ 195static_libs/libunibreak/wordbreak.h \
196static_libs/libunibreak/wordbreakdata.c 196static_libs/libunibreak/wordbreakdata.c \
197static_libs/libunibreak/graphemebreak.h \
198static_libs/libunibreak/graphemebreakdef.h \
199static_libs/libunibreak/graphemebreakdata.c
197 200
198# Linebreak 201# Linebreak
199lib_evas_libevas_la_SOURCES = \ 202lib_evas_libevas_la_SOURCES = \
@@ -202,7 +205,8 @@ static_libs/libunibreak/unibreakdef.c \
202static_libs/libunibreak/linebreak.c \ 205static_libs/libunibreak/linebreak.c \
203static_libs/libunibreak/linebreakdata.c \ 206static_libs/libunibreak/linebreakdata.c \
204static_libs/libunibreak/linebreakdef.c \ 207static_libs/libunibreak/linebreakdef.c \
205static_libs/libunibreak/wordbreak.c 208static_libs/libunibreak/wordbreak.c \
209static_libs/libunibreak/graphemebreak.c
206 210
207# Main 211# Main
208lib_evas_libevas_la_SOURCES += \ 212lib_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
2402static Evas_Textblock_Cursor * 2411static 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
4353Eina_Bool 4362Eina_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
9274EAPI Eina_Bool 9275static char *
9275evas_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
9292static 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
9366static 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
9314EOLIAN 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
9322static Eina_Bool 9417static 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
9337EAPI Eina_Bool 9447EAPI Eina_Bool
9448evas_textblock_cursor_char_next(Efl_Text_Cursor_Cursor *cur)
9449{
9450 return _evas_textblock_cursor_next(cur, EINA_FALSE);
9451}
9452
9453EOLIAN 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
9461EAPI Eina_Bool
9338evas_textblock_cursor_char_prev(Efl_Text_Cursor_Cursor *cur) 9462evas_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
9344EOLIAN static void 9467EOLIAN 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
9475EAPI Eina_Bool
9476evas_textblock_cursor_cluster_next(Efl_Text_Cursor_Cursor *cur)
9477{
9478 return _evas_textblock_cursor_next(cur, EINA_TRUE);
9479}
9480
9481EOLIAN 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
9489EAPI Eina_Bool
9490evas_textblock_cursor_cluster_prev(Efl_Text_Cursor_Cursor *cur)
9491{
9492 return _evas_textblock_cursor_prev(cur, EINA_TRUE);
9493}
9494
9495EOLIAN 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
9352EAPI void 9503EAPI 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 12185static Eina_Bool
12035EAPI Eina_Bool 12186_evas_textblock_cursor_coord_set(Evas_Textblock_Cursor *cur, Evas_Coord x, Evas_Coord y, Eina_Bool per_cluster)
12036evas_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
12379EAPI Eina_Bool
12380evas_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
12385EAPI Eina_Bool
12386evas_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
12170EOLIAN static void 12391EOLIAN 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
12399EOLIAN 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
12178EAPI int 12407EAPI int
12179evas_textblock_cursor_line_coord_set(Evas_Textblock_Cursor *cur, Evas_Coord y) 12408evas_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);
605EAPI Eina_Bool evas_textblock_cursor_char_next(Evas_Textblock_Cursor *obj); 605EAPI 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 */
612EAPI 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 */
621EAPI 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 *
860EAPI Eina_Bool evas_textblock_cursor_char_coord_set(Evas_Textblock_Cursor *obj, Evas_Coord x, Evas_Coord y); 876EAPI 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 */
886EAPI 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 @@
12016-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
72016-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
132016-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
192016-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
292016-12-10 Wu Yongwei <wuyongwei@gmail.com>
30
31 * src/Makefile.am (include_HEADERS): Add a missing file
32 graphemebreakdef.h.
33
342016-12-10 Wu Yongwei <wuyongwei@gmail.com>
35
36 * bootstrap: Add a missing `--copy' argument to glibtoolize.
37
382016-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
432016-12-10 Wu Yongwei <wuyongwei@gmail.com>
44
45 * Doxyfile (EXCLUDE): Add `src/tests.c'.
46
472016-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
562016-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
732016-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
812016-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
892016-12-05 Tom Hacohen <tom@stosb.com>
90
91 * src/test_skips.h: New file.
92
12016-12-04 Wu Yongwei <wuyongwei@gmail.com> 932016-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 @@
1Copyright (C) 2008-2015 Wu Yongwei <wuyongwei at gmail dot com> 1Copyright (C) 2008-2016 Wu Yongwei <wuyongwei at gmail dot com>
2Copyright (C) 2012-2015 Tom Hacohen <tom at stosb dot com> 2Copyright (C) 2012-2016 Tom Hacohen <tom at stosb dot com>
3Copyright (C) 2013 Petr Filipsky <philodej at gmail dot com> 3Copyright (C) 2013 Petr Filipsky <philodej at gmail dot com>
4Copyright (C) 2016 Andreas Röver <roever at users dot sf dot net>
4 5
5This software is provided 'as-is', without any express or implied 6This software is provided 'as-is', without any express or implied
6warranty. In no event will the author be held liable for any damages 7warranty. 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 @@
1New 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
1New in libunibreak 3.0 8New 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
9Annex 14] [1] and [Unicode Standard Annex 29] [2]. Check the project's 9Annex 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
502. On systems where GCC and Binutils are supported, one can type 522. 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
653. On Windows, apart from using method 1 (Cygwin/MSYS) and method 2 693. 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:
77Documentation 81Documentation
78------------- 82-------------
79 83
80Check the generated document *doc/html/linebreak\_8h.html* and 84Check 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
82interfaces exposed to applications. 86the 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
45typedef 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 */
63void 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 */
73static 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 */
103static 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 */
235void 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 */
256void 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 */
277void 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
50extern "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
57void init_graphemebreak(void);
58void set_graphemebreaks_utf8(const utf8_t *s, size_t len, const char *lang,
59 char *brks);
60void set_graphemebreaks_utf16(const utf16_t *s, size_t len,
61 const char *lang, char *brks);
62void 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
8static 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 */
50enum 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 */
77struct 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 */
73enum BreakAction 72enum 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 */
86static enum BreakAction baTable[LBP_CB][LBP_CB] = { 85static enum BreakAction baTable[LBP_CB][LBP_CB] = {
87 { /* OP */ 86 { /* OP */
@@ -313,11 +312,12 @@ static struct LineBreakPropertiesIndex lb_prop_index[LINEBREAK_INDEX_SIZE] =
313static __inline int ends_with(const char *str, const char *suffix, 312static __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 */
770void set_linebreaks_utf8( 788void 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 */
790void set_linebreaks_utf16( 809void 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 */
810void set_linebreaks_utf32( 830void 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 @@
40extern "C" { 39extern "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 */
44extern const int unibreak_version; 43extern 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)
105EFL_START_TEST(evas_textblock_cursor) 105EFL_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}
978EFL_END_TEST 1000EFL_END_TEST