From f82e15ed5e804674132a717b3329b926a4436753 Mon Sep 17 00:00:00 2001 From: Vincent Wei Date: Sun, 10 Mar 2019 18:08:53 +0800 Subject: [PATCH] use iso8859-bidi-tables --- src/font/Makefile.am | 1 + src/font/charset-arabic.c | 11 +- src/font/charset.c | 15 ++- src/font/iso8859-bidi-tables.inc | 85 ++++++++++++++ src/font/utils/gen-iso8859-bidi-tables.py | 128 ++++++++++++++++++++++ 5 files changed, 236 insertions(+), 4 deletions(-) create mode 100644 src/font/iso8859-bidi-tables.inc create mode 100755 src/font/utils/gen-iso8859-bidi-tables.py diff --git a/src/font/Makefile.am b/src/font/Makefile.am index c5154f84..25e77999 100644 --- a/src/font/Makefile.am +++ b/src/font/Makefile.am @@ -20,6 +20,7 @@ HDR_FILES = charset.h rawbitmap.h varbitmap.h freetype2.h qpf.h se_minigui.h \ unicode-tables.h unicode-break-tables.h unicode-script-table.h \ unicode-decomp.h unicode-comp.h \ unicode-emoji-tables.h \ + iso8859-bidi-tables.inc \ mgbidi.h \ mgbidi-bidi-types-list.inc \ mgbidi-joining-types-list.inc \ diff --git a/src/font/charset-arabic.c b/src/font/charset-arabic.c index 76fc9e8b..09cbee5d 100644 --- a/src/font/charset-arabic.c +++ b/src/font/charset-arabic.c @@ -470,7 +470,8 @@ static unsigned int iso8859_6_char_type (Achar32 chv) return ch_type; } -static Uint16 __mg_iso8859_68x_type[] = { +static BidiType __mg_iso8859_6_bidi_char_type_map[] = { +#if 0 /*0x00~0x0f*/ BIDI_TYPE_BN, BIDI_TYPE_BN, BIDI_TYPE_BN, BIDI_TYPE_BN, BIDI_TYPE_BN, BIDI_TYPE_BN, BIDI_TYPE_BN, BIDI_TYPE_BN, @@ -506,6 +507,7 @@ static Uint16 __mg_iso8859_68x_type[] = { BIDI_TYPE_LTR, BIDI_TYPE_LTR, BIDI_TYPE_LTR, BIDI_TYPE_LTR, BIDI_TYPE_LTR, BIDI_TYPE_LTR, BIDI_TYPE_LTR, BIDI_TYPE_ON, BIDI_TYPE_ON, BIDI_TYPE_ON, BIDI_TYPE_ON, BIDI_TYPE_ON, + /*0x60~0x6f*/ BIDI_TYPE_ON, BIDI_TYPE_LTR, BIDI_TYPE_LTR, BIDI_TYPE_LTR, BIDI_TYPE_LTR, BIDI_TYPE_LTR, BIDI_TYPE_LTR, BIDI_TYPE_LTR, @@ -517,6 +519,7 @@ static Uint16 __mg_iso8859_68x_type[] = { BIDI_TYPE_LTR, BIDI_TYPE_LTR, BIDI_TYPE_LTR, BIDI_TYPE_LTR, BIDI_TYPE_LTR, BIDI_TYPE_LTR, BIDI_TYPE_LTR, BIDI_TYPE_ON, BIDI_TYPE_ON, BIDI_TYPE_ON, BIDI_TYPE_ON, BIDI_TYPE_BN, +#endif /*0x80~0x8f*/ BIDI_TYPE_ON, BIDI_TYPE_AL, BIDI_TYPE_AL, BIDI_TYPE_AL, @@ -590,7 +593,11 @@ static Uint16 __mg_iso8859_68x_type[] = { static BidiType iso8859_6_bidi_char_type (Achar32 chv) { - return (BidiType)__mg_iso8859_68x_type[REAL_ACHAR(chv)]; + chv = REAL_ACHAR(chv); + if (chv > 0x7F) + return (BidiType)__mg_iso8859_6_bidi_char_type_map[chv - 0x80]; + else + return (BidiType)__mg_iso8859_1_bidi_char_type_map[chv]; } static int get_table_index(Uint8 c) diff --git a/src/font/charset.c b/src/font/charset.c index fd51f9c6..e23d3849 100644 --- a/src/font/charset.c +++ b/src/font/charset.c @@ -731,6 +731,10 @@ static CHARSETOPS CharsetOps_iso8859_5 = { #endif /* _CYRILLIC */ +#if defined (_MGCHARSET_HEBREW) || defined (_MGCHARSET_ARABIC) +#include "iso8859-bidi-tables.inc" +#endif + #if defined (_MGCHARSET_HEBREW) || defined (_MGCHARSET_ARABIC) || defined (_MGCHARSET_UNICODE) #include "bidi.h" @@ -948,7 +952,8 @@ static const unsigned char* iso8859_8_get_next_word (const unsigned char* mstr, //return sb_get_next_word(mstr, mstrlen, word_info); } -static Uint16 __mg_iso8859_8_type[] = { +static BidiType __mg_iso8859_8_bidi_char_type_map[] = { +#if 0 /*0x00~0x0f*/ BIDI_TYPE_BN, BIDI_TYPE_BN, BIDI_TYPE_BN, BIDI_TYPE_BN, BIDI_TYPE_BN, BIDI_TYPE_BN, BIDI_TYPE_BN, BIDI_TYPE_BN, @@ -984,6 +989,7 @@ static Uint16 __mg_iso8859_8_type[] = { BIDI_TYPE_LTR, BIDI_TYPE_LTR, BIDI_TYPE_LTR, BIDI_TYPE_LTR, BIDI_TYPE_LTR, BIDI_TYPE_LTR, BIDI_TYPE_LTR, BIDI_TYPE_ON, BIDI_TYPE_ON, BIDI_TYPE_ON, BIDI_TYPE_ON, BIDI_TYPE_ON, + /*0x60~0x6f*/ BIDI_TYPE_ON, BIDI_TYPE_LTR, BIDI_TYPE_LTR, BIDI_TYPE_LTR, BIDI_TYPE_LTR, BIDI_TYPE_LTR, BIDI_TYPE_LTR, BIDI_TYPE_LTR, @@ -995,6 +1001,7 @@ static Uint16 __mg_iso8859_8_type[] = { BIDI_TYPE_LTR, BIDI_TYPE_LTR, BIDI_TYPE_LTR, BIDI_TYPE_LTR, BIDI_TYPE_LTR, BIDI_TYPE_LTR, BIDI_TYPE_LTR, BIDI_TYPE_ON, BIDI_TYPE_ON, BIDI_TYPE_ON, BIDI_TYPE_ON, BIDI_TYPE_BN, +#endif /*0x80~0x8f*/ BIDI_TYPE_BN, BIDI_TYPE_BN, BIDI_TYPE_BN, BIDI_TYPE_BN, @@ -1048,7 +1055,11 @@ static Uint16 __mg_iso8859_8_type[] = { static BidiType iso8859_8_bidi_char_type (Achar32 chv) { - return (BidiType)__mg_iso8859_8_type [REAL_ACHAR(chv)]; + chv = REAL_ACHAR(chv); + if (chv > 0x7F) + return (BidiType)__mg_iso8859_8_bidi_char_type_map[chv - 0x80]; + else + return (BidiType)__mg_iso8859_1_bidi_char_type_map[chv]; } static const BIDICHAR_MIRROR_MAP __mg_iso8859_8_mirror_table [] = diff --git a/src/font/iso8859-bidi-tables.inc b/src/font/iso8859-bidi-tables.inc new file mode 100644 index 00000000..7bc3a572 --- /dev/null +++ b/src/font/iso8859-bidi-tables.inc @@ -0,0 +1,85 @@ +/* == Start of generated table == */ +/* + * The following table is generated by running: + * + * ./gen-ascii-bidi-tables.py + * + * on ucd/UnicodeData.txt files with these headers: + * + * UnicodeData.txt does not have a header. + */ + +#ifndef _MGFONT_ISO8859_BIDI_TABLES_H +#define _MGFONT_ISO8859_BIDI_TABLES_H + +static const BidiType __mg_iso8859_1_bidi_char_type_map[] = +{ + BIDI_TYPE_BN, BIDI_TYPE_BN, BIDI_TYPE_BN, BIDI_TYPE_BN, + BIDI_TYPE_BN, BIDI_TYPE_BN, BIDI_TYPE_BN, BIDI_TYPE_BN, + BIDI_TYPE_BN, BIDI_TYPE_SS, BIDI_TYPE_BS, BIDI_TYPE_SS, + BIDI_TYPE_WS, BIDI_TYPE_BS, BIDI_TYPE_BN, BIDI_TYPE_BN, + BIDI_TYPE_BN, BIDI_TYPE_BN, BIDI_TYPE_BN, BIDI_TYPE_BN, + BIDI_TYPE_BN, BIDI_TYPE_BN, BIDI_TYPE_BN, BIDI_TYPE_BN, + BIDI_TYPE_BN, BIDI_TYPE_BN, BIDI_TYPE_BN, BIDI_TYPE_BN, + BIDI_TYPE_BS, BIDI_TYPE_BS, BIDI_TYPE_BS, BIDI_TYPE_SS, + BIDI_TYPE_WS, BIDI_TYPE_ON, BIDI_TYPE_ON, BIDI_TYPE_ET, + BIDI_TYPE_ET, BIDI_TYPE_ET, BIDI_TYPE_ON, BIDI_TYPE_ON, + BIDI_TYPE_ON, BIDI_TYPE_ON, BIDI_TYPE_ON, BIDI_TYPE_ES, + BIDI_TYPE_CS, BIDI_TYPE_ES, BIDI_TYPE_CS, BIDI_TYPE_CS, + BIDI_TYPE_EN, BIDI_TYPE_EN, BIDI_TYPE_EN, BIDI_TYPE_EN, + BIDI_TYPE_EN, BIDI_TYPE_EN, BIDI_TYPE_EN, BIDI_TYPE_EN, + BIDI_TYPE_EN, BIDI_TYPE_EN, BIDI_TYPE_CS, BIDI_TYPE_ON, + BIDI_TYPE_ON, BIDI_TYPE_ON, BIDI_TYPE_ON, BIDI_TYPE_ON, + BIDI_TYPE_ON, BIDI_TYPE_LTR, BIDI_TYPE_LTR, BIDI_TYPE_LTR, + BIDI_TYPE_LTR, BIDI_TYPE_LTR, BIDI_TYPE_LTR, BIDI_TYPE_LTR, + BIDI_TYPE_LTR, BIDI_TYPE_LTR, BIDI_TYPE_LTR, BIDI_TYPE_LTR, + BIDI_TYPE_LTR, BIDI_TYPE_LTR, BIDI_TYPE_LTR, BIDI_TYPE_LTR, + BIDI_TYPE_LTR, BIDI_TYPE_LTR, BIDI_TYPE_LTR, BIDI_TYPE_LTR, + BIDI_TYPE_LTR, BIDI_TYPE_LTR, BIDI_TYPE_LTR, BIDI_TYPE_LTR, + BIDI_TYPE_LTR, BIDI_TYPE_LTR, BIDI_TYPE_LTR, BIDI_TYPE_ON, + BIDI_TYPE_ON, BIDI_TYPE_ON, BIDI_TYPE_ON, BIDI_TYPE_ON, + BIDI_TYPE_ON, BIDI_TYPE_LTR, BIDI_TYPE_LTR, BIDI_TYPE_LTR, + BIDI_TYPE_LTR, BIDI_TYPE_LTR, BIDI_TYPE_LTR, BIDI_TYPE_LTR, + BIDI_TYPE_LTR, BIDI_TYPE_LTR, BIDI_TYPE_LTR, BIDI_TYPE_LTR, + BIDI_TYPE_LTR, BIDI_TYPE_LTR, BIDI_TYPE_LTR, BIDI_TYPE_LTR, + BIDI_TYPE_LTR, BIDI_TYPE_LTR, BIDI_TYPE_LTR, BIDI_TYPE_LTR, + BIDI_TYPE_LTR, BIDI_TYPE_LTR, BIDI_TYPE_LTR, BIDI_TYPE_LTR, + BIDI_TYPE_LTR, BIDI_TYPE_LTR, BIDI_TYPE_LTR, BIDI_TYPE_ON, + BIDI_TYPE_ON, BIDI_TYPE_ON, BIDI_TYPE_ON, BIDI_TYPE_BN, + BIDI_TYPE_BN, BIDI_TYPE_BN, BIDI_TYPE_BN, BIDI_TYPE_BN, + BIDI_TYPE_BN, BIDI_TYPE_BS, BIDI_TYPE_BN, BIDI_TYPE_BN, + BIDI_TYPE_BN, BIDI_TYPE_BN, BIDI_TYPE_BN, BIDI_TYPE_BN, + BIDI_TYPE_BN, BIDI_TYPE_BN, BIDI_TYPE_BN, BIDI_TYPE_BN, + BIDI_TYPE_BN, BIDI_TYPE_BN, BIDI_TYPE_BN, BIDI_TYPE_BN, + BIDI_TYPE_BN, BIDI_TYPE_BN, BIDI_TYPE_BN, BIDI_TYPE_BN, + BIDI_TYPE_BN, BIDI_TYPE_BN, BIDI_TYPE_BN, BIDI_TYPE_BN, + BIDI_TYPE_BN, BIDI_TYPE_BN, BIDI_TYPE_BN, BIDI_TYPE_BN, + BIDI_TYPE_CS, BIDI_TYPE_ON, BIDI_TYPE_ET, BIDI_TYPE_ET, + BIDI_TYPE_ET, BIDI_TYPE_ET, BIDI_TYPE_ON, BIDI_TYPE_ON, + BIDI_TYPE_ON, BIDI_TYPE_ON, BIDI_TYPE_LTR, BIDI_TYPE_ON, + BIDI_TYPE_ON, BIDI_TYPE_BN, BIDI_TYPE_ON, BIDI_TYPE_ON, + BIDI_TYPE_ET, BIDI_TYPE_ET, BIDI_TYPE_EN, BIDI_TYPE_EN, + BIDI_TYPE_ON, BIDI_TYPE_LTR, BIDI_TYPE_ON, BIDI_TYPE_ON, + BIDI_TYPE_ON, BIDI_TYPE_EN, BIDI_TYPE_LTR, BIDI_TYPE_ON, + BIDI_TYPE_ON, BIDI_TYPE_ON, BIDI_TYPE_ON, BIDI_TYPE_ON, + BIDI_TYPE_LTR, BIDI_TYPE_LTR, BIDI_TYPE_LTR, BIDI_TYPE_LTR, + BIDI_TYPE_LTR, BIDI_TYPE_LTR, BIDI_TYPE_LTR, BIDI_TYPE_LTR, + BIDI_TYPE_LTR, BIDI_TYPE_LTR, BIDI_TYPE_LTR, BIDI_TYPE_LTR, + BIDI_TYPE_LTR, BIDI_TYPE_LTR, BIDI_TYPE_LTR, BIDI_TYPE_LTR, + BIDI_TYPE_LTR, BIDI_TYPE_LTR, BIDI_TYPE_LTR, BIDI_TYPE_LTR, + BIDI_TYPE_LTR, BIDI_TYPE_LTR, BIDI_TYPE_LTR, BIDI_TYPE_ON, + BIDI_TYPE_LTR, BIDI_TYPE_LTR, BIDI_TYPE_LTR, BIDI_TYPE_LTR, + BIDI_TYPE_LTR, BIDI_TYPE_LTR, BIDI_TYPE_LTR, BIDI_TYPE_LTR, + BIDI_TYPE_LTR, BIDI_TYPE_LTR, BIDI_TYPE_LTR, BIDI_TYPE_LTR, + BIDI_TYPE_LTR, BIDI_TYPE_LTR, BIDI_TYPE_LTR, BIDI_TYPE_LTR, + BIDI_TYPE_LTR, BIDI_TYPE_LTR, BIDI_TYPE_LTR, BIDI_TYPE_LTR, + BIDI_TYPE_LTR, BIDI_TYPE_LTR, BIDI_TYPE_LTR, BIDI_TYPE_LTR, + BIDI_TYPE_LTR, BIDI_TYPE_LTR, BIDI_TYPE_LTR, BIDI_TYPE_LTR, + BIDI_TYPE_LTR, BIDI_TYPE_LTR, BIDI_TYPE_LTR, BIDI_TYPE_ON, + BIDI_TYPE_LTR, BIDI_TYPE_LTR, BIDI_TYPE_LTR, BIDI_TYPE_LTR, + BIDI_TYPE_LTR, BIDI_TYPE_LTR, BIDI_TYPE_LTR, BIDI_TYPE_LTR, +}; + +#endif /* !_MGFONT_ISO8859_BIDI_TABLES_H */ + +/* == End of generated table == */ diff --git a/src/font/utils/gen-iso8859-bidi-tables.py b/src/font/utils/gen-iso8859-bidi-tables.py new file mode 100755 index 00000000..8f2ff1d5 --- /dev/null +++ b/src/font/utils/gen-iso8859-bidi-tables.py @@ -0,0 +1,128 @@ +#!/usr/bin/env python + +# Wrotten by Vincent Wei for MiniGUI 3.4 +# Create on 2019-03-07 + +from __future__ import print_function, division, absolute_import + +import io, sys + +CHAR_STOP = 0xFF +NR_UNICODE_CHARS = CHAR_STOP + 1 + +#if len (sys.argv) != 4: +# print ("usage: ./gen-sbc-bidi-tables.py", file=sys.stderr) +# sys.exit (1) + +filenames = ['ucd/UnicodeData.txt'] + +files = [io.open (x, encoding='utf-8') for x in filenames] + +headers = [] +headers.insert (0, ["UnicodeData.txt does not have a header."]) + +# Read fileds[] in UnicodeData.txt to data + +data = [{} for f in files] +for i, f in enumerate (files): + for line in f: + + j = line.find ('#') + if j >= 0: + line = line[:j] + + fields = [x.strip () for x in line.split (';')] + if len (fields) == 1: + continue + + u = int (fields[0], 16) + if u > CHAR_STOP: + break; + + data[i][u] = fields[4] + +bidi_types = ["BIDI_TYPE_LTR" for i in range(0, NR_UNICODE_CHARS)] + +# Fill bidi_types +d = data[0] +for u, v in d.items(): + v = v.strip() + if cmp(v, 'L') == 0: + bidi_types[u] = 'BIDI_TYPE_LTR' + elif cmp(v, 'R') == 0: + bidi_types[u] = 'BIDI_TYPE_RTL' + elif cmp(v, 'EN') == 0: + bidi_types[u] = 'BIDI_TYPE_EN' + elif cmp(v, 'ES') == 0: + bidi_types[u] = 'BIDI_TYPE_ES' + elif cmp(v, 'ET') == 0: + bidi_types[u] = 'BIDI_TYPE_ET' + elif cmp(v, 'AN') == 0: + bidi_types[u] = 'BIDI_TYPE_AN' + elif cmp(v, 'CS') == 0: + bidi_types[u] = 'BIDI_TYPE_CS' + elif cmp(v, 'B') == 0: + bidi_types[u] = 'BIDI_TYPE_BS' + elif cmp(v, 'S') == 0: + bidi_types[u] = 'BIDI_TYPE_SS' + elif cmp(v, 'WS') == 0: + bidi_types[u] = 'BIDI_TYPE_WS' + elif cmp(v, 'ON') == 0: + bidi_types[u] = 'BIDI_TYPE_ON' + elif cmp(v, 'BN') == 0: + bidi_types[u] = 'BIDI_TYPE_BN' + elif cmp(v, 'NSM') == 0: + bidi_types[u] = 'BIDI_TYPE_NSM' + elif cmp(v, 'AL') == 0: + bidi_types[u] = 'BIDI_TYPE_AL' + elif cmp(v, 'LRO') == 0: + bidi_types[u] = 'BIDI_TYPE_LRO' + elif cmp(v, 'RLO') == 0: + bidi_types[u] = 'BIDI_TYPE_RLO' + elif cmp(v, 'LRE') == 0: + bidi_types[u] = 'BIDI_TYPE_LRE' + elif cmp(v, 'RLE') == 0: + bidi_types[u] = 'BIDI_TYPE_RLE' + elif cmp(v, 'PDF') == 0: + bidi_types[u] = 'BIDI_TYPE_PDF' + elif cmp(v, 'LRI') == 0: + bidi_types[u] = 'BIDI_TYPE_LRI' + elif cmp(v, 'RLI') == 0: + bidi_types[u] = 'BIDI_TYPE_RLI' + elif cmp(v, 'FSI') == 0: + bidi_types[u] = 'BIDI_TYPE_FSI' + elif cmp(v, 'PDI') == 0: + bidi_types[u] = 'BIDI_TYPE_PDI' + else: + print ("Unknown BIDI type: %s" % v) + +print ("/* == Start of generated table == */") +print ("/*") +print (" * The following table is generated by running:") +print (" *") +print (" * ./gen-ascii-bidi-tables.py") +print (" *") +print (" * on ucd/UnicodeData.txt files with these headers:") +print (" *") +for h in headers: + for l in h: + print (" * %s" % (l.strip())) +print (" */") +print () + +print ("#ifndef _MGFONT_ISO8859_BIDI_TABLES_H") +print ("#define _MGFONT_ISO8859_BIDI_TABLES_H") +print ("") +print ("static const BidiType __mg_iso8859_1_bidi_char_type_map[] =") +print ("{") + +for i in range(0, 0x100, 4): + print (" %s, %s, %s, %s," % (bidi_types[i], bidi_types[i + 1], bidi_types[i + 2], bidi_types[i + 3], )) + +print ("};") +print () +print ("#endif /* !_MGFONT_ISO8859_BIDI_TABLES_H */") + +print () +print ("/* == End of generated table == */") +