QtBase  v6.3.1
hb-ot-var-avar-table.hh
Go to the documentation of this file.
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 #ifndef HB_OT_VAR_AVAR_TABLE_HH
28 #define HB_OT_VAR_AVAR_TABLE_HH
29 
30 #include "hb-open-type.hh"
31 
32 /*
33  * avar -- Axis Variations
34  * https://docs.microsoft.com/en-us/typography/opentype/spec/avar
35  */
36 
37 #define HB_OT_TAG_avar HB_TAG('a','v','a','r')
38 
39 
40 namespace OT {
41 
42 
44 {
46  {
47  TRACE_SANITIZE (this);
48  return_trace (c->check_struct (this));
49  }
50 
51  public:
53 // F2DOT14 fromCoord; /* A normalized coordinate value obtained using
54 // * default normalization. */
55 // F2DOT14 toCoord; /* The modified, normalized coordinate value. */
56 
57  public:
59 };
60 
61 struct SegmentMaps : Array16Of<AxisValueMap>
62 {
63  int map (int value, unsigned int from_offset = 0, unsigned int to_offset = 1) const
64  {
65 #define fromCoord coords[from_offset]
66 #define toCoord coords[to_offset]
67  /* The following special-cases are not part of OpenType, which requires
68  * that at least -1, 0, and +1 must be mapped. But we include these as
69  * part of a better error recovery scheme. */
70  if (len < 2)
71  {
72  if (!len)
73  return value;
74  else /* len == 1*/
75  return value - arrayZ[0].fromCoord + arrayZ[0].toCoord;
76  }
77 
78  if (value <= arrayZ[0].fromCoord)
79  return value - arrayZ[0].fromCoord + arrayZ[0].toCoord;
80 
81  unsigned int i;
82  unsigned int count = len - 1;
83  for (i = 1; i < count && value > arrayZ[i].fromCoord; i++)
84  ;
85 
86  if (value >= arrayZ[i].fromCoord)
87  return value - arrayZ[i].fromCoord + arrayZ[i].toCoord;
88 
90  return arrayZ[i-1].toCoord;
91 
92  int denom = arrayZ[i].fromCoord - arrayZ[i-1].fromCoord;
93  return roundf (arrayZ[i-1].toCoord + ((float) (arrayZ[i].toCoord - arrayZ[i-1].toCoord) *
94  (value - arrayZ[i-1].fromCoord)) / denom);
95 #undef toCoord
96 #undef fromCoord
97  }
98 
99  int unmap (int value) const { return map (value, 1, 0); }
100 
101  public:
102  DEFINE_SIZE_ARRAY (2, *this);
103 };
104 
105 struct avar
106 {
107  static constexpr hb_tag_t tableTag = HB_OT_TAG_avar;
108 
110  {
111  TRACE_SANITIZE (this);
112  if (unlikely (!(version.sanitize (c) &&
113  version.major == 1 &&
114  c->check_struct (this))))
115  return_trace (false);
116 
118  unsigned int count = axisCount;
119  for (unsigned int i = 0; i < count; i++)
120  {
121  if (unlikely (!map->sanitize (c)))
122  return_trace (false);
123  map = &StructAfter<SegmentMaps> (*map);
124  }
125 
126  return_trace (true);
127  }
128 
129  void map_coords (int *coords, unsigned int coords_length) const
130  {
131  unsigned int count = hb_min (coords_length, axisCount);
132 
134  for (unsigned int i = 0; i < count; i++)
135  {
136  coords[i] = map->map (coords[i]);
137  map = &StructAfter<SegmentMaps> (*map);
138  }
139  }
140 
141  void unmap_coords (int *coords, unsigned int coords_length) const
142  {
143  unsigned int count = hb_min (coords_length, axisCount);
144 
146  for (unsigned int i = 0; i < count; i++)
147  {
148  coords[i] = map->unmap (coords[i]);
149  map = &StructAfter<SegmentMaps> (*map);
150  }
151  }
152 
153  protected:
154  FixedVersion<>version; /* Version of the avar table
155  * initially set to 0x00010000u */
156  HBUINT16 reserved; /* This field is permanently reserved. Set to 0. */
157  HBUINT16 axisCount; /* The number of variation axes in the font. This
158  * must be the same number as axisCount in the
159  * 'fvar' table. */
161 
162  public:
164 };
165 
166 } /* namespace OT */
167 
168 
169 #endif /* HB_OT_VAR_AVAR_TABLE_HH */
small capitals from c petite p scientific i
[1]
Definition: afcover.h:80
#define value
[5]
QMap< QString, QString > map
[6]
#define roundf(x)
Definition: hb-algs.hh:165
#define TRACE_SANITIZE(this)
Definition: hb-debug.hh:414
#define return_trace(RET)
Definition: hb-debug.hh:349
#define toCoord
#define fromCoord
#define HB_OT_TAG_avar
#define unlikely(expr)
Definition: hb.hh:251
EGLOutputLayerEXT EGLint EGLAttrib value
GLsizei const GLubyte GLsizei GLenum const void * coords
GLenum GLenum GLsizei count
const GLubyte * c
Definition: qopenglext.h:12701
GLenum GLsizei len
Definition: qopenglext.h:3292
uint32_t hb_tag_t
Definition: hb-common.h:157
Type arrayZ[HB_VAR_ARRAY]
bool sanitize(hb_sanitize_context_t *c) const
bool sanitize(hb_sanitize_context_t *c) const
int map(int value, unsigned int from_offset=0, unsigned int to_offset=1) const
DEFINE_SIZE_ARRAY(2, *this)
int unmap(int value) const
void map_coords(int *coords, unsigned int coords_length) const
bool sanitize(hb_sanitize_context_t *c) const
static constexpr hb_tag_t tableTag
SegmentMaps firstAxisSegmentMaps
FixedVersion version
void unmap_coords(int *coords, unsigned int coords_length) const
DEFINE_SIZE_MIN(8)