OLD | NEW |
| (Empty) |
1 /* | |
2 * Copyright (C) 1998-2004 David Turner and Werner Lemberg | |
3 * Copyright (C) 2006 Behdad Esfahbod | |
4 * | |
5 * This is part of HarfBuzz, an OpenType Layout engine library. | |
6 * | |
7 * Permission is hereby granted, without written agreement and without | |
8 * license or royalty fees, to use, copy, modify, and distribute this | |
9 * software and its documentation for any purpose, provided that the | |
10 * above copyright notice and the following two paragraphs appear in | |
11 * all copies of this software. | |
12 * | |
13 * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR | |
14 * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES | |
15 * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN | |
16 * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH | |
17 * DAMAGE. | |
18 * | |
19 * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, | |
20 * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND | |
21 * FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS | |
22 * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO | |
23 * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. | |
24 */ | |
25 | |
26 #ifndef HARFBUZZ_GSUB_PRIVATE_H | |
27 #define HARFBUZZ_GSUB_PRIVATE_H | |
28 | |
29 #include "harfbuzz-impl.h" | |
30 #include "harfbuzz-stream-private.h" | |
31 #include "harfbuzz-gsub.h" | |
32 | |
33 HB_BEGIN_HEADER | |
34 | |
35 #ifdef HB_USE_PACKED_STRUCTS | |
36 #pragma pack(push, 1) | |
37 #endif | |
38 | |
39 typedef union HB_GSUB_SubTable_ HB_GSUB_SubTable; | |
40 | |
41 /* LookupType 1 */ | |
42 | |
43 struct HB_SingleSubstFormat1_ | |
44 { | |
45 HB_Short DeltaGlyphID; /* constant added to get | |
46 substitution glyph index */ | |
47 }; | |
48 | |
49 typedef struct HB_SingleSubstFormat1_ HB_SingleSubstFormat1; | |
50 | |
51 | |
52 struct HB_SingleSubstFormat2_ | |
53 { | |
54 HB_UShort* Substitute; /* array of substitute glyph IDs */ | |
55 HB_UShort GlyphCount; /* number of glyph IDs in | |
56 Substitute array */ | |
57 }; | |
58 | |
59 typedef struct HB_SingleSubstFormat2_ HB_SingleSubstFormat2; | |
60 | |
61 | |
62 struct HB_SingleSubst_ | |
63 { | |
64 union | |
65 { | |
66 HB_SingleSubstFormat1 ssf1; | |
67 HB_SingleSubstFormat2 ssf2; | |
68 } ssf; | |
69 | |
70 HB_Coverage Coverage; /* Coverage table */ | |
71 HB_Byte SubstFormat; /* 1 or 2 */ | |
72 }; | |
73 | |
74 typedef struct HB_SingleSubst_ HB_SingleSubst; | |
75 | |
76 | |
77 /* LookupType 2 */ | |
78 | |
79 struct HB_Sequence_ | |
80 { | |
81 HB_UShort* Substitute; /* string of glyph IDs to | |
82 substitute */ | |
83 HB_UShort GlyphCount; /* number of glyph IDs in the | |
84 Substitute array */ | |
85 }; | |
86 | |
87 typedef struct HB_Sequence_ HB_Sequence; | |
88 | |
89 | |
90 struct HB_MultipleSubst_ | |
91 { | |
92 HB_Sequence* Sequence; /* array of Sequence tables */ | |
93 HB_Coverage Coverage; /* Coverage table */ | |
94 HB_UShort SubstFormat; /* always 1 */ | |
95 HB_UShort SequenceCount; /* number of Sequence tables */ | |
96 }; | |
97 | |
98 typedef struct HB_MultipleSubst_ HB_MultipleSubst; | |
99 | |
100 | |
101 /* LookupType 3 */ | |
102 | |
103 struct HB_AlternateSet_ | |
104 { | |
105 HB_UShort* Alternate; /* array of alternate glyph IDs */ | |
106 HB_UShort GlyphCount; /* number of glyph IDs in the | |
107 Alternate array */ | |
108 }; | |
109 | |
110 typedef struct HB_AlternateSet_ HB_AlternateSet; | |
111 | |
112 | |
113 struct HB_AlternateSubst_ | |
114 { | |
115 HB_AlternateSet* AlternateSet; /* array of AlternateSet tables */ | |
116 HB_Coverage Coverage; /* Coverage table */ | |
117 HB_UShort SubstFormat; /* always 1 */ | |
118 HB_UShort AlternateSetCount; | |
119 /* number of AlternateSet tables */ | |
120 }; | |
121 | |
122 typedef struct HB_AlternateSubst_ HB_AlternateSubst; | |
123 | |
124 | |
125 /* LookupType 4 */ | |
126 | |
127 struct HB_Ligature_ | |
128 { | |
129 HB_UShort* Component; /* array of component glyph IDs */ | |
130 HB_UShort LigGlyph; /* glyphID of ligature | |
131 to substitute */ | |
132 HB_UShort ComponentCount; /* number of components in ligature */ | |
133 }; | |
134 | |
135 typedef struct HB_Ligature_ HB_Ligature; | |
136 | |
137 | |
138 struct HB_LigatureSet_ | |
139 { | |
140 HB_Ligature* Ligature; /* array of Ligature tables */ | |
141 HB_UShort LigatureCount; /* number of Ligature tables */ | |
142 }; | |
143 | |
144 typedef struct HB_LigatureSet_ HB_LigatureSet; | |
145 | |
146 | |
147 struct HB_LigatureSubst_ | |
148 { | |
149 HB_LigatureSet* LigatureSet; /* array of LigatureSet tables */ | |
150 HB_Coverage Coverage; /* Coverage table */ | |
151 HB_UShort SubstFormat; /* always 1 */ | |
152 HB_UShort LigatureSetCount; /* number of LigatureSet tables */ | |
153 }; | |
154 | |
155 typedef struct HB_LigatureSubst_ HB_LigatureSubst; | |
156 | |
157 | |
158 /* needed by both lookup type 5 and 6 */ | |
159 | |
160 struct HB_SubstLookupRecord_ | |
161 { | |
162 HB_UShort SequenceIndex; /* index into current | |
163 glyph sequence */ | |
164 HB_UShort LookupListIndex; /* Lookup to apply to that pos. */ | |
165 }; | |
166 | |
167 typedef struct HB_SubstLookupRecord_ HB_SubstLookupRecord; | |
168 | |
169 | |
170 /* LookupType 5 */ | |
171 | |
172 struct HB_SubRule_ | |
173 { | |
174 HB_UShort* Input; /* array of input glyph IDs */ | |
175 HB_SubstLookupRecord* SubstLookupRecord; | |
176 /* array of SubstLookupRecord | |
177 tables */ | |
178 HB_UShort GlyphCount; /* total number of input glyphs */ | |
179 HB_UShort SubstCount; /* number of SubstLookupRecord | |
180 tables */ | |
181 }; | |
182 | |
183 typedef struct HB_SubRule_ HB_SubRule; | |
184 | |
185 | |
186 struct HB_SubRuleSet_ | |
187 { | |
188 HB_SubRule* SubRule; /* array of SubRule tables */ | |
189 HB_UShort SubRuleCount; /* number of SubRule tables */ | |
190 }; | |
191 | |
192 typedef struct HB_SubRuleSet_ HB_SubRuleSet; | |
193 | |
194 | |
195 struct HB_ContextSubstFormat1_ | |
196 { | |
197 HB_SubRuleSet* SubRuleSet; /* array of SubRuleSet tables */ | |
198 HB_Coverage Coverage; /* Coverage table */ | |
199 HB_UShort SubRuleSetCount; /* number of SubRuleSet tables */ | |
200 }; | |
201 | |
202 typedef struct HB_ContextSubstFormat1_ HB_ContextSubstFormat1; | |
203 | |
204 | |
205 struct HB_SubClassRule_ | |
206 { | |
207 HB_UShort* Class; /* array of classes */ | |
208 HB_SubstLookupRecord* SubstLookupRecord; | |
209 /* array of SubstLookupRecord | |
210 tables */ | |
211 HB_UShort GlyphCount; /* total number of context classes */ | |
212 HB_UShort SubstCount; /* number of SubstLookupRecord | |
213 tables */ | |
214 }; | |
215 | |
216 typedef struct HB_SubClassRule_ HB_SubClassRule; | |
217 | |
218 | |
219 struct HB_SubClassSet_ | |
220 { | |
221 HB_SubClassRule* SubClassRule; /* array of SubClassRule tables */ | |
222 HB_UShort SubClassRuleCount; | |
223 /* number of SubClassRule tables */ | |
224 }; | |
225 | |
226 typedef struct HB_SubClassSet_ HB_SubClassSet; | |
227 | |
228 | |
229 /* The `MaxContextLength' field is not defined in the TTO specification | |
230 but simplifies the implementation of this format. It holds the | |
231 maximal context length used in the context rules. */ | |
232 | |
233 struct HB_ContextSubstFormat2_ | |
234 { | |
235 HB_SubClassSet* SubClassSet; /* array of SubClassSet tables */ | |
236 HB_Coverage Coverage; /* Coverage table */ | |
237 HB_ClassDefinition ClassDef; /* ClassDef table */ | |
238 HB_UShort SubClassSetCount; | |
239 /* number of SubClassSet tables */ | |
240 HB_UShort MaxContextLength; | |
241 /* maximal context length */ | |
242 }; | |
243 | |
244 typedef struct HB_ContextSubstFormat2_ HB_ContextSubstFormat2; | |
245 | |
246 | |
247 struct HB_ContextSubstFormat3_ | |
248 { | |
249 HB_Coverage* Coverage; /* array of Coverage tables */ | |
250 HB_SubstLookupRecord* SubstLookupRecord; | |
251 /* array of substitution lookups */ | |
252 HB_UShort GlyphCount; /* number of input glyphs */ | |
253 HB_UShort SubstCount; /* number of SubstLookupRecords */ | |
254 }; | |
255 | |
256 typedef struct HB_ContextSubstFormat3_ HB_ContextSubstFormat3; | |
257 | |
258 | |
259 struct HB_ContextSubst_ | |
260 { | |
261 union | |
262 { | |
263 HB_ContextSubstFormat1 csf1; | |
264 HB_ContextSubstFormat2 csf2; | |
265 HB_ContextSubstFormat3 csf3; | |
266 } csf; | |
267 | |
268 HB_Byte SubstFormat; /* 1, 2, or 3 */ | |
269 }; | |
270 | |
271 typedef struct HB_ContextSubst_ HB_ContextSubst; | |
272 | |
273 | |
274 /* LookupType 6 */ | |
275 | |
276 struct HB_ChainSubRule_ | |
277 { | |
278 HB_UShort* Backtrack; /* array of backtrack glyph IDs */ | |
279 HB_UShort* Input; /* array of input glyph IDs */ | |
280 HB_UShort* Lookahead; /* array of lookahead glyph IDs */ | |
281 HB_SubstLookupRecord* SubstLookupRecord; | |
282 /* array of SubstLookupRecords */ | |
283 HB_UShort BacktrackGlyphCount; | |
284 /* total number of backtrack glyphs */ | |
285 HB_UShort InputGlyphCount; | |
286 /* total number of input glyphs */ | |
287 HB_UShort LookaheadGlyphCount; | |
288 /* total number of lookahead glyphs */ | |
289 HB_UShort SubstCount; /* number of SubstLookupRecords */ | |
290 }; | |
291 | |
292 typedef struct HB_ChainSubRule_ HB_ChainSubRule; | |
293 | |
294 | |
295 struct HB_ChainSubRuleSet_ | |
296 { | |
297 HB_ChainSubRule* ChainSubRule; /* array of ChainSubRule tables */ | |
298 HB_UShort ChainSubRuleCount; | |
299 /* number of ChainSubRule tables */ | |
300 }; | |
301 | |
302 typedef struct HB_ChainSubRuleSet_ HB_ChainSubRuleSet; | |
303 | |
304 | |
305 struct HB_ChainContextSubstFormat1_ | |
306 { | |
307 HB_ChainSubRuleSet* ChainSubRuleSet; | |
308 /* array of ChainSubRuleSet tables */ | |
309 HB_Coverage Coverage; /* Coverage table */ | |
310 HB_UShort ChainSubRuleSetCount; | |
311 /* number of ChainSubRuleSet tables */ | |
312 }; | |
313 | |
314 typedef struct HB_ChainContextSubstFormat1_ HB_ChainContextSubstFormat1; | |
315 | |
316 | |
317 struct HB_ChainSubClassRule_ | |
318 { | |
319 HB_UShort* Backtrack; /* array of backtrack classes */ | |
320 HB_UShort* Input; /* array of context classes */ | |
321 HB_UShort* Lookahead; /* array of lookahead classes */ | |
322 HB_SubstLookupRecord* SubstLookupRecord; | |
323 /* array of substitution lookups */ | |
324 HB_UShort BacktrackGlyphCount; | |
325 /* total number of backtrack | |
326 classes */ | |
327 HB_UShort InputGlyphCount; | |
328 /* total number of context classes */ | |
329 HB_UShort LookaheadGlyphCount; | |
330 /* total number of lookahead | |
331 classes */ | |
332 HB_UShort SubstCount; /* number of SubstLookupRecords */ | |
333 }; | |
334 | |
335 typedef struct HB_ChainSubClassRule_ HB_ChainSubClassRule; | |
336 | |
337 | |
338 struct HB_ChainSubClassSet_ | |
339 { | |
340 HB_ChainSubClassRule* ChainSubClassRule; | |
341 /* array of ChainSubClassRule | |
342 tables */ | |
343 HB_UShort ChainSubClassRuleCount; | |
344 /* number of ChainSubClassRule | |
345 tables */ | |
346 }; | |
347 | |
348 typedef struct HB_ChainSubClassSet_ HB_ChainSubClassSet; | |
349 | |
350 | |
351 /* The `MaxXXXLength' fields are not defined in the TTO specification | |
352 but simplifies the implementation of this format. It holds the | |
353 maximal context length used in the specific context rules. */ | |
354 | |
355 struct HB_ChainContextSubstFormat2_ | |
356 { | |
357 HB_ChainSubClassSet* ChainSubClassSet; | |
358 /* array of ChainSubClassSet | |
359 tables */ | |
360 HB_Coverage Coverage; /* Coverage table */ | |
361 | |
362 HB_ClassDefinition BacktrackClassDef; | |
363 /* BacktrackClassDef table */ | |
364 HB_ClassDefinition InputClassDef; | |
365 /* InputClassDef table */ | |
366 HB_ClassDefinition LookaheadClassDef; | |
367 /* LookaheadClassDef table */ | |
368 | |
369 HB_UShort ChainSubClassSetCount; | |
370 /* number of ChainSubClassSet | |
371 tables */ | |
372 HB_UShort MaxBacktrackLength; | |
373 /* maximal backtrack length */ | |
374 HB_UShort MaxLookaheadLength; | |
375 /* maximal lookahead length */ | |
376 HB_UShort MaxInputLength; | |
377 /* maximal input length */ | |
378 }; | |
379 | |
380 typedef struct HB_ChainContextSubstFormat2_ HB_ChainContextSubstFormat2; | |
381 | |
382 | |
383 struct HB_ChainContextSubstFormat3_ | |
384 { | |
385 HB_Coverage* BacktrackCoverage; | |
386 /* array of backtrack Coverage | |
387 tables */ | |
388 HB_Coverage* InputCoverage; | |
389 /* array of input coverage | |
390 tables */ | |
391 HB_Coverage* LookaheadCoverage; | |
392 /* array of lookahead coverage | |
393 tables */ | |
394 HB_SubstLookupRecord* SubstLookupRecord; | |
395 /* array of substitution lookups */ | |
396 HB_UShort BacktrackGlyphCount; | |
397 /* number of backtrack glyphs */ | |
398 HB_UShort InputGlyphCount; | |
399 /* number of input glyphs */ | |
400 HB_UShort LookaheadGlyphCount; | |
401 /* number of lookahead glyphs */ | |
402 HB_UShort SubstCount; /* number of SubstLookupRecords */ | |
403 }; | |
404 | |
405 typedef struct HB_ChainContextSubstFormat3_ HB_ChainContextSubstFormat3; | |
406 | |
407 | |
408 struct HB_ChainContextSubst_ | |
409 { | |
410 union | |
411 { | |
412 HB_ChainContextSubstFormat1 ccsf1; | |
413 HB_ChainContextSubstFormat2 ccsf2; | |
414 HB_ChainContextSubstFormat3 ccsf3; | |
415 } ccsf; | |
416 | |
417 HB_Byte SubstFormat; /* 1, 2, or 3 */ | |
418 }; | |
419 | |
420 typedef struct HB_ChainContextSubst_ HB_ChainContextSubst; | |
421 | |
422 | |
423 #if 0 | |
424 /* LookupType 7 */ | |
425 struct HB_ExtensionSubst_ | |
426 { | |
427 HB_GSUB_SubTable *subtable; /* referenced subtable */ | |
428 HB_UShort SubstFormat; /* always 1 */ | |
429 HB_UShort LookuptType; /* lookup-type of referenced subtable */ | |
430 }; | |
431 | |
432 typedef struct HB_ExtensionSubst_ HB_ExtensionSubst; | |
433 #endif | |
434 | |
435 | |
436 /* LookupType 8 */ | |
437 struct HB_ReverseChainContextSubst_ | |
438 { | |
439 HB_Coverage* LookaheadCoverage; /* array of lookahead Coverage | |
440 tables */ | |
441 HB_UShort* Substitute; /* array of substitute Glyph ID */ | |
442 HB_Coverage* BacktrackCoverage; /* array of backtrack Coverage | |
443 tables */ | |
444 HB_Coverage Coverage; /* coverage table for input glyphs */ | |
445 HB_UShort SubstFormat; /* always 1 */ | |
446 HB_UShort BacktrackGlyphCount; /* number of backtrack glyphs */ | |
447 HB_UShort LookaheadGlyphCount; /* number of lookahead glyphs */ | |
448 HB_UShort GlyphCount; /* number of Glyph IDs */ | |
449 }; | |
450 | |
451 typedef struct HB_ReverseChainContextSubst_ HB_ReverseChainContextSubst; | |
452 | |
453 | |
454 union HB_GSUB_SubTable_ | |
455 { | |
456 HB_SingleSubst single; | |
457 HB_MultipleSubst multiple; | |
458 HB_AlternateSubst alternate; | |
459 HB_LigatureSubst ligature; | |
460 HB_ContextSubst context; | |
461 HB_ChainContextSubst chain; | |
462 HB_ReverseChainContextSubst reverse; | |
463 }; | |
464 | |
465 | |
466 | |
467 | |
468 HB_INTERNAL HB_Error | |
469 _HB_GSUB_Load_SubTable( HB_GSUB_SubTable* st, | |
470 HB_Stream stream, | |
471 HB_UShort lookup_type ); | |
472 | |
473 HB_INTERNAL void | |
474 _HB_GSUB_Free_SubTable( HB_GSUB_SubTable* st, | |
475 HB_UShort lookup_type ); | |
476 | |
477 #ifdef HB_USE_PACKED_STRUCTS | |
478 #pragma pack(pop) | |
479 #endif | |
480 | |
481 HB_END_HEADER | |
482 | |
483 #endif /* HARFBUZZ_GSUB_PRIVATE_H */ | |
OLD | NEW |