summaryrefslogtreecommitdiff
path: root/Build/source/libs/icu/icu-4.2.1-PATCHES/patch-70-Arabic
diff options
context:
space:
mode:
Diffstat (limited to 'Build/source/libs/icu/icu-4.2.1-PATCHES/patch-70-Arabic')
-rw-r--r--Build/source/libs/icu/icu-4.2.1-PATCHES/patch-70-Arabic204
1 files changed, 204 insertions, 0 deletions
diff --git a/Build/source/libs/icu/icu-4.2.1-PATCHES/patch-70-Arabic b/Build/source/libs/icu/icu-4.2.1-PATCHES/patch-70-Arabic
new file mode 100644
index 00000000000..0046f27b065
--- /dev/null
+++ b/Build/source/libs/icu/icu-4.2.1-PATCHES/patch-70-Arabic
@@ -0,0 +1,204 @@
+diff -ur icu-4.2.1.orig/source/layout/ArabicShaping.cpp icu-4.2.1/source/layout/ArabicShaping.cpp
+--- icu-4.2.1.orig/source/layout/ArabicShaping.cpp 2009-07-01 20:51:24.000000000 +0200
++++ icu-4.2.1/source/layout/ArabicShaping.cpp 2009-10-23 14:00:28.000000000 +0200
+@@ -24,6 +24,31 @@
+ ArabicShaping::ST_TRANSPARENT // [T]
+ };
+
++// Draft Mongolian shaping classes, not provided by the Unicode data files at this time
++enum {
++ _c_ = ArabicShaping::ST_NOSHAPE_DUAL,
++ _d_ = ArabicShaping::ST_DUAL,
++ _n_ = ArabicShaping::ST_NONE,
++ _r_ = ArabicShaping::ST_RIGHT,
++ _t_ = ArabicShaping::ST_TRANSPARENT,
++ _x_ = ArabicShaping::ST_NOSHAPE_NONE
++};
++
++const ArabicShaping::ShapeType ArabicShaping::mongolianTypes[] =
++{
++ _n_, _n_, _n_, _n_, _n_, _n_, _n_, _n_, _n_, _n_, _n_, _t_, _t_, _t_, _t_, _n_, // 0x1800 - 0x180f
++ _n_, _n_, _n_, _n_, _n_, _n_, _n_, _n_, _n_, _n_, _n_, _n_, _n_, _n_, _n_, _n_, // 0x1810 - 0x181f
++ _d_, _d_, _d_, _d_, _d_, _d_, _d_, _d_, _d_, _d_, _d_, _d_, _d_, _d_, _d_, _d_, // 0x1820 - 0x182f
++ _d_, _d_, _d_, _d_, _d_, _d_, _d_, _d_, _d_, _d_, _d_, _d_, _d_, _d_, _d_, _d_, // 0x1830 - 0x183f
++ _d_, _d_, _d_, _d_, _d_, _d_, _d_, _d_, _d_, _d_, _d_, _d_, _d_, _d_, _d_, _d_, // 0x1840 - 0x184f
++ _d_, _d_, _d_, _d_, _d_, _d_, _d_, _d_, _d_, _d_, _d_, _d_, _d_, _d_, _d_, _d_, // 0x1850 - 0x185f
++ _d_, _d_, _d_, _d_, _d_, _d_, _d_, _d_, _d_, _d_, _d_, _d_, _d_, _d_, _d_, _d_, // 0x1860 - 0x186f
++ _d_, _d_, _d_, _d_, _d_, _d_, _d_, _d_, _n_, _n_, _n_, _n_, _n_, _n_, _n_, _n_, // 0x1870 - 0x187f
++ _n_, _n_, _n_, _n_, _n_, _n_, _n_, _d_, _d_, _d_, _d_, _d_, _d_, _d_, _d_, _d_, // 0x1880 - 0x188f
++ _d_, _d_, _d_, _d_, _d_, _d_, _d_, _d_, _d_, _d_, _d_, _d_, _d_, _d_, _d_, _d_, // 0x1890 - 0x189f
++ _d_, _d_, _d_, _d_, _d_, _d_, _d_, _d_, _d_, _t_, _n_, _n_, _n_, _n_, _n_, _n_ // 0x18a0 - 0x18af
++};
++
+ /*
+ shaping array holds types for Arabic chars between 0610 and 0700
+ other values are either unshaped, or transparent if a mark or format
+@@ -36,17 +61,32 @@
+ const ClassDefinitionTable *joiningTypes = (const ClassDefinitionTable *) ArabicShaping::shapingTypeTable;
+ le_int32 joiningType = joiningTypes->getGlyphClass(c);
+
+- if (joiningType >= 0 && joiningType < ArabicShaping::JT_COUNT) {
+- return ArabicShaping::shapeTypes[joiningType];
++ if (joiningType == JT_RIGHT_JOINING) { // check for Syriac exceptions ALAPH, DALATH, RISH
++ if (c == 0x0710)
++ return ST_ALAPH;
++ if (c == 0x0715 || c == 0x0716 || c == 0x072A || c == 0x072F)
++ return ST_DALATH_RISH;
+ }
+
+- return ArabicShaping::ST_NOSHAPE_NONE;
++ if (joiningType == 0) { // check for Mongolian range, not supported by ArabicShaping::shapingTypeTable
++ if (c >= 0x1800 && c <= 0x18af)
++ return mongolianTypes[c - 0x1800];
++ }
++
++ if (joiningType >= 0 && joiningType < JT_COUNT) {
++ return shapeTypes[joiningType];
++ }
++
++ return ST_NOSHAPE_NONE;
+ }
+
+ #define isolFeatureTag LE_ISOL_FEATURE_TAG
+ #define initFeatureTag LE_INIT_FEATURE_TAG
+ #define mediFeatureTag LE_MEDI_FEATURE_TAG
++#define med2FeatureTag LE_MED2_FEATURE_TAG
+ #define finaFeatureTag LE_FINA_FEATURE_TAG
++#define fin2FeatureTag LE_FIN2_FEATURE_TAG
++#define fin3FeatureTag LE_FIN3_FEATURE_TAG
+ #define ligaFeatureTag LE_LIGA_FEATURE_TAG
+ #define msetFeatureTag LE_MSET_FEATURE_TAG
+ #define markFeatureTag LE_MARK_FEATURE_TAG
+@@ -62,33 +102,40 @@
+ // NOTE:
+ // The isol, fina, init and medi features must be
+ // defined in the above order, and have masks that
+-// are all in the same nibble.
++// are all in the same byte.
+ #define isolFeatureMask 0x80000000UL
+ #define finaFeatureMask 0x40000000UL
+ #define initFeatureMask 0x20000000UL
+ #define mediFeatureMask 0x10000000UL
+-#define ccmpFeatureMask 0x08000000UL
+-#define rligFeatureMask 0x04000000UL
+-#define caltFeatureMask 0x02000000UL
+-#define ligaFeatureMask 0x01000000UL
+-#define dligFeatureMask 0x00800000UL
+-#define cswhFeatureMask 0x00400000UL
+-#define msetFeatureMask 0x00200000UL
+-#define cursFeatureMask 0x00100000UL
+-#define kernFeatureMask 0x00080000UL
+-#define markFeatureMask 0x00040000UL
+-#define mkmkFeatureMask 0x00020000UL
++#define fin2FeatureMask 0x08000000UL
++#define fin3FeatureMask 0x04000000UL
++#define med2FeatureMask 0x03000000UL /* two bits, from shifting either fin2 or fin3 */
++
++#define ccmpFeatureMask 0x00800000UL
++#define rligFeatureMask 0x00400000UL
++#define caltFeatureMask 0x00200000UL
++#define ligaFeatureMask 0x00100000UL
++#define dligFeatureMask 0x00080000UL
++#define cswhFeatureMask 0x00040000UL
++#define msetFeatureMask 0x00020000UL
++#define cursFeatureMask 0x00010000UL
++#define kernFeatureMask 0x00008000UL
++#define markFeatureMask 0x00004000UL
++#define mkmkFeatureMask 0x00002000UL
+
+ #define NO_FEATURES 0
+ #define ISOL_FEATURES (isolFeatureMask | ligaFeatureMask | msetFeatureMask | markFeatureMask | ccmpFeatureMask | rligFeatureMask | caltFeatureMask | dligFeatureMask | cswhFeatureMask | cursFeatureMask | kernFeatureMask | mkmkFeatureMask)
+
+-#define SHAPE_MASK 0xF0000000UL
++#define SHAPE_MASK 0xFF000000UL
+
+ static const FeatureMap featureMap[] = {
+ {ccmpFeatureTag, ccmpFeatureMask},
+ {isolFeatureTag, isolFeatureMask},
+ {finaFeatureTag, finaFeatureMask},
++ {fin2FeatureTag, fin2FeatureMask},
++ {fin3FeatureTag, fin3FeatureMask},
+ {mediFeatureTag, mediFeatureMask},
++ {med2FeatureTag, med2FeatureMask},
+ {initFeatureTag, initFeatureMask},
+ {rligFeatureTag, rligFeatureMask},
+ {caltFeatureTag, caltFeatureMask},
+@@ -138,6 +185,14 @@
+ // shaper.shape(errout, 2) (isolate to initial, or final to medial)
+ // shaper.shape(out, 1) (isolate to final)
+
++ // special cases for Syriac ALAPH:
++ // final ALAPH is fin2 when effective right char shapes but does not cause left shaping, and is not DALATH/RISH
++ // final ALAPH is fin3 when effective right char is DALATH/RISH
++ // medial ALAPH is med2 when effective right char shapes but does not cause left shaping
++ // using one of:
++ // shaper.shape(out, 4) (isolate to fin2)
++ // shaper.shape(out, 5) (isolate to fin3)
++
+ ShapeType rightType = ST_NOSHAPE_NONE, leftType = ST_NOSHAPE_NONE;
+ LEErrorCode success = LE_NO_ERROR;
+ le_int32 i;
+@@ -195,10 +250,17 @@
+ if (curShapes) {
+ adjustTags(out, 1, glyphStorage);
+ }
++ } else if (t == ST_ALAPH) {
++ if (rightType == ST_DALATH_RISH) {
++ adjustTags(out, 5, glyphStorage);
++ } else if (rightShapes && !rightCauses) {
++ adjustTags(out, 4, glyphStorage);
++ }
+ }
+
+ rightShapes = curShapes;
+ rightCauses = (t & MASK_SHAPE_LEFT) != 0;
++ rightType = t; // remember this; might need to know if it was DALATH/RISH
+ erout = out;
+ }
+
+diff -ur icu-4.2.1.orig/source/layout/ArabicShaping.h icu-4.2.1/source/layout/ArabicShaping.h
+--- icu-4.2.1.orig/source/layout/ArabicShaping.h 2009-07-01 20:51:24.000000000 +0200
++++ icu-4.2.1/source/layout/ArabicShaping.h 2009-10-23 14:00:28.000000000 +0200
+@@ -39,7 +39,10 @@
+ MASK_SHAPE_RIGHT = 1, // if this bit set, shapes to right
+ MASK_SHAPE_LEFT = 2, // if this bit set, shapes to left
+ MASK_TRANSPARENT = 4, // if this bit set, is transparent (ignore other bits)
+- MASK_NOSHAPE = 8 // if this bit set, don't shape this char, i.e. tatweel
++ MASK_NOSHAPE = 8, // if this bit set, don't shape this char, i.e. tatweel
++
++ MASK_ALAPH = 16, // if this bit set, char is Syriac ALAPH
++ MASK_DALATH_RISH = 32 // if this bit set, char is Syriac DALATH/RISH
+ };
+
+ // shaping values
+@@ -51,7 +54,9 @@
+ ST_DUAL = MASK_SHAPE_RIGHT | MASK_SHAPE_LEFT,
+ ST_TRANSPARENT = MASK_TRANSPARENT,
+ ST_NOSHAPE_DUAL = MASK_NOSHAPE | ST_DUAL,
+- ST_NOSHAPE_NONE = MASK_NOSHAPE
++ ST_NOSHAPE_NONE = MASK_NOSHAPE,
++ ST_ALAPH = MASK_ALAPH | MASK_SHAPE_RIGHT,
++ ST_DALATH_RISH = MASK_DALATH_RISH | MASK_SHAPE_RIGHT
+ };
+
+ typedef le_int32 ShapeType;
+@@ -69,6 +74,7 @@
+
+ static const le_uint8 shapingTypeTable[];
+ static const ShapeType shapeTypes[];
++ static const ShapeType mongolianTypes[];
+
+ static void adjustTags(le_int32 outIndex, le_int32 shapeOffset, LEGlyphStorage &glyphStorage);
+ };
+diff -ur icu-4.2.1.orig/source/layout/LayoutEngine.cpp icu-4.2.1/source/layout/LayoutEngine.cpp
+--- icu-4.2.1.orig/source/layout/LayoutEngine.cpp 2009-10-23 00:16:48.000000000 +0200
++++ icu-4.2.1/source/layout/LayoutEngine.cpp 2009-10-23 14:05:00.000000000 +0200
+@@ -567,6 +567,8 @@
+ break;
+
+ case arabScriptCode:
++ case syrcScriptCode:
++ case mongScriptCode:
+ result = new ArabicOpenTypeLayoutEngine(fontInstance, scriptCode, languageCode, typoFlags, gsubTable, success);
+ break;
+