• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 */
484