2 * Copyright © 2014 Google, Inc.
4 * This is part of HarfBuzz, a text shaping library.
6 * Permission is hereby granted, without written agreement and without
7 * license or royalty fees, to use, copy, modify, and distribute this
8 * software and its documentation for any purpose, provided that the
9 * above copyright notice and the following two paragraphs appear in
10 * all copies of this software.
12 * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR
13 * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
14 * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN
15 * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
18 * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING,
19 * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
20 * FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS
21 * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO
22 * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
24 * Google Author(s): Behdad Esfahbod
27 #ifndef HB_OT_SHAPE_COMPLEX_ARABIC_WIN1256_HH
31 * The macros in the first part of this file are generic macros that can
32 * be used to define the bytes for OpenType table data in code in a
33 * readable manner. We can move the macros to reside with their respective
34 * struct types, but since we only use these to define one data table, the
35 * Windows-1256 Arabic shaping table in this file, we keep them here.
39 /* First we measure, then we cut. */
42 #define OT_TABLE_START static const struct TABLE_NAME {
43 #define OT_TABLE_END }
44 #define OT_LABEL_START(Name) unsigned char Name[
45 #define OT_LABEL_END ];
46 #define OT_BYTE(u8) +1/*byte*/
47 #define OT_USHORT(u16) +2/*bytes*/
50 #define OT_TABLE_START TABLE_NAME = {
51 #define OT_TABLE_END };
52 #define OT_LABEL_START(Name) {
53 #define OT_LABEL_END },
54 #define OT_BYTE(u8) (u8),
55 #define OT_USHORT(u16) (unsigned char)((u16)>>8), (unsigned char)((u16)&0xFFu),
56 #define OT_COUNT(Name, ItemSize) ((unsigned int) sizeof(((struct TABLE_NAME*)0)->Name) \
57 / (unsigned int)(ItemSize) \
58 /* OT_ASSERT it's divisible (and positive). */)
59 #define OT_DISTANCE(From,To) ((unsigned int) \
60 ((char*)(&((struct TABLE_NAME*)0)->To) - \
61 (char*)(&((struct TABLE_NAME*)0)->From)) \
62 /* OT_ASSERT it's positive. */)
66 #define OT_LABEL(Name) \
70 /* Whenever we receive an argument that is a list, it will expand to
71 * contain commas. That cannot be passed to another macro because the
72 * commas will throw off the preprocessor. The solution is to wrap
73 * the passed-in argument in OT_LIST() before passing to the next macro.
74 * Unfortunately this trick requires vararg macros. */
75 #define OT_LIST(...) __VA_ARGS__
82 #define OT_TAG(a,b,c,d) \
83 OT_BYTE(a) OT_BYTE(b) OT_BYTE(c) OT_BYTE(d)
85 #define OT_OFFSET(From, To) /* Offset from From to To in bytes */ \
86 OT_USHORT(OT_DISTANCE(From, To))
88 #define OT_GLYPHID /* GlyphID */ \
91 #define OT_UARRAY(Name, Items) \
92 OT_LABEL_START(Name) \
93 OT_USHORT(OT_COUNT(Name##Data, 2)) \
94 OT_LABEL(Name##Data) \
98 #define OT_UHEADLESSARRAY(Name, Items) \
99 OT_LABEL_START(Name) \
100 OT_USHORT(OT_COUNT(Name##Data, 2) + 1) \
101 OT_LABEL(Name##Data) \
110 #define OT_LOOKUP_FLAG_IGNORE_MARKS 0x08u
112 #define OT_LOOKUP(Name, LookupType, LookupFlag, SubLookupOffsets) \
113 OT_LABEL_START(Name) \
114 OT_USHORT(LookupType) \
115 OT_USHORT(LookupFlag) \
117 OT_UARRAY(Name##SubLookupOffsetsArray, OT_LIST(SubLookupOffsets))
119 #define OT_SUBLOOKUP(Name, SubFormat, Items) \
120 OT_LABEL_START(Name) \
121 OT_USHORT(SubFormat) \
124 #define OT_COVERAGE1(Name, Items) \
125 OT_LABEL_START(Name) \
128 OT_UARRAY(Name##Glyphs, OT_LIST(Items))
135 #define OT_LOOKUP_TYPE_SUBST_SINGLE 1u
136 #define OT_LOOKUP_TYPE_SUBST_LIGATURE 4u
138 #define OT_SUBLOOKUP_SINGLE_SUBST_FORMAT2(Name, FromGlyphs, ToGlyphs) \
139 OT_SUBLOOKUP(Name, 2, \
140 OT_OFFSET(Name, Name##Coverage) \
142 OT_UARRAY(Name##Substitute, OT_LIST(ToGlyphs)) \
144 OT_COVERAGE1(Name##Coverage, OT_LIST(FromGlyphs)) \
145 /* ASSERT_STATIC_EXPR len(FromGlyphs) == len(ToGlyphs) */
147 #define OT_SUBLOOKUP_LIGATURE_SUBST_FORMAT1(Name, FirstGlyphs, LigatureSetOffsets) \
148 OT_SUBLOOKUP(Name, 1, \
149 OT_OFFSET(Name, Name##Coverage) \
151 OT_UARRAY(Name##LigatureSetOffsetsArray, OT_LIST(LigatureSetOffsets)) \
153 OT_COVERAGE1(Name##Coverage, OT_LIST(FirstGlyphs)) \
154 /* ASSERT_STATIC_EXPR len(FirstGlyphs) == len(LigatureSetOffsets) */
156 #define OT_LIGATURE_SET(Name, LigatureSetOffsets) \
157 OT_UARRAY(Name, OT_LIST(LigatureSetOffsets))
159 #define OT_LIGATURE(Name, Components, LigGlyph) \
160 OT_LABEL_START(Name) \
163 OT_UHEADLESSARRAY(Name##ComponentsArray, OT_LIST(Components))
167 * Start of Windows-1256 shaping table.
172 #define TABLE_NAME arabic_win1256_gsub_lookups
174 /* Table manifest. */
175 #define MANIFEST(Items) \
176 OT_LABEL_START(manifest) \
177 OT_USHORT(OT_COUNT(manifestData, 6)) \
178 OT_LABEL(manifestData) \
182 #define MANIFEST_LOOKUP(Tag, Name) \
184 OT_OFFSET(manifest, Name)
199 MANIFEST_LOOKUP(OT_TAG('r','l','i','g'), rligLookup
)
200 MANIFEST_LOOKUP(OT_TAG('i','n','i','t'), initLookup
)
201 MANIFEST_LOOKUP(OT_TAG('m','e','d','i'), mediLookup
)
202 MANIFEST_LOOKUP(OT_TAG('f','i','n','a'), finaLookup
)
203 MANIFEST_LOOKUP(OT_TAG('r','l','i','g'), rligMarksLookup
)
209 OT_LOOKUP(initLookup
, OT_LOOKUP_TYPE_SUBST_SINGLE
, OT_LOOKUP_FLAG_IGNORE_MARKS
,
210 OT_OFFSET(initLookup
, initmediSubLookup
)
211 OT_OFFSET(initLookup
, initSubLookup
)
213 OT_LOOKUP(mediLookup
, OT_LOOKUP_TYPE_SUBST_SINGLE
, OT_LOOKUP_FLAG_IGNORE_MARKS
,
214 OT_OFFSET(mediLookup
, initmediSubLookup
)
215 OT_OFFSET(mediLookup
, mediSubLookup
)
216 OT_OFFSET(mediLookup
, medifinaLamAlefSubLookup
)
218 OT_LOOKUP(finaLookup
, OT_LOOKUP_TYPE_SUBST_SINGLE
, OT_LOOKUP_FLAG_IGNORE_MARKS
,
219 OT_OFFSET(finaLookup
, finaSubLookup
)
220 /* We don't need this one currently as the sequence inherits masks
221 * from the first item. Just in case we change that in the future
222 * to be smart about Arabic masks when ligating... */
223 OT_OFFSET(finaLookup
, medifinaLamAlefSubLookup
)
225 OT_LOOKUP(rligLookup
, OT_LOOKUP_TYPE_SUBST_LIGATURE
, OT_LOOKUP_FLAG_IGNORE_MARKS
,
226 OT_OFFSET(rligLookup
, lamAlefLigaturesSubLookup
)
228 OT_LOOKUP(rligMarksLookup
, OT_LOOKUP_TYPE_SUBST_LIGATURE
, 0,
229 OT_OFFSET(rligMarksLookup
, shaddaLigaturesSubLookup
)
233 * init/medi/fina forms
235 OT_SUBLOOKUP_SINGLE_SUBST_FORMAT2(initmediSubLookup
,
236 G(198) G(200) G(201) G(202) G(203) G(204) G(205) G(206) G(211)
237 G(212) G(213) G(214) G(223) G(225) G(227) G(228) G(236) G(237),
238 G(162) G(4) G(5) G(5) G(6) G(7) G(9) G(11) G(13)
239 G(14) G(15) G(26) G(140) G(141) G(142) G(143) G(154) G(154)
241 OT_SUBLOOKUP_SINGLE_SUBST_FORMAT2(initSubLookup
,
242 G(218) G(219) G(221) G(222) G(229),
243 G(27) G(30) G(128) G(131) G(144)
245 OT_SUBLOOKUP_SINGLE_SUBST_FORMAT2(mediSubLookup
,
246 G(218) G(219) G(221) G(222) G(229),
247 G(28) G(31) G(129) G(138) G(149)
249 OT_SUBLOOKUP_SINGLE_SUBST_FORMAT2(finaSubLookup
,
250 G(194) G(195) G(197) G(198) G(199) G(201) G(204) G(205) G(206)
251 G(218) G(219) G(229) G(236) G(237),
252 G(2) G(1) G(3) G(181) G(0) G(159) G(8) G(10) G(12)
253 G(29) G(127) G(152) G(160) G(156)
255 OT_SUBLOOKUP_SINGLE_SUBST_FORMAT2(medifinaLamAlefSubLookup
,
256 G(165) G(178) G(180) G(252),
257 G(170) G(179) G(185) G(255)
263 OT_SUBLOOKUP_LIGATURE_SUBST_FORMAT1(lamAlefLigaturesSubLookup
,
265 OT_OFFSET(lamAlefLigaturesSubLookup
, lamLigatureSet
)
267 OT_LIGATURE_SET(lamLigatureSet
,
268 OT_OFFSET(lamLigatureSet
, lamInitLigature1
)
269 OT_OFFSET(lamLigatureSet
, lamInitLigature2
)
270 OT_OFFSET(lamLigatureSet
, lamInitLigature3
)
271 OT_OFFSET(lamLigatureSet
, lamInitLigature4
)
273 OT_LIGATURE(lamInitLigature1
, G(199), G(165))
274 OT_LIGATURE(lamInitLigature2
, G(195), G(178))
275 OT_LIGATURE(lamInitLigature3
, G(194), G(180))
276 OT_LIGATURE(lamInitLigature4
, G(197), G(252))
281 OT_SUBLOOKUP_LIGATURE_SUBST_FORMAT1(shaddaLigaturesSubLookup
,
283 OT_OFFSET(shaddaLigaturesSubLookup
, shaddaLigatureSet
)
285 OT_LIGATURE_SET(shaddaLigatureSet
,
286 OT_OFFSET(shaddaLigatureSet
, shaddaLigature1
)
287 OT_OFFSET(shaddaLigatureSet
, shaddaLigature2
)
288 OT_OFFSET(shaddaLigatureSet
, shaddaLigature3
)
290 OT_LIGATURE(shaddaLigature1
, G(243), G(172))
291 OT_LIGATURE(shaddaLigature2
, G(245), G(173))
292 OT_LIGATURE(shaddaLigature3
, G(246), G(175))
303 #undef OT_TABLE_START
305 #undef OT_LABEL_START
313 * Include a second time to get the table data...
316 #include "hb-private.hh" /* Make check-includes.sh happy. */
319 #include "hb-ot-shape-complex-arabic-win1256.hh"
322 #define HB_OT_SHAPE_COMPLEX_ARABIC_WIN1256_HH
323 #endif /* HB_OT_SHAPE_COMPLEX_ARABIC_WIN1256_HH */