Home | History | Annotate | Download | only in src
      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