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 {
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   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 {
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 (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 {
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   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 
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