This commit is contained in:
Vincent Wei
2019-03-12 17:52:06 +08:00
parent 005519e7cc
commit a4e8a42707
9 changed files with 530 additions and 311 deletions
+158 -6
View File
@@ -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
+30 -22
View File
@@ -44,12 +44,14 @@
#include <assert.h>
#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;
}
+3 -1
View File
@@ -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;
+123 -123
View File
@@ -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 },
-140
View File
@@ -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 */
+6 -8
View File
@@ -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);
}
}
+6 -6
View File
@@ -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]
+3 -3
View File
@@ -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 {
+201 -2
View File
@@ -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;
}