tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

hb-ot-shape.hh (4488B)


      1 /*
      2 * Copyright © 2010  Google, Inc.
      3 *
      4 *  This is part of HarfBuzz, a text shaping library.
      5 *
      6 * Permission is hereby granted, without written agreement and without
      7 * license or royalty fees, to use, copy, modify, and distribute this
      8 * software and its documentation for any purpose, provided that the
      9 * above copyright notice and the following two paragraphs appear in
     10 * all copies of this software.
     11 *
     12 * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR
     13 * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
     14 * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN
     15 * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
     16 * DAMAGE.
     17 *
     18 * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING,
     19 * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
     20 * FITNESS FOR A PARTICULAR PURPOSE.  THE SOFTWARE PROVIDED HEREUNDER IS
     21 * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO
     22 * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
     23 *
     24 * Google Author(s): Behdad Esfahbod
     25 */
     26 
     27 #ifndef HB_OT_SHAPE_HH
     28 #define HB_OT_SHAPE_HH
     29 
     30 #include "hb.hh"
     31 
     32 #include "hb-ot-map.hh"
     33 #include "hb-aat-map.hh"
     34 
     35 
     36 struct hb_ot_shape_plan_key_t
     37 {
     38  unsigned int variations_index[2];
     39 
     40  void init (hb_face_t *face,
     41      const int *coords,
     42      unsigned   num_coords)
     43  {
     44    for (unsigned int table_index = 0; table_index < 2; table_index++)
     45      hb_ot_layout_table_find_feature_variations (face,
     46 					  table_tags[table_index],
     47 					  coords,
     48 					  num_coords,
     49 					  &variations_index[table_index]);
     50  }
     51 
     52  bool equal (const hb_ot_shape_plan_key_t *other)
     53  {
     54    return variations_index[0] == other->variations_index[0] &&
     55    variations_index[1] == other->variations_index[1];
     56  }
     57 };
     58 
     59 
     60 struct hb_shape_plan_key_t;
     61 
     62 struct hb_ot_shape_plan_t
     63 {
     64  ~hb_ot_shape_plan_t () { fini (); }
     65 
     66  hb_segment_properties_t props;
     67  const struct hb_ot_shaper_t *shaper;
     68  hb_ot_map_t map;
     69  hb_aat_map_t aat_map;
     70  const void *data;
     71 #ifndef HB_NO_OT_SHAPE_FRACTIONS
     72  hb_mask_t frac_mask, numr_mask, dnom_mask;
     73 #else
     74  static constexpr hb_mask_t frac_mask = 0;
     75  static constexpr hb_mask_t numr_mask = 0;
     76  static constexpr hb_mask_t dnom_mask = 0;
     77 #endif
     78  hb_mask_t rtlm_mask;
     79 #ifndef HB_NO_OT_KERN
     80  hb_mask_t kern_mask;
     81 #else
     82  static constexpr hb_mask_t kern_mask = 0;
     83 #endif
     84 
     85 #ifndef HB_NO_OT_KERN
     86  bool requested_kerning : 1;
     87 #else
     88  static constexpr bool requested_kerning = false;
     89 #endif
     90 #ifndef HB_NO_OT_SHAPE_FRACTIONS
     91  bool has_frac : 1;
     92 #else
     93  static constexpr bool has_frac = false;
     94 #endif
     95  bool has_vert : 1;
     96  bool has_gpos_mark : 1;
     97  bool zero_marks : 1;
     98  bool fallback_glyph_classes : 1;
     99  bool fallback_mark_positioning : 1;
    100  bool adjust_mark_positioning_when_zeroing : 1;
    101 
    102  bool apply_gpos : 1;
    103 #ifndef HB_NO_OT_KERN
    104  bool apply_kern : 1;
    105 #else
    106  static constexpr bool apply_kern = false;
    107 #endif
    108  bool apply_fallback_kern : 1;
    109 #ifndef HB_NO_AAT_SHAPE
    110  bool apply_kerx : 1;
    111  bool apply_morx : 1;
    112  bool apply_trak : 1;
    113 #else
    114  static constexpr bool apply_kerx = false;
    115  static constexpr bool apply_morx = false;
    116  static constexpr bool apply_trak = false;
    117 #endif
    118 
    119  void collect_lookups (hb_tag_t table_tag, hb_set_t *lookups) const
    120  {
    121    unsigned int table_index;
    122    switch (table_tag) {
    123      case HB_OT_TAG_GSUB: table_index = 0; break;
    124      case HB_OT_TAG_GPOS: table_index = 1; break;
    125      default: return;
    126    }
    127    map.collect_lookups (table_index, lookups);
    128  }
    129 
    130  HB_INTERNAL bool init0 (hb_face_t                     *face,
    131 		  const hb_shape_plan_key_t     *key);
    132  HB_INTERNAL void fini ();
    133 
    134  HB_INTERNAL void substitute (hb_font_t *font, hb_buffer_t *buffer) const;
    135  HB_INTERNAL void position (hb_font_t *font, hb_buffer_t *buffer) const;
    136 };
    137 
    138 struct hb_shape_plan_t;
    139 
    140 struct hb_ot_shape_planner_t
    141 {
    142  /* In the order that they are filled in. */
    143  hb_face_t *face;
    144  hb_segment_properties_t props;
    145  hb_ot_map_builder_t map;
    146 #ifndef HB_NO_AAT_SHAPE
    147  hb_aat_map_builder_t aat_map;
    148  bool apply_morx : 1;
    149 #else
    150  static constexpr bool apply_morx = false;
    151 #endif
    152  bool script_zero_marks : 1;
    153  bool script_fallback_position : 1;
    154  const struct hb_ot_shaper_t *shaper;
    155 
    156  HB_INTERNAL hb_ot_shape_planner_t (hb_face_t                     *face,
    157 			     const hb_segment_properties_t &props);
    158 
    159  HB_INTERNAL void compile (hb_ot_shape_plan_t           &plan,
    160 		    const hb_ot_shape_plan_key_t &key);
    161 };
    162 
    163 
    164 #endif /* HB_OT_SHAPE_HH */