1 /* 2 * Copyright © 2013 Google, Inc. 3 * 4 * This is part of HarfBuzz, a text shaping library. 5 * 6 * Permission is hereby granted, without written agreement and without 7 * license or royalty fees, to use, copy, modify, and distribute this 8 * software and its documentation for any purpose, provided that the 9 * above copyright notice and the following two paragraphs appear in 10 * all copies of this software. 11 * 12 * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR 13 * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES 14 * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN 15 * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH 16 * DAMAGE. 17 * 18 * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, 19 * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND 20 * FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS 21 * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO 22 * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. 23 * 24 * Google Author(s): Behdad Esfahbod 25 */ 26 27 #ifndef HB_OT_LAYOUT_JSTF_TABLE_HH 28 #define HB_OT_LAYOUT_JSTF_TABLE_HH 29 30 #include "hb-open-type.hh" 31 #include "hb-ot-layout-gpos-table.hh" 32 33 34 namespace OT { 35 36 37 /* 38 * JstfModList -- Justification Modification List Tables 39 */ 40 41 typedef IndexArray JstfModList; 42 43 44 /* 45 * JstfMax -- Justification Maximum Table 46 */ 47 48 typedef OffsetListOf<PosLookup> JstfMax; 49 50 51 /* 52 * JstfPriority -- Justification Priority Table 53 */ 54 55 struct JstfPriority 56 { sanitizeOT::JstfPriority57 bool sanitize (hb_sanitize_context_t *c) const 58 { 59 TRACE_SANITIZE (this); 60 return_trace (c->check_struct (this) && 61 shrinkageEnableGSUB.sanitize (c, this) && 62 shrinkageDisableGSUB.sanitize (c, this) && 63 shrinkageEnableGPOS.sanitize (c, this) && 64 shrinkageDisableGPOS.sanitize (c, this) && 65 shrinkageJstfMax.sanitize (c, this) && 66 extensionEnableGSUB.sanitize (c, this) && 67 extensionDisableGSUB.sanitize (c, this) && 68 extensionEnableGPOS.sanitize (c, this) && 69 extensionDisableGPOS.sanitize (c, this) && 70 extensionJstfMax.sanitize (c, this)); 71 } 72 73 protected: 74 OffsetTo<JstfModList> 75 shrinkageEnableGSUB; /* Offset to Shrinkage Enable GSUB 76 * JstfModList table--from beginning of 77 * JstfPriority table--may be NULL */ 78 OffsetTo<JstfModList> 79 shrinkageDisableGSUB; /* Offset to Shrinkage Disable GSUB 80 * JstfModList table--from beginning of 81 * JstfPriority table--may be NULL */ 82 OffsetTo<JstfModList> 83 shrinkageEnableGPOS; /* Offset to Shrinkage Enable GPOS 84 * JstfModList table--from beginning of 85 * JstfPriority table--may be NULL */ 86 OffsetTo<JstfModList> 87 shrinkageDisableGPOS; /* Offset to Shrinkage Disable GPOS 88 * JstfModList table--from beginning of 89 * JstfPriority table--may be NULL */ 90 OffsetTo<JstfMax> 91 shrinkageJstfMax; /* Offset to Shrinkage JstfMax table-- 92 * from beginning of JstfPriority table 93 * --may be NULL */ 94 OffsetTo<JstfModList> 95 extensionEnableGSUB; /* Offset to Extension Enable GSUB 96 * JstfModList table--from beginning of 97 * JstfPriority table--may be NULL */ 98 OffsetTo<JstfModList> 99 extensionDisableGSUB; /* Offset to Extension Disable GSUB 100 * JstfModList table--from beginning of 101 * JstfPriority table--may be NULL */ 102 OffsetTo<JstfModList> 103 extensionEnableGPOS; /* Offset to Extension Enable GPOS 104 * JstfModList table--from beginning of 105 * JstfPriority table--may be NULL */ 106 OffsetTo<JstfModList> 107 extensionDisableGPOS; /* Offset to Extension Disable GPOS 108 * JstfModList table--from beginning of 109 * JstfPriority table--may be NULL */ 110 OffsetTo<JstfMax> 111 extensionJstfMax; /* Offset to Extension JstfMax table-- 112 * from beginning of JstfPriority table 113 * --may be NULL */ 114 115 public: 116 DEFINE_SIZE_STATIC (20); 117 }; 118 119 120 /* 121 * JstfLangSys -- Justification Language System Table 122 */ 123 124 struct JstfLangSys : OffsetListOf<JstfPriority> 125 { sanitizeOT::JstfLangSys126 bool sanitize (hb_sanitize_context_t *c, 127 const Record_sanitize_closure_t * = nullptr) const 128 { 129 TRACE_SANITIZE (this); 130 return_trace (OffsetListOf<JstfPriority>::sanitize (c)); 131 } 132 }; 133 134 135 /* 136 * ExtenderGlyphs -- Extender Glyph Table 137 */ 138 139 typedef SortedArrayOf<HBGlyphID> ExtenderGlyphs; 140 141 142 /* 143 * JstfScript -- The Justification Table 144 */ 145 146 struct JstfScript 147 { get_lang_sys_countOT::JstfScript148 unsigned int get_lang_sys_count () const 149 { return langSys.len; } get_lang_sys_tagOT::JstfScript150 const Tag& get_lang_sys_tag (unsigned int i) const 151 { return langSys.get_tag (i); } get_lang_sys_tagsOT::JstfScript152 unsigned int get_lang_sys_tags (unsigned int start_offset, 153 unsigned int *lang_sys_count /* IN/OUT */, 154 hb_tag_t *lang_sys_tags /* OUT */) const 155 { return langSys.get_tags (start_offset, lang_sys_count, lang_sys_tags); } get_lang_sysOT::JstfScript156 const JstfLangSys& get_lang_sys (unsigned int i) const 157 { 158 if (i == Index::NOT_FOUND_INDEX) return get_default_lang_sys (); 159 return this+langSys[i].offset; 160 } find_lang_sys_indexOT::JstfScript161 bool find_lang_sys_index (hb_tag_t tag, unsigned int *index) const 162 { return langSys.find_index (tag, index); } 163 has_default_lang_sysOT::JstfScript164 bool has_default_lang_sys () const { return defaultLangSys != 0; } get_default_lang_sysOT::JstfScript165 const JstfLangSys& get_default_lang_sys () const { return this+defaultLangSys; } 166 sanitizeOT::JstfScript167 bool sanitize (hb_sanitize_context_t *c, 168 const Record_sanitize_closure_t * = nullptr) const 169 { 170 TRACE_SANITIZE (this); 171 return_trace (extenderGlyphs.sanitize (c, this) && 172 defaultLangSys.sanitize (c, this) && 173 langSys.sanitize (c, this)); 174 } 175 176 protected: 177 OffsetTo<ExtenderGlyphs> 178 extenderGlyphs; /* Offset to ExtenderGlyph table--from beginning 179 * of JstfScript table-may be NULL */ 180 OffsetTo<JstfLangSys> 181 defaultLangSys; /* Offset to DefaultJstfLangSys table--from 182 * beginning of JstfScript table--may be Null */ 183 RecordArrayOf<JstfLangSys> 184 langSys; /* Array of JstfLangSysRecords--listed 185 * alphabetically by LangSysTag */ 186 public: 187 DEFINE_SIZE_ARRAY (6, langSys); 188 }; 189 190 191 /* 192 * JSTF -- Justification 193 * https://docs.microsoft.com/en-us/typography/opentype/spec/jstf 194 */ 195 196 struct JSTF 197 { 198 static constexpr hb_tag_t tableTag = HB_OT_TAG_JSTF; 199 get_script_countOT::JSTF200 unsigned int get_script_count () const 201 { return scriptList.len; } get_script_tagOT::JSTF202 const Tag& get_script_tag (unsigned int i) const 203 { return scriptList.get_tag (i); } get_script_tagsOT::JSTF204 unsigned int get_script_tags (unsigned int start_offset, 205 unsigned int *script_count /* IN/OUT */, 206 hb_tag_t *script_tags /* OUT */) const 207 { return scriptList.get_tags (start_offset, script_count, script_tags); } get_scriptOT::JSTF208 const JstfScript& get_script (unsigned int i) const 209 { return this+scriptList[i].offset; } find_script_indexOT::JSTF210 bool find_script_index (hb_tag_t tag, unsigned int *index) const 211 { return scriptList.find_index (tag, index); } 212 sanitizeOT::JSTF213 bool sanitize (hb_sanitize_context_t *c) const 214 { 215 TRACE_SANITIZE (this); 216 return_trace (version.sanitize (c) && 217 likely (version.major == 1) && 218 scriptList.sanitize (c, this)); 219 } 220 221 protected: 222 FixedVersion<>version; /* Version of the JSTF table--initially set 223 * to 0x00010000u */ 224 RecordArrayOf<JstfScript> 225 scriptList; /* Array of JstfScripts--listed 226 * alphabetically by ScriptTag */ 227 public: 228 DEFINE_SIZE_ARRAY (6, scriptList); 229 }; 230 231 232 } /* namespace OT */ 233 234 235 #endif /* HB_OT_LAYOUT_JSTF_TABLE_HH */ 236