1*2d1272b8SAndroid Build Coastguard Worker /* 2*2d1272b8SAndroid Build Coastguard Worker * Copyright © 2016 Google, Inc. 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 * Google Author(s): Behdad Esfahbod 25*2d1272b8SAndroid Build Coastguard Worker */ 26*2d1272b8SAndroid Build Coastguard Worker 27*2d1272b8SAndroid Build Coastguard Worker #ifndef HB_OT_POST_TABLE_HH 28*2d1272b8SAndroid Build Coastguard Worker #define HB_OT_POST_TABLE_HH 29*2d1272b8SAndroid Build Coastguard Worker 30*2d1272b8SAndroid Build Coastguard Worker #include "hb-open-type.hh" 31*2d1272b8SAndroid Build Coastguard Worker #include "hb-ot-var-mvar-table.hh" 32*2d1272b8SAndroid Build Coastguard Worker 33*2d1272b8SAndroid Build Coastguard Worker #define HB_STRING_ARRAY_NAME format1_names 34*2d1272b8SAndroid Build Coastguard Worker #define HB_STRING_ARRAY_LIST "hb-ot-post-macroman.hh" 35*2d1272b8SAndroid Build Coastguard Worker #include "hb-string-array.hh" 36*2d1272b8SAndroid Build Coastguard Worker #undef HB_STRING_ARRAY_LIST 37*2d1272b8SAndroid Build Coastguard Worker #undef HB_STRING_ARRAY_NAME 38*2d1272b8SAndroid Build Coastguard Worker 39*2d1272b8SAndroid Build Coastguard Worker /* 40*2d1272b8SAndroid Build Coastguard Worker * post -- PostScript 41*2d1272b8SAndroid Build Coastguard Worker * https://docs.microsoft.com/en-us/typography/opentype/spec/post 42*2d1272b8SAndroid Build Coastguard Worker */ 43*2d1272b8SAndroid Build Coastguard Worker #define HB_OT_TAG_post HB_TAG('p','o','s','t') 44*2d1272b8SAndroid Build Coastguard Worker 45*2d1272b8SAndroid Build Coastguard Worker 46*2d1272b8SAndroid Build Coastguard Worker namespace OT { 47*2d1272b8SAndroid Build Coastguard Worker 48*2d1272b8SAndroid Build Coastguard Worker 49*2d1272b8SAndroid Build Coastguard Worker struct postV2Tail 50*2d1272b8SAndroid Build Coastguard Worker { 51*2d1272b8SAndroid Build Coastguard Worker friend struct post; 52*2d1272b8SAndroid Build Coastguard Worker sanitizeOT::postV2Tail53*2d1272b8SAndroid Build Coastguard Worker bool sanitize (hb_sanitize_context_t *c) const 54*2d1272b8SAndroid Build Coastguard Worker { 55*2d1272b8SAndroid Build Coastguard Worker TRACE_SANITIZE (this); 56*2d1272b8SAndroid Build Coastguard Worker return_trace (glyphNameIndex.sanitize (c)); 57*2d1272b8SAndroid Build Coastguard Worker } 58*2d1272b8SAndroid Build Coastguard Worker 59*2d1272b8SAndroid Build Coastguard Worker template<typename Iterator> 60*2d1272b8SAndroid Build Coastguard Worker bool serialize (hb_serialize_context_t *c, 61*2d1272b8SAndroid Build Coastguard Worker Iterator it, 62*2d1272b8SAndroid Build Coastguard Worker const void* _post) const; 63*2d1272b8SAndroid Build Coastguard Worker 64*2d1272b8SAndroid Build Coastguard Worker bool subset (hb_subset_context_t *c) const; 65*2d1272b8SAndroid Build Coastguard Worker 66*2d1272b8SAndroid Build Coastguard Worker protected: 67*2d1272b8SAndroid Build Coastguard Worker Array16Of<HBUINT16> glyphNameIndex; /* This is not an offset, but is the 68*2d1272b8SAndroid Build Coastguard Worker * ordinal number of the glyph in 'post' 69*2d1272b8SAndroid Build Coastguard Worker * string tables. */ 70*2d1272b8SAndroid Build Coastguard Worker /*UnsizedArrayOf<HBUINT8> 71*2d1272b8SAndroid Build Coastguard Worker namesX;*/ /* Glyph names with length bytes [variable] 72*2d1272b8SAndroid Build Coastguard Worker * (a Pascal string). */ 73*2d1272b8SAndroid Build Coastguard Worker 74*2d1272b8SAndroid Build Coastguard Worker public: 75*2d1272b8SAndroid Build Coastguard Worker DEFINE_SIZE_ARRAY (2, glyphNameIndex); 76*2d1272b8SAndroid Build Coastguard Worker }; 77*2d1272b8SAndroid Build Coastguard Worker 78*2d1272b8SAndroid Build Coastguard Worker struct post 79*2d1272b8SAndroid Build Coastguard Worker { 80*2d1272b8SAndroid Build Coastguard Worker static constexpr hb_tag_t tableTag = HB_OT_TAG_post; 81*2d1272b8SAndroid Build Coastguard Worker serializeOT::post82*2d1272b8SAndroid Build Coastguard Worker bool serialize (hb_serialize_context_t *c, bool glyph_names) const 83*2d1272b8SAndroid Build Coastguard Worker { 84*2d1272b8SAndroid Build Coastguard Worker TRACE_SERIALIZE (this); 85*2d1272b8SAndroid Build Coastguard Worker post *post_prime = c->allocate_min<post> (); 86*2d1272b8SAndroid Build Coastguard Worker if (unlikely (!post_prime)) return_trace (false); 87*2d1272b8SAndroid Build Coastguard Worker 88*2d1272b8SAndroid Build Coastguard Worker hb_memcpy (post_prime, this, post::min_size); 89*2d1272b8SAndroid Build Coastguard Worker if (!glyph_names) 90*2d1272b8SAndroid Build Coastguard Worker return_trace (c->check_assign (post_prime->version.major, 3, 91*2d1272b8SAndroid Build Coastguard Worker HB_SERIALIZE_ERROR_INT_OVERFLOW)); // Version 3 does not have any glyph names. 92*2d1272b8SAndroid Build Coastguard Worker 93*2d1272b8SAndroid Build Coastguard Worker return_trace (true); 94*2d1272b8SAndroid Build Coastguard Worker } 95*2d1272b8SAndroid Build Coastguard Worker subsetOT::post96*2d1272b8SAndroid Build Coastguard Worker bool subset (hb_subset_context_t *c) const 97*2d1272b8SAndroid Build Coastguard Worker { 98*2d1272b8SAndroid Build Coastguard Worker TRACE_SUBSET (this); 99*2d1272b8SAndroid Build Coastguard Worker auto *post_prime = c->serializer->start_embed<post> (); 100*2d1272b8SAndroid Build Coastguard Worker 101*2d1272b8SAndroid Build Coastguard Worker bool glyph_names = c->plan->flags & HB_SUBSET_FLAGS_GLYPH_NAMES; 102*2d1272b8SAndroid Build Coastguard Worker if (!serialize (c->serializer, glyph_names)) 103*2d1272b8SAndroid Build Coastguard Worker return_trace (false); 104*2d1272b8SAndroid Build Coastguard Worker 105*2d1272b8SAndroid Build Coastguard Worker #ifndef HB_NO_VAR 106*2d1272b8SAndroid Build Coastguard Worker if (c->plan->normalized_coords) 107*2d1272b8SAndroid Build Coastguard Worker { 108*2d1272b8SAndroid Build Coastguard Worker auto &MVAR = *c->plan->source->table.MVAR; 109*2d1272b8SAndroid Build Coastguard Worker auto *table = post_prime; 110*2d1272b8SAndroid Build Coastguard Worker 111*2d1272b8SAndroid Build Coastguard Worker HB_ADD_MVAR_VAR (HB_OT_METRICS_TAG_UNDERLINE_SIZE, underlineThickness); 112*2d1272b8SAndroid Build Coastguard Worker HB_ADD_MVAR_VAR (HB_OT_METRICS_TAG_UNDERLINE_OFFSET, underlinePosition); 113*2d1272b8SAndroid Build Coastguard Worker } 114*2d1272b8SAndroid Build Coastguard Worker #endif 115*2d1272b8SAndroid Build Coastguard Worker 116*2d1272b8SAndroid Build Coastguard Worker Triple *axis_range; 117*2d1272b8SAndroid Build Coastguard Worker if (c->plan->user_axes_location.has (HB_TAG ('s','l','n','t'), &axis_range)) 118*2d1272b8SAndroid Build Coastguard Worker { 119*2d1272b8SAndroid Build Coastguard Worker float italic_angle = hb_max (-90.0, hb_min (axis_range->middle, 90.0)); 120*2d1272b8SAndroid Build Coastguard Worker if (post_prime->italicAngle.to_float () != italic_angle) 121*2d1272b8SAndroid Build Coastguard Worker post_prime->italicAngle.set_float (italic_angle); 122*2d1272b8SAndroid Build Coastguard Worker } 123*2d1272b8SAndroid Build Coastguard Worker 124*2d1272b8SAndroid Build Coastguard Worker if (glyph_names && version.major == 2) 125*2d1272b8SAndroid Build Coastguard Worker { 126*2d1272b8SAndroid Build Coastguard Worker hb_barrier (); 127*2d1272b8SAndroid Build Coastguard Worker return_trace (v2X.subset (c)); 128*2d1272b8SAndroid Build Coastguard Worker } 129*2d1272b8SAndroid Build Coastguard Worker 130*2d1272b8SAndroid Build Coastguard Worker return_trace (true); 131*2d1272b8SAndroid Build Coastguard Worker } 132*2d1272b8SAndroid Build Coastguard Worker 133*2d1272b8SAndroid Build Coastguard Worker struct accelerator_t 134*2d1272b8SAndroid Build Coastguard Worker { 135*2d1272b8SAndroid Build Coastguard Worker friend struct postV2Tail; 136*2d1272b8SAndroid Build Coastguard Worker accelerator_tOT::post::accelerator_t137*2d1272b8SAndroid Build Coastguard Worker accelerator_t (hb_face_t *face) 138*2d1272b8SAndroid Build Coastguard Worker { 139*2d1272b8SAndroid Build Coastguard Worker table = hb_sanitize_context_t ().reference_table<post> (face); 140*2d1272b8SAndroid Build Coastguard Worker unsigned int table_length = table.get_length (); 141*2d1272b8SAndroid Build Coastguard Worker 142*2d1272b8SAndroid Build Coastguard Worker version = table->version.to_int (); 143*2d1272b8SAndroid Build Coastguard Worker if (version != 0x00020000) return; 144*2d1272b8SAndroid Build Coastguard Worker hb_barrier (); 145*2d1272b8SAndroid Build Coastguard Worker 146*2d1272b8SAndroid Build Coastguard Worker const postV2Tail &v2 = table->v2X; 147*2d1272b8SAndroid Build Coastguard Worker 148*2d1272b8SAndroid Build Coastguard Worker glyphNameIndex = &v2.glyphNameIndex; 149*2d1272b8SAndroid Build Coastguard Worker pool = &StructAfter<uint8_t> (v2.glyphNameIndex); 150*2d1272b8SAndroid Build Coastguard Worker 151*2d1272b8SAndroid Build Coastguard Worker const uint8_t *end = (const uint8_t *) (const void *) table + table_length; 152*2d1272b8SAndroid Build Coastguard Worker index_to_offset.alloc (hb_min (face->get_num_glyphs (), table_length / 8)); 153*2d1272b8SAndroid Build Coastguard Worker for (const uint8_t *data = pool; 154*2d1272b8SAndroid Build Coastguard Worker index_to_offset.length < 65535 && data < end && data + *data < end; 155*2d1272b8SAndroid Build Coastguard Worker data += 1 + *data) 156*2d1272b8SAndroid Build Coastguard Worker index_to_offset.push (data - pool); 157*2d1272b8SAndroid Build Coastguard Worker } ~accelerator_tOT::post::accelerator_t158*2d1272b8SAndroid Build Coastguard Worker ~accelerator_t () 159*2d1272b8SAndroid Build Coastguard Worker { 160*2d1272b8SAndroid Build Coastguard Worker hb_free (gids_sorted_by_name.get_acquire ()); 161*2d1272b8SAndroid Build Coastguard Worker table.destroy (); 162*2d1272b8SAndroid Build Coastguard Worker } 163*2d1272b8SAndroid Build Coastguard Worker get_glyph_nameOT::post::accelerator_t164*2d1272b8SAndroid Build Coastguard Worker bool get_glyph_name (hb_codepoint_t glyph, 165*2d1272b8SAndroid Build Coastguard Worker char *buf, unsigned int buf_len) const 166*2d1272b8SAndroid Build Coastguard Worker { 167*2d1272b8SAndroid Build Coastguard Worker hb_bytes_t s = find_glyph_name (glyph); 168*2d1272b8SAndroid Build Coastguard Worker if (!s.length) return false; 169*2d1272b8SAndroid Build Coastguard Worker if (!buf_len) return true; 170*2d1272b8SAndroid Build Coastguard Worker unsigned int len = hb_min (buf_len - 1, s.length); 171*2d1272b8SAndroid Build Coastguard Worker strncpy (buf, s.arrayZ, len); 172*2d1272b8SAndroid Build Coastguard Worker buf[len] = '\0'; 173*2d1272b8SAndroid Build Coastguard Worker return true; 174*2d1272b8SAndroid Build Coastguard Worker } 175*2d1272b8SAndroid Build Coastguard Worker get_glyph_from_nameOT::post::accelerator_t176*2d1272b8SAndroid Build Coastguard Worker bool get_glyph_from_name (const char *name, int len, 177*2d1272b8SAndroid Build Coastguard Worker hb_codepoint_t *glyph) const 178*2d1272b8SAndroid Build Coastguard Worker { 179*2d1272b8SAndroid Build Coastguard Worker unsigned int count = get_glyph_count (); 180*2d1272b8SAndroid Build Coastguard Worker if (unlikely (!count)) return false; 181*2d1272b8SAndroid Build Coastguard Worker 182*2d1272b8SAndroid Build Coastguard Worker if (len < 0) len = strlen (name); 183*2d1272b8SAndroid Build Coastguard Worker 184*2d1272b8SAndroid Build Coastguard Worker if (unlikely (!len)) return false; 185*2d1272b8SAndroid Build Coastguard Worker 186*2d1272b8SAndroid Build Coastguard Worker retry: 187*2d1272b8SAndroid Build Coastguard Worker uint16_t *gids = gids_sorted_by_name.get_acquire (); 188*2d1272b8SAndroid Build Coastguard Worker 189*2d1272b8SAndroid Build Coastguard Worker if (unlikely (!gids)) 190*2d1272b8SAndroid Build Coastguard Worker { 191*2d1272b8SAndroid Build Coastguard Worker gids = (uint16_t *) hb_malloc (count * sizeof (gids[0])); 192*2d1272b8SAndroid Build Coastguard Worker if (unlikely (!gids)) 193*2d1272b8SAndroid Build Coastguard Worker return false; /* Anything better?! */ 194*2d1272b8SAndroid Build Coastguard Worker 195*2d1272b8SAndroid Build Coastguard Worker for (unsigned int i = 0; i < count; i++) 196*2d1272b8SAndroid Build Coastguard Worker gids[i] = i; 197*2d1272b8SAndroid Build Coastguard Worker hb_qsort (gids, count, sizeof (gids[0]), cmp_gids, (void *) this); 198*2d1272b8SAndroid Build Coastguard Worker 199*2d1272b8SAndroid Build Coastguard Worker if (unlikely (!gids_sorted_by_name.cmpexch (nullptr, gids))) 200*2d1272b8SAndroid Build Coastguard Worker { 201*2d1272b8SAndroid Build Coastguard Worker hb_free (gids); 202*2d1272b8SAndroid Build Coastguard Worker goto retry; 203*2d1272b8SAndroid Build Coastguard Worker } 204*2d1272b8SAndroid Build Coastguard Worker } 205*2d1272b8SAndroid Build Coastguard Worker 206*2d1272b8SAndroid Build Coastguard Worker hb_bytes_t st (name, len); 207*2d1272b8SAndroid Build Coastguard Worker auto* gid = hb_bsearch (st, gids, count, sizeof (gids[0]), cmp_key, (void *) this); 208*2d1272b8SAndroid Build Coastguard Worker if (gid) 209*2d1272b8SAndroid Build Coastguard Worker { 210*2d1272b8SAndroid Build Coastguard Worker *glyph = *gid; 211*2d1272b8SAndroid Build Coastguard Worker return true; 212*2d1272b8SAndroid Build Coastguard Worker } 213*2d1272b8SAndroid Build Coastguard Worker 214*2d1272b8SAndroid Build Coastguard Worker return false; 215*2d1272b8SAndroid Build Coastguard Worker } 216*2d1272b8SAndroid Build Coastguard Worker 217*2d1272b8SAndroid Build Coastguard Worker hb_blob_ptr_t<post> table; 218*2d1272b8SAndroid Build Coastguard Worker 219*2d1272b8SAndroid Build Coastguard Worker protected: 220*2d1272b8SAndroid Build Coastguard Worker get_glyph_countOT::post::accelerator_t221*2d1272b8SAndroid Build Coastguard Worker unsigned int get_glyph_count () const 222*2d1272b8SAndroid Build Coastguard Worker { 223*2d1272b8SAndroid Build Coastguard Worker if (version == 0x00010000) 224*2d1272b8SAndroid Build Coastguard Worker { 225*2d1272b8SAndroid Build Coastguard Worker hb_barrier (); 226*2d1272b8SAndroid Build Coastguard Worker return format1_names_length; 227*2d1272b8SAndroid Build Coastguard Worker } 228*2d1272b8SAndroid Build Coastguard Worker 229*2d1272b8SAndroid Build Coastguard Worker if (version == 0x00020000) 230*2d1272b8SAndroid Build Coastguard Worker { 231*2d1272b8SAndroid Build Coastguard Worker hb_barrier (); 232*2d1272b8SAndroid Build Coastguard Worker return glyphNameIndex->len; 233*2d1272b8SAndroid Build Coastguard Worker } 234*2d1272b8SAndroid Build Coastguard Worker 235*2d1272b8SAndroid Build Coastguard Worker return 0; 236*2d1272b8SAndroid Build Coastguard Worker } 237*2d1272b8SAndroid Build Coastguard Worker cmp_gidsOT::post::accelerator_t238*2d1272b8SAndroid Build Coastguard Worker static int cmp_gids (const void *pa, const void *pb, void *arg) 239*2d1272b8SAndroid Build Coastguard Worker { 240*2d1272b8SAndroid Build Coastguard Worker const accelerator_t *thiz = (const accelerator_t *) arg; 241*2d1272b8SAndroid Build Coastguard Worker uint16_t a = * (const uint16_t *) pa; 242*2d1272b8SAndroid Build Coastguard Worker uint16_t b = * (const uint16_t *) pb; 243*2d1272b8SAndroid Build Coastguard Worker return thiz->find_glyph_name (b).cmp (thiz->find_glyph_name (a)); 244*2d1272b8SAndroid Build Coastguard Worker } 245*2d1272b8SAndroid Build Coastguard Worker cmp_keyOT::post::accelerator_t246*2d1272b8SAndroid Build Coastguard Worker static int cmp_key (const void *pk, const void *po, void *arg) 247*2d1272b8SAndroid Build Coastguard Worker { 248*2d1272b8SAndroid Build Coastguard Worker const accelerator_t *thiz = (const accelerator_t *) arg; 249*2d1272b8SAndroid Build Coastguard Worker const hb_bytes_t *key = (const hb_bytes_t *) pk; 250*2d1272b8SAndroid Build Coastguard Worker uint16_t o = * (const uint16_t *) po; 251*2d1272b8SAndroid Build Coastguard Worker return thiz->find_glyph_name (o).cmp (*key); 252*2d1272b8SAndroid Build Coastguard Worker } 253*2d1272b8SAndroid Build Coastguard Worker find_glyph_nameOT::post::accelerator_t254*2d1272b8SAndroid Build Coastguard Worker hb_bytes_t find_glyph_name (hb_codepoint_t glyph) const 255*2d1272b8SAndroid Build Coastguard Worker { 256*2d1272b8SAndroid Build Coastguard Worker if (version == 0x00010000) 257*2d1272b8SAndroid Build Coastguard Worker { 258*2d1272b8SAndroid Build Coastguard Worker hb_barrier (); 259*2d1272b8SAndroid Build Coastguard Worker if (glyph >= format1_names_length) 260*2d1272b8SAndroid Build Coastguard Worker return hb_bytes_t (); 261*2d1272b8SAndroid Build Coastguard Worker 262*2d1272b8SAndroid Build Coastguard Worker return format1_names (glyph); 263*2d1272b8SAndroid Build Coastguard Worker } 264*2d1272b8SAndroid Build Coastguard Worker 265*2d1272b8SAndroid Build Coastguard Worker if (version != 0x00020000) 266*2d1272b8SAndroid Build Coastguard Worker return hb_bytes_t (); 267*2d1272b8SAndroid Build Coastguard Worker hb_barrier (); 268*2d1272b8SAndroid Build Coastguard Worker 269*2d1272b8SAndroid Build Coastguard Worker if (glyph >= glyphNameIndex->len) 270*2d1272b8SAndroid Build Coastguard Worker return hb_bytes_t (); 271*2d1272b8SAndroid Build Coastguard Worker 272*2d1272b8SAndroid Build Coastguard Worker unsigned int index = glyphNameIndex->arrayZ[glyph]; 273*2d1272b8SAndroid Build Coastguard Worker if (index < format1_names_length) 274*2d1272b8SAndroid Build Coastguard Worker return format1_names (index); 275*2d1272b8SAndroid Build Coastguard Worker index -= format1_names_length; 276*2d1272b8SAndroid Build Coastguard Worker 277*2d1272b8SAndroid Build Coastguard Worker if (index >= index_to_offset.length) 278*2d1272b8SAndroid Build Coastguard Worker return hb_bytes_t (); 279*2d1272b8SAndroid Build Coastguard Worker unsigned int offset = index_to_offset[index]; 280*2d1272b8SAndroid Build Coastguard Worker 281*2d1272b8SAndroid Build Coastguard Worker const uint8_t *data = pool + offset; 282*2d1272b8SAndroid Build Coastguard Worker unsigned int name_length = *data; 283*2d1272b8SAndroid Build Coastguard Worker data++; 284*2d1272b8SAndroid Build Coastguard Worker 285*2d1272b8SAndroid Build Coastguard Worker return hb_bytes_t ((const char *) data, name_length); 286*2d1272b8SAndroid Build Coastguard Worker } 287*2d1272b8SAndroid Build Coastguard Worker 288*2d1272b8SAndroid Build Coastguard Worker private: 289*2d1272b8SAndroid Build Coastguard Worker uint32_t version; 290*2d1272b8SAndroid Build Coastguard Worker const Array16Of<HBUINT16> *glyphNameIndex = nullptr; 291*2d1272b8SAndroid Build Coastguard Worker hb_vector_t<uint32_t> index_to_offset; 292*2d1272b8SAndroid Build Coastguard Worker const uint8_t *pool = nullptr; 293*2d1272b8SAndroid Build Coastguard Worker hb_atomic_ptr_t<uint16_t *> gids_sorted_by_name; 294*2d1272b8SAndroid Build Coastguard Worker }; 295*2d1272b8SAndroid Build Coastguard Worker has_dataOT::post296*2d1272b8SAndroid Build Coastguard Worker bool has_data () const { return version.to_int (); } 297*2d1272b8SAndroid Build Coastguard Worker sanitizeOT::post298*2d1272b8SAndroid Build Coastguard Worker bool sanitize (hb_sanitize_context_t *c) const 299*2d1272b8SAndroid Build Coastguard Worker { 300*2d1272b8SAndroid Build Coastguard Worker TRACE_SANITIZE (this); 301*2d1272b8SAndroid Build Coastguard Worker return_trace (c->check_struct (this) && 302*2d1272b8SAndroid Build Coastguard Worker hb_barrier () && 303*2d1272b8SAndroid Build Coastguard Worker (version.to_int () == 0x00010000 || 304*2d1272b8SAndroid Build Coastguard Worker (version.to_int () == 0x00020000 && hb_barrier () && v2X.sanitize (c)) || 305*2d1272b8SAndroid Build Coastguard Worker version.to_int () == 0x00030000)); 306*2d1272b8SAndroid Build Coastguard Worker } 307*2d1272b8SAndroid Build Coastguard Worker 308*2d1272b8SAndroid Build Coastguard Worker public: 309*2d1272b8SAndroid Build Coastguard Worker FixedVersion<>version; /* 0x00010000 for version 1.0 310*2d1272b8SAndroid Build Coastguard Worker * 0x00020000 for version 2.0 311*2d1272b8SAndroid Build Coastguard Worker * 0x00025000 for version 2.5 (deprecated) 312*2d1272b8SAndroid Build Coastguard Worker * 0x00030000 for version 3.0 */ 313*2d1272b8SAndroid Build Coastguard Worker F16DOT16 italicAngle; /* Italic angle in counter-clockwise degrees 314*2d1272b8SAndroid Build Coastguard Worker * from the vertical. Zero for upright text, 315*2d1272b8SAndroid Build Coastguard Worker * negative for text that leans to the right 316*2d1272b8SAndroid Build Coastguard Worker * (forward). */ 317*2d1272b8SAndroid Build Coastguard Worker FWORD underlinePosition; /* This is the suggested distance of the top 318*2d1272b8SAndroid Build Coastguard Worker * of the underline from the baseline 319*2d1272b8SAndroid Build Coastguard Worker * (negative values indicate below baseline). 320*2d1272b8SAndroid Build Coastguard Worker * The PostScript definition of this FontInfo 321*2d1272b8SAndroid Build Coastguard Worker * dictionary key (the y coordinate of the 322*2d1272b8SAndroid Build Coastguard Worker * center of the stroke) is not used for 323*2d1272b8SAndroid Build Coastguard Worker * historical reasons. The value of the 324*2d1272b8SAndroid Build Coastguard Worker * PostScript key may be calculated by 325*2d1272b8SAndroid Build Coastguard Worker * subtracting half the underlineThickness 326*2d1272b8SAndroid Build Coastguard Worker * from the value of this field. */ 327*2d1272b8SAndroid Build Coastguard Worker FWORD underlineThickness; /* Suggested values for the underline 328*2d1272b8SAndroid Build Coastguard Worker thickness. */ 329*2d1272b8SAndroid Build Coastguard Worker HBUINT32 isFixedPitch; /* Set to 0 if the font is proportionally 330*2d1272b8SAndroid Build Coastguard Worker * spaced, non-zero if the font is not 331*2d1272b8SAndroid Build Coastguard Worker * proportionally spaced (i.e. monospaced). */ 332*2d1272b8SAndroid Build Coastguard Worker HBUINT32 minMemType42; /* Minimum memory usage when an OpenType font 333*2d1272b8SAndroid Build Coastguard Worker * is downloaded. */ 334*2d1272b8SAndroid Build Coastguard Worker HBUINT32 maxMemType42; /* Maximum memory usage when an OpenType font 335*2d1272b8SAndroid Build Coastguard Worker * is downloaded. */ 336*2d1272b8SAndroid Build Coastguard Worker HBUINT32 minMemType1; /* Minimum memory usage when an OpenType font 337*2d1272b8SAndroid Build Coastguard Worker * is downloaded as a Type 1 font. */ 338*2d1272b8SAndroid Build Coastguard Worker HBUINT32 maxMemType1; /* Maximum memory usage when an OpenType font 339*2d1272b8SAndroid Build Coastguard Worker * is downloaded as a Type 1 font. */ 340*2d1272b8SAndroid Build Coastguard Worker postV2Tail v2X; 341*2d1272b8SAndroid Build Coastguard Worker DEFINE_SIZE_MIN (32); 342*2d1272b8SAndroid Build Coastguard Worker }; 343*2d1272b8SAndroid Build Coastguard Worker 344*2d1272b8SAndroid Build Coastguard Worker struct post_accelerator_t : post::accelerator_t { post_accelerator_tOT::post_accelerator_t345*2d1272b8SAndroid Build Coastguard Worker post_accelerator_t (hb_face_t *face) : post::accelerator_t (face) {} 346*2d1272b8SAndroid Build Coastguard Worker }; 347*2d1272b8SAndroid Build Coastguard Worker 348*2d1272b8SAndroid Build Coastguard Worker 349*2d1272b8SAndroid Build Coastguard Worker } /* namespace OT */ 350*2d1272b8SAndroid Build Coastguard Worker 351*2d1272b8SAndroid Build Coastguard Worker 352*2d1272b8SAndroid Build Coastguard Worker #endif /* HB_OT_POST_TABLE_HH */ 353