Coverage Report

Created: 2023-03-09 17:58

/src/harfbuzz/src/hb-ot-var.cc
Line
Count
Source (jump to first uncovered line)
1
/*
2
 * Copyright © 2017  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
#include "hb.hh"
28
29
#ifndef HB_NO_VAR
30
31
#include "hb-ot-var.h"
32
33
#include "hb-ot-var-avar-table.hh"
34
#include "hb-ot-var-fvar-table.hh"
35
#include "hb-ot-var-mvar-table.hh"
36
37
38
/**
39
 * SECTION:hb-ot-var
40
 * @title: hb-ot-var
41
 * @short_description: OpenType Font Variations
42
 * @include: hb-ot.h
43
 *
44
 * Functions for fetching information about OpenType Variable Fonts.
45
 **/
46
47
48
/*
49
 * fvar/avar
50
 */
51
52
53
/**
54
 * hb_ot_var_has_data:
55
 * @face: The #hb_face_t to work on
56
 *
57
 * Tests whether a face includes any OpenType variation data in the `fvar` table.
58
 *
59
 * Return value: `true` if data found, `false` otherwise
60
 *
61
 * Since: 1.4.2
62
 **/
63
hb_bool_t
64
hb_ot_var_has_data (hb_face_t *face)
65
0
{
66
0
  return face->table.fvar->has_data ();
67
0
}
68
69
/**
70
 * hb_ot_var_get_axis_count:
71
 * @face: The #hb_face_t to work on
72
 *
73
 * Fetches the number of OpenType variation axes included in the face. 
74
 *
75
 * Return value: the number of variation axes defined
76
 *
77
 * Since: 1.4.2
78
 **/
79
unsigned int
80
hb_ot_var_get_axis_count (hb_face_t *face)
81
1.11M
{
82
1.11M
  return face->table.fvar->get_axis_count ();
83
1.11M
}
84
85
#ifndef HB_DISABLE_DEPRECATED
86
/**
87
 * hb_ot_var_get_axes:
88
 * @face: #hb_face_t to work upon
89
 * @start_offset: offset of the first lookup to retrieve
90
 * @axes_count: (inout) (optional): Input = the maximum number of variation axes to return;
91
 *                Output = the actual number of variation axes returned (may be zero)
92
 * @axes_array: (out caller-allocates) (array length=axes_count): The array of variation axes found
93
 *
94
 * Fetches a list of all variation axes in the specified face. The list returned will begin
95
 * at the offset provided.
96
 *
97
 * Since: 1.4.2
98
 * Deprecated: 2.2.0: use hb_ot_var_get_axis_infos() instead
99
 **/
100
unsigned int
101
hb_ot_var_get_axes (hb_face_t        *face,
102
        unsigned int      start_offset,
103
        unsigned int     *axes_count /* IN/OUT */,
104
        hb_ot_var_axis_t *axes_array /* OUT */)
105
0
{
106
0
  return face->table.fvar->get_axes_deprecated (start_offset, axes_count, axes_array);
107
0
}
108
109
/**
110
 * hb_ot_var_find_axis:
111
 * @face: #hb_face_t to work upon
112
 * @axis_tag: The #hb_tag_t of the variation axis to query
113
 * @axis_index: The index of the variation axis
114
 * @axis_info: (out): The #hb_ot_var_axis_info_t of the axis tag queried
115
 *
116
 * Fetches the variation-axis information corresponding to the specified axis tag
117
 * in the specified face.
118
 *
119
 * Since: 1.4.2
120
 * Deprecated: 2.2.0 - use hb_ot_var_find_axis_info() instead
121
 **/
122
hb_bool_t
123
hb_ot_var_find_axis (hb_face_t        *face,
124
         hb_tag_t          axis_tag,
125
         unsigned int     *axis_index,
126
         hb_ot_var_axis_t *axis_info)
