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_H
     27 #define HARFBUZZ_GSUB_H
     28 
     29 #include "harfbuzz-gdef.h"
     30 #include "harfbuzz-buffer.h"
     31 
     32 HB_BEGIN_HEADER
     33 
     34 
     35 #ifdef HB_USE_PACKED_STRUCTS
     36 #pragma pack(push, 1)
     37 #endif
     38 
     39 /* Lookup types for glyph substitution */
     40 
     41 #define HB_GSUB_LOOKUP_SINGLE        1
     42 #define HB_GSUB_LOOKUP_MULTIPLE      2
     43 #define HB_GSUB_LOOKUP_ALTERNATE     3
     44 #define HB_GSUB_LOOKUP_LIGATURE      4
     45 #define HB_GSUB_LOOKUP_CONTEXT       5
     46 #define HB_GSUB_LOOKUP_CHAIN         6
     47 #define HB_GSUB_LOOKUP_EXTENSION     7
     48 #define HB_GSUB_LOOKUP_REVERSE_CHAIN 8
     49 
     50 
     51 /* A pointer to a function which selects the alternate glyph.  `pos' is
     52    the position of the glyph with index `glyphID', `num_alternates'
     53    gives the number of alternates in the `alternates' array.  `data'
     54    points to the user-defined structure specified during a call to
     55    HB_GSUB_Register_Alternate_Function().  The function must return an
     56    index into the `alternates' array.                                   */
     57 
     58 typedef HB_UShort  (*HB_AltFunction)(HB_UInt    pos,
     59 				      HB_UShort   glyphID,
     60 				      HB_UShort   num_alternates,
     61 				      HB_UShort*  alternates,
     62 				      void*       data );
     63 
     64 
     65 struct  HB_GSUBHeader_
     66 {
     67   HB_GDEFHeader*  gdef;
     68 
     69   /* the next two fields are used for an alternate substitution callback
     70      function to select the proper alternate glyph.                      */
     71 
     72   void*            data;
     73   HB_AltFunction  altfunc;
     74 
     75   HB_UInt         offset;
     76 
     77   HB_16Dot16         Version;
     78 
     79   HB_ScriptList   ScriptList;
     80   HB_FeatureList  FeatureList;
     81   HB_LookupList   LookupList;
     82 };
     83 
     84 typedef struct HB_GSUBHeader_   HB_GSUBHeader;
     85 typedef HB_GSUBHeader*  HB_GSUB;
     86 
     87 
     88 HB_Error  HB_Load_GSUB_Table( HB_Stream       stream,
     89 			      HB_GSUBHeader** gsub,
     90 			      HB_GDEFHeader*  gdef,
     91                               HB_Stream       gdefStream );
     92 
     93 
     94 HB_Error  HB_Done_GSUB_Table( HB_GSUBHeader*  gsub );
     95 
     96 
     97 HB_Error  HB_GSUB_Select_Script( HB_GSUBHeader*  gsub,
     98 				 HB_UInt         script_tag,
     99 				 HB_UShort*       script_index );
    100 
    101 HB_Error  HB_GSUB_Select_Language( HB_GSUBHeader*  gsub,
    102 				   HB_UInt         language_tag,
    103 				   HB_UShort        script_index,
    104 				   HB_UShort*       language_index,
    105 				   HB_UShort*       req_feature_index );
    106 
    107 HB_Error  HB_GSUB_Select_Feature( HB_GSUBHeader*  gsub,
    108 				  HB_UInt         feature_tag,
    109 				  HB_UShort        script_index,
    110 				  HB_UShort        language_index,
    111 				  HB_UShort*       feature_index );
    112 
    113 
    114 HB_Error  HB_GSUB_Query_Scripts( HB_GSUBHeader*  gsub,
    115 				 HB_UInt**       script_tag_list );
    116 
    117 HB_Error  HB_GSUB_Query_Languages( HB_GSUBHeader*  gsub,
    118 				   HB_UShort        script_index,
    119 				   HB_UInt**       language_tag_list );
    120 
    121 HB_Error  HB_GSUB_Query_Features( HB_GSUBHeader*  gsub,
    122 				  HB_UShort        script_index,
    123 				  HB_UShort        language_index,
    124 				  HB_UInt**       feature_tag_list );
    125 
    126 
    127 HB_Error  HB_GSUB_Add_Feature( HB_GSUBHeader*  gsub,
    128 			       HB_UShort        feature_index,
    129 			       HB_UInt          property );
    130 
    131 HB_Error  HB_GSUB_Clear_Features( HB_GSUBHeader*  gsub );
    132 
    133 
    134 HB_Error  HB_GSUB_Register_Alternate_Function( HB_GSUBHeader*  gsub,
    135 					       HB_AltFunction  altfunc,
    136 					       void*            data );
    137 
    138 
    139 HB_Error  HB_GSUB_Apply_String( HB_GSUBHeader*   gsub,
    140 				HB_Buffer        buffer );
    141 
    142 #ifdef HB_USE_PACKED_STRUCTS
    143 #pragma pack(pop)
    144 #endif
    145 
    146 HB_END_HEADER
    147 
    148 #endif /* HARFBUZZ_GSUB_H */
    149