From a4e8a4270741794c27c76c26993482c58e977d98 Mon Sep 17 00:00:00 2001 From: Vincent Wei Date: Tue, 12 Mar 2019 17:52:06 +0800 Subject: [PATCH] cleanup --- include/gdi.h | 164 +++++++++++++++++++- src/font/charset-unicode.c | 52 ++++--- src/font/charset.c | 4 +- src/font/unicode-bidi-tables.h | 246 +++++++++++++++--------------- src/font/unicode-bidi.h | 140 ----------------- src/font/unicode-shape-arabic.c | 14 +- src/font/utils/gen-bidi-tables.py | 12 +- src/include/bidi.h | 6 +- src/newgdi/shaped-glyph.c | 203 +++++++++++++++++++++++- 9 files changed, 530 insertions(+), 311 deletions(-) diff --git a/include/gdi.h b/include/gdi.h index 54cc99e3..b2625b58 100644 --- a/include/gdi.h +++ b/include/gdi.h @@ -7885,6 +7885,146 @@ typedef Uint8 BidiArabicProp; #define BIDI_PGDIR_RTL BIDI_TYPE_RTL #define BIDI_PGDIR_ON BIDI_TYPE_ON +/* + * Define bit masks that joining types are based on, each mask has + * only one bit set. + */ +#define BIDI_MASK_JOINS_RIGHT 0x01 /* May join to right */ +#define BIDI_MASK_JOINS_LEFT 0x02 /* May join to right */ +#define BIDI_MASK_ARAB_SHAPES 0x04 /* May Arabic shape */ +#define BIDI_MASK_TRANSPARENT 0x08 /* Is transparent */ +#define BIDI_MASK_IGNORED 0x10 /* Is ignored */ +#define BIDI_MASK_LIGATURED 0x20 /* Is ligatured */ + +/* + * Define values for BidiJoiningType + */ + +/* nUn-joining */ +#define BIDI_JOINING_TYPE_U_VAL ( 0 ) + +/* Right-joining */ +#define BIDI_JOINING_TYPE_R_VAL \ + ( BIDI_MASK_JOINS_RIGHT | BIDI_MASK_ARAB_SHAPES ) + +/* Dual-joining */ +#define BIDI_JOINING_TYPE_D_VAL \ + ( BIDI_MASK_JOINS_RIGHT | BIDI_MASK_JOINS_LEFT \ + | BIDI_MASK_ARAB_SHAPES ) + +/* join-Causing */ +#define BIDI_JOINING_TYPE_C_VAL \ + ( BIDI_MASK_JOINS_RIGHT | BIDI_MASK_JOINS_LEFT ) + +/* Left-joining */ +#define BIDI_JOINING_TYPE_L_VAL \ + ( BIDI_MASK_JOINS_LEFT | BIDI_MASK_ARAB_SHAPES ) + +/* Transparent */ +#define BIDI_JOINING_TYPE_T_VAL \ + ( BIDI_MASK_TRANSPARENT | BIDI_MASK_ARAB_SHAPES ) + +/* iGnored */ +#define BIDI_JOINING_TYPE_G_VAL ( BIDI_MASK_IGNORED ) + +/* + * The equivalent of JoiningType values for ArabicProp + */ + +/* Primary Arabic Joining Classes (Table 8-2) */ + +/* nUn-joining */ +#define BIDI_IS_JOINING_TYPE_U(p) \ + ( 0 == ( (p) & \ + ( BIDI_MASK_TRANSPARENT | BIDI_MASK_IGNORED \ + | BIDI_MASK_JOINS_RIGHT | BIDI_MASK_JOINS_LEFT ) ) ) + +/* Right-joining */ +#define BIDI_IS_JOINING_TYPE_R(p) \ + ( BIDI_MASK_JOINS_RIGHT == ( (p) & \ + ( BIDI_MASK_TRANSPARENT | BIDI_MASK_IGNORED \ + | BIDI_MASK_JOINS_RIGHT | BIDI_MASK_JOINS_LEFT ) ) ) + +/* Dual-joining */ +#define BIDI_IS_JOINING_TYPE_D(p) \ + ( ( BIDI_MASK_JOINS_RIGHT | BIDI_MASK_JOINS_LEFT \ + | BIDI_MASK_ARAB_SHAPES ) == ( (p) & \ + ( BIDI_MASK_TRANSPARENT | BIDI_MASK_IGNORED \ + | BIDI_MASK_JOINS_RIGHT | BIDI_MASK_JOINS_LEFT \ + | BIDI_MASK_ARAB_SHAPES ) ) ) + +/* join-Causing */ +#define BIDI_IS_JOINING_TYPE_C(p) \ + ( ( BIDI_MASK_JOINS_RIGHT | BIDI_MASK_JOINS_LEFT ) == ( (p) & \ + ( BIDI_MASK_TRANSPARENT | BIDI_MASK_IGNORED \ + | BIDI_MASK_JOINS_RIGHT | BIDI_MASK_JOINS_LEFT \ + | BIDI_MASK_ARAB_SHAPES ) ) ) + +/* Left-joining */ +#define BIDI_IS_JOINING_TYPE_L(p) \ + ( BIDI_MASK_JOINS_LEFT == ( (p) & \ + ( BIDI_MASK_TRANSPARENT | BIDI_MASK_IGNORED \ + | BIDI_MASK_JOINS_RIGHT | BIDI_MASK_JOINS_LEFT ) ) ) + +/* Transparent */ +#define BIDI_IS_JOINING_TYPE_T(p) \ + ( BIDI_MASK_TRANSPARENT == ( (p) & \ + ( BIDI_MASK_TRANSPARENT | BIDI_MASK_IGNORED ) ) ) + +/* iGnored */ +#define BIDI_IS_JOINING_TYPE_G(p) \ + ( BIDI_MASK_IGNORED == ( (p) & \ + ( BIDI_MASK_TRANSPARENT | BIDI_MASK_IGNORED ) ) ) + +/* and for Derived Arabic Joining Classes (Table 8-3) */ + +/* Right join-Causing */ +#define BIDI_IS_JOINING_TYPE_RC(p) \ + ( BIDI_MASK_JOINS_RIGHT == ( (p) & \ + ( BIDI_MASK_TRANSPARENT | BIDI_MASK_IGNORED \ + | BIDI_MASK_JOINS_RIGHT ) ) ) + +/* Left join-Causing */ +#define BIDI_IS_JOINING_TYPE_LC(p) \ + ( BIDI_MASK_JOINS_LEFT == ( (p) & \ + ( BIDI_MASK_TRANSPARENT | BIDI_MASK_IGNORED \ + | BIDI_MASK_JOINS_LEFT ) ) ) + +/* + * Defining macros for needed queries, It is fully dependent on the + * implementation of BidiJoiningType. + */ + +/* Joins to right: R, D, C? */ +#define BIDI_JOINS_RIGHT(p) ((p) & BIDI_MASK_JOINS_RIGHT) + +/* Joins to left: L, D, C? */ +#define BIDI_JOINS_LEFT(p) ((p) & BIDI_MASK_JOINS_LEFT) + +/* May shape: R, D, L, T? */ +#define BIDI_ARAB_SHAPES(p) ((p) & BIDI_MASK_ARAB_SHAPES) + +/* Is skipped in joining: T, G? */ +#define BIDI_IS_JOIN_SKIPPED(p) \ + ((p) & (BIDI_MASK_TRANSPARENT | BIDI_MASK_IGNORED)) + +/* Is base that will be shaped: R, D, L? */ +#define BIDI_IS_JOIN_BASE_SHAPES(p) \ + ( BIDI_MASK_ARAB_SHAPES == ( (p) & \ + ( BIDI_MASK_TRANSPARENT | BIDI_MASK_IGNORED \ + | BIDI_MASK_ARAB_SHAPES ) ) ) + +#define BIDI_JOINS_PRECEDING_MASK(level) \ + (BIDI_LEVEL_IS_RTL (level) ? BIDI_MASK_JOINS_RIGHT \ + : BIDI_MASK_JOINS_LEFT) + +#define BIDI_JOINS_FOLLOWING_MASK(level) \ + (BIDI_LEVEL_IS_RTL (level) ? BIDI_MASK_JOINS_LEFT \ + : BIDI_MASK_JOINS_RIGHT) + +#define BIDI_JOIN_SHAPE(p) \ + ((p) & ( BIDI_MASK_JOINS_RIGHT | BIDI_MASK_JOINS_LEFT )) + /** @} end of bidi_types */ #ifdef _MGCHARSET_UNICODE @@ -12054,7 +12194,7 @@ typedef struct _SHAPEDGLYPH { * LanguageCode content_language, UCharScriptType writing_system, * const Uchar32* logical_ucs, int nr_ucs, * Uint16* break_oppos, SHAPEDGLYPH* visual_glyphs, - * int* pos_l2v, int* nr_glyphs) + * BidiType *paragraph_dir, int* pos_l2v, int* nr_glyphs) * \brief Analyse and generate a shaped glyph string of a Unicode string under * specific content language and script. * @@ -12069,7 +12209,7 @@ typedef struct _SHAPEDGLYPH { * The shaping process includes: * * - Shaping (substituting) glyphs. - * - Assigning the breaking opportunities to glyphs. + * - Tailoring and assigning the breaking opportunities to glyphs. * - Re-ordering glyphs. * - Positioning glyphs. * @@ -12094,6 +12234,7 @@ typedef struct _SHAPEDGLYPH { * writing systems. * \param visual_glyphs The pointer to the buffer to store the generated * shaped visual glyph array. + * \param paragraph_dir The specified and resolved paragraph base direction. * \param pos_l2v The pointer to an int array which will store the map from * the positions in the logical Uchar32 string to the positions in * the visual shaped glyphs; can be NULL. @@ -12103,21 +12244,26 @@ typedef struct _SHAPEDGLYPH { * * \note Only available when support for UNICODE is enabled. * + * \note This function assumes that you passed one line (one paragraph) of + * the logical Unicode string. Therefore, you need to call this function + * after calling GetUCharsAndBreaks. + * * \sa GetUCharsAndBreaks, GetShapedGlyphsComplex, SHAPEDGLYPH, + * UBidiReorderLine, bidi_types, * GetGlyphsExtentInfo, GetGlyphsPositionInfo, DrawShapedGlyphString */ MG_EXPORT int GUIAPI GetShapedGlyphsBasic(LOGFONT* logfont, LanguageCode content_language, UCharScriptType writing_system, const Uchar32* logical_ucs, int nr_ucs, Uint16* break_oppos, SHAPEDGLYPH* visual_glyphs, - int* pos_l2v, int* nr_glyphs); + BidiType *paragraph_dir, int* pos_l2v, int* nr_glyphs); /** * \fn int GUIAPI GetShapedGlyphsComplex(LOGFONT* logfont, * LanguageCode content_language, UCharScriptType writing_system, * const Uchar32* logical_ucs, int nr_ucs, * Uint16* break_oppos, SHAPEDGLYPH* visual_glyphs, - * int* pos_l2v, int* nr_glyphs); + * BidiType *paragraph_dir, int* pos_l2v, int* nr_glyphs); * \brief Analyse and generate a shaped glyph string of a Unicode string under * specific content language and script. * @@ -12157,6 +12303,7 @@ MG_EXPORT int GUIAPI GetShapedGlyphsBasic(LOGFONT* logfont, * writing systems. * \param visual_glyphs The pointer to the buffer to store the generated * shaped visual glyph array. + * \param paragraph_dir The specified and resolved paragraph base direction. * \param pos_l2v The pointer to an int array which will store the map from * the positions in the logical Uchar32 string to the positions in * the visual shaped glyphs; can be NULL. @@ -12166,14 +12313,19 @@ MG_EXPORT int GUIAPI GetShapedGlyphsBasic(LOGFONT* logfont, * * \note Only available when support for UNICODE is enabled. * - * \sa GetUCharsAndBreaks, GetShapedGlyphsBasic, SHAPEDGLYPH + * \note This function assumes that you passed one line (one paragraph) of + * the logical Unicode string. Therefore, you need to call this function + * after calling GetUCharsAndBreaks. + * + * \sa GetUCharsAndBreaks, GetShapedGlyphsBasic, SHAPEDGLYPH, + * UBidiReorderLine, bidi_types, * GetGlyphsExtentInfo, GetGlyphsPositionInfo, DrawShapedGlyphString */ MG_EXPORT int GUIAPI GetShapedGlyphsComplex(LOGFONT* logfont, LanguageCode content_language, UCharScriptType writing_system, const Uchar32* logical_ucs, int nr_ucs, Uint16* break_oppos, SHAPEDGLYPH* visual_glyphs, - int* pos_l2v, int* nr_glyphs); + BidiType *paragraph_dir, int* pos_l2v, int* nr_glyphs); #define GLYPH_ORIENTATION_UPRIGHT 0 #define GLYPH_ORIENTATION_SIDEWAYS 1 diff --git a/src/font/charset-unicode.c b/src/font/charset-unicode.c index 62e207c3..3147972d 100644 --- a/src/font/charset-unicode.c +++ b/src/font/charset-unicode.c @@ -44,12 +44,14 @@ #include #include "common.h" + +#ifdef _MGCHARSET_UNICODE + #include "minigui.h" #include "gdi.h" #include "devfont.h" #include "charset.h" - -#ifdef _MGCHARSET_UNICODE +#include "bidi.h" /************************* UTF-8 Specific Operations ************************/ static int utf8_len_first_char (const unsigned char* mstr, int len) @@ -205,7 +207,7 @@ static unsigned int unicode_char_type (Achar32 chv) return (break_type << 24) | (basic_type << 16) | mchar_type; } -#define _USE_UNIBIDI +#undef _USE_UNIBIDI #ifdef _USE_UNIBIDI @@ -312,23 +314,23 @@ BOOL GUIAPI UCharGetMirror(Uchar32 ch, Uchar32* mirrored_ch) static BidiType unicode_bidi_char_type (Achar32 chv) { Achar32 chv_first = 0; - Achar32 chv_last = (Achar32)TABLESIZE (__mg___mg_unicode_bidi_char_type_map); + Achar32 chv_last = (Achar32)TABLESIZE (unicode_bidi_char_type_map); Achar32 chv_mid; chv = REAL_ACHAR(chv); while (chv_last >= chv_first) { chv_mid = (chv_first + chv_last)/2; - if ((__mg___mg_unicode_bidi_char_type_map[chv_mid].chv <= chv) - && ((__mg___mg_unicode_bidi_char_type_map[chv_mid].chv + __mg___mg_unicode_bidi_char_type_map[chv_mid].count) > chv)) { - return __mg___mg_unicode_bidi_char_type_map[chv_mid].type; + if ((unicode_bidi_char_type_map[chv_mid].chv <= chv) + && ((unicode_bidi_char_type_map[chv_mid].chv + unicode_bidi_char_type_map[chv_mid].count) > chv)) { + return unicode_bidi_char_type_map[chv_mid].type; } - if (chv >= (__mg___mg_unicode_bidi_char_type_map[chv_mid].chv + __mg___mg_unicode_bidi_char_type_map[chv_mid].count)) { + if (chv >= (unicode_bidi_char_type_map[chv_mid].chv + unicode_bidi_char_type_map[chv_mid].count)) { chv_first = chv_mid + 1; } else { - if (chv < __mg___mg_unicode_bidi_char_type_map[chv_mid].chv) + if (chv < unicode_bidi_char_type_map[chv_mid].chv) chv_last = chv_mid - 1; else chv_last = chv_mid; @@ -338,10 +340,13 @@ static BidiType unicode_bidi_char_type (Achar32 chv) return BIDI_TYPE_LTR; } +BOOL __mg_get_mirror_char (const BIDICHAR_MIRROR_MAP* map, int n, + Achar32 chv, Achar32* mirrored); + static BOOL unicode_bidi_mirror_char (Achar32 chv, Achar32* mirrored) { - return get_mirror_char (__mg_unicode_mirror_table, - TABLESIZE (__mg_unicode_mirror_table), chv, mirrored); + return __mg_get_mirror_char (unicode_mirror_table, + TABLESIZE (unicode_mirror_table), chv, mirrored); } BidiType GUIAPI UCharGetBidiType(Uchar32 uc) @@ -353,17 +358,17 @@ BidiBracketType GUIAPI UCharGetBracketType(Uchar32 uc) { BidiBracketType bracket_type; unsigned int lower = 0; - unsigned int upper = TABLESIZE (__mg_unicode_bracket_table) - 1; - int mid = TABLESIZE (__mg_unicode_bracket_table) / 2; + unsigned int upper = TABLESIZE (unicode_bracket_table) - 1; + int mid = TABLESIZE (unicode_bracket_table) / 2; - if (uc < __mg_unicode_bracket_table[lower].chv || - uc > __mg_unicode_bracket_table[upper].chv) + if (uc < unicode_bracket_table[lower].chv || + uc > unicode_bracket_table[upper].chv) return BIDI_BRACKET_NONE; do { - if (uc < __mg_unicode_bracket_table[mid].chv) + if (uc < unicode_bracket_table[mid].chv) upper = mid - 1; - else if (uc > __mg_unicode_bracket_table[mid].chv) + else if (uc > unicode_bracket_table[mid].chv) lower = mid + 1; else goto found; @@ -375,11 +380,14 @@ BidiBracketType GUIAPI UCharGetBracketType(Uchar32 uc) return BIDI_BRACKET_NONE; found: - bracket_type = __mg_unicode_bracket_table[mid].chv + - __mg_unicode_bracket_table[mid].bracket_off; - bracket_type &= BIDI_BRACKET_CHAR_MASK; - if (__mg_unicode_bracket_table[mid].type == UNIBIDI_BRACKET_OPEN) - bracket_type |= BIDI_BRACKET_OPEN_MASK; + if (unicode_bracket_table[mid].type == _BIDI_BRACKET_OPEN) { + bracket_type = uc | BIDI_BRACKET_OPEN_MASK; + } + else { + bracket_type = unicode_bracket_table[mid].chv + + unicode_bracket_table[mid].bracket_off; + bracket_type &= BIDI_BRACKET_CHAR_MASK; + } return bracket_type; } diff --git a/src/font/charset.c b/src/font/charset.c index 26971559..6556d289 100644 --- a/src/font/charset.c +++ b/src/font/charset.c @@ -741,7 +741,9 @@ static CHARSETOPS CharsetOps_iso8859_5 = { #include "bidi.h" -static BOOL get_mirror_char (const BIDICHAR_MIRROR_MAP* map, int n, +#define get_mirror_char __mg_get_mirror_char + +BOOL __mg_get_mirror_char (const BIDICHAR_MIRROR_MAP* map, int n, Achar32 chv, Achar32* mirrored) { int pos, step; diff --git a/src/font/unicode-bidi-tables.h b/src/font/unicode-bidi-tables.h index 9724899a..d3db2e08 100644 --- a/src/font/unicode-bidi-tables.h +++ b/src/font/unicode-bidi-tables.h @@ -18,7 +18,7 @@ #ifndef _UNICODE_BIDI_TABLES_H #define _UNICODE_BIDI_TABLES_H -static const BIDICHAR_TYPE_MAP __mg_unicode_bidi_char_type_map[] = +static const BIDICHAR_TYPE_MAP unicode_bidi_char_type_map[] = { { 0x000000, 0x0009, BIDI_TYPE_BN }, { 0x000009, 0x0001, BIDI_TYPE_SS }, @@ -1157,131 +1157,131 @@ static const BIDICHAR_TYPE_MAP __mg_unicode_bidi_char_type_map[] = { 0x100000, 0xFFFE, BIDI_TYPE_LTR }, }; -static const BIDICHAR_BRACKET __mg_unicode_bracket_table[] = +static const BIDICHAR_BRACKET unicode_bracket_table[] = { - { 0x000028, 1, UNIBIDI_BRACKET_OPEN }, - { 0x000029, -1, UNIBIDI_BRACKET_CLOSE }, - { 0x00005B, 2, UNIBIDI_BRACKET_OPEN }, - { 0x00005D, -2, UNIBIDI_BRACKET_CLOSE }, - { 0x00007B, 2, UNIBIDI_BRACKET_OPEN }, - { 0x00007D, -2, UNIBIDI_BRACKET_CLOSE }, - { 0x000F3A, 1, UNIBIDI_BRACKET_OPEN }, - { 0x000F3B, -1, UNIBIDI_BRACKET_CLOSE }, - { 0x000F3C, 1, UNIBIDI_BRACKET_OPEN }, - { 0x000F3D, -1, UNIBIDI_BRACKET_CLOSE }, - { 0x00169B, 1, UNIBIDI_BRACKET_OPEN }, - { 0x00169C, -1, UNIBIDI_BRACKET_CLOSE }, - { 0x002045, 1, UNIBIDI_BRACKET_OPEN }, - { 0x002046, -1, UNIBIDI_BRACKET_CLOSE }, - { 0x00207D, 1, UNIBIDI_BRACKET_OPEN }, - { 0x00207E, -1, UNIBIDI_BRACKET_CLOSE }, - { 0x00208D, 1, UNIBIDI_BRACKET_OPEN }, - { 0x00208E, -1, UNIBIDI_BRACKET_CLOSE }, - { 0x002308, 1, UNIBIDI_BRACKET_OPEN }, - { 0x002309, -1, UNIBIDI_BRACKET_CLOSE }, - { 0x00230A, 1, UNIBIDI_BRACKET_OPEN }, - { 0x00230B, -1, UNIBIDI_BRACKET_CLOSE }, - { 0x002329, 1, UNIBIDI_BRACKET_OPEN }, - { 0x00232A, -1, UNIBIDI_BRACKET_CLOSE }, - { 0x002768, 1, UNIBIDI_BRACKET_OPEN }, - { 0x002769, -1, UNIBIDI_BRACKET_CLOSE }, - { 0x00276A, 1, UNIBIDI_BRACKET_OPEN }, - { 0x00276B, -1, UNIBIDI_BRACKET_CLOSE }, - { 0x00276C, 1, UNIBIDI_BRACKET_OPEN }, - { 0x00276D, -1, UNIBIDI_BRACKET_CLOSE }, - { 0x00276E, 1, UNIBIDI_BRACKET_OPEN }, - { 0x00276F, -1, UNIBIDI_BRACKET_CLOSE }, - { 0x002770, 1, UNIBIDI_BRACKET_OPEN }, - { 0x002771, -1, UNIBIDI_BRACKET_CLOSE }, - { 0x002772, 1, UNIBIDI_BRACKET_OPEN }, - { 0x002773, -1, UNIBIDI_BRACKET_CLOSE }, - { 0x002774, 1, UNIBIDI_BRACKET_OPEN }, - { 0x002775, -1, UNIBIDI_BRACKET_CLOSE }, - { 0x0027C5, 1, UNIBIDI_BRACKET_OPEN }, - { 0x0027C6, -1, UNIBIDI_BRACKET_CLOSE }, - { 0x0027E6, 1, UNIBIDI_BRACKET_OPEN }, - { 0x0027E7, -1, UNIBIDI_BRACKET_CLOSE }, - { 0x0027E8, 1, UNIBIDI_BRACKET_OPEN }, - { 0x0027E9, -1, UNIBIDI_BRACKET_CLOSE }, - { 0x0027EA, 1, UNIBIDI_BRACKET_OPEN }, - { 0x0027EB, -1, UNIBIDI_BRACKET_CLOSE }, - { 0x0027EC, 1, UNIBIDI_BRACKET_OPEN }, - { 0x0027ED, -1, UNIBIDI_BRACKET_CLOSE }, - { 0x0027EE, 1, UNIBIDI_BRACKET_OPEN }, - { 0x0027EF, -1, UNIBIDI_BRACKET_CLOSE }, - { 0x002983, 1, UNIBIDI_BRACKET_OPEN }, - { 0x002984, -1, UNIBIDI_BRACKET_CLOSE }, - { 0x002985, 1, UNIBIDI_BRACKET_OPEN }, - { 0x002986, -1, UNIBIDI_BRACKET_CLOSE }, - { 0x002987, 1, UNIBIDI_BRACKET_OPEN }, - { 0x002988, -1, UNIBIDI_BRACKET_CLOSE }, - { 0x002989, 1, UNIBIDI_BRACKET_OPEN }, - { 0x00298A, -1, UNIBIDI_BRACKET_CLOSE }, - { 0x00298B, 1, UNIBIDI_BRACKET_OPEN }, - { 0x00298C, -1, UNIBIDI_BRACKET_CLOSE }, - { 0x00298D, 3, UNIBIDI_BRACKET_OPEN }, - { 0x00298E, 1, UNIBIDI_BRACKET_CLOSE }, - { 0x00298F, -1, UNIBIDI_BRACKET_OPEN }, - { 0x002990, -3, UNIBIDI_BRACKET_CLOSE }, - { 0x002991, 1, UNIBIDI_BRACKET_OPEN }, - { 0x002992, -1, UNIBIDI_BRACKET_CLOSE }, - { 0x002993, 1, UNIBIDI_BRACKET_OPEN }, - { 0x002994, -1, UNIBIDI_BRACKET_CLOSE }, - { 0x002995, 1, UNIBIDI_BRACKET_OPEN }, - { 0x002996, -1, UNIBIDI_BRACKET_CLOSE }, - { 0x002997, 1, UNIBIDI_BRACKET_OPEN }, - { 0x002998, -1, UNIBIDI_BRACKET_CLOSE }, - { 0x0029D8, 1, UNIBIDI_BRACKET_OPEN }, - { 0x0029D9, -1, UNIBIDI_BRACKET_CLOSE }, - { 0x0029DA, 1, UNIBIDI_BRACKET_OPEN }, - { 0x0029DB, -1, UNIBIDI_BRACKET_CLOSE }, - { 0x0029FC, 1, UNIBIDI_BRACKET_OPEN }, - { 0x0029FD, -1, UNIBIDI_BRACKET_CLOSE }, - { 0x002E22, 1, UNIBIDI_BRACKET_OPEN }, - { 0x002E23, -1, UNIBIDI_BRACKET_CLOSE }, - { 0x002E24, 1, UNIBIDI_BRACKET_OPEN }, - { 0x002E25, -1, UNIBIDI_BRACKET_CLOSE }, - { 0x002E26, 1, UNIBIDI_BRACKET_OPEN }, - { 0x002E27, -1, UNIBIDI_BRACKET_CLOSE }, - { 0x002E28, 1, UNIBIDI_BRACKET_OPEN }, - { 0x002E29, -1, UNIBIDI_BRACKET_CLOSE }, - { 0x003008, 1, UNIBIDI_BRACKET_OPEN }, - { 0x003009, -1, UNIBIDI_BRACKET_CLOSE }, - { 0x00300A, 1, UNIBIDI_BRACKET_OPEN }, - { 0x00300B, -1, UNIBIDI_BRACKET_CLOSE }, - { 0x00300C, 1, UNIBIDI_BRACKET_OPEN }, - { 0x00300D, -1, UNIBIDI_BRACKET_CLOSE }, - { 0x00300E, 1, UNIBIDI_BRACKET_OPEN }, - { 0x00300F, -1, UNIBIDI_BRACKET_CLOSE }, - { 0x003010, 1, UNIBIDI_BRACKET_OPEN }, - { 0x003011, -1, UNIBIDI_BRACKET_CLOSE }, - { 0x003014, 1, UNIBIDI_BRACKET_OPEN }, - { 0x003015, -1, UNIBIDI_BRACKET_CLOSE }, - { 0x003016, 1, UNIBIDI_BRACKET_OPEN }, - { 0x003017, -1, UNIBIDI_BRACKET_CLOSE }, - { 0x003018, 1, UNIBIDI_BRACKET_OPEN }, - { 0x003019, -1, UNIBIDI_BRACKET_CLOSE }, - { 0x00301A, 1, UNIBIDI_BRACKET_OPEN }, - { 0x00301B, -1, UNIBIDI_BRACKET_CLOSE }, - { 0x00FE59, 1, UNIBIDI_BRACKET_OPEN }, - { 0x00FE5A, -1, UNIBIDI_BRACKET_CLOSE }, - { 0x00FE5B, 1, UNIBIDI_BRACKET_OPEN }, - { 0x00FE5C, -1, UNIBIDI_BRACKET_CLOSE }, - { 0x00FE5D, 1, UNIBIDI_BRACKET_OPEN }, - { 0x00FE5E, -1, UNIBIDI_BRACKET_CLOSE }, - { 0x00FF08, 1, UNIBIDI_BRACKET_OPEN }, - { 0x00FF09, -1, UNIBIDI_BRACKET_CLOSE }, - { 0x00FF3B, 2, UNIBIDI_BRACKET_OPEN }, - { 0x00FF3D, -2, UNIBIDI_BRACKET_CLOSE }, - { 0x00FF5B, 2, UNIBIDI_BRACKET_OPEN }, - { 0x00FF5D, -2, UNIBIDI_BRACKET_CLOSE }, - { 0x00FF5F, 1, UNIBIDI_BRACKET_OPEN }, - { 0x00FF60, -1, UNIBIDI_BRACKET_CLOSE }, - { 0x00FF62, 1, UNIBIDI_BRACKET_OPEN }, - { 0x00FF63, -1, UNIBIDI_BRACKET_CLOSE }, + { 0x000028, 1, _BIDI_BRACKET_OPEN }, + { 0x000029, -1, _BIDI_BRACKET_CLOSE }, + { 0x00005B, 2, _BIDI_BRACKET_OPEN }, + { 0x00005D, -2, _BIDI_BRACKET_CLOSE }, + { 0x00007B, 2, _BIDI_BRACKET_OPEN }, + { 0x00007D, -2, _BIDI_BRACKET_CLOSE }, + { 0x000F3A, 1, _BIDI_BRACKET_OPEN }, + { 0x000F3B, -1, _BIDI_BRACKET_CLOSE }, + { 0x000F3C, 1, _BIDI_BRACKET_OPEN }, + { 0x000F3D, -1, _BIDI_BRACKET_CLOSE }, + { 0x00169B, 1, _BIDI_BRACKET_OPEN }, + { 0x00169C, -1, _BIDI_BRACKET_CLOSE }, + { 0x002045, 1, _BIDI_BRACKET_OPEN }, + { 0x002046, -1, _BIDI_BRACKET_CLOSE }, + { 0x00207D, 1, _BIDI_BRACKET_OPEN }, + { 0x00207E, -1, _BIDI_BRACKET_CLOSE }, + { 0x00208D, 1, _BIDI_BRACKET_OPEN }, + { 0x00208E, -1, _BIDI_BRACKET_CLOSE }, + { 0x002308, 1, _BIDI_BRACKET_OPEN }, + { 0x002309, -1, _BIDI_BRACKET_CLOSE }, + { 0x00230A, 1, _BIDI_BRACKET_OPEN }, + { 0x00230B, -1, _BIDI_BRACKET_CLOSE }, + { 0x002329, 1, _BIDI_BRACKET_OPEN }, + { 0x00232A, -1, _BIDI_BRACKET_CLOSE }, + { 0x002768, 1, _BIDI_BRACKET_OPEN }, + { 0x002769, -1, _BIDI_BRACKET_CLOSE }, + { 0x00276A, 1, _BIDI_BRACKET_OPEN }, + { 0x00276B, -1, _BIDI_BRACKET_CLOSE }, + { 0x00276C, 1, _BIDI_BRACKET_OPEN }, + { 0x00276D, -1, _BIDI_BRACKET_CLOSE }, + { 0x00276E, 1, _BIDI_BRACKET_OPEN }, + { 0x00276F, -1, _BIDI_BRACKET_CLOSE }, + { 0x002770, 1, _BIDI_BRACKET_OPEN }, + { 0x002771, -1, _BIDI_BRACKET_CLOSE }, + { 0x002772, 1, _BIDI_BRACKET_OPEN }, + { 0x002773, -1, _BIDI_BRACKET_CLOSE }, + { 0x002774, 1, _BIDI_BRACKET_OPEN }, + { 0x002775, -1, _BIDI_BRACKET_CLOSE }, + { 0x0027C5, 1, _BIDI_BRACKET_OPEN }, + { 0x0027C6, -1, _BIDI_BRACKET_CLOSE }, + { 0x0027E6, 1, _BIDI_BRACKET_OPEN }, + { 0x0027E7, -1, _BIDI_BRACKET_CLOSE }, + { 0x0027E8, 1, _BIDI_BRACKET_OPEN }, + { 0x0027E9, -1, _BIDI_BRACKET_CLOSE }, + { 0x0027EA, 1, _BIDI_BRACKET_OPEN }, + { 0x0027EB, -1, _BIDI_BRACKET_CLOSE }, + { 0x0027EC, 1, _BIDI_BRACKET_OPEN }, + { 0x0027ED, -1, _BIDI_BRACKET_CLOSE }, + { 0x0027EE, 1, _BIDI_BRACKET_OPEN }, + { 0x0027EF, -1, _BIDI_BRACKET_CLOSE }, + { 0x002983, 1, _BIDI_BRACKET_OPEN }, + { 0x002984, -1, _BIDI_BRACKET_CLOSE }, + { 0x002985, 1, _BIDI_BRACKET_OPEN }, + { 0x002986, -1, _BIDI_BRACKET_CLOSE }, + { 0x002987, 1, _BIDI_BRACKET_OPEN }, + { 0x002988, -1, _BIDI_BRACKET_CLOSE }, + { 0x002989, 1, _BIDI_BRACKET_OPEN }, + { 0x00298A, -1, _BIDI_BRACKET_CLOSE }, + { 0x00298B, 1, _BIDI_BRACKET_OPEN }, + { 0x00298C, -1, _BIDI_BRACKET_CLOSE }, + { 0x00298D, 3, _BIDI_BRACKET_OPEN }, + { 0x00298E, 1, _BIDI_BRACKET_CLOSE }, + { 0x00298F, -1, _BIDI_BRACKET_OPEN }, + { 0x002990, -3, _BIDI_BRACKET_CLOSE }, + { 0x002991, 1, _BIDI_BRACKET_OPEN }, + { 0x002992, -1, _BIDI_BRACKET_CLOSE }, + { 0x002993, 1, _BIDI_BRACKET_OPEN }, + { 0x002994, -1, _BIDI_BRACKET_CLOSE }, + { 0x002995, 1, _BIDI_BRACKET_OPEN }, + { 0x002996, -1, _BIDI_BRACKET_CLOSE }, + { 0x002997, 1, _BIDI_BRACKET_OPEN }, + { 0x002998, -1, _BIDI_BRACKET_CLOSE }, + { 0x0029D8, 1, _BIDI_BRACKET_OPEN }, + { 0x0029D9, -1, _BIDI_BRACKET_CLOSE }, + { 0x0029DA, 1, _BIDI_BRACKET_OPEN }, + { 0x0029DB, -1, _BIDI_BRACKET_CLOSE }, + { 0x0029FC, 1, _BIDI_BRACKET_OPEN }, + { 0x0029FD, -1, _BIDI_BRACKET_CLOSE }, + { 0x002E22, 1, _BIDI_BRACKET_OPEN }, + { 0x002E23, -1, _BIDI_BRACKET_CLOSE }, + { 0x002E24, 1, _BIDI_BRACKET_OPEN }, + { 0x002E25, -1, _BIDI_BRACKET_CLOSE }, + { 0x002E26, 1, _BIDI_BRACKET_OPEN }, + { 0x002E27, -1, _BIDI_BRACKET_CLOSE }, + { 0x002E28, 1, _BIDI_BRACKET_OPEN }, + { 0x002E29, -1, _BIDI_BRACKET_CLOSE }, + { 0x003008, 1, _BIDI_BRACKET_OPEN }, + { 0x003009, -1, _BIDI_BRACKET_CLOSE }, + { 0x00300A, 1, _BIDI_BRACKET_OPEN }, + { 0x00300B, -1, _BIDI_BRACKET_CLOSE }, + { 0x00300C, 1, _BIDI_BRACKET_OPEN }, + { 0x00300D, -1, _BIDI_BRACKET_CLOSE }, + { 0x00300E, 1, _BIDI_BRACKET_OPEN }, + { 0x00300F, -1, _BIDI_BRACKET_CLOSE }, + { 0x003010, 1, _BIDI_BRACKET_OPEN }, + { 0x003011, -1, _BIDI_BRACKET_CLOSE }, + { 0x003014, 1, _BIDI_BRACKET_OPEN }, + { 0x003015, -1, _BIDI_BRACKET_CLOSE }, + { 0x003016, 1, _BIDI_BRACKET_OPEN }, + { 0x003017, -1, _BIDI_BRACKET_CLOSE }, + { 0x003018, 1, _BIDI_BRACKET_OPEN }, + { 0x003019, -1, _BIDI_BRACKET_CLOSE }, + { 0x00301A, 1, _BIDI_BRACKET_OPEN }, + { 0x00301B, -1, _BIDI_BRACKET_CLOSE }, + { 0x00FE59, 1, _BIDI_BRACKET_OPEN }, + { 0x00FE5A, -1, _BIDI_BRACKET_CLOSE }, + { 0x00FE5B, 1, _BIDI_BRACKET_OPEN }, + { 0x00FE5C, -1, _BIDI_BRACKET_CLOSE }, + { 0x00FE5D, 1, _BIDI_BRACKET_OPEN }, + { 0x00FE5E, -1, _BIDI_BRACKET_CLOSE }, + { 0x00FF08, 1, _BIDI_BRACKET_OPEN }, + { 0x00FF09, -1, _BIDI_BRACKET_CLOSE }, + { 0x00FF3B, 2, _BIDI_BRACKET_OPEN }, + { 0x00FF3D, -2, _BIDI_BRACKET_CLOSE }, + { 0x00FF5B, 2, _BIDI_BRACKET_OPEN }, + { 0x00FF5D, -2, _BIDI_BRACKET_CLOSE }, + { 0x00FF5F, 1, _BIDI_BRACKET_OPEN }, + { 0x00FF60, -1, _BIDI_BRACKET_CLOSE }, + { 0x00FF62, 1, _BIDI_BRACKET_OPEN }, + { 0x00FF63, -1, _BIDI_BRACKET_CLOSE }, }; -static const BIDICHAR_MIRROR_MAP __mg_unicode_mirror_table[] = +static const BIDICHAR_MIRROR_MAP unicode_mirror_table[] = { { 0x000028, 0x000029 }, { 0x000029, 0x000028 }, diff --git a/src/font/unicode-bidi.h b/src/font/unicode-bidi.h index 022107aa..9b46e1fc 100644 --- a/src/font/unicode-bidi.h +++ b/src/font/unicode-bidi.h @@ -121,48 +121,6 @@ #define BIDI_SENTINEL -1 -/* - * Define bit masks that joining types are based on, each mask has - * only one bit set. - */ -#define BIDI_MASK_JOINS_RIGHT 0x01 /* May join to right */ -#define BIDI_MASK_JOINS_LEFT 0x02 /* May join to right */ -#define BIDI_MASK_ARAB_SHAPES 0x04 /* May Arabic shape */ -#define BIDI_MASK_TRANSPARENT 0x08 /* Is transparent */ -#define BIDI_MASK_IGNORED 0x10 /* Is ignored */ -#define BIDI_MASK_LIGATURED 0x20 /* Is ligatured */ - -/* - * Define values for FriBidiJoiningType - */ - -/* nUn-joining */ -#define BIDI_JOINING_TYPE_U_VAL ( 0 ) - -/* Right-joining */ -#define BIDI_JOINING_TYPE_R_VAL \ - ( BIDI_MASK_JOINS_RIGHT | BIDI_MASK_ARAB_SHAPES ) - -/* Dual-joining */ -#define BIDI_JOINING_TYPE_D_VAL \ - ( BIDI_MASK_JOINS_RIGHT | BIDI_MASK_JOINS_LEFT \ - | BIDI_MASK_ARAB_SHAPES ) - -/* join-Causing */ -#define BIDI_JOINING_TYPE_C_VAL \ - ( BIDI_MASK_JOINS_RIGHT | BIDI_MASK_JOINS_LEFT ) - -/* Left-joining */ -#define BIDI_JOINING_TYPE_L_VAL \ - ( BIDI_MASK_JOINS_LEFT | BIDI_MASK_ARAB_SHAPES ) - -/* Transparent */ -#define BIDI_JOINING_TYPE_T_VAL \ - ( BIDI_MASK_TRANSPARENT | BIDI_MASK_ARAB_SHAPES ) - -/* iGnored */ -#define BIDI_JOINING_TYPE_G_VAL ( BIDI_MASK_IGNORED ) - enum _BidiJoiningTypeEnum { # define _UNIBIDI_ADD_TYPE(TYPE,SYMBOL) \ BIDI_JOINING_TYPE_##TYPE = BIDI_JOINING_TYPE_##TYPE##_VAL, @@ -171,104 +129,6 @@ enum _BidiJoiningTypeEnum { _UNIBIDI_JOINING_TYPE_JUNK /* Don't use this */ }; -/* - * The equivalent of JoiningType values for ArabicProp - */ - -/* Primary Arabic Joining Classes (Table 8-2) */ - -/* nUn-joining */ -#define BIDI_IS_JOINING_TYPE_U(p) \ - ( 0 == ( (p) & \ - ( BIDI_MASK_TRANSPARENT | BIDI_MASK_IGNORED \ - | BIDI_MASK_JOINS_RIGHT | BIDI_MASK_JOINS_LEFT ) ) ) - -/* Right-joining */ -#define BIDI_IS_JOINING_TYPE_R(p) \ - ( BIDI_MASK_JOINS_RIGHT == ( (p) & \ - ( BIDI_MASK_TRANSPARENT | BIDI_MASK_IGNORED \ - | BIDI_MASK_JOINS_RIGHT | BIDI_MASK_JOINS_LEFT ) ) ) - -/* Dual-joining */ -#define BIDI_IS_JOINING_TYPE_D(p) \ - ( ( BIDI_MASK_JOINS_RIGHT | BIDI_MASK_JOINS_LEFT \ - | BIDI_MASK_ARAB_SHAPES ) == ( (p) & \ - ( BIDI_MASK_TRANSPARENT | BIDI_MASK_IGNORED \ - | BIDI_MASK_JOINS_RIGHT | BIDI_MASK_JOINS_LEFT \ - | BIDI_MASK_ARAB_SHAPES ) ) ) - -/* join-Causing */ -#define BIDI_IS_JOINING_TYPE_C(p) \ - ( ( BIDI_MASK_JOINS_RIGHT | BIDI_MASK_JOINS_LEFT ) == ( (p) & \ - ( BIDI_MASK_TRANSPARENT | BIDI_MASK_IGNORED \ - | BIDI_MASK_JOINS_RIGHT | BIDI_MASK_JOINS_LEFT \ - | BIDI_MASK_ARAB_SHAPES ) ) ) - -/* Left-joining */ -#define BIDI_IS_JOINING_TYPE_L(p) \ - ( BIDI_MASK_JOINS_LEFT == ( (p) & \ - ( BIDI_MASK_TRANSPARENT | BIDI_MASK_IGNORED \ - | BIDI_MASK_JOINS_RIGHT | BIDI_MASK_JOINS_LEFT ) ) ) - -/* Transparent */ -#define BIDI_IS_JOINING_TYPE_T(p) \ - ( BIDI_MASK_TRANSPARENT == ( (p) & \ - ( BIDI_MASK_TRANSPARENT | BIDI_MASK_IGNORED ) ) ) - -/* iGnored */ -#define BIDI_IS_JOINING_TYPE_G(p) \ - ( BIDI_MASK_IGNORED == ( (p) & \ - ( BIDI_MASK_TRANSPARENT | BIDI_MASK_IGNORED ) ) ) - -/* and for Derived Arabic Joining Classes (Table 8-3) */ - -/* Right join-Causing */ -#define BIDI_IS_JOINING_TYPE_RC(p) \ - ( BIDI_MASK_JOINS_RIGHT == ( (p) & \ - ( BIDI_MASK_TRANSPARENT | BIDI_MASK_IGNORED \ - | BIDI_MASK_JOINS_RIGHT ) ) ) - -/* Left join-Causing */ -#define BIDI_IS_JOINING_TYPE_LC(p) \ - ( BIDI_MASK_JOINS_LEFT == ( (p) & \ - ( BIDI_MASK_TRANSPARENT | BIDI_MASK_IGNORED \ - | BIDI_MASK_JOINS_LEFT ) ) ) - -/* - * Defining macros for needed queries, It is fully dependent on the - * implementation of FriBidiJoiningType. - */ - -/* Joins to right: R, D, C? */ -#define BIDI_JOINS_RIGHT(p) ((p) & BIDI_MASK_JOINS_RIGHT) - -/* Joins to left: L, D, C? */ -#define BIDI_JOINS_LEFT(p) ((p) & BIDI_MASK_JOINS_LEFT) - -/* May shape: R, D, L, T? */ -#define BIDI_ARAB_SHAPES(p) ((p) & BIDI_MASK_ARAB_SHAPES) - -/* Is skipped in joining: T, G? */ -#define BIDI_IS_JOIN_SKIPPED(p) \ - ((p) & (BIDI_MASK_TRANSPARENT | BIDI_MASK_IGNORED)) - -/* Is base that will be shaped: R, D, L? */ -#define BIDI_IS_JOIN_BASE_SHAPES(p) \ - ( BIDI_MASK_ARAB_SHAPES == ( (p) & \ - ( BIDI_MASK_TRANSPARENT | BIDI_MASK_IGNORED \ - | BIDI_MASK_ARAB_SHAPES ) ) ) - -#define BIDI_JOINS_PRECEDING_MASK(level) \ - (BIDI_LEVEL_IS_RTL (level) ? BIDI_MASK_JOINS_RIGHT \ - : BIDI_MASK_JOINS_LEFT) - -#define BIDI_JOINS_FOLLOWING_MASK(level) \ - (BIDI_LEVEL_IS_RTL (level) ? BIDI_MASK_JOINS_LEFT \ - : BIDI_MASK_JOINS_RIGHT) - -#define BIDI_JOIN_SHAPE(p) \ - ((p) & ( BIDI_MASK_JOINS_RIGHT | BIDI_MASK_JOINS_LEFT )) - #ifdef __cplusplus extern "C" { #endif /* __cplusplus */ diff --git a/src/font/unicode-shape-arabic.c b/src/font/unicode-shape-arabic.c index 5b561700..11773aa8 100644 --- a/src/font/unicode-shape-arabic.c +++ b/src/font/unicode-shape-arabic.c @@ -70,8 +70,7 @@ typedef struct _PairMap { #include "unicode-arabic-misc-table.inc" static void unibidi_shape_arabic_joining (const Uchar32 table[][4], - Uchar32 min, Uchar32 max, - const int len, + Uchar32 min, Uchar32 max, const int len, const BidiArabicProp *ar_props, Uchar32 *str) { @@ -114,8 +113,7 @@ static Uchar32 find_pair_match (const PairMap *table, int size, find_pair_match(table, len, first, second)) static void unibidi_shape_arabic_ligature(const PairMap *table, - int size, const BidiLevel *embedding_levels, - int len, + int size, const BidiLevel *embedding_levels, int len, BidiArabicProp *ar_props, Uchar32 *str) { /* TODO: This doesn't form ligatures for even-level Arabic text. @@ -145,8 +143,6 @@ static void unibidi_shape_arabic_ligature(const PairMap *table, void UBidiShapeArabic(Uint32 flags, const BidiLevel *embedding_levels, int len, BidiArabicProp *ar_props, Uchar32 *str) { - _DBG_PRINTF ("in UBidiShapeArabic"); - if (len == 0 || !str) return; if (BIDI_TEST_BITS (flags, BIDI_FLAG_SHAPE_ARAB_PRES)) { @@ -154,11 +150,13 @@ void UBidiShapeArabic(Uint32 flags, const BidiLevel *embedding_levels, int len, } if (BIDI_TEST_BITS (flags, BIDI_FLAG_SHAPE_ARAB_LIGA)) { - DO_LIGATURING (mandatory_liga_table, embedding_levels, len, ar_props, str); + DO_LIGATURING (mandatory_liga_table, embedding_levels, len, + ar_props, str); } if (BIDI_TEST_BITS (flags, BIDI_FLAG_SHAPE_ARAB_CONSOLE)) { - DO_LIGATURING (console_liga_table, embedding_levels, len, ar_props, str); + DO_LIGATURING (console_liga_table, embedding_levels, len, + ar_props, str); DO_SHAPING (UNIBIDI_GET_ARABIC_SHAPE_NSM, len, ar_props, str); } } diff --git a/src/font/utils/gen-bidi-tables.py b/src/font/utils/gen-bidi-tables.py index df3b455d..2a43bd34 100755 --- a/src/font/utils/gen-bidi-tables.py +++ b/src/font/utils/gen-bidi-tables.py @@ -210,7 +210,7 @@ print () print ("#ifndef _UNICODE_BIDI_TABLES_H") print ("#define _UNICODE_BIDI_TABLES_H") print ("") -print ("static const BIDICHAR_TYPE_MAP __mg_unicode_bidi_char_type_map[] =") +print ("static const BIDICHAR_TYPE_MAP unicode_bidi_char_type_map[] =") print ("{") cur_chv = 0 @@ -229,7 +229,7 @@ for i in range(1, NR_UNICODE_CHARS): print ("};") print ("") -print ("static const BIDICHAR_BRACKET __mg_unicode_bracket_table[] =") +print ("static const BIDICHAR_BRACKET unicode_bracket_table[] =") print ("{") d = data[1] @@ -239,18 +239,18 @@ for u in uu: v1 = d[u][1] v1 = v1.strip() if cmp(v1, 'o') == 0: - bracket_type = "MGBIDI_BRACKET_OPEN" + bracket_type = "_BIDI_BRACKET_OPEN" elif cmp(v1, 'c') == 0: - bracket_type = "MGBIDI_BRACKET_CLOSE" + bracket_type = "_BIDI_BRACKET_CLOSE" else: - bracket_type = "MGBIDI_BRACKET_NONE" + bracket_type = "_BIDI_BRACKET_NONE" print (" { 0x%06X, %d, %s }," % (u, v0 - u, bracket_type, )) print ("};") print ("") -print ("static const BIDICHAR_MIRROR_MAP __mg_unicode_mirror_table[] =") +print ("static const BIDICHAR_MIRROR_MAP unicode_mirror_table[] =") print ("{") d = data[2] diff --git a/src/include/bidi.h b/src/include/bidi.h index b99e73dd..4139a510 100644 --- a/src/include/bidi.h +++ b/src/include/bidi.h @@ -73,9 +73,9 @@ typedef struct _BIDICHAR_TYPE_MAP { Uint16 type; } BIDICHAR_TYPE_MAP; -#define MGBIDI_BRACKET_NONE 0 -#define MGBIDI_BRACKET_CLOSE 1 -#define MGBIDI_BRACKET_OPEN 2 +#define _BIDI_BRACKET_NONE 0 +#define _BIDI_BRACKET_CLOSE 1 +#define _BIDI_BRACKET_OPEN 2 // NOTE: It is enough to use Uint16 for Unicode bracket table typedef struct _BIDICHAR_BRACKET { diff --git a/src/newgdi/shaped-glyph.c b/src/newgdi/shaped-glyph.c index 9d4fbc86..8fca74c4 100644 --- a/src/newgdi/shaped-glyph.c +++ b/src/newgdi/shaped-glyph.c @@ -55,12 +55,211 @@ #ifdef _MGCHARSET_UNICODE +#if 0 +static void bidi_reverse_shaped_glyphs (void* context, int len, int pos) +{ + int i; + SHAPEDGLYPH* vgs = (SHAPEDGLYPH*)context + pos; + + for (i = 0; i < len / 2; i++) { + SHAPEDGLYPH tmp = vgs[i]; + vgs[i] = vgs[len - 1 - i]; + vgs[len - 1 - i] = tmp; + } +} +#endif + +/* Local array size, used for stack-based local arrays */ +#define LOCAL_ARRAY_SIZE 128 + int GUIAPI GetShapedGlyphsBasic(LOGFONT* logfont, LanguageCode content_language, UCharScriptType writing_system, const Uchar32* logical_ucs, int nr_ucs, Uint16* break_oppos, SHAPEDGLYPH* visual_glyphs, - int* pos_l2v, int* nr_glyphs) + BidiType *paragraph_dir, int* pos_l2v, int* nr_glyphs) { + int i, j; + BidiLevel max_level = 0; + + Uchar32 local_visual_ucs[LOCAL_ARRAY_SIZE]; + Uchar32* visual_ucs = NULL; + + BidiArabicProp local_ar_props[LOCAL_ARRAY_SIZE]; + BidiArabicProp *ar_props = NULL; + + BidiType local_bidi_ts[LOCAL_ARRAY_SIZE]; + BidiType *bidi_ts = NULL; + + BidiBracketType local_brk_ts[LOCAL_ARRAY_SIZE]; + BidiBracketType *brk_ts = NULL; + + BidiLevel local_els[LOCAL_ARRAY_SIZE]; + BidiLevel* els = NULL; + + int local_pos_v2l[LOCAL_ARRAY_SIZE]; + int* pos_v2l = NULL; + + if (nr_ucs == 0 || logical_ucs == NULL || break_oppos == NULL || + visual_glyphs == NULL || nr_glyphs == NULL) { + return 0; + } + + /* + * TODO: tailor break opportunties according to the content languages. + */ + + if (nr_ucs < LOCAL_ARRAY_SIZE) + visual_ucs = local_visual_ucs; + else + visual_ucs = malloc (nr_ucs * sizeof(Uchar32)); + + if (!visual_ucs) + goto out; + + if (nr_ucs < LOCAL_ARRAY_SIZE) + bidi_ts = local_bidi_ts; + else + bidi_ts = malloc (nr_ucs * sizeof(BidiType)); + + if (!bidi_ts) + goto out; + + UStrGetBidiTypes(logical_ucs, nr_ucs, bidi_ts); + + if (nr_ucs < LOCAL_ARRAY_SIZE) + brk_ts = local_brk_ts; + else + brk_ts = (BidiBracketType*)malloc (nr_ucs * sizeof(BidiBracketType)); + + if (!brk_ts) + goto out; + + UStrGetBracketTypes (logical_ucs, bidi_ts, nr_ucs, brk_ts); + + if (nr_ucs < LOCAL_ARRAY_SIZE) + els = local_els; + else + els = (BidiLevel*)malloc (nr_ucs * sizeof(BidiLevel)); + + if (!els) + goto out; + + max_level = UBidiGetParagraphEmbeddingLevels(bidi_ts, brk_ts, nr_ucs, + paragraph_dir, els) - 1; + if (max_level < 0) + goto out; + + /* If l2v is to be calculated we must have to + make a private instance of it. */ + if (pos_l2v) { + if (nr_ucs < LOCAL_ARRAY_SIZE) + pos_v2l = local_pos_v2l; + else + pos_v2l = (int*)malloc(sizeof(int) * nr_ucs); + + if (!pos_v2l) + goto out; + } + + /* Set up the ordering array to identity order */ + if (pos_v2l) { + for (i = 0; i < nr_ucs; i++) + pos_v2l[i] = i; + } + + memcpy(visual_ucs, logical_ucs, sizeof(Uchar32) * nr_ucs); + + if (content_language == LANGCODE_ar) { + /* Arabic joining */ + if (nr_ucs < LOCAL_ARRAY_SIZE) + ar_props = local_ar_props; + else + ar_props = malloc(sizeof(BidiArabicProp) * nr_ucs); + + if (!ar_props) + goto out; + + UStrGetJoiningTypes(logical_ucs, nr_ucs, ar_props); + UBidiJoinArabic(bidi_ts, els, nr_ucs, ar_props); + UBidiShape(BIDI_FLAG_SHAPE_MIRRORING | BIDI_FLAG_SHAPE_ARAB_PRES | + BIDI_FLAG_SHAPE_ARAB_LIGA, + els, nr_ucs, ar_props, visual_ucs); + } + + if (UBidiReorderLine(BIDI_FLAGS_DEFAULT, bidi_ts, nr_ucs, 0, + *paragraph_dir, els, visual_ucs, pos_v2l, NULL, NULL) == 0) + goto out; + + /* get shaped glyphs */ + j = 0; + for (i = 0; i < nr_ucs; i++) { + if (pos_v2l[i] >= 0) { + visual_glyphs[j].gv = GetGlyphValue(logfont, + UCHAR2ACHAR(visual_ucs[i])); + visual_glyphs[j].bos = break_oppos[pos_v2l[i]]; + + if (ar_props) { + BidiArabicProp ar_prop = ar_props[pos_v2l[i]]; + if (ar_prop & BIDI_MASK_LIGATURED) { + visual_glyphs[j].gt = GLYPH_TYPE_STDLIGATURE; + visual_glyphs[j].gp = GLYPH_POS_BASELINE; + } + else if (ar_prop & BIDI_MASK_ARAB_SHAPES) { + visual_glyphs[j].gt = GLYPH_TYPE_STDBASE; + visual_glyphs[j].gp = GLYPH_POS_BASELINE; + } + else if (ar_prop & BIDI_MASK_TRANSPARENT) { + visual_glyphs[j].gt = GLYPH_TYPE_STDMARK; + visual_glyphs[j].gp = GLYPH_POS_STDMARK_ABOVE; + } + else { + visual_glyphs[j].gt = GLYPH_TYPE_STANDALONE; + visual_glyphs[j].gp = GLYPH_POS_BASELINE; + } + } + else { + visual_glyphs[j].gt = GLYPH_TYPE_STANDALONE; + visual_glyphs[j].gp = GLYPH_POS_BASELINE; + } + + j++; + } + else { + _DBG_PRINTF("%s: A character skipped\n", __FUNCTION__); + } + } + + *nr_glyphs = j; + + /* Convert the v2l list to l2v */ + if (pos_l2v) { + for (i = 0; i < nr_ucs; i++) + pos_l2v[i] = -1; + for (i = 0; i < nr_ucs; i++) + pos_l2v[pos_v2l[i]] = i; + } + + return nr_ucs; + +out: + if (visual_ucs && visual_ucs != local_visual_ucs) + free (visual_ucs); + + if (pos_v2l && pos_v2l != local_pos_v2l) + free (pos_v2l); + + if (els && els != local_els) + free (els); + + if (ar_props && ar_props != local_ar_props) + free (ar_props); + + if (bidi_ts && bidi_ts != local_bidi_ts) + free (bidi_ts); + + if (brk_ts && brk_ts != local_brk_ts) + free (brk_ts); + return 0; } @@ -68,7 +267,7 @@ int GUIAPI GetShapedGlyphsComplex(LOGFONT* logfont, LanguageCode content_language, UCharScriptType writing_system, const Uchar32* logical_ucs, int nr_ucs, Uint16* break_oppos, SHAPEDGLYPH* visual_glyphs, - int* pos_l2v, int* nr_glyphs) + BidiType *paragraph_dir, int* pos_l2v, int* nr_glyphs) { return 0; }