tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

hb-ot-layout-jstf-table.hh (7249B)


      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 List16OfOffset16To<PosLookup> JstfMax;
     49 
     50 
     51 /*
     52 * JstfPriority -- Justification Priority Table
     53 */
     54 
     55 struct JstfPriority
     56 {
     57  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  Offset16To<JstfModList>
     75 	shrinkageEnableGSUB;	/* Offset to Shrinkage Enable GSUB
     76 				 * JstfModList table--from beginning of
     77 				 * JstfPriority table--may be NULL */
     78  Offset16To<JstfModList>
     79 	shrinkageDisableGSUB;	/* Offset to Shrinkage Disable GSUB
     80 				 * JstfModList table--from beginning of
     81 				 * JstfPriority table--may be NULL */
     82  Offset16To<JstfModList>
     83 	shrinkageEnableGPOS;	/* Offset to Shrinkage Enable GPOS
     84 				 * JstfModList table--from beginning of
     85 				 * JstfPriority table--may be NULL */
     86  Offset16To<JstfModList>
     87 	shrinkageDisableGPOS;	/* Offset to Shrinkage Disable GPOS
     88 				 * JstfModList table--from beginning of
     89 				 * JstfPriority table--may be NULL */
     90  Offset16To<JstfMax>
     91 	shrinkageJstfMax;	/* Offset to Shrinkage JstfMax table--
     92 				 * from beginning of JstfPriority table
     93 				 * --may be NULL */
     94  Offset16To<JstfModList>
     95 	extensionEnableGSUB;	/* Offset to Extension Enable GSUB
     96 				 * JstfModList table--from beginning of
     97 				 * JstfPriority table--may be NULL */
     98  Offset16To<JstfModList>
     99 	extensionDisableGSUB;	/* Offset to Extension Disable GSUB
    100 				 * JstfModList table--from beginning of
    101 				 * JstfPriority table--may be NULL */
    102  Offset16To<JstfModList>
    103 	extensionEnableGPOS;	/* Offset to Extension Enable GPOS
    104 				 * JstfModList table--from beginning of
    105 				 * JstfPriority table--may be NULL */
    106  Offset16To<JstfModList>
    107 	extensionDisableGPOS;	/* Offset to Extension Disable GPOS
    108 				 * JstfModList table--from beginning of
    109 				 * JstfPriority table--may be NULL */
    110  Offset16To<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 : List16OfOffset16To<JstfPriority>
    125 {
    126  bool sanitize (hb_sanitize_context_t *c,
    127 	 const Record_sanitize_closure_t * = nullptr) const
    128  {
    129    TRACE_SANITIZE (this);
    130    return_trace (List16OfOffset16To<JstfPriority>::sanitize (c));
    131  }
    132 };
    133 
    134 
    135 /*
    136 * ExtenderGlyphs -- Extender Glyph Table
    137 */
    138 
    139 typedef SortedArray16Of<HBGlyphID16> ExtenderGlyphs;
    140 
    141 
    142 /*
    143 * JstfScript -- The Justification Table
    144 */
    145 
    146 struct JstfScript
    147 {
    148  unsigned int get_lang_sys_count () const
    149  { return langSys.len; }
    150  const Tag& get_lang_sys_tag (unsigned int i) const
    151  { return langSys.get_tag (i); }
    152  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); }
    156  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  }
    161  bool find_lang_sys_index (hb_tag_t tag, unsigned int *index) const
    162  { return langSys.find_index (tag, index); }
    163 
    164  bool has_default_lang_sys () const               { return defaultLangSys != 0; }
    165  const JstfLangSys& get_default_lang_sys () const { return this+defaultLangSys; }
    166 
    167  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  Offset16To<ExtenderGlyphs>
    178 	extenderGlyphs;	/* Offset to ExtenderGlyph table--from beginning
    179 			 * of JstfScript table-may be NULL */
    180  Offset16To<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 
    200  unsigned int get_script_count () const
    201  { return scriptList.len; }
    202  const Tag& get_script_tag (unsigned int i) const
    203  { return scriptList.get_tag (i); }
    204  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); }
    208  const JstfScript& get_script (unsigned int i) const
    209  { return this+scriptList[i].offset; }
    210  bool find_script_index (hb_tag_t tag, unsigned int *index) const
    211  { return scriptList.find_index (tag, index); }
    212 
    213  bool sanitize (hb_sanitize_context_t *c) const
    214  {
    215    TRACE_SANITIZE (this);
    216    return_trace (version.sanitize (c) &&
    217 	  hb_barrier () &&
    218 	  likely (version.major == 1) &&
    219 	  scriptList.sanitize (c, this));
    220  }
    221 
    222  protected:
    223  FixedVersion<>version;	/* Version of the JSTF table--initially set
    224 			 * to 0x00010000u */
    225  RecordArrayOf<JstfScript>
    226 	scriptList;	/* Array of JstfScripts--listed
    227 			 * alphabetically by ScriptTag */
    228  public:
    229  DEFINE_SIZE_ARRAY (6, scriptList);
    230 };
    231 
    232 
    233 } /* namespace OT */
    234 
    235 
    236 #endif /* HB_OT_LAYOUT_JSTF_TABLE_HH */