127
0
{
128
0
  return face->table.fvar->find_axis_deprecated (axis_tag, axis_index, axis_info);
129
0
}
130
#endif
131
132
/**
133
 * hb_ot_var_get_axis_infos:
134
 * @face: #hb_face_t to work upon
135
 * @start_offset: offset of the first lookup to retrieve
136
 * @axes_count: (inout) (optional): Input = the maximum number of variation axes to return;
137
 *                Output = the actual number of variation axes returned (may be zero)
138
 * @axes_array: (out caller-allocates) (array length=axes_count): The array of variation axes found
139
 *
140
 * Fetches a list of all variation axes in the specified face. The list returned will begin
141
 * at the offset provided.
142
 *
143
 * Return value: the number of variation axes in the face
144
 *
145
 * Since: 2.2.0
146
 **/
147
HB_EXTERN unsigned int
148
hb_ot_var_get_axis_infos (hb_face_t             *face,
149
        unsigned int           start_offset,
150
        unsigned int          *axes_count /* IN/OUT */,
151
        hb_ot_var_axis_info_t *axes_array /* OUT */)
152
372k
{
153
372k
  return face->table.fvar->get_axis_infos (start_offset, axes_count, axes_array);
154
372k
}
155
156
/**
157
 * hb_ot_var_find_axis_info:
158
 * @face: #hb_face_t to work upon
159
 * @axis_tag: The #hb_tag_t of the variation axis to query
160
 * @axis_info: (out): The #hb_ot_var_axis_info_t of the axis tag queried
161
 *
162
 * Fetches the variation-axis information corresponding to the specified axis tag
163
 * in the specified face.
164
 *
165
 * Return value: `true` if data found, `false` otherwise
166
 *
167
 * Since: 2.2.0
168
 **/
169
HB_EXTERN hb_bool_t
170
hb_ot_var_find_axis_info (hb_face_t             *face,
171
        hb_tag_t               axis_tag,
172
        hb_ot_var_axis_info_t *axis_info)
173
0
{
174
0
  return face->table.fvar->find_axis_info (axis_tag, axis_info);
175
0
}
176
177
178
/*
179
 * Named instances.
180
 */
181
182
/**
183
 * hb_ot_var_get_named_instance_count:
184
 * @face: The #hb_face_t to work on
185
 *
186
 * Fetches the number of named instances included in the face. 
187
 *
188
 * Return value: the number of named instances defined
189
 *
190
 * Since: 2.2.0
191
 **/
192
unsigned int
193
hb_ot_var_get_named_instance_count (hb_face_t *face)
194
0
{
195
0
  return face->table.fvar->get_instance_count ();
196
0
}
197
198
/**
199
 * hb_ot_var_named_instance_get_subfamily_name_id:
200
 * @face: The #hb_face_t to work on
201
 * @instance_index: The index of the named instance to query
202
 *
203
 * Fetches the `name` table Name ID that provides display names for
204
 * the "Subfamily name" defined for the given named instance in the face.
205
 *
206
 * Return value: the Name ID found for the Subfamily name
207
 *
208
 * Since: 2.2.0
209
 **/
210
hb_ot_name_id_t
211
hb_ot_var_named_instance_get_subfamily_name_id (hb_face_t   *face,
212
            unsigned int instance_index)
213
0
{
214
0
  return face->table.fvar->get_instance_subfamily_name_id (instance_index);
215
0
}
216
217
/**
218
 * hb_ot_var_named_instance_get_postscript_name_id:
219
 * @face: The #hb_face_t to work on
220
 * @instance_index: The index of the named instance to query
221
 *
222
 * Fetches the `name` table Name ID that provides display names for
223
 * the "PostScript name" defined for the given named instance in the face.
224
 *
225
 * Return value: the Name ID found for the PostScript name
226
 *
227
 * Since: 2.2.0
228
 **/
229
hb_ot_name_id_t
230
hb_ot_var_named_instance_get_postscript_name_id (hb_face_t  *face,
231
            unsigned int instance_index)
