• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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  
inithb_ot_shape_plan_key_t40    void init (hb_face_t   *face,
41  		    const int   *coords,
42  		    unsigned int 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  
equalhb_ot_shape_plan_key_t52    bool equal (const hb_ot_shape_plan_key_t *other)
53    {
54      return 0 == memcmp (this, other, sizeof (*this));
55    }
56  };
57  
58  
59  struct hb_shape_plan_key_t;
60  
61  struct hb_ot_shape_plan_t
62  {
63    hb_segment_properties_t props;
64    const struct hb_ot_complex_shaper_t *shaper;
65    hb_ot_map_t map;
66    hb_aat_map_t aat_map;
67    const void *data;
68  #ifndef HB_NO_OT_SHAPE_FRACTIONS
69    hb_mask_t frac_mask, numr_mask, dnom_mask;
70  #else
71    static constexpr hb_mask_t frac_mask = 0;
72    static constexpr hb_mask_t numr_mask = 0;
73    static constexpr hb_mask_t dnom_mask = 0;
74  #endif
75    hb_mask_t rtlm_mask;
76  #ifndef HB_NO_OT_KERN
77    hb_mask_t kern_mask;
78  #else
79    static constexpr hb_mask_t kern_mask = 0;
80  #endif
81  #ifndef HB_NO_AAT_SHAPE
82    hb_mask_t trak_mask;
83  #else
84    static constexpr hb_mask_t trak_mask = 0;
85  #endif
86  
87  #ifndef HB_NO_OT_KERN
88    bool requested_kerning : 1;
89  #else
90    static constexpr bool requested_kerning = false;
91  #endif
92  #ifndef HB_NO_AAT_SHAPE
93    bool requested_tracking : 1;
94  #else
95    static constexpr bool requested_tracking = false;
96  #endif
97  #ifndef HB_NO_OT_SHAPE_FRACTIONS
98    bool has_frac : 1;
99  #else
100    static constexpr bool has_frac = false;
101  #endif
102    bool has_gpos_mark : 1;
103    bool zero_marks : 1;
104    bool fallback_glyph_classes : 1;
105    bool fallback_mark_positioning : 1;
106    bool adjust_mark_positioning_when_zeroing : 1;
107  
108    bool apply_gpos : 1;
109  #ifndef HB_NO_OT_KERN
110    bool apply_kern : 1;
111  #else
112    static constexpr bool apply_kern = false;
113  #endif
114  #ifndef HB_NO_AAT_SHAPE
115    bool apply_kerx : 1;
116    bool apply_morx : 1;
117    bool apply_trak : 1;
118  #else
119    static constexpr bool apply_kerx = false;
120    static constexpr bool apply_morx = false;
121    static constexpr bool apply_trak = false;
122  #endif
123  
collect_lookupshb_ot_shape_plan_t124    void collect_lookups (hb_tag_t table_tag, hb_set_t *lookups) const
125    {
126      unsigned int table_index;
127      switch (table_tag) {
128        case HB_OT_TAG_GSUB: table_index = 0; break;
129        case HB_OT_TAG_GPOS: table_index = 1; break;
130        default: return;
131      }
132      map.collect_lookups (table_index, lookups);
133    }
134  
135    HB_INTERNAL bool init0 (hb_face_t                     *face,
136  			  const hb_shape_plan_key_t     *key);
137    HB_INTERNAL void fini ();
138  
139    HB_INTERNAL void substitute (hb_font_t *font, hb_buffer_t *buffer) const;
140    HB_INTERNAL void position (hb_font_t *font, hb_buffer_t *buffer) const;
141  };
142  
143  struct hb_shape_plan_t;
144  
145  struct hb_ot_shape_planner_t
146  {
147    /* In the order that they are filled in. */
148    hb_face_t *face;
149    hb_segment_properties_t props;
150    hb_ot_map_builder_t map;
151    hb_aat_map_builder_t aat_map;
152  #ifndef HB_NO_AAT_SHAPE
153    bool apply_morx : 1;
154  #else
155    static constexpr bool apply_morx = false;
156  #endif
157    bool script_zero_marks : 1;
158    bool script_fallback_mark_positioning : 1;
159    const struct hb_ot_complex_shaper_t *shaper;
160  
161    HB_INTERNAL hb_ot_shape_planner_t (hb_face_t                     *face,
162  				     const hb_segment_properties_t *props);
163  
164    HB_INTERNAL void compile (hb_ot_shape_plan_t           &plan,
165  			    const hb_ot_shape_plan_key_t &key);
166  };
167  
168  
169  #endif /* HB_OT_SHAPE_HH */
170