Coverage Report

Created: 2026-03-31 07:07

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/harfbuzz/src/hb-cff-interp-common.hh
Line
Count
Source
1
/*
2
 * Copyright © 2018 Adobe 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
 * Adobe Author(s): Michiharu Ariza
25
 */
26
#ifndef HB_CFF_INTERP_COMMON_HH
27
#define HB_CFF_INTERP_COMMON_HH
28
29
extern HB_INTERNAL const unsigned char *endchar_str;
30
31
namespace CFF {
32
33
using namespace OT;
34
35
typedef unsigned int op_code_t;
36
37
38
/* === Dict operators === */
39
40
/* One byte operators (0-31) */
41
14.2k
#define OpCode_version      0 /* CFF Top */
42
22.3k
#define OpCode_Notice     1 /* CFF Top */
43
30.7k
#define OpCode_FullName     2 /* CFF Top */
44
37.5k
#define OpCode_FamilyName   3 /* CFF Top */
45
43.0k
#define OpCode_Weight     4 /* CFF Top */
46
17.0k
#define OpCode_FontBBox     5 /* CFF Top */
47
30.4k
#define OpCode_BlueValues   6 /* CFF Private, CFF2 Private */
48
39.3k
#define OpCode_OtherBlues   7 /* CFF Private, CFF2 Private */
49
48.4k
#define OpCode_FamilyBlues    8 /* CFF Private, CFF2 Private */
50
54.4k
#define OpCode_FamilyOtherBlues   9 /* CFF Private, CFF2 Private */
51
118k
#define OpCode_StdHW     10 /* CFF Private, CFF2 Private */
52
144k
#define OpCode_StdVW     11 /* CFF Private, CFF2 Private */
53
89.2M
#define OpCode_escape    12 /* All. Shared with CS */
54
7.18k
#define OpCode_UniqueID    13 /* CFF Top */
55
19.8k
#define OpCode_XUID    14 /* CFF Top */
56
10.2k
#define OpCode_charset     15 /* CFF Top (0) */
57
4.55k
#define OpCode_Encoding    16 /* CFF Top (0) */
58
19.0k
#define OpCode_CharStrings   17 /* CFF Top, CFF2 Top */
59
51.8k
#define OpCode_Private     18 /* CFF Top, CFF2 FD */
60
75.8k
#define OpCode_Subrs     19 /* CFF Private, CFF2 Private */
61
152k
#define OpCode_defaultWidthX   20 /* CFF Private (0) */
62
156k
#define OpCode_nominalWidthX   21 /* CFF Private (0) */
63
391
#define OpCode_vsindexdict   22 /* CFF2 Private/CS */
64
5.46k
#define OpCode_blenddict   23 /* CFF2 Private/CS */
65
2.43k
#define OpCode_vstore    24 /* CFF2 Top */
66
#define OpCode_reserved25  25
67
#define OpCode_reserved26  26
68
#define OpCode_reserved27  27
69
70
/* Numbers */
71
378k
#define OpCode_shortint    28 /* 16-bit integer, All */
72
35.6k
#define OpCode_longintdict   29 /* 32-bit integer, All */
73
10.3k
#define OpCode_BCD     30 /* Real number, CFF2 Top/FD */
74
#define OpCode_reserved31  31
75
76
/* 1-byte integers */
77
#define OpCode_OneByteIntFirst   32 /* All. beginning of the range of first byte ints */
78
#define OpCode_OneByteIntLast 246 /* All. ending of the range of first byte int */
79
80
/* 2-byte integers */
81
2.24M
#define OpCode_TwoBytePosInt0 247 /* All. first byte of two byte positive int (+108 to +1131) */
82
684k
#define OpCode_TwoBytePosInt1 248
83
1.65M
#define OpCode_TwoBytePosInt2 249
84
1.77M
#define OpCode_TwoBytePosInt3 250
85
86
1.89M
#define OpCode_TwoByteNegInt0 251 /* All. first byte of two byte negative int (-1131 to -108) */
87
858k
#define OpCode_TwoByteNegInt1 252
88
909k
#define OpCode_TwoByteNegInt2 253
89
1.04M
#define OpCode_TwoByteNegInt3 254
90
91
/* Two byte escape operators 12, (0-41) */
92
2.36M
#define OpCode_ESC_Base   256
93
1.82M
#define Make_OpCode_ESC(byte2)  ((op_code_t)(OpCode_ESC_Base + (byte2)))
94
95
4.41k
inline op_code_t Unmake_OpCode_ESC (op_code_t op)  { return (op_code_t)(op - OpCode_ESC_Base); }
96
535k
inline bool Is_OpCode_ESC (op_code_t op) { return op >= OpCode_ESC_Base; }
97
25.2k
inline unsigned int OpCode_Size (op_code_t op) { return Is_OpCode_ESC (op) ? 2: 1; }
98
99
16.6k
#define OpCode_Copyright  Make_OpCode_ESC(0) /* CFF Top */
100
1.10k
#define OpCode_isFixedPitch Make_OpCode_ESC(1) /* CFF Top (false) */
101
1.87k
#define OpCode_ItalicAngle  Make_OpCode_ESC(2) /* CFF Top (0) */
102
4.59k
#define OpCode_UnderlinePosition Make_OpCode_ESC(3) /* CFF Top (-100) */
103
5.04k
#define OpCode_UnderlineThickness Make_OpCode_ESC(4) /* CFF Top (50) */
104
6.16k
#define OpCode_PaintType  Make_OpCode_ESC(5) /* CFF Top (0) */
105
5.79k
#define OpCode_CharstringType Make_OpCode_ESC(6) /* CFF Top (2) */
106
2.88k
#define OpCode_FontMatrix Make_OpCode_ESC(7) /* CFF Top, CFF2 Top (.001 0 0 .001 0 0)*/
107
7.38k
#define OpCode_StrokeWidth  Make_OpCode_ESC(8) /* CFF Top (0) */
108
146k
#define OpCode_BlueScale  Make_OpCode_ESC(9) /* CFF Private, CFF2 Private (0.039625) */
109
147k
#define OpCode_BlueShift  Make_OpCode_ESC(10) /* CFF Private, CFF2 Private (7) */
110
149k
#define OpCode_BlueFuzz   Make_OpCode_ESC(11) /* CFF Private, CFF2 Private (1) */
111
85.4k
#define OpCode_StemSnapH  Make_OpCode_ESC(12) /* CFF Private, CFF2 Private */
112
105k
#define OpCode_StemSnapV  Make_OpCode_ESC(13) /* CFF Private, CFF2 Private */
113
133k
#define OpCode_ForceBold  Make_OpCode_ESC(14) /* CFF Private (false) */
114
#define OpCode_reservedESC15  Make_OpCode_ESC(15)
115
#define OpCode_reservedESC16  Make_OpCode_ESC(16)
116
154k
#define OpCode_LanguageGroup  Make_OpCode_ESC(17) /* CFF Private, CFF2 Private (0) */
117
155k
#define OpCode_ExpansionFactor  Make_OpCode_ESC(18) /* CFF Private, CFF2 Private (0.06) */
118
129k
#define OpCode_initialRandomSeed Make_OpCode_ESC(19) /* CFF Private (0) */
119
7.53k
#define OpCode_SyntheticBase  Make_OpCode_ESC(20) /* CFF Top */
120
37.0k
#define OpCode_PostScript Make_OpCode_ESC(21) /* CFF Top */
121
37.4k
#define OpCode_BaseFontName Make_OpCode_ESC(22) /* CFF Top */
122
20.2k
#define OpCode_BaseFontBlend  Make_OpCode_ESC(23) /* CFF Top */
123
#define OpCode_reservedESC24  Make_OpCode_ESC(24)
124
#define OpCode_reservedESC25  Make_OpCode_ESC(25)
125
#define OpCode_reservedESC26  Make_OpCode_ESC(26)
126
#define OpCode_reservedESC27  Make_OpCode_ESC(27)
127
#define OpCode_reservedESC28  Make_OpCode_ESC(28)
128
#define OpCode_reservedESC29  Make_OpCode_ESC(29)
129
2.11k
#define OpCode_ROS    Make_OpCode_ESC(30) /* CFF Top_CID */
130
9.01k
#define OpCode_CIDFontVersion Make_OpCode_ESC(31) /* CFF Top_CID (0) */
131
9.19k
#define OpCode_CIDFontRevision  Make_OpCode_ESC(32) /* CFF Top_CID (0) */
132
9.36k
#define OpCode_CIDFontType  Make_OpCode_ESC(33) /* CFF Top_CID (0) */
133
1.40k
#define OpCode_CIDCount   Make_OpCode_ESC(34) /* CFF Top_CID (8720) */
134
9.42k
#define OpCode_UIDBase    Make_OpCode_ESC(35) /* CFF Top_CID */
135
8.71k
#define OpCode_FDArray    Make_OpCode_ESC(36) /* CFF Top_CID, CFF2 Top */
136
3.55k
#define OpCode_FDSelect   Make_OpCode_ESC(37) /* CFF Top_CID, CFF2 Top */
137
47.6k
#define OpCode_FontName   Make_OpCode_ESC(38) /* CFF Top_CID */
138
139
140
/* === CharString operators === */
141
142
390k
#define OpCode_hstem      1 /* CFF, CFF2 */
143
#define OpCode_Reserved2    2
144
400k
#define OpCode_vstem      3 /* CFF, CFF2 */
145
820k
#define OpCode_vmoveto      4 /* CFF, CFF2 */
146
565k
#define OpCode_rlineto      5 /* CFF, CFF2 */
147
671k
#define OpCode_hlineto      6 /* CFF, CFF2 */
148
146k
#define OpCode_vlineto      7 /* CFF, CFF2 */
149
467k
#define OpCode_rrcurveto    8 /* CFF, CFF2 */
150
#define OpCode_Reserved9    9
151
1.44M
#define OpCode_callsubr    10 /* CFF, CFF2 */
152
9.14M
#define OpCode_return    11 /* CFF */
153
//#define OpCode_escape    12 /* CFF, CFF2 */
154
#define OpCode_Reserved13  13
155
138k
#define OpCode_endchar     14 /* CFF */
156
16.6k
#define OpCode_vsindexcs   15 /* CFF2 */
157
68.1k
#define OpCode_blendcs     16 /* CFF2 */
158
#define OpCode_Reserved17  17
159
570k
#define OpCode_hstemhm     18 /* CFF, CFF2 */
160
4.28M
#define OpCode_hintmask    19 /* CFF, CFF2 */
161
4.43M
#define OpCode_cntrmask    20 /* CFF, CFF2 */
162
292k
#define OpCode_rmoveto     21 /* CFF, CFF2 */
163
66.5k
#define OpCode_hmoveto     22 /* CFF, CFF2 */
164
535k
#define OpCode_vstemhm     23 /* CFF, CFF2 */
165
114k
#define OpCode_rcurveline  24 /* CFF, CFF2 */
166
89.0k
#define OpCode_rlinecurve  25 /* CFF, CFF2 */
167
128k
#define OpCode_vvcurveto   26 /* CFF, CFF2 */
168
310k
#define OpCode_hhcurveto   27 /* CFF, CFF2 */
169
//#define OpCode_shortint  28 /* CFF, CFF2 */
170
9.50M
#define OpCode_callgsubr   29 /* CFF, CFF2 */
171
294k
#define OpCode_vhcurveto   30 /* CFF, CFF2 */
172
837k
#define OpCode_hvcurveto   31 /* CFF, CFF2 */
173
174
1.16M
#define OpCode_fixedcs    255 /* 32-bit fixed */
175
176
/* Two byte escape operators 12, (0-41) */
177
23.4k
#define OpCode_dotsection Make_OpCode_ESC(0) /* CFF (obsoleted) */
178
#define OpCode_ReservedESC1 Make_OpCode_ESC(1)
179
#define OpCode_ReservedESC2 Make_OpCode_ESC(2)
180
#define OpCode_and    Make_OpCode_ESC(3) /* CFF */
181
#define OpCode_or   Make_OpCode_ESC(4) /* CFF */
182
#define OpCode_not    Make_OpCode_ESC(5) /* CFF */
183
#define OpCode_ReservedESC6 Make_OpCode_ESC(6)
184
#define OpCode_ReservedESC7 Make_OpCode_ESC(7)
185
#define OpCode_ReservedESC8 Make_OpCode_ESC(8)
186
#define OpCode_abs    Make_OpCode_ESC(9) /* CFF */
187
#define OpCode_add    Make_OpCode_ESC(10) /* CFF */
188
#define OpCode_sub    Make_OpCode_ESC(11) /* CFF */
189
#define OpCode_div    Make_OpCode_ESC(12) /* CFF */
190
#define OpCode_ReservedESC13  Make_OpCode_ESC(13)
191
#define OpCode_neg    Make_OpCode_ESC(14) /* CFF */
192
#define OpCode_eq   Make_OpCode_ESC(15) /* CFF */
193
#define OpCode_ReservedESC16  Make_OpCode_ESC(16)
194
#define OpCode_ReservedESC17  Make_OpCode_ESC(17)
195
#define OpCode_drop   Make_OpCode_ESC(18) /* CFF */
196
#define OpCode_ReservedESC19  Make_OpCode_ESC(19)
197
#define OpCode_put    Make_OpCode_ESC(20) /* CFF */
198
#define OpCode_get    Make_OpCode_ESC(21) /* CFF */
199
#define OpCode_ifelse   Make_OpCode_ESC(22) /* CFF */
200
#define OpCode_random   Make_OpCode_ESC(23) /* CFF */
201
#define OpCode_mul    Make_OpCode_ESC(24) /* CFF */
202
//#define OpCode_reservedESC25  Make_OpCode_ESC(25)
203
#define OpCode_sqrt   Make_OpCode_ESC(26) /* CFF */
204
#define OpCode_dup    Make_OpCode_ESC(27) /* CFF */
205
#define OpCode_exch   Make_OpCode_ESC(28) /* CFF */
206
#define OpCode_index    Make_OpCode_ESC(29) /* CFF */
207
#define OpCode_roll   Make_OpCode_ESC(30) /* CFF */
208
#define OpCode_reservedESC31  Make_OpCode_ESC(31)
209
#define OpCode_reservedESC32  Make_OpCode_ESC(32)
210
#define OpCode_reservedESC33  Make_OpCode_ESC(33)
211
2.30k
#define OpCode_hflex    Make_OpCode_ESC(34) /* CFF, CFF2 */
212
4.56k
#define OpCode_flex   Make_OpCode_ESC(35) /* CFF, CFF2 */
213
3.29k
#define OpCode_hflex1   Make_OpCode_ESC(36) /* CFF, CFF2 */
214
3.20k
#define OpCode_flex1    Make_OpCode_ESC(37) /* CFF, CFF2 */
215
216
217
9.53G
#define OpCode_Invalid    0xFFFFu
218
219
220
struct number_t
221
{
222
79.5M
  void set_int (int v)       { value = v; }
223
14.9M
  int to_int () const        { return value; }
224
225
1.07M
  void set_fixed (int32_t v) { value = v / 65536.0; }
226
67.1k
  int32_t to_fixed () const  { return value * 65536.0; }
227
228
33.8M
  void set_real (double v)   { value = v; }
229
140M
  double to_real () const    { return value; }
230
231
  bool in_int_range () const
232
5.02M
  { return ((double) (int16_t) to_int () == value); }
233
234
51.5M
  bool operator >  (const number_t &n) const { return value > n.to_real (); }
235
25.8M
  bool operator <  (const number_t &n) const { return n > *this; }
236
60.0k
  bool operator >= (const number_t &n) const { return !(*this < n); }
237
0
  bool operator <= (const number_t &n) const { return !(*this > n); }
238
239
  const number_t &operator += (const number_t &n)
240
33.6M
  {
241
33.6M
    set_real (to_real () + n.to_real ());
242
243
33.6M
    return *this;
244
33.6M
  }
245
246
  protected:
247
  double value = 0.;
248
};
249
250
/* byte string */
251
struct UnsizedByteStr : UnsizedArrayOf <HBUINT8>
252
{
253
  hb_ubytes_t as_ubytes (unsigned l) const
254
50.1k
  { return hb_ubytes_t ((const unsigned char *) this, l); }
255
256
  // encode 2-byte int (Dict/CharString) or 4-byte int (Dict)
257
  template <typename T, typename V>
258
  static bool serialize_int (hb_serialize_context_t *c, op_code_t intOp, V value)
259
18.4k
  {
260
18.4k
    TRACE_SERIALIZE (this);
261
262
18.4k
    HBUINT8 *p = c->allocate_size<HBUINT8> (1);
263
18.4k
    if (unlikely (!p)) return_trace (false);
264
18.4k
    *p = intOp;
265
266
18.4k
    T *ip = c->allocate_size<T> (T::static_size);
267
18.4k
    if (unlikely (!ip)) return_trace (false);
268
18.4k
    return_trace (c->check_assign (*ip, value, HB_SERIALIZE_ERROR_INT_OVERFLOW));
269
18.4k
  }
bool CFF::UnsizedByteStr::serialize_int<OT::NumType<true, int, 4u>, int>(hb_serialize_context_t*, unsigned int, int)
Line
Count
Source
259
9.20k
  {
260
9.20k
    TRACE_SERIALIZE (this);
261
262
9.20k
    HBUINT8 *p = c->allocate_size<HBUINT8> (1);
263
9.20k
    if (unlikely (!p)) return_trace (false);
264
9.20k
    *p = intOp;
265
266
9.20k
    T *ip = c->allocate_size<T> (T::static_size);
267
9.20k
    if (unlikely (!ip)) return_trace (false);
268
9.20k
    return_trace (c->check_assign (*ip, value, HB_SERIALIZE_ERROR_INT_OVERFLOW));
269
9.20k
  }
bool CFF::UnsizedByteStr::serialize_int<OT::NumType<true, short, 2u>, int>(hb_serialize_context_t*, unsigned int, int)
Line
Count
Source
259
608
  {
260
608
    TRACE_SERIALIZE (this);
261
262
608
    HBUINT8 *p = c->allocate_size<HBUINT8> (1);
263
608
    if (unlikely (!p)) return_trace (false);
264
608
    *p = intOp;
265
266
608
    T *ip = c->allocate_size<T> (T::static_size);
267
608
    if (unlikely (!ip)) return_trace (false);
268
608
    return_trace (c->check_assign (*ip, value, HB_SERIALIZE_ERROR_INT_OVERFLOW));
269
608
  }
bool CFF::UnsizedByteStr::serialize_int<OT::NumType<true, short, 2u>, unsigned int>(hb_serialize_context_t*, unsigned int, unsigned int)
Line
Count
Source
259
8.60k
  {
260
8.60k
    TRACE_SERIALIZE (this);
261
262
8.60k
    HBUINT8 *p = c->allocate_size<HBUINT8> (1);
263
8.60k
    if (unlikely (!p)) return_trace (false);
264
8.60k
    *p = intOp;
265
266
8.60k
    T *ip = c->allocate_size<T> (T::static_size);
267
8.60k
    if (unlikely (!ip)) return_trace (false);
268
8.60k
    return_trace (c->check_assign (*ip, value, HB_SERIALIZE_ERROR_INT_OVERFLOW));
269
8.60k
  }
270
271
  template <typename V>
272
  static bool serialize_int4 (hb_serialize_context_t *c, V value)
273
  { return serialize_int<HBINT32> (c, OpCode_longintdict, value); }
274
275
  template <typename V>
276
  static bool serialize_int2 (hb_serialize_context_t *c, V value)
277
2.96k
  { return serialize_int<HBINT16> (c, OpCode_shortint, value); }
278
279
  /* Defining null_size allows a Null object may be created. Should be safe because:
280
   * A descendent struct Dict uses a Null pointer to indicate a missing table,
281
   * checked before access.
282
   */
283
  DEFINE_SIZE_MIN(0);
284
};
285
286
/* A byte string associated with the current offset and an error condition */
287
struct byte_str_ref_t
288
{
289
  byte_str_ref_t ()
290
2.01M
    : str () {}
291
292
  byte_str_ref_t (const hb_ubytes_t &str_, unsigned int offset_ = 0)
293
4.81M
    : str (str_) { set_offset (offset_); }
294
295
  void reset (const hb_ubytes_t &str_, unsigned int offset_ = 0)
296
257k
  {
297
257k
    str = str_;
298
257k
    set_offset (offset_);
299
257k
  }
300
301
4.86M
  const unsigned char& operator [] (int i) {
302
4.86M
    if (unlikely ((unsigned int) (get_offset () + i) >= str.length))
303
2.96k
    {
304
2.96k
      set_error ();
305
2.96k
      return Null (unsigned char);
306
2.96k
    }
307
4.86M
    return str.arrayZ[get_offset () + i];
308
4.86M
  }
309
310
89.5M
  unsigned char head_unchecked () const { return str.arrayZ[get_offset ()]; }
311
312
  /* Conversion to hb_ubytes_t */
313
0
  operator hb_ubytes_t () const { return str.sub_array (get_offset ()); }
314
315
  hb_ubytes_t sub_array (unsigned int offset_, unsigned int len_) const
316
99.3M
  { return str.sub_array (offset_, len_); }
317
318
  bool avail (unsigned int count=1) const
319
4.90G
  { return get_offset () + count <= str.length; }
320
  void inc (unsigned int count=1)
321
98.1M
  {
322
    /* Automatically puts us in error if count is out-of-range. */
323
98.1M
    set_offset (get_offset () + count);
324
98.1M
  }
325
326
  /* We (ab)use ubytes backwards_length as a cursor (called offset),
327
   * as well as to store error condition. */
328
329
5.29G
  unsigned get_offset () const { return str.backwards_length; }
330
103M
  void set_offset (unsigned offset) { str.backwards_length = offset; }
331
332
114k
  void set_error ()      { str.backwards_length = str.length + 1; }
333
4.82G
  bool in_error () const { return str.backwards_length > str.length; }
334
335
27.1k
  unsigned total_size () const { return str.length; }
336
337
  protected:
338
  hb_ubytes_t       str;
339
};
340
341
/* stack */
342
template <typename ELEM, int LIMIT>
343
struct cff_stack_t
344
{
345
  ELEM& operator [] (unsigned int i)
346
37.7M
  {
347
37.7M
    if (unlikely (i >= length))
348
0
    {
349
0
      set_error ();
350
0
      return Crap (ELEM);
351
0
    }
352
37.7M
    return arrayZ[i];
353
37.7M
  }
CFF::cff_stack_t<CFF::number_t, 513>::operator[](unsigned int)
Line
Count
Source
346
32.7M
  {
347
32.7M
    if (unlikely (i >= length))
348
0
    {
349
0
      set_error ();
350
0
      return Crap (ELEM);
351
0
    }
352
32.7M
    return arrayZ[i];
353
32.7M
  }
CFF::cff_stack_t<CFF::call_context_t, 10>::operator[](unsigned int)
Line
Count
Source
346
474
  {
347
474
    if (unlikely (i >= length))
348
0
    {
349
0
      set_error ();
350
0
      return Crap (ELEM);
351
0
    }
352
474
    return arrayZ[i];
353
474
  }
CFF::cff_stack_t<CFF::blend_arg_t, 513>::operator[](unsigned int)
Line
Count
Source
346
4.97M
  {
347
4.97M
    if (unlikely (i >= length))
348
0
    {
349
0
      set_error ();
350
0
      return Crap (ELEM);
351
0
    }
352
4.97M
    return arrayZ[i];
353
4.97M
  }
354
355
  void push (const ELEM &v)
356
4.65M
  {
357
4.65M
    if (likely (length < LIMIT))
358
4.65M
      arrayZ[length++] = v;
359
0
    else
360
0
      set_error ();
361
4.65M
  }
362
  ELEM &push ()
363
69.9M
  {
364
69.9M
    if (likely (length < LIMIT))
365
69.9M
      return arrayZ[length++];
366
423
    else
367
423
    {
368
423
      set_error ();
369
423
      return Crap (ELEM);
370
423
    }
371
69.9M
  }
CFF::cff_stack_t<CFF::number_t, 513>::push()
Line
Count
Source
363
55.3M
  {
364
55.3M
    if (likely (length < LIMIT))
365
55.3M
      return arrayZ[length++];
366
417
    else
367
417
    {
368
417
      set_error ();
369
417
      return Crap (ELEM);
370
417
    }
371
55.3M
  }
CFF::cff_stack_t<CFF::blend_arg_t, 513>::push()
Line
Count
Source
363
14.6M
  {
364
14.6M
    if (likely (length < LIMIT))
365
14.6M
      return arrayZ[length++];
366
6
    else
367
6
    {
368
6
      set_error ();
369
6
      return Crap (ELEM);
370
6
    }
371
14.6M
  }
372
373
  ELEM& pop ()
374
10.5M
  {
375
10.5M
    if (likely (length > 0))
376
10.4M
      return arrayZ[--length];
377
22.6k
    else
378
22.6k
    {
379
22.6k
      set_error ();
380
22.6k
      return Crap (ELEM);
381
22.6k
    }
382
10.5M
  }
CFF::cff_stack_t<CFF::number_t, 513>::pop()
Line
Count
Source
374
5.55M
  {
375
5.55M
    if (likely (length > 0))
376
5.53M
      return arrayZ[--length];
377
19.2k
    else
378
19.2k
    {
379
19.2k
      set_error ();
380
19.2k
      return Crap (ELEM);
381
19.2k
    }
382
5.55M
  }
CFF::cff_stack_t<CFF::call_context_t, 10>::pop()
Line
Count
Source
374
4.58M
  {
375
4.58M
    if (likely (length > 0))
376
4.57M
      return arrayZ[--length];
377
3.34k
    else
378
3.34k
    {
379
3.34k
      set_error ();
380
3.34k
      return Crap (ELEM);
381
3.34k
    }
382
4.58M
  }
CFF::cff_stack_t<CFF::blend_arg_t, 513>::pop()
Line
Count
Source
374
371k
  {
375
371k
    if (likely (length > 0))
376
371k
      return arrayZ[--length];
377
104
    else
378
104
    {
379
104
      set_error ();
380
104
      return Crap (ELEM);
381
104
    }
382
371k
  }
383
  void pop (unsigned int n)
384
4.73G
  {
385
4.73G
    if (likely (length >= n))
386
4.73G
      length -= n;
387
0
    else
388
0
      set_error ();
389
4.73G
  }
CFF::cff_stack_t<CFF::number_t, 513>::pop(unsigned int)
Line
Count
Source
384
4.73G
  {
385
4.73G
    if (likely (length >= n))
386
4.73G
      length -= n;
387
0
    else
388
0
      set_error ();
389
4.73G
  }
CFF::cff_stack_t<CFF::blend_arg_t, 513>::pop(unsigned int)
Line
Count
Source
384
1.64M
  {
385
1.64M
    if (likely (length >= n))
386
1.64M
      length -= n;
387
0
    else
388
0
      set_error ();
389
1.64M
  }
390
391
  const ELEM& peek ()
392
  {
393
    if (unlikely (length == 0))
394
    {
395
      set_error ();
396
      return Null (ELEM);
397
    }
398
    return arrayZ[length - 1];
399
  }
400
401
  void unpop ()
402
  {
403
    if (likely (length < LIMIT))
404
      length++;
405
    else
406
      set_error ();
407
  }
408
409
  void clear () { length = 0; }
410
411
9.63G
  bool in_error () const { return (error); }
CFF::cff_stack_t<CFF::number_t, 513>::in_error() const
Line
Count
Source
411
4.80G
  bool in_error () const { return (error); }
CFF::cff_stack_t<CFF::call_context_t, 10>::in_error() const
Line
Count
Source
411
4.81G
  bool in_error () const { return (error); }
CFF::cff_stack_t<CFF::blend_arg_t, 513>::in_error() const
Line
Count
Source
411
16.9M
  bool in_error () const { return (error); }
412
24.8k
  void set_error ()      { error = true; }
CFF::cff_stack_t<CFF::number_t, 513>::set_error()
Line
Count
Source
412
21.3k
  void set_error ()      { error = true; }
CFF::cff_stack_t<CFF::call_context_t, 10>::set_error()
Line
Count
Source
412
3.34k
  void set_error ()      { error = true; }
CFF::cff_stack_t<CFF::blend_arg_t, 513>::set_error()
Line
Count
Source
412
165
  void set_error ()      { error = true; }
413
414
4.76G
  unsigned int get_count () const { return length; }
CFF::cff_stack_t<CFF::number_t, 513>::get_count() const
Line
Count
Source
414
4.74G
  unsigned int get_count () const { return length; }
CFF::cff_stack_t<CFF::call_context_t, 10>::get_count() const
Line
Count
Source
414
4.66M
  unsigned int get_count () const { return length; }
CFF::cff_stack_t<CFF::blend_arg_t, 513>::get_count() const
Line
Count
Source
414
7.32M
  unsigned int get_count () const { return length; }
415
6.22M
  bool is_empty () const          { return !length; }
CFF::cff_stack_t<CFF::number_t, 513>::is_empty() const
Line
Count
Source
415
1.66M
  bool is_empty () const          { return !length; }
CFF::cff_stack_t<CFF::call_context_t, 10>::is_empty() const
Line
Count
Source
415
4.55M
  bool is_empty () const          { return !length; }
416
417
  hb_array_t<const ELEM> sub_array (unsigned start, unsigned length) const
418
234k
  { return hb_array_t<const ELEM> (arrayZ).sub_array (start, length); }
CFF::cff_stack_t<CFF::number_t, 513>::sub_array(unsigned int, unsigned int) const
Line
Count
Source
418
189k
  { return hb_array_t<const ELEM> (arrayZ).sub_array (start, length); }
CFF::cff_stack_t<CFF::blend_arg_t, 513>::sub_array(unsigned int, unsigned int) const
Line
Count
Source
418
45.2k
  { return hb_array_t<const ELEM> (arrayZ).sub_array (start, length); }
419
420
  bool error = false;
421
  unsigned int length = 0;
422
  ELEM arrayZ[LIMIT];
423
};
424
425
/* argument stack */
426
template <typename ARG=number_t>
427
struct arg_stack_t : cff_stack_t<ARG, 513>
428
{
429
  void push_int (int v)
430
68.8M
  {
431
68.8M
    ARG &n = S::push ();
432
68.8M
    n.set_int (v);
433
68.8M
  }
CFF::arg_stack_t<CFF::number_t>::push_int(int)
Line
Count
Source
430
54.3M
  {
431
54.3M
    ARG &n = S::push ();
432
54.3M
    n.set_int (v);
433
54.3M
  }
CFF::arg_stack_t<CFF::blend_arg_t>::push_int(int)
Line
Count
Source
430
14.4M
  {
431
14.4M
    ARG &n = S::push ();
432
14.4M
    n.set_int (v);
433
14.4M
  }
434
435
  void push_fixed (int32_t v)
436
1.07M
  {
437
1.07M
    ARG &n = S::push ();
438
1.07M
    n.set_fixed (v);
439
1.07M
  }
CFF::arg_stack_t<CFF::number_t>::push_fixed(int)
Line
Count
Source
436
895k
  {
437
895k
    ARG &n = S::push ();
438
895k
    n.set_fixed (v);
439
895k
  }
CFF::arg_stack_t<CFF::blend_arg_t>::push_fixed(int)
Line
Count
Source
436
184k
  {
437
184k
    ARG &n = S::push ();
438
184k
    n.set_fixed (v);
439
184k
  }
440
441
  void push_real (double v)
442
10.3k
  {
443
10.3k
    ARG &n = S::push ();
444
10.3k
    n.set_real (v);
445
10.3k
  }
446
447
  ARG& pop_num () { return this->pop (); }
448
449
4.91M
  int pop_int ()  { return this->pop ().to_int (); }
CFF::arg_stack_t<CFF::number_t>::pop_int()
Line
Count
Source
449
4.54M
  int pop_int ()  { return this->pop ().to_int (); }
CFF::arg_stack_t<CFF::blend_arg_t>::pop_int()
Line
Count
Source
449
371k
  int pop_int ()  { return this->pop ().to_int (); }
450
451
  unsigned int pop_uint ()
452
186k
  {
453
186k
    int i = pop_int ();
454
186k
    if (unlikely (i < 0))
455
1.71k
    {
456
1.71k
      i = 0;
457
1.71k
      S::set_error ();
458
1.71k
    }
459
186k
    return (unsigned) i;
460
186k
  }
CFF::arg_stack_t<CFF::number_t>::pop_uint()
Line
Count
Source
452
171k
  {
453
171k
    int i = pop_int ();
454
171k
    if (unlikely (i < 0))
455
1.65k
    {
456
1.65k
      i = 0;
457
1.65k
      S::set_error ();
458
1.65k
    }
459
171k
    return (unsigned) i;
460
171k
  }
CFF::arg_stack_t<CFF::blend_arg_t>::pop_uint()
Line
Count
Source
452
14.7k
  {
453
14.7k
    int i = pop_int ();
454
14.7k
    if (unlikely (i < 0))
455
55
    {
456
55
      i = 0;
457
55
      S::set_error ();
458
55
    }
459
14.7k
    return (unsigned) i;
460
14.7k
  }
461
462
  void push_longint_from_substr (byte_str_ref_t& str_ref)
463
35.6k
  {
464
35.6k
    push_int ((str_ref[0] << 24) | (str_ref[1] << 16) | (str_ref[2] << 8) | (str_ref[3]));
465
35.6k
    str_ref.inc (4);
466
35.6k
  }
467
468
  bool push_fixed_from_substr (byte_str_ref_t& str_ref)
469
1.09M
  {
470
1.09M
    if (unlikely (!str_ref.avail (4)))
471
13.5k
      return false;
472
1.07M
    push_fixed ((int32_t)*(const HBUINT32*)&str_ref[0]);
473
1.07M
    str_ref.inc (4);
474
1.07M
    return true;
475
1.09M
  }
CFF::arg_stack_t<CFF::number_t>::push_fixed_from_substr(CFF::byte_str_ref_t&)
Line
Count
Source
469
907k
  {
470
907k
    if (unlikely (!str_ref.avail (4)))
471
12.4k
      return false;
472
895k
    push_fixed ((int32_t)*(const HBUINT32*)&str_ref[0]);
473
895k
    str_ref.inc (4);
474
895k
    return true;
475
907k
  }
CFF::arg_stack_t<CFF::blend_arg_t>::push_fixed_from_substr(CFF::byte_str_ref_t&)
Line
Count
Source
469
185k
  {
470
185k
    if (unlikely (!str_ref.avail (4)))
471
1.01k
      return false;
472
184k
    push_fixed ((int32_t)*(const HBUINT32*)&str_ref[0]);
473
184k
    str_ref.inc (4);
474
184k
    return true;
475
185k
  }
476
477
  private:
478
  typedef cff_stack_t<ARG, 513> S;
479
};
480
481
/* an operator prefixed by its operands in a byte string */
482
struct op_str_t
483
{
484
  /* This used to have a hb_ubytes_t. Using a pointer and length
485
   * in a particular order, saves 8 bytes in this struct and more
486
   * in our parsed_cs_op_t subclass. */
487
488
  const unsigned char *ptr = nullptr;
489
490
  op_code_t  op = OpCode_Invalid;
491
492
  uint8_t length = 0;
493
};
494
495
/* base of OP_SERIALIZER */
496
struct op_serializer_t
497
{
498
  protected:
499
  bool copy_opstr (hb_serialize_context_t *c, const op_str_t& opstr) const
500
67.8k
  {
501
67.8k
    TRACE_SERIALIZE (this);
502
503
67.8k
    unsigned char *d = c->allocate_size<unsigned char> (opstr.length);
504
67.8k
    if (unlikely (!d)) return_trace (false);
505
    /* Faster than hb_memcpy for small strings. */
506
237k
    for (unsigned i = 0; i < opstr.length; i++)
507
169k
      d[i] = opstr.ptr[i];
508
67.8k
    return_trace (true);
509
67.8k
  }
510
};
511
512
template <typename VAL>
513
struct parsed_values_t
514
{
515
  void init ()
516
1.08M
  {
517
1.08M
    opStart = 0;
518
1.08M
    values.init ();
519
1.08M
  }
CFF::parsed_values_t<CFF::cff1_top_dict_val_t>::init()
Line
Count
Source
516
100k
  {
517
100k
    opStart = 0;
518
100k
    values.init ();
519
100k
  }
CFF::parsed_values_t<CFF::op_str_t>::init()
Line
Count
Source
516
231k
  {
517
231k
    opStart = 0;
518
231k
    values.init ();
519
231k
  }
CFF::parsed_values_t<CFF::dict_val_t>::init()
Line
Count
Source
516
77.8k
  {
517
77.8k
    opStart = 0;
518
77.8k
    values.init ();
519
77.8k
  }
CFF::parsed_values_t<CFF::parsed_cs_op_t>::init()
Line
Count
Source
516
678k
  {
517
678k
    opStart = 0;
518
678k
    values.init ();
519
678k
  }
520
255k
  void fini () { values.fini (); }
CFF::parsed_values_t<CFF::cff1_top_dict_val_t>::fini()
Line
Count
Source
520
165k
  void fini () { values.fini (); }
CFF::parsed_values_t<CFF::op_str_t>::fini()
Line
Count
Source
520
89.5k
  void fini () { values.fini (); }
521
522
  void alloc (unsigned n)
523
35.7k
  {
524
35.7k
    values.alloc_exact (n);
525
35.7k
  }
526
527
  void add_op (op_code_t op, const byte_str_ref_t& str_ref = byte_str_ref_t (), const VAL &v = VAL ())
528
99.3M
  {
529
99.3M
    VAL *val = values.push (v);
530
99.3M
    val->op = op;
531
99.3M
    auto arr = str_ref.sub_array (opStart, str_ref.get_offset () - opStart);
532
99.3M
    val->ptr = arr.arrayZ;
533
99.3M
    val->length = arr.length;
534
99.3M
    opStart = str_ref.get_offset ();
535
99.3M
  }
CFF::parsed_values_t<CFF::cff1_top_dict_val_t>::add_op(unsigned int, CFF::byte_str_ref_t const&, CFF::cff1_top_dict_val_t const&)
Line
Count
Source
528
120k
  {
529
120k
    VAL *val = values.push (v);
530
120k
    val->op = op;
531
120k
    auto arr = str_ref.sub_array (opStart, str_ref.get_offset () - opStart);
532
120k
    val->ptr = arr.arrayZ;
533
120k
    val->length = arr.length;
534
120k
    opStart = str_ref.get_offset ();
535
120k
  }
CFF::parsed_values_t<CFF::op_str_t>::add_op(unsigned int, CFF::byte_str_ref_t const&, CFF::op_str_t const&)
Line
Count
Source
528
606k
  {
529
606k
    VAL *val = values.push (v);
530
606k
    val->op = op;
531
606k
    auto arr = str_ref.sub_array (opStart, str_ref.get_offset () - opStart);
532
606k
    val->ptr = arr.arrayZ;
533
606k
    val->length = arr.length;
534
606k
    opStart = str_ref.get_offset ();
535
606k
  }
CFF::parsed_values_t<CFF::dict_val_t>::add_op(unsigned int, CFF::byte_str_ref_t const&, CFF::dict_val_t const&)
Line
Count
Source
528
115k
  {
529
115k
    VAL *val = values.push (v);
530
115k
    val->op = op;
531
115k
    auto arr = str_ref.sub_array (opStart, str_ref.get_offset () - opStart);
532
115k
    val->ptr = arr.arrayZ;
533
115k
    val->length = arr.length;
534
115k
    opStart = str_ref.get_offset ();
535
115k
  }
CFF::parsed_values_t<CFF::parsed_cs_op_t>::add_op(unsigned int, CFF::byte_str_ref_t const&, CFF::parsed_cs_op_t const&)
Line
Count
Source
528
98.5M
  {
529
98.5M
    VAL *val = values.push (v);
530
98.5M
    val->op = op;
531
98.5M
    auto arr = str_ref.sub_array (opStart, str_ref.get_offset () - opStart);
532
98.5M
    val->ptr = arr.arrayZ;
533
98.5M
    val->length = arr.length;
534
98.5M
    opStart = str_ref.get_offset ();
535
98.5M
  }
536
537
  bool has_op (op_code_t op) const
538
2.21k
  {
539
2.21k
    for (const auto& v : values)
540
16.9k
      if (v.op == op) return true;
541
239
    return false;
542
2.21k
  }
543
544
144k
  unsigned get_count () const { return values.length; }
CFF::parsed_values_t<CFF::op_str_t>::get_count() const
Line
Count
Source
544
98.1k
  unsigned get_count () const { return values.length; }
CFF::parsed_values_t<CFF::cff1_top_dict_val_t>::get_count() const
Line
Count
Source
544
46.4k
  unsigned get_count () const { return values.length; }
545
106k
  const VAL &operator [] (unsigned int i) const { return values[i]; }
CFF::parsed_values_t<CFF::op_str_t>::operator[](unsigned int) const
Line
Count
Source
545
92.2k
  const VAL &operator [] (unsigned int i) const { return values[i]; }
CFF::parsed_values_t<CFF::cff1_top_dict_val_t>::operator[](unsigned int) const
Line
Count
Source
545
14.2k
  const VAL &operator [] (unsigned int i) const { return values[i]; }
546
547
  unsigned int       opStart;
548
  hb_vector_t<VAL>   values;
549
};
550
551
template <typename ARG=number_t>
552
struct interp_env_t
553
{
554
  interp_env_t () {}
555
  interp_env_t (const hb_ubytes_t &str_)
556
257k
  {
557
257k
    str_ref.reset (str_);
558
257k
  }
CFF::interp_env_t<CFF::number_t>::interp_env_t(hb_array_t<unsigned char const> const&)
Line
Count
Source
556
254k
  {
557
254k
    str_ref.reset (str_);
558
254k
  }
CFF::interp_env_t<CFF::blend_arg_t>::interp_env_t(hb_array_t<unsigned char const> const&)
Line
Count
Source
556
3.25k
  {
557
3.25k
    str_ref.reset (str_);
558
3.25k
  }
559
  bool in_error () const
560
4.81G
  { return str_ref.in_error () || argStack.in_error (); }
CFF::interp_env_t<CFF::number_t>::in_error() const
Line
Count
Source
560
4.80G
  { return str_ref.in_error () || argStack.in_error (); }
CFF::interp_env_t<CFF::blend_arg_t>::in_error() const
Line
Count
Source
560
16.9M
  { return str_ref.in_error () || argStack.in_error (); }
561
562
111k
  void set_error () { str_ref.set_error (); }
CFF::interp_env_t<CFF::number_t>::set_error()
Line
Count
Source
562
110k
  void set_error () { str_ref.set_error (); }
CFF::interp_env_t<CFF::blend_arg_t>::set_error()
Line
Count
Source
562
1.02k
  void set_error () { str_ref.set_error (); }
563
564
  op_code_t fetch_op ()
565
4.81G
  {
566
4.81G
    op_code_t  op = OpCode_Invalid;
567
4.81G
    if (unlikely (!str_ref.avail ()))
568
4.72G
      return OpCode_Invalid;
569
89.2M
    op = (op_code_t) str_ref.head_unchecked ();
570
89.2M
    str_ref.inc ();
571
89.2M
    if (op == OpCode_escape) {
572
325k
      if (unlikely (!str_ref.avail ()))
573
3.17k
  return OpCode_Invalid;
574
322k
      op = Make_OpCode_ESC (str_ref.head_unchecked ());
575
322k
      str_ref.inc ();
576
322k
    }
577
89.2M
    return op;
578
89.2M
  }
CFF::interp_env_t<CFF::number_t>::fetch_op()
Line
Count
Source
565
4.79G
  {
566
4.79G
    op_code_t  op = OpCode_Invalid;
567
4.79G
    if (unlikely (!str_ref.avail ()))
568
4.72G
      return OpCode_Invalid;
569
72.6M
    op = (op_code_t) str_ref.head_unchecked ();
570
72.6M
    str_ref.inc ();
571
72.6M
    if (op == OpCode_escape) {
572
175k
      if (unlikely (!str_ref.avail ()))
573
3.14k
  return OpCode_Invalid;
574
172k
      op = Make_OpCode_ESC (str_ref.head_unchecked ());
575
172k
      str_ref.inc ();
576
172k
    }
577
72.6M
    return op;
578
72.6M
  }
CFF::interp_env_t<CFF::blend_arg_t>::fetch_op()
Line
Count
Source
565
16.6M
  {
566
16.6M
    op_code_t  op = OpCode_Invalid;
567
16.6M
    if (unlikely (!str_ref.avail ()))
568
0
      return OpCode_Invalid;
569
16.6M
    op = (op_code_t) str_ref.head_unchecked ();
570
16.6M
    str_ref.inc ();
571
16.6M
    if (op == OpCode_escape) {
572
150k
      if (unlikely (!str_ref.avail ()))
573
35
  return OpCode_Invalid;
574
150k
      op = Make_OpCode_ESC (str_ref.head_unchecked ());
575
150k
      str_ref.inc ();
576
150k
    }
577
16.6M
    return op;
578
16.6M
  }
579
580
6.11M
  const ARG& eval_arg (unsigned int i) { return argStack[i]; }
581
582
190k
  ARG& pop_arg () { return argStack.pop (); }
583
4.73G
  void pop_n_args (unsigned int n) { argStack.pop (n); }
CFF::interp_env_t<CFF::number_t>::pop_n_args(unsigned int)
Line
Count
Source
583
4.73G
  void pop_n_args (unsigned int n) { argStack.pop (n); }
CFF::interp_env_t<CFF::blend_arg_t>::pop_n_args(unsigned int)
Line
Count
Source
583
1.63M
  void pop_n_args (unsigned int n) { argStack.pop (n); }
584
585
4.72G
  void clear_args () { pop_n_args (argStack.get_count ()); }
CFF::interp_env_t<CFF::number_t>::clear_args()
Line
Count
Source
585
4.72G
  void clear_args () { pop_n_args (argStack.get_count ()); }
CFF::interp_env_t<CFF::blend_arg_t>::clear_args()
Line
Count
Source
585
748k
  void clear_args () { pop_n_args (argStack.get_count ()); }
586
587
  byte_str_ref_t
588
    str_ref;
589
  arg_stack_t<ARG>
590
    argStack;
591
};
592
593
using num_interp_env_t =  interp_env_t<>;
594
595
template <typename ARG=number_t>
596
struct opset_t
597
{
598
  static void process_op (op_code_t op, interp_env_t<ARG>& env)
599
4.79G
  {
600
4.79G
    switch (op) {
601
358k
      case OpCode_shortint:
602
358k
  env.argStack.push_int ((int16_t)((env.str_ref[0] << 8) | env.str_ref[1]));
603
358k
  env.str_ref.inc (2);
604
358k
  break;
605
606
684k
      case OpCode_TwoBytePosInt0: case OpCode_TwoBytePosInt1:
607
1.77M
      case OpCode_TwoBytePosInt2: case OpCode_TwoBytePosInt3:
608
1.77M
  env.argStack.push_int ((int16_t)((op - OpCode_TwoBytePosInt0) * 256 + env.str_ref[0] + 108));
609
1.77M
  env.str_ref.inc ();
610
1.77M
  break;
611
612
858k
      case OpCode_TwoByteNegInt0: case OpCode_TwoByteNegInt1:
613
1.04M
      case OpCode_TwoByteNegInt2: case OpCode_TwoByteNegInt3:
614
1.04M
  env.argStack.push_int ((-(int16_t)(op - OpCode_TwoByteNegInt0) * 256 - env.str_ref[0] - 108));
615
1.04M
  env.str_ref.inc ();
616
1.04M
  break;
617
618
4.79G
      default:
619
  /* 1-byte integer */
620
4.79G
  if (likely ((OpCode_OneByteIntFirst <= op) && (op <= OpCode_OneByteIntLast)))
621
65.6M
  {
622
65.6M
    env.argStack.push_int ((int)op - 139);
623
4.72G
  } else {
624
    /* invalid unknown operator */
625
4.72G
    env.clear_args ();
626
4.72G
  }
627
4.79G
  break;
628
4.79G
    }
629
4.79G
  }
CFF::opset_t<CFF::number_t>::process_op(unsigned int, CFF::interp_env_t<CFF::number_t>&)
Line
Count
Source
599
4.78G
  {
600
4.78G
    switch (op) {
601
344k
      case OpCode_shortint:
602
344k
  env.argStack.push_int ((int16_t)((env.str_ref[0] << 8) | env.str_ref[1]));
603
344k
  env.str_ref.inc (2);
604
344k
  break;
605
606
609k
      case OpCode_TwoBytePosInt0: case OpCode_TwoBytePosInt1:
607
1.38M
      case OpCode_TwoBytePosInt2: case OpCode_TwoBytePosInt3:
608
1.38M
  env.argStack.push_int ((int16_t)((op - OpCode_TwoBytePosInt0) * 256 + env.str_ref[0] + 108));
609
1.38M
  env.str_ref.inc ();
610
1.38M
  break;
611
612
747k
      case OpCode_TwoByteNegInt0: case OpCode_TwoByteNegInt1:
613
831k
      case OpCode_TwoByteNegInt2: case OpCode_TwoByteNegInt3:
614
831k
  env.argStack.push_int ((-(int16_t)(op - OpCode_TwoByteNegInt0) * 256 - env.str_ref[0] - 108));
615
831k
  env.str_ref.inc ();
616
831k
  break;
617
618
4.77G
      default:
619
  /* 1-byte integer */
620
4.77G
  if (likely ((OpCode_OneByteIntFirst <= op) && (op <= OpCode_OneByteIntLast)))
621
51.7M
  {
622
51.7M
    env.argStack.push_int ((int)op - 139);
623
4.72G
  } else {
624
    /* invalid unknown operator */
625
4.72G
    env.clear_args ();
626
4.72G
  }
627
4.77G
  break;
628
4.78G
    }
629
4.78G
  }
CFF::opset_t<CFF::blend_arg_t>::process_op(unsigned int, CFF::interp_env_t<CFF::blend_arg_t>&)
Line
Count
Source
599
15.0M
  {
600
15.0M
    switch (op) {
601
13.8k
      case OpCode_shortint:
602
13.8k
  env.argStack.push_int ((int16_t)((env.str_ref[0] << 8) | env.str_ref[1]));
603
13.8k
  env.str_ref.inc (2);
604
13.8k
  break;
605
606
74.5k
      case OpCode_TwoBytePosInt0: case OpCode_TwoBytePosInt1:
607
383k
      case OpCode_TwoBytePosInt2: case OpCode_TwoBytePosInt3:
608
383k
  env.argStack.push_int ((int16_t)((op - OpCode_TwoBytePosInt0) * 256 + env.str_ref[0] + 108));
609
383k
  env.str_ref.inc ();
610
383k
  break;
611
612
111k
      case OpCode_TwoByteNegInt0: case OpCode_TwoByteNegInt1:
613
217k
      case OpCode_TwoByteNegInt2: case OpCode_TwoByteNegInt3:
614
217k
  env.argStack.push_int ((-(int16_t)(op - OpCode_TwoByteNegInt0) * 256 - env.str_ref[0] - 108));
615
217k
  env.str_ref.inc ();
616
217k
  break;
617
618
14.4M
      default:
619
  /* 1-byte integer */
620
14.4M
  if (likely ((OpCode_OneByteIntFirst <= op) && (op <= OpCode_OneByteIntLast)))
621
13.8M
  {
622
13.8M
    env.argStack.push_int ((int)op - 139);
623
13.8M
  } else {
624
    /* invalid unknown operator */
625
657k
    env.clear_args ();
626
657k
  }
627
14.4M
  break;
628
15.0M
    }
629
15.0M
  }
630
};
631
632
template <typename ENV>
633
struct interpreter_t
634
{
635
257k
  interpreter_t (ENV& env_) : env (env_) {}
CFF::interpreter_t<CFF::interp_env_t<CFF::number_t> >::interpreter_t(CFF::interp_env_t<CFF::number_t>&)
Line
Count
Source
635
78.2k
  interpreter_t (ENV& env_) : env (env_) {}
CFF::interpreter_t<CFF::cff2_priv_dict_interp_env_t>::interpreter_t(CFF::cff2_priv_dict_interp_env_t&)
Line
Count
Source
635
9.25k
  interpreter_t (ENV& env_) : env (env_) {}
CFF::interpreter_t<CFF::cff1_top_dict_interp_env_t>::interpreter_t(CFF::cff1_top_dict_interp_env_t&)
Line
Count
Source
635
10.8k
  interpreter_t (ENV& env_) : env (env_) {}
CFF::interpreter_t<CFF::cff1_cs_interp_env_t>::interpreter_t(CFF::cff1_cs_interp_env_t&)
Line
Count
Source
635
118k
  interpreter_t (ENV& env_) : env (env_) {}
CFF::interpreter_t<CFF::cff2_cs_interp_env_t<CFF::number_t> >::interpreter_t(CFF::cff2_cs_interp_env_t<CFF::number_t>&)
Line
Count
Source
635
38.1k
  interpreter_t (ENV& env_) : env (env_) {}
CFF::interpreter_t<CFF::cff2_cs_interp_env_t<CFF::blend_arg_t> >::interpreter_t(CFF::cff2_cs_interp_env_t<CFF::blend_arg_t>&)
Line
Count
Source
635
3.25k
  interpreter_t (ENV& env_) : env (env_) {}
636
  ENV& env;
637
};
638
639
} /* namespace CFF */
640
641
#endif /* HB_CFF_INTERP_COMMON_HH */