232
0
{
233
0
  return face->table.fvar->get_instance_postscript_name_id (instance_index);
234
0
}
235
236
/**
237
 * hb_ot_var_named_instance_get_design_coords:
238
 * @face: The #hb_face_t to work on
239
 * @instance_index: The index of the named instance to query
240
 * @coords_length: (inout) (optional): Input = the maximum number of coordinates to return;
241
 *                 Output = the actual number of coordinates returned (may be zero)
242
 * @coords: (out) (array length=coords_length): The array of coordinates found for the query
243
 *
244
 * Fetches the design-space coordinates corresponding to the given
245
 * named instance in the face.
246
 *
247
 * Return value: the number of variation axes in the face
248
 *
249
 * Since: 2.2.0
250
 **/
251
unsigned int
252
hb_ot_var_named_instance_get_design_coords (hb_face_t    *face,
253
              unsigned int  instance_index,
254
              unsigned int *coords_length, /* IN/OUT */
255
              float        *coords         /* OUT */)
256
0
{
257
0
  return face->table.fvar->get_instance_coords (instance_index, coords_length, coords);
258
0
}
259
260
261
/**
262
 * hb_ot_var_normalize_variations:
263
 * @face: The #hb_face_t to work on
264
 * @variations: The array of variations to normalize
265
 * @variations_length: The number of variations to normalize
266
 * @coords: (out) (array length=coords_length): The array of normalized coordinates 
267
 * @coords_length: The length of the coordinate array
268
 *
269
 * Normalizes all of the coordinates in the given list of variation axes.
270
 *
271
 * Since: 1.4.2
272
 **/
273
void
274
hb_ot_var_normalize_variations (hb_face_t            *face,
275
        const hb_variation_t *variations, /* IN */
276
        unsigned int          variations_length,
277
        int                  *coords, /* OUT */
278
        unsigned int          coords_length)
279
372k
{
280
372k
  for (unsigned int i = 0; i < coords_length; i++)
281
0
    coords[i] = 0;
282
283
372k
  const OT::fvar &fvar = *face->table.fvar;
284
372k
  for (unsigned int i = 0; i < variations_length; i++)
285
0
  {
286
0
    hb_ot_var_axis_info_t info;
287
0
    if (hb_ot_var_find_axis_info (face, variations[i].tag, &info) &&
288
0
  info.axis_index < coords_length)
289
0
      coords[info.axis_index] = fvar.normalize_axis_value (info.axis_index, variations[i].value);
290
0
  }
291
292
372k
  face->table.avar->map_coords (coords, coords_length);
293
372k
}
294
295
/**
296
 * hb_ot_var_normalize_coords:
297
 * @face: The #hb_face_t to work on
298
 * @coords_length: The length of the coordinate array
299
 * @design_coords: The design-space coordinates to normalize
300
 * @normalized_coords: (out): The normalized coordinates
301
 *
302
 * Normalizes the given design-space coordinates. The minimum and maximum
303
 * values for the axis are mapped to the interval [-1,1], with the default
304
 * axis value mapped to 0.
305
 *
306
 * The normalized values have 14 bits of fixed-point sub-integer precision as per
307
 * OpenType specification.
308
 *
309
 * Any additional scaling defined in the face's `avar` table is also
310
 * applied, as described at https://docs.microsoft.com/en-us/typography/opentype/spec/avar
311
 *
312
 * Since: 1.4.2
313
 **/
314
void
315
hb_ot_var_normalize_coords (hb_face_t    *face,
316
          unsigned int coords_length,
317
          const float *design_coords, /* IN */
318
          int *normalized_coords /* OUT */)
319
371k
{
320
371k
  const OT::fvar &fvar = *face->table.fvar;
321
371k
  for (unsigned int i = 0; i < coords_length; i++)
322
0
    normalized_coords[i] = fvar.normalize_axis_value (i, design_coords[i]);
323
324
371k
  face->table.avar->map_coords (normalized_coords, coords_length);
325
371k
}
326
327
328
#endif