1*2d1272b8SAndroid Build Coastguard Worker /* 2*2d1272b8SAndroid Build Coastguard Worker * Copyright © 2018 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): Garret Rieger, Roderick Sheeter 25*2d1272b8SAndroid Build Coastguard Worker */ 26*2d1272b8SAndroid Build Coastguard Worker 27*2d1272b8SAndroid Build Coastguard Worker #ifndef HB_SUBSET_INPUT_HH 28*2d1272b8SAndroid Build Coastguard Worker #define HB_SUBSET_INPUT_HH 29*2d1272b8SAndroid Build Coastguard Worker 30*2d1272b8SAndroid Build Coastguard Worker 31*2d1272b8SAndroid Build Coastguard Worker #include "hb.hh" 32*2d1272b8SAndroid Build Coastguard Worker 33*2d1272b8SAndroid Build Coastguard Worker #include "hb-subset.h" 34*2d1272b8SAndroid Build Coastguard Worker #include "hb-map.hh" 35*2d1272b8SAndroid Build Coastguard Worker #include "hb-set.hh" 36*2d1272b8SAndroid Build Coastguard Worker #include "hb-cplusplus.hh" 37*2d1272b8SAndroid Build Coastguard Worker #include "hb-font.hh" 38*2d1272b8SAndroid Build Coastguard Worker #include "hb-subset-instancer-solver.hh" 39*2d1272b8SAndroid Build Coastguard Worker 40*2d1272b8SAndroid Build Coastguard Worker struct hb_ot_name_record_ids_t 41*2d1272b8SAndroid Build Coastguard Worker { 42*2d1272b8SAndroid Build Coastguard Worker hb_ot_name_record_ids_t () = default; hb_ot_name_record_ids_thb_ot_name_record_ids_t43*2d1272b8SAndroid Build Coastguard Worker hb_ot_name_record_ids_t (unsigned platform_id_, 44*2d1272b8SAndroid Build Coastguard Worker unsigned encoding_id_, 45*2d1272b8SAndroid Build Coastguard Worker unsigned language_id_, 46*2d1272b8SAndroid Build Coastguard Worker unsigned name_id_) 47*2d1272b8SAndroid Build Coastguard Worker :platform_id (platform_id_), 48*2d1272b8SAndroid Build Coastguard Worker encoding_id (encoding_id_), 49*2d1272b8SAndroid Build Coastguard Worker language_id (language_id_), 50*2d1272b8SAndroid Build Coastguard Worker name_id (name_id_) {} 51*2d1272b8SAndroid Build Coastguard Worker operator !=hb_ot_name_record_ids_t52*2d1272b8SAndroid Build Coastguard Worker bool operator != (const hb_ot_name_record_ids_t o) const 53*2d1272b8SAndroid Build Coastguard Worker { return !(*this == o); } 54*2d1272b8SAndroid Build Coastguard Worker operator ==hb_ot_name_record_ids_t55*2d1272b8SAndroid Build Coastguard Worker inline bool operator == (const hb_ot_name_record_ids_t& o) const 56*2d1272b8SAndroid Build Coastguard Worker { 57*2d1272b8SAndroid Build Coastguard Worker return platform_id == o.platform_id && 58*2d1272b8SAndroid Build Coastguard Worker encoding_id == o.encoding_id && 59*2d1272b8SAndroid Build Coastguard Worker language_id == o.language_id && 60*2d1272b8SAndroid Build Coastguard Worker name_id == o.name_id; 61*2d1272b8SAndroid Build Coastguard Worker } 62*2d1272b8SAndroid Build Coastguard Worker hashhb_ot_name_record_ids_t63*2d1272b8SAndroid Build Coastguard Worker inline uint32_t hash () const 64*2d1272b8SAndroid Build Coastguard Worker { 65*2d1272b8SAndroid Build Coastguard Worker uint32_t current = 0; 66*2d1272b8SAndroid Build Coastguard Worker current = current * 31 + hb_hash (platform_id); 67*2d1272b8SAndroid Build Coastguard Worker current = current * 31 + hb_hash (encoding_id); 68*2d1272b8SAndroid Build Coastguard Worker current = current * 31 + hb_hash (language_id); 69*2d1272b8SAndroid Build Coastguard Worker current = current * 31 + hb_hash (name_id); 70*2d1272b8SAndroid Build Coastguard Worker return current; 71*2d1272b8SAndroid Build Coastguard Worker } 72*2d1272b8SAndroid Build Coastguard Worker 73*2d1272b8SAndroid Build Coastguard Worker unsigned platform_id; 74*2d1272b8SAndroid Build Coastguard Worker unsigned encoding_id; 75*2d1272b8SAndroid Build Coastguard Worker unsigned language_id; 76*2d1272b8SAndroid Build Coastguard Worker unsigned name_id; 77*2d1272b8SAndroid Build Coastguard Worker }; 78*2d1272b8SAndroid Build Coastguard Worker 79*2d1272b8SAndroid Build Coastguard Worker typedef struct hb_ot_name_record_ids_t hb_ot_name_record_ids_t; 80*2d1272b8SAndroid Build Coastguard Worker 81*2d1272b8SAndroid Build Coastguard Worker 82*2d1272b8SAndroid Build Coastguard Worker HB_MARK_AS_FLAG_T (hb_subset_flags_t); 83*2d1272b8SAndroid Build Coastguard Worker 84*2d1272b8SAndroid Build Coastguard Worker struct hb_subset_input_t 85*2d1272b8SAndroid Build Coastguard Worker { 86*2d1272b8SAndroid Build Coastguard Worker HB_INTERNAL hb_subset_input_t (); 87*2d1272b8SAndroid Build Coastguard Worker ~hb_subset_input_thb_subset_input_t88*2d1272b8SAndroid Build Coastguard Worker ~hb_subset_input_t () 89*2d1272b8SAndroid Build Coastguard Worker { 90*2d1272b8SAndroid Build Coastguard Worker sets.~sets_t (); 91*2d1272b8SAndroid Build Coastguard Worker 92*2d1272b8SAndroid Build Coastguard Worker #ifdef HB_EXPERIMENTAL_API 93*2d1272b8SAndroid Build Coastguard Worker for (auto _ : name_table_overrides.values ()) 94*2d1272b8SAndroid Build Coastguard Worker _.fini (); 95*2d1272b8SAndroid Build Coastguard Worker #endif 96*2d1272b8SAndroid Build Coastguard Worker } 97*2d1272b8SAndroid Build Coastguard Worker 98*2d1272b8SAndroid Build Coastguard Worker hb_object_header_t header; 99*2d1272b8SAndroid Build Coastguard Worker 100*2d1272b8SAndroid Build Coastguard Worker struct sets_t { 101*2d1272b8SAndroid Build Coastguard Worker hb::shared_ptr<hb_set_t> glyphs; 102*2d1272b8SAndroid Build Coastguard Worker hb::shared_ptr<hb_set_t> unicodes; 103*2d1272b8SAndroid Build Coastguard Worker hb::shared_ptr<hb_set_t> no_subset_tables; 104*2d1272b8SAndroid Build Coastguard Worker hb::shared_ptr<hb_set_t> drop_tables; 105*2d1272b8SAndroid Build Coastguard Worker hb::shared_ptr<hb_set_t> name_ids; 106*2d1272b8SAndroid Build Coastguard Worker hb::shared_ptr<hb_set_t> name_languages; 107*2d1272b8SAndroid Build Coastguard Worker hb::shared_ptr<hb_set_t> layout_features; 108*2d1272b8SAndroid Build Coastguard Worker hb::shared_ptr<hb_set_t> layout_scripts; 109*2d1272b8SAndroid Build Coastguard Worker }; 110*2d1272b8SAndroid Build Coastguard Worker 111*2d1272b8SAndroid Build Coastguard Worker union { 112*2d1272b8SAndroid Build Coastguard Worker sets_t sets; 113*2d1272b8SAndroid Build Coastguard Worker hb::shared_ptr<hb_set_t> set_ptrs[sizeof (sets_t) / sizeof (hb_set_t*)]; 114*2d1272b8SAndroid Build Coastguard Worker }; 115*2d1272b8SAndroid Build Coastguard Worker 116*2d1272b8SAndroid Build Coastguard Worker unsigned flags; 117*2d1272b8SAndroid Build Coastguard Worker bool attach_accelerator_data = false; 118*2d1272b8SAndroid Build Coastguard Worker 119*2d1272b8SAndroid Build Coastguard Worker // If set loca format will always be the long version. 120*2d1272b8SAndroid Build Coastguard Worker bool force_long_loca = false; 121*2d1272b8SAndroid Build Coastguard Worker 122*2d1272b8SAndroid Build Coastguard Worker hb_hashmap_t<hb_tag_t, Triple> axes_location; 123*2d1272b8SAndroid Build Coastguard Worker hb_map_t glyph_map; 124*2d1272b8SAndroid Build Coastguard Worker #ifdef HB_EXPERIMENTAL_API 125*2d1272b8SAndroid Build Coastguard Worker hb_hashmap_t<hb_ot_name_record_ids_t, hb_bytes_t> name_table_overrides; 126*2d1272b8SAndroid Build Coastguard Worker #endif 127*2d1272b8SAndroid Build Coastguard Worker num_setshb_subset_input_t128*2d1272b8SAndroid Build Coastguard Worker inline unsigned num_sets () const 129*2d1272b8SAndroid Build Coastguard Worker { 130*2d1272b8SAndroid Build Coastguard Worker return sizeof (set_ptrs) / sizeof (hb_set_t*); 131*2d1272b8SAndroid Build Coastguard Worker } 132*2d1272b8SAndroid Build Coastguard Worker sets_iterhb_subset_input_t133*2d1272b8SAndroid Build Coastguard Worker inline hb_array_t<hb::shared_ptr<hb_set_t>> sets_iter () 134*2d1272b8SAndroid Build Coastguard Worker { 135*2d1272b8SAndroid Build Coastguard Worker return hb_array (set_ptrs); 136*2d1272b8SAndroid Build Coastguard Worker } 137*2d1272b8SAndroid Build Coastguard Worker in_errorhb_subset_input_t138*2d1272b8SAndroid Build Coastguard Worker bool in_error () const 139*2d1272b8SAndroid Build Coastguard Worker { 140*2d1272b8SAndroid Build Coastguard Worker for (unsigned i = 0; i < num_sets (); i++) 141*2d1272b8SAndroid Build Coastguard Worker { 142*2d1272b8SAndroid Build Coastguard Worker if (unlikely (set_ptrs[i]->in_error ())) 143*2d1272b8SAndroid Build Coastguard Worker return true; 144*2d1272b8SAndroid Build Coastguard Worker } 145*2d1272b8SAndroid Build Coastguard Worker 146*2d1272b8SAndroid Build Coastguard Worker return axes_location.in_error () 147*2d1272b8SAndroid Build Coastguard Worker #ifdef HB_EXPERIMENTAL_API 148*2d1272b8SAndroid Build Coastguard Worker || name_table_overrides.in_error () 149*2d1272b8SAndroid Build Coastguard Worker #endif 150*2d1272b8SAndroid Build Coastguard Worker ; 151*2d1272b8SAndroid Build Coastguard Worker } 152*2d1272b8SAndroid Build Coastguard Worker }; 153*2d1272b8SAndroid Build Coastguard Worker 154*2d1272b8SAndroid Build Coastguard Worker 155*2d1272b8SAndroid Build Coastguard Worker #endif /* HB_SUBSET_INPUT_HH */ 156