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-private.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   inline bool sanitize (hb_sanitize_context_t *c) {
58     TRACE_SANITIZE (this);
59     return TRACE_RETURN (c->check_struct (this) &&
60 			 shrinkageEnableGSUB.sanitize (c, this) &&
61 			 shrinkageDisableGSUB.sanitize (c, this) &&
62 			 shrinkageEnableGPOS.sanitize (c, this) &&
63 			 shrinkageDisableGPOS.sanitize (c, this) &&
64 			 shrinkageJstfMax.sanitize (c, this) &&
65 			 extensionEnableGSUB.sanitize (c, this) &&
66 			 extensionDisableGSUB.sanitize (c, this) &&
67 			 extensionEnableGPOS.sanitize (c, this) &&
68 			 extensionDisableGPOS.sanitize (c, this) &&
69 			 extensionJstfMax.sanitize (c, this));
70   }
71 
72   protected:
73   OffsetTo<JstfModList>
74 		shrinkageEnableGSUB;	/* Offset to Shrinkage Enable GSUB
75 					 * JstfModList table--from beginning of
76 					 * JstfPriority table--may be NULL */
77   OffsetTo<JstfModList>
78 		shrinkageDisableGSUB;	/* Offset to Shrinkage Disable GSUB
79 					 * JstfModList table--from beginning of
80 					 * JstfPriority table--may be NULL */
81   OffsetTo<JstfModList>
82 		shrinkageEnableGPOS;	/* Offset to Shrinkage Enable GPOS
83 					 * JstfModList table--from beginning of
84 					 * JstfPriority table--may be NULL */
85   OffsetTo<JstfModList>
86 		shrinkageDisableGPOS;	/* Offset to Shrinkage Disable GPOS
87 					 * JstfModList table--from beginning of
88 					 * JstfPriority table--may be NULL */
89   OffsetTo<JstfMax>
90 		shrinkageJstfMax;	/* Offset to Shrinkage JstfMax table--
91 					 * from beginning of JstfPriority table
92 					 * --may be NULL */
93   OffsetTo<JstfModList>
94 		extensionEnableGSUB;	/* Offset to Extension Enable GSUB
95 					 * JstfModList table--from beginning of
96 					 * JstfPriority table--may be NULL */
97   OffsetTo<JstfModList>
98 		extensionDisableGSUB;	/* Offset to Extension Disable GSUB
99 					 * JstfModList table--from beginning of
100 					 * JstfPriority table--may be NULL */
101   OffsetTo<JstfModList>
102 		extensionEnableGPOS;	/* Offset to Extension Enable GPOS
103 					 * JstfModList table--from beginning of
104 					 * JstfPriority table--may be NULL */
105   OffsetTo<JstfModList>
106 		extensionDisableGPOS;	/* Offset to Extension Disable GPOS
107 					 * JstfModList table--from beginning of
108 					 * JstfPriority table--may be NULL */
109   OffsetTo<JstfMax>
110 		extensionJstfMax;	/* Offset to Extension JstfMax table--
111 					 * from beginning of JstfPriority table
112 					 * --may be NULL */
113 
114   public:
115   DEFINE_SIZE_STATIC (20);
116 };
117 
118 
119 /*
120  * JstfLangSys -- Justification Language System Table
121  */
122 
123 struct JstfLangSys : OffsetListOf<JstfPriority>
124 {
sanitizeOT::JstfLangSys125   inline bool sanitize (hb_sanitize_context_t *c,
126 			const Record<JstfLangSys>::sanitize_closure_t * = NULL) {
127     TRACE_SANITIZE (this);
128     return TRACE_RETURN (OffsetListOf<JstfPriority>::sanitize (c));
129   }
130 };
131 
132 
133 /*
134  * ExtenderGlyphs -- Extender Glyph Table
135  */
136 
137 typedef SortedArrayOf<GlyphID> ExtenderGlyphs;
138 
139 
140 /*
141  * JstfScript -- The Justification Table
142  */
143 
144 struct JstfScript
145 {
get_lang_sys_countOT::JstfScript146   inline unsigned int get_lang_sys_count (void) const
147   { return langSys.len; }
get_lang_sys_tagOT::JstfScript148   inline const Tag& get_lang_sys_tag (unsigned int i) const
149   { return langSys.get_tag (i); }
get_lang_sys_tagsOT::JstfScript150   inline unsigned int get_lang_sys_tags (unsigned int start_offset,
151 					 unsigned int *lang_sys_count /* IN/OUT */,
152 					 hb_tag_t     *lang_sys_tags /* OUT */) const
153   { return langSys.get_tags (start_offset, lang_sys_count, lang_sys_tags); }
get_lang_sysOT::JstfScript154   inline const JstfLangSys& get_lang_sys (unsigned int i) const
155   {
156     if (i == Index::NOT_FOUND_INDEX) return get_default_lang_sys ();
157     return this+langSys[i].offset;
158   }
find_lang_sys_indexOT::JstfScript159   inline bool find_lang_sys_index (hb_tag_t tag, unsigned int *index) const
160   { return langSys.find_index (tag, index); }
161 
has_default_lang_sysOT::JstfScript162   inline bool has_default_lang_sys (void) const { return defaultLangSys != 0; }
get_default_lang_sysOT::JstfScript163   inline const JstfLangSys& get_default_lang_sys (void) const { return this+defaultLangSys; }
164 
sanitizeOT::JstfScript165   inline bool sanitize (hb_sanitize_context_t *c,
166 			const Record<JstfScript>::sanitize_closure_t * = NULL) {
167     TRACE_SANITIZE (this);
168     return TRACE_RETURN (extenderGlyphs.sanitize (c, this) &&
169 			 defaultLangSys.sanitize (c, this) &&
170 			 langSys.sanitize (c, this));
171   }
172 
173   protected:
174   OffsetTo<ExtenderGlyphs>
175 		extenderGlyphs;	/* Offset to ExtenderGlyph table--from beginning
176 				 * of JstfScript table-may be NULL */
177   OffsetTo<JstfLangSys>
178 		defaultLangSys;	/* Offset to DefaultJstfLangSys table--from
179 				 * beginning of JstfScript table--may be Null */
180   RecordArrayOf<JstfLangSys>
181 		langSys;	/* Array of JstfLangSysRecords--listed
182 				 * alphabetically by LangSysTag */
183   public:
184   DEFINE_SIZE_ARRAY (6, langSys);
185 };
186 
187 
188 /*
189  * JSTF -- The Justification Table
190  */
191 
192 struct JSTF
193 {
194   static const hb_tag_t tableTag	= HB_OT_TAG_JSTF;
195 
get_script_countOT::JSTF196   inline unsigned int get_script_count (void) const
197   { return scriptList.len; }
get_script_tagOT::JSTF198   inline const Tag& get_script_tag (unsigned int i) const
199   { return scriptList.get_tag (i); }
get_script_tagsOT::JSTF200   inline unsigned int get_script_tags (unsigned int start_offset,
201 				       unsigned int *script_count /* IN/OUT */,
202 				       hb_tag_t     *script_tags /* OUT */) const
203   { return scriptList.get_tags (start_offset, script_count, script_tags); }
get_scriptOT::JSTF204   inline const JstfScript& get_script (unsigned int i) const
205   { return this+scriptList[i].offset; }
find_script_indexOT::JSTF206   inline bool find_script_index (hb_tag_t tag, unsigned int *index) const
207   { return scriptList.find_index (tag, index); }
208 
sanitizeOT::JSTF209   inline bool sanitize (hb_sanitize_context_t *c) {
210     TRACE_SANITIZE (this);
211     return TRACE_RETURN (version.sanitize (c) && likely (version.major == 1) &&
212 			 scriptList.sanitize (c, this));
213   }
214 
215   protected:
216   FixedVersion	version;	/* Version of the JSTF table--initially set
217 				 * to 0x00010000u */
218   RecordArrayOf<JstfScript>
219 		scriptList;  	/* Array of JstfScripts--listed
220 				 * alphabetically by ScriptTag */
221   public:
222   DEFINE_SIZE_ARRAY (6, scriptList);
223 };
224 
225 
226 } /* namespace OT */
227 
228 
229 #endif /* HB_OT_LAYOUT_JSTF_TABLE_HH */
230