Index: third_party/harfbuzz-ng/src/hb-ot-shape-complex-arabic-win1256.hh |
diff --git a/third_party/harfbuzz-ng/src/hb-ot-shape-complex-arabic-win1256.hh b/third_party/harfbuzz-ng/src/hb-ot-shape-complex-arabic-win1256.hh |
new file mode 100644 |
index 0000000000000000000000000000000000000000..63ed3f8e0ef548221918aa3eb6c2816ae3c79aa4 |
--- /dev/null |
+++ b/third_party/harfbuzz-ng/src/hb-ot-shape-complex-arabic-win1256.hh |
@@ -0,0 +1,321 @@ |
+/* |
+ * Copyright © 2014 Google, Inc. |
+ * |
+ * This is part of HarfBuzz, a text shaping library. |
+ * |
+ * Permission is hereby granted, without written agreement and without |
+ * license or royalty fees, to use, copy, modify, and distribute this |
+ * software and its documentation for any purpose, provided that the |
+ * above copyright notice and the following two paragraphs appear in |
+ * all copies of this software. |
+ * |
+ * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR |
+ * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES |
+ * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN |
+ * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH |
+ * DAMAGE. |
+ * |
+ * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, |
+ * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND |
+ * FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS |
+ * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO |
+ * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. |
+ * |
+ * Google Author(s): Behdad Esfahbod |
+ */ |
+ |
+#ifndef HB_OT_SHAPE_COMPLEX_ARABIC_WIN1256_HH |
+ |
+ |
+/* |
+ * The macros in the first part of this file are generic macros that can |
+ * be used to define the bytes for OpenType table data in code in a |
+ * readable manner. We can move the macros to reside with their respective |
+ * struct types, but since we only use these to define one data table, the |
+ * Windows-1256 Arabic shaping table in this file, we keep them here. |
+ */ |
+ |
+ |
+/* First we measure, then we cut. */ |
+#ifndef OT_MEASURE |
+#define OT_MEASURE |
+#define OT_TABLE_START static const struct TABLE_NAME { |
+#define OT_TABLE_END } |
+#define OT_LABEL_START(Name) unsigned char Name[ |
+#define OT_LABEL_END ]; |
+#define OT_BYTE(u8) +1/*byte*/ |
+#define OT_USHORT(u16) +2/*bytes*/ |
+#else |
+#undef OT_MEASURE |
+#define OT_TABLE_START TABLE_NAME = { |
+#define OT_TABLE_END }; |
+#define OT_LABEL_START(Name) { |
+#define OT_LABEL_END }, |
+#define OT_BYTE(u8) (u8), |
+#define OT_USHORT(u16) (unsigned char)((u16)>>8), (unsigned char)((u16)&0xFFu), |
+#define OT_COUNT(Name, ItemSize) ((unsigned int) sizeof(((struct TABLE_NAME*)0)->Name) \ |
+ / (unsigned int)(ItemSize) \ |
+ /* OT_ASSERT it's divisible (and positive). */) |
+#define OT_DISTANCE(From,To) ((unsigned int) \ |
+ ((char*)(&((struct TABLE_NAME*)0)->To) - \ |
+ (char*)(&((struct TABLE_NAME*)0)->From)) \ |
+ /* OT_ASSERT it's positive. */) |
+#endif |
+ |
+ |
+#define OT_LABEL(Name) \ |
+ OT_LABEL_END \ |
+ OT_LABEL_START(Name) |
+ |
+/* Whenever we receive an argument that is a list, it will expand to |
+ * contain commas. That cannot be passed to another macro because the |
+ * commas will throw off the preprocessor. The solution is to wrap |
+ * the passed-in argument in OT_LIST() before passing to the next macro. |
+ * Unfortunately this trick requires vararg macros. */ |
+#define OT_LIST(...) __VA_ARGS__ |
+ |
+ |
+/* |
+ * Basic Types |
+ */ |
+ |
+#define OT_TAG(a,b,c,d) \ |
+ OT_BYTE(a) OT_BYTE(b) OT_BYTE(c) OT_BYTE(d) |
+ |
+#define OT_OFFSET(From, To) /* Offset from From to To in bytes */ \ |
+ OT_USHORT(OT_DISTANCE(From, To)) |
+ |
+#define OT_GLYPHID /* GlyphID */ \ |
+ OT_USHORT |
+ |
+#define OT_UARRAY(Name, Items) \ |
+ OT_LABEL_START(Name) \ |
+ OT_USHORT(OT_COUNT(Name##Data, 2)) \ |
+ OT_LABEL(Name##Data) \ |
+ Items \ |
+ OT_LABEL_END |
+ |
+#define OT_UHEADLESSARRAY(Name, Items) \ |
+ OT_LABEL_START(Name) \ |
+ OT_USHORT(OT_COUNT(Name##Data, 2) + 1) \ |
+ OT_LABEL(Name##Data) \ |
+ Items \ |
+ OT_LABEL_END |
+ |
+ |
+/* |
+ * Common Types |
+ */ |
+ |
+#define OT_LOOKUP_FLAG_IGNORE_MARKS 0x08u |
+ |
+#define OT_LOOKUP(Name, LookupType, LookupFlag, SubLookupOffsets) \ |
+ OT_LABEL_START(Name) \ |
+ OT_USHORT(LookupType) \ |
+ OT_USHORT(LookupFlag) \ |
+ OT_LABEL_END \ |
+ OT_UARRAY(Name##SubLookupOffsetsArray, OT_LIST(SubLookupOffsets)) |
+ |
+#define OT_SUBLOOKUP(Name, SubFormat, Items) \ |
+ OT_LABEL_START(Name) \ |
+ OT_USHORT(SubFormat) \ |
+ Items |
+ |
+#define OT_COVERAGE1(Name, Items) \ |
+ OT_LABEL_START(Name) \ |
+ OT_USHORT(1) \ |
+ OT_LABEL_END \ |
+ OT_UARRAY(Name##Glyphs, OT_LIST(Items)) |
+ |
+ |
+/* |
+ * GSUB |
+ */ |
+ |
+#define OT_LOOKUP_TYPE_SUBST_SINGLE 1u |
+#define OT_LOOKUP_TYPE_SUBST_MULTIPLE 2u |
+#define OT_LOOKUP_TYPE_SUBST_LIGATURE 4u |
+ |
+#define OT_SUBLOOKUP_SINGLE_SUBST_FORMAT2(Name, FromGlyphs, ToGlyphs) \ |
+ OT_SUBLOOKUP(Name, 2, \ |
+ OT_OFFSET(Name, Name##Coverage) \ |
+ OT_LABEL_END \ |
+ OT_UARRAY(Name##Substitute, OT_LIST(ToGlyphs)) \ |
+ ) \ |
+ OT_COVERAGE1(Name##Coverage, OT_LIST(FromGlyphs)) \ |
+ /* ASSERT_STATIC_EXPR len(FromGlyphs) == len(ToGlyphs) */ |
+ |
+#define OT_SUBLOOKUP_LIGATURE_SUBST_FORMAT1(Name, FirstGlyphs, LigatureSetOffsets) \ |
+ OT_SUBLOOKUP(Name, 1, \ |
+ OT_OFFSET(Name, Name##Coverage) \ |
+ OT_LABEL_END \ |
+ OT_UARRAY(Name##LigatureSetOffsetsArray, OT_LIST(LigatureSetOffsets)) \ |
+ ) \ |
+ OT_COVERAGE1(Name##Coverage, OT_LIST(FirstGlyphs)) \ |
+ /* ASSERT_STATIC_EXPR len(FirstGlyphs) == len(LigatureSetOffsets) */ |
+ |
+#define OT_LIGATURE_SET(Name, LigatureSetOffsets) \ |
+ OT_UARRAY(Name, OT_LIST(LigatureSetOffsets)) |
+ |
+#define OT_LIGATURE(Name, Components, LigGlyph) \ |
+ OT_LABEL_START(Name) \ |
+ LigGlyph \ |
+ OT_LABEL_END \ |
+ OT_UHEADLESSARRAY(Name##ComponentsArray, OT_LIST(Components)) |
+ |
+/* |
+ * |
+ * Start of Windows-1256 shaping table. |
+ * |
+ */ |
+ |
+/* Table name. */ |
+#define TABLE_NAME arabic_win1256_gsub_lookups |
+ |
+/* Table manifest. */ |
+#define MANIFEST(Items) \ |
+ OT_LABEL_START(manifest) \ |
+ OT_USHORT(OT_COUNT(manifestData, 6)) \ |
+ OT_LABEL(manifestData) \ |
+ Items \ |
+ OT_LABEL_END |
+ |
+#define MANIFEST_LOOKUP(Tag, Name) \ |
+ Tag \ |
+ OT_OFFSET(manifest, Name) |
+ |
+/* Shorthand. */ |
+#define G OT_GLYPHID |
+ |
+/* |
+ * Table Start |
+ */ |
+OT_TABLE_START |
+ |
+ |
+/* |
+ * Manifest |
+ */ |
+MANIFEST( |
+ MANIFEST_LOOKUP(OT_TAG('r','l','i','g'), rligLookup) |
+ MANIFEST_LOOKUP(OT_TAG('i','n','i','t'), initLookup) |
+ MANIFEST_LOOKUP(OT_TAG('m','e','d','i'), mediLookup) |
+ MANIFEST_LOOKUP(OT_TAG('f','i','n','a'), finaLookup) |
+ MANIFEST_LOOKUP(OT_TAG('r','l','i','g'), rligMarksLookup) |
+) |
+ |
+/* |
+ * Lookups |
+ */ |
+OT_LOOKUP(initLookup, OT_LOOKUP_TYPE_SUBST_SINGLE, OT_LOOKUP_FLAG_IGNORE_MARKS, |
+ OT_OFFSET(initLookup, initmediSubLookup) |
+ OT_OFFSET(initLookup, initSubLookup) |
+) |
+OT_LOOKUP(mediLookup, OT_LOOKUP_TYPE_SUBST_SINGLE, OT_LOOKUP_FLAG_IGNORE_MARKS, |
+ OT_OFFSET(mediLookup, initmediSubLookup) |
+ OT_OFFSET(mediLookup, mediSubLookup) |
+ OT_OFFSET(mediLookup, medifinaLamAlefSubLookup) |
+) |
+OT_LOOKUP(finaLookup, OT_LOOKUP_TYPE_SUBST_SINGLE, OT_LOOKUP_FLAG_IGNORE_MARKS, |
+ OT_OFFSET(finaLookup, finaSubLookup) |
+ /* We don't need this one currently as the sequence inherits masks |
+ * from the first item. Just in case we change that in the future |
+ * to be smart about Arabic masks when ligating... */ |
+ OT_OFFSET(finaLookup, medifinaLamAlefSubLookup) |
+) |
+OT_LOOKUP(rligLookup, OT_LOOKUP_TYPE_SUBST_LIGATURE, OT_LOOKUP_FLAG_IGNORE_MARKS, |
+ OT_OFFSET(rligLookup, lamAlefLigaturesSubLookup) |
+) |
+OT_LOOKUP(rligMarksLookup, OT_LOOKUP_TYPE_SUBST_LIGATURE, 0, |
+ OT_OFFSET(rligMarksLookup, shaddaLigaturesSubLookup) |
+) |
+ |
+/* |
+ * init/medi/fina forms |
+ */ |
+OT_SUBLOOKUP_SINGLE_SUBST_FORMAT2(initmediSubLookup, |
+ G(198) G(200) G(201) G(202) G(203) G(204) G(205) G(206) G(211) |
+ G(212) G(213) G(214) G(223) G(225) G(227) G(228) G(236) G(237), |
+ G(162) G(4) G(5) G(5) G(6) G(7) G(9) G(11) G(13) |
+ G(14) G(15) G(26) G(140) G(141) G(142) G(143) G(154) G(154) |
+) |
+OT_SUBLOOKUP_SINGLE_SUBST_FORMAT2(initSubLookup, |
+ G(218) G(219) G(221) G(222) G(229), |
+ G(27) G(30) G(128) G(131) G(144) |
+) |
+OT_SUBLOOKUP_SINGLE_SUBST_FORMAT2(mediSubLookup, |
+ G(218) G(219) G(221) G(222) G(229), |
+ G(28) G(31) G(129) G(138) G(149) |
+) |
+OT_SUBLOOKUP_SINGLE_SUBST_FORMAT2(finaSubLookup, |
+ G(194) G(195) G(197) G(198) G(199) G(201) G(204) G(205) G(206) |
+ G(218) G(219) G(229) G(236) G(237), |
+ G(2) G(1) G(3) G(181) G(0) G(159) G(8) G(10) G(12) |
+ G(29) G(127) G(152) G(160) G(156) |
+) |
+OT_SUBLOOKUP_SINGLE_SUBST_FORMAT2(medifinaLamAlefSubLookup, |
+ G(165) G(178) G(180) G(252), |
+ G(170) G(179) G(185) G(255) |
+) |
+ |
+/* |
+ * Lam+Alef ligatures |
+ */ |
+OT_SUBLOOKUP_LIGATURE_SUBST_FORMAT1(lamAlefLigaturesSubLookup, |
+ G(225), |
+ OT_OFFSET(lamAlefLigaturesSubLookup, lamLigatureSet) |
+) |
+OT_LIGATURE_SET(lamLigatureSet, |
+ OT_OFFSET(lamLigatureSet, lamInitLigature1) |
+ OT_OFFSET(lamLigatureSet, lamInitLigature2) |
+ OT_OFFSET(lamLigatureSet, lamInitLigature3) |
+ OT_OFFSET(lamLigatureSet, lamInitLigature4) |
+) |
+OT_LIGATURE(lamInitLigature1, G(199), G(165)) |
+OT_LIGATURE(lamInitLigature2, G(195), G(178)) |
+OT_LIGATURE(lamInitLigature3, G(194), G(180)) |
+OT_LIGATURE(lamInitLigature4, G(197), G(252)) |
+ |
+/* |
+ * Shadda ligatures |
+ */ |
+OT_SUBLOOKUP_LIGATURE_SUBST_FORMAT1(shaddaLigaturesSubLookup, |
+ G(248), |
+ OT_OFFSET(shaddaLigaturesSubLookup, shaddaLigatureSet) |
+) |
+OT_LIGATURE_SET(shaddaLigatureSet, |
+ OT_OFFSET(shaddaLigatureSet, shaddaLigature1) |
+ OT_OFFSET(shaddaLigatureSet, shaddaLigature2) |
+ OT_OFFSET(shaddaLigatureSet, shaddaLigature3) |
+) |
+OT_LIGATURE(shaddaLigature1, G(243), G(172)) |
+OT_LIGATURE(shaddaLigature2, G(245), G(173)) |
+OT_LIGATURE(shaddaLigature3, G(246), G(175)) |
+ |
+/* |
+ * Table end |
+ */ |
+OT_TABLE_END |
+ |
+ |
+/* |
+ * Clean up |
+ */ |
+#undef OT_TABLE_START |
+#undef OT_TABLE_END |
+#undef OT_LABEL_START |
+#undef OT_LABEL_END |
+#undef OT_BYTE |
+#undef OT_USHORT |
+#undef OT_DISTANCE |
+#undef OT_COUNT |
+ |
+/* |
+ * Include a second time to get the table data... |
+ */ |
+#ifdef OT_MEASURE |
+#include __FILE__ |
+#endif |
+ |
+#define HB_OT_SHAPE_COMPLEX_ARABIC_WIN1256_HH |
+#endif /* HB_OT_SHAPE_COMPLEX_ARABIC_WIN1256_HH */ |