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_GDEF_H 27 #define HARFBUZZ_GDEF_H 28 29 #include "harfbuzz-open.h" 30 #include "harfbuzz-stream.h" 31 32 HB_BEGIN_HEADER 33 34 #ifdef HB_USE_PACKED_STRUCTS 35 #pragma pack(push, 1) 36 #endif 37 38 /* GDEF glyph properties. Note that HB_GDEF_COMPONENT has no corresponding 39 * flag in the LookupFlag field. */ 40 #define HB_GDEF_BASE_GLYPH 0x0002 41 #define HB_GDEF_LIGATURE 0x0004 42 #define HB_GDEF_MARK 0x0008 43 #define HB_GDEF_COMPONENT 0x0010 44 45 46 typedef struct HB_AttachPoint_ HB_AttachPoint; 47 48 49 struct HB_AttachList_ 50 { 51 HB_AttachPoint* AttachPoint; /* array of AttachPoint tables */ 52 HB_Coverage Coverage; /* Coverage table */ 53 HB_UShort GlyphCount; /* number of glyphs with 54 attachments */ 55 HB_Bool loaded; 56 }; 57 58 typedef struct HB_AttachList_ HB_AttachList; 59 60 typedef struct HB_LigGlyph_ HB_LigGlyph; 61 62 struct HB_LigCaretList_ 63 { 64 HB_LigGlyph* LigGlyph; /* array of LigGlyph tables */ 65 HB_Coverage Coverage; /* Coverage table */ 66 HB_UShort LigGlyphCount; /* number of ligature glyphs */ 67 HB_Bool loaded; 68 }; 69 70 typedef struct HB_LigCaretList_ HB_LigCaretList; 71 72 73 74 /* The `NewGlyphClasses' field is not defined in the TTO specification. 75 We use it for fonts with a constructed `GlyphClassDef' structure 76 (i.e., which don't have a GDEF table) to collect glyph classes 77 assigned during the lookup process. The number of arrays in this 78 pointer array is GlyphClassDef->cd.cd2.ClassRangeCount+1; the nth 79 array then contains the glyph class values of the glyphs not covered 80 by the ClassRangeRecords structures with index n-1 and n. We store 81 glyph class values for four glyphs in a single array element. 82 83 `LastGlyph' is identical to the number of glyphs minus one in the 84 font; we need it only if `NewGlyphClasses' is not NULL (to have an 85 upper bound for the last array). 86 87 Note that we first store the file offset to the `MarkAttachClassDef' 88 field (which has been introduced in OpenType 1.2) -- since the 89 `Version' field value hasn't been increased to indicate that we have 90 one more field for some obscure reason, we must parse the GSUB table 91 to find out whether class values refer to this table. Only then we 92 can finally load the MarkAttachClassDef structure if necessary. */ 93 94 struct HB_GDEFHeader_ 95 { 96 HB_UShort** NewGlyphClasses; 97 HB_UInt offset; 98 HB_UInt MarkAttachClassDef_offset; 99 100 HB_16Dot16 Version; 101 102 HB_ClassDefinition GlyphClassDef; 103 HB_AttachList AttachList; 104 HB_LigCaretList LigCaretList; 105 HB_ClassDefinition MarkAttachClassDef; /* new in OT 1.2 */ 106 107 HB_UShort LastGlyph; 108 }; 109 110 typedef struct HB_GDEFHeader_ HB_GDEFHeader; 111 typedef struct HB_GDEFHeader_* HB_GDEF; 112 113 114 HB_Error HB_New_GDEF_Table( HB_GDEFHeader** retptr ); 115 116 117 HB_Error HB_Load_GDEF_Table( HB_Stream stream, 118 HB_GDEFHeader** gdef ); 119 120 121 HB_Error HB_Done_GDEF_Table ( HB_GDEFHeader* gdef ); 122 123 124 HB_Error HB_GDEF_Get_Glyph_Property( HB_GDEFHeader* gdef, 125 HB_UShort glyphID, 126 HB_UShort* property ); 127 128 HB_Error HB_GDEF_Build_ClassDefinition( HB_GDEFHeader* gdef, 129 HB_UShort num_glyphs, 130 HB_UShort glyph_count, 131 HB_UShort* glyph_array, 132 HB_UShort* class_array ); 133 134 #ifdef HB_USE_PACKED_STRUCTS 135 #pragma pack(pop) 136 #endif 137 138 HB_END_HEADER 139 140 #endif /* HARFBUZZ_GDEF_H */ 141