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