xref: /aosp_15_r20/external/harfbuzz_ng/src/hb-aat-layout-just-table.hh (revision 2d1272b857b1f7575e6e246373e1cb218663db8a)
1*2d1272b8SAndroid Build Coastguard Worker /*
2*2d1272b8SAndroid Build Coastguard Worker  * Copyright © 2018  Ebrahim Byagowi
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 
25*2d1272b8SAndroid Build Coastguard Worker #ifndef HB_AAT_LAYOUT_JUST_TABLE_HH
26*2d1272b8SAndroid Build Coastguard Worker #define HB_AAT_LAYOUT_JUST_TABLE_HH
27*2d1272b8SAndroid Build Coastguard Worker 
28*2d1272b8SAndroid Build Coastguard Worker #include "hb-aat-layout-common.hh"
29*2d1272b8SAndroid Build Coastguard Worker #include "hb-ot-layout.hh"
30*2d1272b8SAndroid Build Coastguard Worker #include "hb-open-type.hh"
31*2d1272b8SAndroid Build Coastguard Worker 
32*2d1272b8SAndroid Build Coastguard Worker #include "hb-aat-layout-morx-table.hh"
33*2d1272b8SAndroid Build Coastguard Worker 
34*2d1272b8SAndroid Build Coastguard Worker /*
35*2d1272b8SAndroid Build Coastguard Worker  * just -- Justification
36*2d1272b8SAndroid Build Coastguard Worker  * https://developer.apple.com/fonts/TrueType-Reference-Manual/RM06/Chap6just.html
37*2d1272b8SAndroid Build Coastguard Worker  */
38*2d1272b8SAndroid Build Coastguard Worker #define HB_AAT_TAG_just HB_TAG('j','u','s','t')
39*2d1272b8SAndroid Build Coastguard Worker 
40*2d1272b8SAndroid Build Coastguard Worker 
41*2d1272b8SAndroid Build Coastguard Worker namespace AAT {
42*2d1272b8SAndroid Build Coastguard Worker 
43*2d1272b8SAndroid Build Coastguard Worker using namespace OT;
44*2d1272b8SAndroid Build Coastguard Worker 
45*2d1272b8SAndroid Build Coastguard Worker 
46*2d1272b8SAndroid Build Coastguard Worker struct ActionSubrecordHeader
47*2d1272b8SAndroid Build Coastguard Worker {
sanitizeAAT::ActionSubrecordHeader48*2d1272b8SAndroid Build Coastguard Worker   bool sanitize (hb_sanitize_context_t *c) const
49*2d1272b8SAndroid Build Coastguard Worker   {
50*2d1272b8SAndroid Build Coastguard Worker     TRACE_SANITIZE (this);
51*2d1272b8SAndroid Build Coastguard Worker     return_trace (c->check_struct (this));
52*2d1272b8SAndroid Build Coastguard Worker   }
53*2d1272b8SAndroid Build Coastguard Worker 
54*2d1272b8SAndroid Build Coastguard Worker   HBUINT16	actionClass;	/* The JustClass value associated with this
55*2d1272b8SAndroid Build Coastguard Worker 				 * ActionSubrecord. */
56*2d1272b8SAndroid Build Coastguard Worker   HBUINT16	actionType;	/* The type of postcompensation action. */
57*2d1272b8SAndroid Build Coastguard Worker   HBUINT16	actionLength;	/* Length of this ActionSubrecord record, which
58*2d1272b8SAndroid Build Coastguard Worker 				 * must be a multiple of 4. */
59*2d1272b8SAndroid Build Coastguard Worker   public:
60*2d1272b8SAndroid Build Coastguard Worker   DEFINE_SIZE_STATIC (6);
61*2d1272b8SAndroid Build Coastguard Worker };
62*2d1272b8SAndroid Build Coastguard Worker 
63*2d1272b8SAndroid Build Coastguard Worker struct DecompositionAction
64*2d1272b8SAndroid Build Coastguard Worker {
sanitizeAAT::DecompositionAction65*2d1272b8SAndroid Build Coastguard Worker   bool sanitize (hb_sanitize_context_t *c) const
66*2d1272b8SAndroid Build Coastguard Worker   {
67*2d1272b8SAndroid Build Coastguard Worker     TRACE_SANITIZE (this);
68*2d1272b8SAndroid Build Coastguard Worker     return_trace (c->check_struct (this));
69*2d1272b8SAndroid Build Coastguard Worker   }
70*2d1272b8SAndroid Build Coastguard Worker 
71*2d1272b8SAndroid Build Coastguard Worker   ActionSubrecordHeader
72*2d1272b8SAndroid Build Coastguard Worker 		header;
73*2d1272b8SAndroid Build Coastguard Worker   F16DOT16	lowerLimit;	/* If the distance factor is less than this value,
74*2d1272b8SAndroid Build Coastguard Worker 				 * then the ligature is decomposed. */
75*2d1272b8SAndroid Build Coastguard Worker   F16DOT16	upperLimit;	/* If the distance factor is greater than this value,
76*2d1272b8SAndroid Build Coastguard Worker 				 * then the ligature is decomposed. */
77*2d1272b8SAndroid Build Coastguard Worker   HBUINT16	order;		/* Numerical order in which this ligature will
78*2d1272b8SAndroid Build Coastguard Worker 				 * be decomposed; you may want infrequent ligatures
79*2d1272b8SAndroid Build Coastguard Worker 				 * to decompose before more frequent ones. The ligatures
80*2d1272b8SAndroid Build Coastguard Worker 				 * on the line of text will decompose in increasing
81*2d1272b8SAndroid Build Coastguard Worker 				 * value of this field. */
82*2d1272b8SAndroid Build Coastguard Worker   Array16Of<HBUINT16>
83*2d1272b8SAndroid Build Coastguard Worker 		decomposedglyphs;
84*2d1272b8SAndroid Build Coastguard Worker 				/* Number of 16-bit glyph indexes that follow;
85*2d1272b8SAndroid Build Coastguard Worker 				 * the ligature will be decomposed into these glyphs.
86*2d1272b8SAndroid Build Coastguard Worker 				 *
87*2d1272b8SAndroid Build Coastguard Worker 				 * Array of decomposed glyphs. */
88*2d1272b8SAndroid Build Coastguard Worker   public:
89*2d1272b8SAndroid Build Coastguard Worker   DEFINE_SIZE_ARRAY (18, decomposedglyphs);
90*2d1272b8SAndroid Build Coastguard Worker };
91*2d1272b8SAndroid Build Coastguard Worker 
92*2d1272b8SAndroid Build Coastguard Worker struct UnconditionalAddGlyphAction
93*2d1272b8SAndroid Build Coastguard Worker {
sanitizeAAT::UnconditionalAddGlyphAction94*2d1272b8SAndroid Build Coastguard Worker   bool sanitize (hb_sanitize_context_t *c) const
95*2d1272b8SAndroid Build Coastguard Worker   {
96*2d1272b8SAndroid Build Coastguard Worker     TRACE_SANITIZE (this);
97*2d1272b8SAndroid Build Coastguard Worker     return_trace (c->check_struct (this));
98*2d1272b8SAndroid Build Coastguard Worker   }
99*2d1272b8SAndroid Build Coastguard Worker 
100*2d1272b8SAndroid Build Coastguard Worker   protected:
101*2d1272b8SAndroid Build Coastguard Worker   ActionSubrecordHeader
102*2d1272b8SAndroid Build Coastguard Worker 		header;
103*2d1272b8SAndroid Build Coastguard Worker   HBGlyphID16	addGlyph;	/* Glyph that should be added if the distance factor
104*2d1272b8SAndroid Build Coastguard Worker 				 * is growing. */
105*2d1272b8SAndroid Build Coastguard Worker 
106*2d1272b8SAndroid Build Coastguard Worker   public:
107*2d1272b8SAndroid Build Coastguard Worker   DEFINE_SIZE_STATIC (8);
108*2d1272b8SAndroid Build Coastguard Worker };
109*2d1272b8SAndroid Build Coastguard Worker 
110*2d1272b8SAndroid Build Coastguard Worker struct ConditionalAddGlyphAction
111*2d1272b8SAndroid Build Coastguard Worker {
sanitizeAAT::ConditionalAddGlyphAction112*2d1272b8SAndroid Build Coastguard Worker   bool sanitize (hb_sanitize_context_t *c) const
113*2d1272b8SAndroid Build Coastguard Worker   {
114*2d1272b8SAndroid Build Coastguard Worker     TRACE_SANITIZE (this);
115*2d1272b8SAndroid Build Coastguard Worker     return_trace (c->check_struct (this));
116*2d1272b8SAndroid Build Coastguard Worker   }
117*2d1272b8SAndroid Build Coastguard Worker 
118*2d1272b8SAndroid Build Coastguard Worker   protected:
119*2d1272b8SAndroid Build Coastguard Worker   ActionSubrecordHeader
120*2d1272b8SAndroid Build Coastguard Worker 		header;
121*2d1272b8SAndroid Build Coastguard Worker   F16DOT16	substThreshold; /* Distance growth factor (in ems) at which
122*2d1272b8SAndroid Build Coastguard Worker 				 * this glyph is replaced and the growth factor
123*2d1272b8SAndroid Build Coastguard Worker 				 * recalculated. */
124*2d1272b8SAndroid Build Coastguard Worker   HBGlyphID16	addGlyph;	/* Glyph to be added as kashida. If this value is
125*2d1272b8SAndroid Build Coastguard Worker 				 * 0xFFFF, no extra glyph will be added. Note that
126*2d1272b8SAndroid Build Coastguard Worker 				 * generally when a glyph is added, justification
127*2d1272b8SAndroid Build Coastguard Worker 				 * will need to be redone. */
128*2d1272b8SAndroid Build Coastguard Worker   HBGlyphID16	substGlyph;	/* Glyph to be substituted for this glyph if the
129*2d1272b8SAndroid Build Coastguard Worker 				 * growth factor equals or exceeds the value of
130*2d1272b8SAndroid Build Coastguard Worker 				 * substThreshold. */
131*2d1272b8SAndroid Build Coastguard Worker   public:
132*2d1272b8SAndroid Build Coastguard Worker   DEFINE_SIZE_STATIC (14);
133*2d1272b8SAndroid Build Coastguard Worker };
134*2d1272b8SAndroid Build Coastguard Worker 
135*2d1272b8SAndroid Build Coastguard Worker struct DuctileGlyphAction
136*2d1272b8SAndroid Build Coastguard Worker {
sanitizeAAT::DuctileGlyphAction137*2d1272b8SAndroid Build Coastguard Worker   bool sanitize (hb_sanitize_context_t *c) const
138*2d1272b8SAndroid Build Coastguard Worker   {
139*2d1272b8SAndroid Build Coastguard Worker     TRACE_SANITIZE (this);
140*2d1272b8SAndroid Build Coastguard Worker     return_trace (c->check_struct (this));
141*2d1272b8SAndroid Build Coastguard Worker   }
142*2d1272b8SAndroid Build Coastguard Worker 
143*2d1272b8SAndroid Build Coastguard Worker   protected:
144*2d1272b8SAndroid Build Coastguard Worker   ActionSubrecordHeader
145*2d1272b8SAndroid Build Coastguard Worker 		header;
146*2d1272b8SAndroid Build Coastguard Worker   HBUINT32	variationAxis;	/* The 4-byte tag identifying the ductile axis.
147*2d1272b8SAndroid Build Coastguard Worker 				 * This would normally be 0x64756374 ('duct'),
148*2d1272b8SAndroid Build Coastguard Worker 				 * but you may use any axis the font contains. */
149*2d1272b8SAndroid Build Coastguard Worker   F16DOT16	minimumLimit;	/* The lowest value for the ductility axis that
150*2d1272b8SAndroid Build Coastguard Worker 				 * still yields an acceptable appearance. Normally
151*2d1272b8SAndroid Build Coastguard Worker 				 * this will be 1.0. */
152*2d1272b8SAndroid Build Coastguard Worker   F16DOT16	noStretchValue; /* This is the default value that corresponds to
153*2d1272b8SAndroid Build Coastguard Worker 				 * no change in appearance. Normally, this will
154*2d1272b8SAndroid Build Coastguard Worker 				 * be 1.0. */
155*2d1272b8SAndroid Build Coastguard Worker   F16DOT16	maximumLimit;	/* The highest value for the ductility axis that
156*2d1272b8SAndroid Build Coastguard Worker 				 * still yields an acceptable appearance. */
157*2d1272b8SAndroid Build Coastguard Worker   public:
158*2d1272b8SAndroid Build Coastguard Worker   DEFINE_SIZE_STATIC (22);
159*2d1272b8SAndroid Build Coastguard Worker };
160*2d1272b8SAndroid Build Coastguard Worker 
161*2d1272b8SAndroid Build Coastguard Worker struct RepeatedAddGlyphAction
162*2d1272b8SAndroid Build Coastguard Worker {
sanitizeAAT::RepeatedAddGlyphAction163*2d1272b8SAndroid Build Coastguard Worker   bool sanitize (hb_sanitize_context_t *c) const
164*2d1272b8SAndroid Build Coastguard Worker   {
165*2d1272b8SAndroid Build Coastguard Worker     TRACE_SANITIZE (this);
166*2d1272b8SAndroid Build Coastguard Worker     return_trace (c->check_struct (this));
167*2d1272b8SAndroid Build Coastguard Worker   }
168*2d1272b8SAndroid Build Coastguard Worker 
169*2d1272b8SAndroid Build Coastguard Worker   protected:
170*2d1272b8SAndroid Build Coastguard Worker   ActionSubrecordHeader
171*2d1272b8SAndroid Build Coastguard Worker 		header;
172*2d1272b8SAndroid Build Coastguard Worker   HBUINT16	flags;		/* Currently unused; set to 0. */
173*2d1272b8SAndroid Build Coastguard Worker   HBGlyphID16	glyph;		/* Glyph that should be added if the distance factor
174*2d1272b8SAndroid Build Coastguard Worker 				 * is growing. */
175*2d1272b8SAndroid Build Coastguard Worker   public:
176*2d1272b8SAndroid Build Coastguard Worker   DEFINE_SIZE_STATIC (10);
177*2d1272b8SAndroid Build Coastguard Worker };
178*2d1272b8SAndroid Build Coastguard Worker 
179*2d1272b8SAndroid Build Coastguard Worker struct ActionSubrecord
180*2d1272b8SAndroid Build Coastguard Worker {
get_lengthAAT::ActionSubrecord181*2d1272b8SAndroid Build Coastguard Worker   unsigned int get_length () const { return u.header.actionLength; }
182*2d1272b8SAndroid Build Coastguard Worker 
sanitizeAAT::ActionSubrecord183*2d1272b8SAndroid Build Coastguard Worker   bool sanitize (hb_sanitize_context_t *c) const
184*2d1272b8SAndroid Build Coastguard Worker   {
185*2d1272b8SAndroid Build Coastguard Worker     TRACE_SANITIZE (this);
186*2d1272b8SAndroid Build Coastguard Worker     if (unlikely (!c->check_struct (this)))
187*2d1272b8SAndroid Build Coastguard Worker       return_trace (false);
188*2d1272b8SAndroid Build Coastguard Worker     hb_barrier ();
189*2d1272b8SAndroid Build Coastguard Worker 
190*2d1272b8SAndroid Build Coastguard Worker     switch (u.header.actionType)
191*2d1272b8SAndroid Build Coastguard Worker     {
192*2d1272b8SAndroid Build Coastguard Worker     case 0: hb_barrier ();  return_trace (u.decompositionAction.sanitize (c));
193*2d1272b8SAndroid Build Coastguard Worker     case 1: hb_barrier ();  return_trace (u.unconditionalAddGlyphAction.sanitize (c));
194*2d1272b8SAndroid Build Coastguard Worker     case 2: hb_barrier ();  return_trace (u.conditionalAddGlyphAction.sanitize (c));
195*2d1272b8SAndroid Build Coastguard Worker     // case 3: hb_barrier (); return_trace (u.stretchGlyphAction.sanitize (c));
196*2d1272b8SAndroid Build Coastguard Worker     case 4: hb_barrier ();  return_trace (u.decompositionAction.sanitize (c));
197*2d1272b8SAndroid Build Coastguard Worker     case 5: hb_barrier ();  return_trace (u.decompositionAction.sanitize (c));
198*2d1272b8SAndroid Build Coastguard Worker     default: return_trace (true);
199*2d1272b8SAndroid Build Coastguard Worker     }
200*2d1272b8SAndroid Build Coastguard Worker   }
201*2d1272b8SAndroid Build Coastguard Worker 
202*2d1272b8SAndroid Build Coastguard Worker   protected:
203*2d1272b8SAndroid Build Coastguard Worker   union	{
204*2d1272b8SAndroid Build Coastguard Worker   ActionSubrecordHeader		header;
205*2d1272b8SAndroid Build Coastguard Worker   DecompositionAction		decompositionAction;
206*2d1272b8SAndroid Build Coastguard Worker   UnconditionalAddGlyphAction	unconditionalAddGlyphAction;
207*2d1272b8SAndroid Build Coastguard Worker   ConditionalAddGlyphAction	conditionalAddGlyphAction;
208*2d1272b8SAndroid Build Coastguard Worker   /* StretchGlyphAction stretchGlyphAction; -- Not supported by CoreText */
209*2d1272b8SAndroid Build Coastguard Worker   DuctileGlyphAction		ductileGlyphAction;
210*2d1272b8SAndroid Build Coastguard Worker   RepeatedAddGlyphAction	repeatedAddGlyphAction;
211*2d1272b8SAndroid Build Coastguard Worker   } u;				/* Data. The format of this data depends on
212*2d1272b8SAndroid Build Coastguard Worker 				 * the value of the actionType field. */
213*2d1272b8SAndroid Build Coastguard Worker   public:
214*2d1272b8SAndroid Build Coastguard Worker   DEFINE_SIZE_UNION (6, header);
215*2d1272b8SAndroid Build Coastguard Worker };
216*2d1272b8SAndroid Build Coastguard Worker 
217*2d1272b8SAndroid Build Coastguard Worker struct PostcompensationActionChain
218*2d1272b8SAndroid Build Coastguard Worker {
sanitizeAAT::PostcompensationActionChain219*2d1272b8SAndroid Build Coastguard Worker   bool sanitize (hb_sanitize_context_t *c) const
220*2d1272b8SAndroid Build Coastguard Worker   {
221*2d1272b8SAndroid Build Coastguard Worker     TRACE_SANITIZE (this);
222*2d1272b8SAndroid Build Coastguard Worker     if (unlikely (!c->check_struct (this)))
223*2d1272b8SAndroid Build Coastguard Worker       return_trace (false);
224*2d1272b8SAndroid Build Coastguard Worker     hb_barrier ();
225*2d1272b8SAndroid Build Coastguard Worker 
226*2d1272b8SAndroid Build Coastguard Worker     unsigned int offset = min_size;
227*2d1272b8SAndroid Build Coastguard Worker     for (unsigned int i = 0; i < count; i++)
228*2d1272b8SAndroid Build Coastguard Worker     {
229*2d1272b8SAndroid Build Coastguard Worker       const ActionSubrecord& subrecord = StructAtOffset<ActionSubrecord> (this, offset);
230*2d1272b8SAndroid Build Coastguard Worker       if (unlikely (!subrecord.sanitize (c))) return_trace (false);
231*2d1272b8SAndroid Build Coastguard Worker       offset += subrecord.get_length ();
232*2d1272b8SAndroid Build Coastguard Worker     }
233*2d1272b8SAndroid Build Coastguard Worker 
234*2d1272b8SAndroid Build Coastguard Worker     return_trace (true);
235*2d1272b8SAndroid Build Coastguard Worker   }
236*2d1272b8SAndroid Build Coastguard Worker 
237*2d1272b8SAndroid Build Coastguard Worker   protected:
238*2d1272b8SAndroid Build Coastguard Worker   HBUINT32	count;
239*2d1272b8SAndroid Build Coastguard Worker 
240*2d1272b8SAndroid Build Coastguard Worker   public:
241*2d1272b8SAndroid Build Coastguard Worker   DEFINE_SIZE_STATIC (4);
242*2d1272b8SAndroid Build Coastguard Worker };
243*2d1272b8SAndroid Build Coastguard Worker 
244*2d1272b8SAndroid Build Coastguard Worker struct JustWidthDeltaEntry
245*2d1272b8SAndroid Build Coastguard Worker {
246*2d1272b8SAndroid Build Coastguard Worker   enum Flags
247*2d1272b8SAndroid Build Coastguard Worker   {
248*2d1272b8SAndroid Build Coastguard Worker     Reserved1		=0xE000,/* Reserved. You should set these bits to zero. */
249*2d1272b8SAndroid Build Coastguard Worker     UnlimiteGap		=0x1000,/* The glyph can take unlimited gap. When this
250*2d1272b8SAndroid Build Coastguard Worker 				 * glyph participates in the justification process,
251*2d1272b8SAndroid Build Coastguard Worker 				 * it and any other glyphs on the line having this
252*2d1272b8SAndroid Build Coastguard Worker 				 * bit set absorb all the remaining gap. */
253*2d1272b8SAndroid Build Coastguard Worker     Reserved2		=0x0FF0,/* Reserved. You should set these bits to zero. */
254*2d1272b8SAndroid Build Coastguard Worker     Priority		=0x000F /* The justification priority of the glyph. */
255*2d1272b8SAndroid Build Coastguard Worker   };
256*2d1272b8SAndroid Build Coastguard Worker 
257*2d1272b8SAndroid Build Coastguard Worker   enum Priority
258*2d1272b8SAndroid Build Coastguard Worker   {
259*2d1272b8SAndroid Build Coastguard Worker     Kashida		= 0,	/* Kashida priority. This is the highest priority
260*2d1272b8SAndroid Build Coastguard Worker 				 * during justification. */
261*2d1272b8SAndroid Build Coastguard Worker     Whitespace		= 1,	/* Whitespace priority. Any whitespace glyphs (as
262*2d1272b8SAndroid Build Coastguard Worker 				 * identified in the glyph properties table) will
263*2d1272b8SAndroid Build Coastguard Worker 				 * get this priority. */
264*2d1272b8SAndroid Build Coastguard Worker     InterCharacter	= 2,	/* Inter-character priority. Give this to any
265*2d1272b8SAndroid Build Coastguard Worker 				 * remaining glyphs. */
266*2d1272b8SAndroid Build Coastguard Worker     NullPriority	= 3	/* Null priority. You should set this priority for
267*2d1272b8SAndroid Build Coastguard Worker 				 * glyphs that only participate in justification
268*2d1272b8SAndroid Build Coastguard Worker 				 * after the above priorities. Normally all glyphs
269*2d1272b8SAndroid Build Coastguard Worker 				 * have one of the previous three values. If you
270*2d1272b8SAndroid Build Coastguard Worker 				 * don't want a glyph to participate in justification,
271*2d1272b8SAndroid Build Coastguard Worker 				 * and you don't want to set its factors to zero,
272*2d1272b8SAndroid Build Coastguard Worker 				 * you may instead assign it to the null priority. */
273*2d1272b8SAndroid Build Coastguard Worker   };
274*2d1272b8SAndroid Build Coastguard Worker 
275*2d1272b8SAndroid Build Coastguard Worker   protected:
276*2d1272b8SAndroid Build Coastguard Worker   F16DOT16	beforeGrowLimit;/* The ratio by which the advance width of the
277*2d1272b8SAndroid Build Coastguard Worker 				 * glyph is permitted to grow on the left or top side. */
278*2d1272b8SAndroid Build Coastguard Worker   F16DOT16	beforeShrinkLimit;
279*2d1272b8SAndroid Build Coastguard Worker 				/* The ratio by which the advance width of the
280*2d1272b8SAndroid Build Coastguard Worker 				 * glyph is permitted to shrink on the left or top side. */
281*2d1272b8SAndroid Build Coastguard Worker   F16DOT16	afterGrowLimit;	/* The ratio by which the advance width of the glyph
282*2d1272b8SAndroid Build Coastguard Worker 				 * is permitted to shrink on the left or top side. */
283*2d1272b8SAndroid Build Coastguard Worker   F16DOT16	afterShrinkLimit;
284*2d1272b8SAndroid Build Coastguard Worker 				/* The ratio by which the advance width of the glyph
285*2d1272b8SAndroid Build Coastguard Worker 				 * is at most permitted to shrink on the right or
286*2d1272b8SAndroid Build Coastguard Worker 				 * bottom side. */
287*2d1272b8SAndroid Build Coastguard Worker   HBUINT16	growFlags;	/* Flags controlling the grow case. */
288*2d1272b8SAndroid Build Coastguard Worker   HBUINT16	shrinkFlags;	/* Flags controlling the shrink case. */
289*2d1272b8SAndroid Build Coastguard Worker 
290*2d1272b8SAndroid Build Coastguard Worker   public:
291*2d1272b8SAndroid Build Coastguard Worker   DEFINE_SIZE_STATIC (20);
292*2d1272b8SAndroid Build Coastguard Worker };
293*2d1272b8SAndroid Build Coastguard Worker 
294*2d1272b8SAndroid Build Coastguard Worker struct WidthDeltaPair
295*2d1272b8SAndroid Build Coastguard Worker {
sanitizeAAT::WidthDeltaPair296*2d1272b8SAndroid Build Coastguard Worker   bool sanitize (hb_sanitize_context_t *c) const
297*2d1272b8SAndroid Build Coastguard Worker   {
298*2d1272b8SAndroid Build Coastguard Worker     TRACE_SANITIZE (this);
299*2d1272b8SAndroid Build Coastguard Worker     return_trace (c->check_struct (this));
300*2d1272b8SAndroid Build Coastguard Worker   }
301*2d1272b8SAndroid Build Coastguard Worker 
302*2d1272b8SAndroid Build Coastguard Worker   protected:
303*2d1272b8SAndroid Build Coastguard Worker   HBUINT32	justClass;	/* The justification category associated
304*2d1272b8SAndroid Build Coastguard Worker 				 * with the wdRecord field. Only 7 bits of
305*2d1272b8SAndroid Build Coastguard Worker 				 * this field are used. (The other bits are
306*2d1272b8SAndroid Build Coastguard Worker 				 * used as padding to guarantee longword
307*2d1272b8SAndroid Build Coastguard Worker 				 * alignment of the following record). */
308*2d1272b8SAndroid Build Coastguard Worker   JustWidthDeltaEntry
309*2d1272b8SAndroid Build Coastguard Worker 		wdRecord;	/* The actual width delta record. */
310*2d1272b8SAndroid Build Coastguard Worker 
311*2d1272b8SAndroid Build Coastguard Worker   public:
312*2d1272b8SAndroid Build Coastguard Worker   DEFINE_SIZE_STATIC (24);
313*2d1272b8SAndroid Build Coastguard Worker };
314*2d1272b8SAndroid Build Coastguard Worker 
315*2d1272b8SAndroid Build Coastguard Worker typedef OT::Array32Of<WidthDeltaPair> WidthDeltaCluster;
316*2d1272b8SAndroid Build Coastguard Worker 
317*2d1272b8SAndroid Build Coastguard Worker struct JustificationCategory
318*2d1272b8SAndroid Build Coastguard Worker {
319*2d1272b8SAndroid Build Coastguard Worker   typedef void EntryData;
320*2d1272b8SAndroid Build Coastguard Worker 
321*2d1272b8SAndroid Build Coastguard Worker   enum Flags
322*2d1272b8SAndroid Build Coastguard Worker   {
323*2d1272b8SAndroid Build Coastguard Worker     SetMark		=0x8000,/* If set, make the current glyph the marked
324*2d1272b8SAndroid Build Coastguard Worker 				 * glyph. */
325*2d1272b8SAndroid Build Coastguard Worker     DontAdvance		=0x4000,/* If set, don't advance to the next glyph before
326*2d1272b8SAndroid Build Coastguard Worker 				 * going to the new state. */
327*2d1272b8SAndroid Build Coastguard Worker     MarkCategory	=0x3F80,/* The justification category for the marked
328*2d1272b8SAndroid Build Coastguard Worker 				 * glyph if nonzero. */
329*2d1272b8SAndroid Build Coastguard Worker     CurrentCategory	=0x007F /* The justification category for the current
330*2d1272b8SAndroid Build Coastguard Worker 				 * glyph if nonzero. */
331*2d1272b8SAndroid Build Coastguard Worker   };
332*2d1272b8SAndroid Build Coastguard Worker 
sanitizeAAT::JustificationCategory333*2d1272b8SAndroid Build Coastguard Worker   bool sanitize (hb_sanitize_context_t *c, const void *base) const
334*2d1272b8SAndroid Build Coastguard Worker   {
335*2d1272b8SAndroid Build Coastguard Worker     TRACE_SANITIZE (this);
336*2d1272b8SAndroid Build Coastguard Worker     return_trace (likely (c->check_struct (this) &&
337*2d1272b8SAndroid Build Coastguard Worker 			  morphHeader.sanitize (c) &&
338*2d1272b8SAndroid Build Coastguard Worker 			  stHeader.sanitize (c)));
339*2d1272b8SAndroid Build Coastguard Worker   }
340*2d1272b8SAndroid Build Coastguard Worker 
341*2d1272b8SAndroid Build Coastguard Worker   protected:
342*2d1272b8SAndroid Build Coastguard Worker   ChainSubtable<ObsoleteTypes>
343*2d1272b8SAndroid Build Coastguard Worker 		morphHeader;	/* Metamorphosis-style subtable header. */
344*2d1272b8SAndroid Build Coastguard Worker   StateTable<ObsoleteTypes, EntryData>
345*2d1272b8SAndroid Build Coastguard Worker 		stHeader;	/* The justification insertion state table header */
346*2d1272b8SAndroid Build Coastguard Worker   public:
347*2d1272b8SAndroid Build Coastguard Worker   DEFINE_SIZE_STATIC (30);
348*2d1272b8SAndroid Build Coastguard Worker };
349*2d1272b8SAndroid Build Coastguard Worker 
350*2d1272b8SAndroid Build Coastguard Worker struct JustificationHeader
351*2d1272b8SAndroid Build Coastguard Worker {
sanitizeAAT::JustificationHeader352*2d1272b8SAndroid Build Coastguard Worker   bool sanitize (hb_sanitize_context_t *c, const void *base) const
353*2d1272b8SAndroid Build Coastguard Worker   {
354*2d1272b8SAndroid Build Coastguard Worker     TRACE_SANITIZE (this);
355*2d1272b8SAndroid Build Coastguard Worker     return_trace (likely (c->check_struct (this) &&
356*2d1272b8SAndroid Build Coastguard Worker 			  justClassTable.sanitize (c, base, base) &&
357*2d1272b8SAndroid Build Coastguard Worker 			  wdcTable.sanitize (c, base) &&
358*2d1272b8SAndroid Build Coastguard Worker 			  pcTable.sanitize (c, base) &&
359*2d1272b8SAndroid Build Coastguard Worker 			  lookupTable.sanitize (c, base)));
360*2d1272b8SAndroid Build Coastguard Worker   }
361*2d1272b8SAndroid Build Coastguard Worker 
362*2d1272b8SAndroid Build Coastguard Worker   protected:
363*2d1272b8SAndroid Build Coastguard Worker   Offset16To<JustificationCategory>
364*2d1272b8SAndroid Build Coastguard Worker 		justClassTable;	/* Offset to the justification category state table. */
365*2d1272b8SAndroid Build Coastguard Worker   Offset16To<WidthDeltaCluster>
366*2d1272b8SAndroid Build Coastguard Worker 		wdcTable;	/* Offset from start of justification table to start
367*2d1272b8SAndroid Build Coastguard Worker 				 * of the subtable containing the width delta factors
368*2d1272b8SAndroid Build Coastguard Worker 				 * for the glyphs in your font.
369*2d1272b8SAndroid Build Coastguard Worker 				 *
370*2d1272b8SAndroid Build Coastguard Worker 				 * The width delta clusters table. */
371*2d1272b8SAndroid Build Coastguard Worker   Offset16To<PostcompensationActionChain>
372*2d1272b8SAndroid Build Coastguard Worker 		pcTable;	/* Offset from start of justification table to start
373*2d1272b8SAndroid Build Coastguard Worker 				 * of postcompensation subtable (set to zero if none).
374*2d1272b8SAndroid Build Coastguard Worker 				 *
375*2d1272b8SAndroid Build Coastguard Worker 				 * The postcompensation subtable, if present in the font. */
376*2d1272b8SAndroid Build Coastguard Worker   Lookup<Offset16To<WidthDeltaCluster>>
377*2d1272b8SAndroid Build Coastguard Worker 		lookupTable;	/* Lookup table associating glyphs with width delta
378*2d1272b8SAndroid Build Coastguard Worker 				 * clusters. See the description of Width Delta Clusters
379*2d1272b8SAndroid Build Coastguard Worker 				 * table for details on how to interpret the lookup values. */
380*2d1272b8SAndroid Build Coastguard Worker 
381*2d1272b8SAndroid Build Coastguard Worker   public:
382*2d1272b8SAndroid Build Coastguard Worker   DEFINE_SIZE_MIN (8);
383*2d1272b8SAndroid Build Coastguard Worker };
384*2d1272b8SAndroid Build Coastguard Worker 
385*2d1272b8SAndroid Build Coastguard Worker struct just
386*2d1272b8SAndroid Build Coastguard Worker {
387*2d1272b8SAndroid Build Coastguard Worker   static constexpr hb_tag_t tableTag = HB_AAT_TAG_just;
388*2d1272b8SAndroid Build Coastguard Worker 
sanitizeAAT::just389*2d1272b8SAndroid Build Coastguard Worker   bool sanitize (hb_sanitize_context_t *c) const
390*2d1272b8SAndroid Build Coastguard Worker   {
391*2d1272b8SAndroid Build Coastguard Worker     TRACE_SANITIZE (this);
392*2d1272b8SAndroid Build Coastguard Worker 
393*2d1272b8SAndroid Build Coastguard Worker     return_trace (likely (c->check_struct (this) &&
394*2d1272b8SAndroid Build Coastguard Worker 			  hb_barrier () &&
395*2d1272b8SAndroid Build Coastguard Worker 			  version.major == 1 &&
396*2d1272b8SAndroid Build Coastguard Worker 			  horizData.sanitize (c, this, this) &&
397*2d1272b8SAndroid Build Coastguard Worker 			  vertData.sanitize (c, this, this)));
398*2d1272b8SAndroid Build Coastguard Worker   }
399*2d1272b8SAndroid Build Coastguard Worker 
400*2d1272b8SAndroid Build Coastguard Worker   protected:
401*2d1272b8SAndroid Build Coastguard Worker   FixedVersion<>version;	/* Version of the justification table
402*2d1272b8SAndroid Build Coastguard Worker 				 * (0x00010000u for version 1.0). */
403*2d1272b8SAndroid Build Coastguard Worker   HBUINT16	format;		/* Format of the justification table (set to 0). */
404*2d1272b8SAndroid Build Coastguard Worker   Offset16To<JustificationHeader>
405*2d1272b8SAndroid Build Coastguard Worker 		horizData;	/* Byte offset from the start of the justification table
406*2d1272b8SAndroid Build Coastguard Worker 				 * to the header for tables that contain justification
407*2d1272b8SAndroid Build Coastguard Worker 				 * information for horizontal text.
408*2d1272b8SAndroid Build Coastguard Worker 				 * If you are not including this information,
409*2d1272b8SAndroid Build Coastguard Worker 				 * store 0. */
410*2d1272b8SAndroid Build Coastguard Worker   Offset16To<JustificationHeader>
411*2d1272b8SAndroid Build Coastguard Worker 		vertData;	/* ditto, vertical */
412*2d1272b8SAndroid Build Coastguard Worker 
413*2d1272b8SAndroid Build Coastguard Worker   public:
414*2d1272b8SAndroid Build Coastguard Worker   DEFINE_SIZE_STATIC (10);
415*2d1272b8SAndroid Build Coastguard Worker };
416*2d1272b8SAndroid Build Coastguard Worker 
417*2d1272b8SAndroid Build Coastguard Worker } /* namespace AAT */
418*2d1272b8SAndroid Build Coastguard Worker 
419*2d1272b8SAndroid Build Coastguard Worker 
420*2d1272b8SAndroid Build Coastguard Worker #endif /* HB_AAT_LAYOUT_JUST_TABLE_HH */
421