Coverage Report

Created: 2025-07-07 10:01

/work/workdir/UnpackedTarball/harfbuzz/src/hb-ot-shape.hh
Line
Count
Source (jump to first uncovered line)
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
32.9M
  {
44
98.8M
    for (unsigned int table_index = 0; table_index < 2; table_index++)
45
65.8M
      hb_ot_layout_table_find_feature_variations (face,
46
65.8M
              table_tags[table_index],
47
65.8M
              coords,
48
65.8M
              num_coords,
49
65.8M
              &variations_index[table_index]);
50
32.9M
  }
51
52
  bool equal (const hb_ot_shape_plan_key_t *other)
53
32.9M
  {
54
32.9M
    return variations_index[0] == other->variations_index[0] &&
55
32.9M
     variations_index[1] == other->variations_index[1];
56
32.9M
  }
57
};
58
59
60
struct hb_shape_plan_key_t;
61
62
struct hb_ot_shape_plan_t
63
{
64
0
  ~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
0
  {
121
0
    unsigned int table_index;
122
0
    switch (table_tag) {
123
0
      case HB_OT_TAG_GSUB: table_index = 0; break;
124
0
      case HB_OT_TAG_GPOS: table_index = 1; break;
125
0
      default: return;
126
0
    }
127
0
    map.collect_lookups (table_index, lookups);
128
0
  }
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_mark_positioning : 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 */