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