Coverage Report

Created: 2025-06-10 07:27

/src/ghostpdl/pdf/pdf_fontps.c
Line
Count
Source (jump to first uncovered line)
1
/* Copyright (C) 2020-2025 Artifex Software, Inc.
2
   All Rights Reserved.
3
4
   This software is provided AS-IS with no warranty, either express or
5
   implied.
6
7
   This software is distributed under license and may not be copied,
8
   modified or distributed except as expressly authorized under the terms
9
   of the license contained in the file LICENSE in this distribution.
10
11
   Refer to licensing information at http://www.artifex.com or contact
12
   Artifex Software, Inc.,  39 Mesa Street, Suite 108A, San Francisco,
13
   CA 94129, USA, for further information.
14
*/
15
16
/* common code for Postscript-type font handling */
17
#include "scanchar.h"
18
#include "sfilter.h"
19
#include "stream.h"
20
#include "strimpl.h"
21
22
#include "pdf_int.h"
23
#include "pdf_types.h"
24
#include "pdf_array.h"
25
#include "pdf_dict.h"
26
#include "pdf_font.h"
27
#include "pdf_font_types.h"
28
#include "pdf_fontps.h"
29
30
static const char *const notdefnamestr = ".notdef";
31
32
int
33
pdfi_pscript_stack_init(pdf_context *pdfi_ctx, pdf_ps_oper_list_t *ops, void *client_data,
34
                        pdf_ps_ctx_t *s)
35
8.67k
{
36
8.67k
    int i, size = PDF_PS_STACK_SIZE;
37
8.67k
    int initsizebytes = sizeof(pdf_ps_stack_object_t) * PDF_PS_STACK_SIZE;
38
8.67k
    s->pdfi_ctx = pdfi_ctx;
39
8.67k
    s->ops = ops;
40
8.67k
    s->client_data = client_data;
41
42
8.67k
    s->stack = (pdf_ps_stack_object_t *)gs_alloc_bytes(pdfi_ctx->memory, initsizebytes, "pdfi_pscript_stack_init(stack)");
43
8.67k
    if (s->stack == NULL)
44
0
        return_error(gs_error_VMerror);
45
46
8.67k
    s->cur = s->stack + 1;
47
8.67k
    s->toplim = s->cur + size;
48
49
17.3k
    for (i = 0; i < PDF_PS_STACK_GUARDS; i++)
50
8.67k
        s->stack[i].type = PDF_PS_OBJ_STACK_BOTTOM;
51
52
17.3k
    for (i = 0; i < PDF_PS_STACK_GUARDS; i++)
53
8.67k
        s->stack[size - 1 + i].type = PDF_PS_OBJ_STACK_TOP;
54
55
3.12M
    for (i = 0; i < size - 1; i++) {
56
3.11M
        pdf_ps_make_null(&(s->cur[i]));
57
3.11M
    }
58
8.67k
    return 0;
59
8.67k
}
60
61
void
62
pdfi_pscript_stack_finit(pdf_ps_ctx_t *s)
63
8.67k
{
64
8.67k
    int stackdepth;
65
66
8.67k
    if ((stackdepth = pdf_ps_stack_count(s)) > 0) {
67
0
        pdf_ps_stack_pop(s, stackdepth);
68
0
    }
69
8.67k
    gs_free_object(s->pdfi_ctx->memory, s->stack, "pdfi_pscript_stack_finit(stack)");
70
8.67k
}
71
72
int
73
ps_pdf_null_oper_func(gs_memory_t *mem, pdf_ps_ctx_t *stack, byte *buf, byte *bufend)
74
200k
{
75
200k
    return 0;
76
200k
}
77
78
int
79
clear_stack_oper_func(gs_memory_t *mem, pdf_ps_ctx_t *s, byte *buf, byte *bufend)
80
12.3k
{
81
12.3k
    int depth = s->cur - &(s->stack[1]);
82
83
12.3k
    return pdf_ps_stack_pop(s, depth);
84
12.3k
}
85
86
int
87
pdf_ps_pop_oper_func(gs_memory_t *mem, pdf_ps_ctx_t *s, byte *buf, byte *bufend)
88
18.2k
{
89
18.2k
    return pdf_ps_stack_pop(s, 1);
90
18.2k
}
91
92
int
93
pdf_ps_pop_and_pushmark_func(gs_memory_t *mem, pdf_ps_ctx_t *stack, byte *buf, byte *bufend)
94
18.2k
{
95
18.2k
    int code = pdf_ps_stack_pop(stack, 1);
96
97
18.2k
    if (code >= 0)
98
18.2k
        code = pdf_ps_stack_push_mark(stack);
99
18.2k
    return code;
100
18.2k
}
101
102
static inline int
103
pdf_ps_is_whitespace(int c)
104
41.0M
{
105
41.0M
    return (c == 0x20) || (c == 0x9) || (c == 0xD) || (c == 0xA);
106
41.0M
}
107
108
static inline int
109
pdf_ps_end_object(int c)
110
41.0M
{
111
41.0M
    return pdf_ps_is_whitespace(c) || (c == '/') || (c == '[') || (c == ']') || c == '{' || c == '}' || (c == '(') || (c == '<');
112
41.0M
}
113
114
static inline int
115
pdf_ps_end_number_object(int c)
116
14.6M
{
117
14.6M
    return (c != '.' && c != 'e' && c != '-' && (c < '0' || c > '9'));
118
14.6M
}
119
120
int
121
pdfi_pscript_interpret(pdf_ps_ctx_t *cs, byte *pdfpsbuf, int64_t buflen)
122
8.67k
{
123
8.67k
    int code = 0;
124
8.67k
    byte *buflim = pdfpsbuf + buflen;
125
8.67k
    int arraydepth = 0;
126
8.67k
    int stackdepth;
127
128
25.4M
    while (pdfpsbuf < buflim && code >= 0) {
129
25.4M
        switch (*pdfpsbuf++) {
130
20.7k
            case '%':          /* Comment */
131
20.7k
                {
132
1.01M
                    while (pdfpsbuf < buflim && *pdfpsbuf != char_EOL && *pdfpsbuf != '\f' &&
133
1.01M
                           *pdfpsbuf != char_CR)
134
989k
                        pdfpsbuf++;
135
136
20.7k
                    if (pdfpsbuf < buflim && *pdfpsbuf == char_EOL)
137
20.1k
                        pdfpsbuf++;
138
20.7k
                }
139
20.7k
                break;
140
2.52M
            case '/':          /* name */
141
2.52M
                {
142
2.52M
                    byte *n = pdfpsbuf;
143
2.52M
                    int len;
144
145
21.1M
                    while (pdfpsbuf < buflim && !pdf_ps_end_object((int)*pdfpsbuf))
146
18.6M
                        pdfpsbuf++;
147
2.52M
                    len = pdfpsbuf - n;
148
2.52M
                    code = pdf_ps_stack_push_name(cs, n, len);
149
2.52M
                } break;
150
33.7k
            case '(':          /* string */
151
33.7k
                {
152
33.7k
                    byte *s = pdfpsbuf;
153
33.7k
                    int len;
154
33.7k
                    int depth = 1;
155
156
3.52M
                    while (pdfpsbuf < buflim && depth > 0) {
157
3.49M
                        if (*pdfpsbuf == '(') {
158
22.5k
                            depth++;
159
22.5k
                        }
160
3.46M
                        else if (*pdfpsbuf == ')') {
161
54.0k
                            depth--;
162
54.0k
                        }
163
3.49M
                        pdfpsbuf++;
164
3.49M
                    }
165
33.7k
                    len = (pdfpsbuf - s) - 1;
166
33.7k
                    code = pdf_ps_stack_push_string(cs, s, len);
167
33.7k
                }
168
33.7k
                break;
169
1.97M
            case '<':          /* hex string */
170
1.97M
                {
171
1.97M
                    byte *s = pdfpsbuf;
172
1.97M
                    stream_cursor_read pr;
173
1.97M
                    stream_cursor_write pw;
174
1.97M
                    int odd_digit = -1;
175
176
1.97M
                    if (pdfpsbuf < buflim && *pdfpsbuf == '<') { /* Dict opening "<<" - we don't care */
177
2.31k
                        pdfpsbuf++;
178
2.31k
                        continue;
179
2.31k
                    }
180
10.6M
                    while (pdfpsbuf < buflim && *pdfpsbuf != '>')
181
8.63M
                        pdfpsbuf++;
182
183
1.97M
                    pr.ptr = s - 1;
184
1.97M
                    pr.limit = pdfpsbuf - 1;
185
1.97M
                    pw.ptr = s - 1;
186
1.97M
                    pw.limit = pdfpsbuf - 1;
187
1.97M
                    code = s_hex_process(&pr, &pw, &odd_digit, hex_ignore_garbage);
188
1.97M
                    if (code != ERRC && pw.ptr - (s - 1) > 0) {
189
1.97M
                        code = pdf_ps_stack_push_string(cs, s, pw.ptr - (s - 1));
190
1.97M
                    }
191
1.97M
                }
192
0
                break;
193
1.98M
            case '>': /* For hex strings, this should be handled above */
194
1.98M
                {
195
1.98M
                    if (pdfpsbuf < buflim && *pdfpsbuf == '>') { /* Dict closing "<<" - we still don't care */
196
2.48k
                        pdfpsbuf++;
197
2.48k
                    }
198
1.98M
                }
199
1.98M
               break;
200
37.2k
            case '[':;         /* begin array */
201
129k
            case '{':;         /* begin executable array (mainly, FontBBox) */
202
129k
                arraydepth++;
203
129k
                code = pdf_ps_stack_push_arr_mark(cs);
204
129k
                break;
205
36.2k
            case ']':          /* end array */
206
128k
            case '}':          /* end executable array */
207
128k
                {
208
128k
                    pdf_ps_stack_object_t *arr = NULL;
209
128k
                    int i, size = pdf_ps_stack_count_to_mark(cs, PDF_PS_OBJ_ARR_MARK);
210
211
128k
                    if (size > 0 && arraydepth > 0) {
212
89.5k
                        arr = (pdf_ps_stack_object_t *) gs_alloc_bytes(cs->pdfi_ctx->memory, size * sizeof(pdf_ps_stack_object_t), "pdfi_pscript_interpret(pdf_ps_stack_object_t");
213
89.5k
                        if (arr == NULL) {
214
0
                            code = gs_note_error(gs_error_VMerror);
215
                            /* clean up the stack, including the mark object */
216
0
                            (void)pdf_ps_stack_pop(cs, size + 1);
217
0
                            size = 0;
218
0
                        }
219
89.5k
                        else {
220
410k
                            for (i = 0; i < size; i++) {
221
321k
                                memcpy(&(arr[(size - 1) - i]), cs->cur, sizeof(*cs->cur));
222
321k
                                if (pdf_ps_obj_has_type(cs->cur, PDF_PS_OBJ_ARRAY)) {
223
60.5k
                                    pdf_ps_make_null(cs->cur);
224
60.5k
                                }
225
321k
                                (void)pdf_ps_stack_pop(cs, 1);
226
321k
                            }
227
                            /* And pop the array mark */
228
89.5k
                            (void)pdf_ps_stack_pop(cs, 1);
229
89.5k
                        }
230
89.5k
                    }
231
38.5k
                    else {
232
                        /* And pop the array mark for an emtpy array */
233
38.5k
                        (void)pdf_ps_stack_pop(cs, 1);
234
38.5k
                    }
235
128k
                    code = pdf_ps_stack_push_array(cs, arr, size > 0 ? size : 0);
236
128k
                    arraydepth--;
237
128k
                    if (arraydepth < 0)
238
1.25k
                        arraydepth = 0;
239
128k
                }
240
128k
                break;
241
766
            case '.':
242
27.5k
            case '-':
243
557k
            case '+':
244
611k
            case '0':
245
1.84M
            case '1':
246
2.29M
            case '2':
247
2.53M
            case '3':
248
2.82M
            case '4':
249
3.19M
            case '5':
250
3.44M
            case '6':
251
3.65M
            case '7':
252
3.86M
            case '8':
253
4.08M
            case '9':{
254
4.08M
                    bool is_float = false;
255
4.08M
                    int len;
256
4.08M
                    byte *n = --pdfpsbuf, *numbuf;
257
258
14.6M
                    while (pdfpsbuf < buflim && !pdf_ps_end_number_object((int)*pdfpsbuf)) {
259
10.5M
                        if (*pdfpsbuf == '.' || *pdfpsbuf == 'e')
260
30.4k
                            is_float = true;
261
10.5M
                        pdfpsbuf++;
262
10.5M
                    }
263
4.08M
                    len = pdfpsbuf - n;
264
4.08M
                    if (len == 1 && *n == '-') {
265
                        /* Not a number, might be an operator */
266
8.75k
                        pdfpsbuf = n + 1;
267
8.75k
                        goto retry_as_oper;
268
8.75k
                    }
269
4.07M
                    numbuf = gs_alloc_bytes(cs->pdfi_ctx->memory, len + 1, "ps pdf number buffer");
270
4.07M
                    if (numbuf == NULL) {
271
0
                        code = gs_note_error(gs_error_VMerror);
272
0
                    }
273
4.07M
                    else {
274
4.07M
                        memcpy(numbuf, n, len);
275
4.07M
                        numbuf[len] = '\0';
276
4.07M
                        if (is_float) {
277
30.4k
                            float f = (float)atof((const char *)numbuf);
278
279
30.4k
                            code = pdf_ps_stack_push_float(cs, f);
280
30.4k
                        }
281
4.04M
                        else {
282
4.04M
                            int i = atoi((const char *)numbuf);
283
284
4.04M
                            code = pdf_ps_stack_push_int(cs, i);
285
4.04M
                        }
286
4.07M
                        gs_free_object(cs->pdfi_ctx->memory, numbuf, "ps pdf number buffer");
287
4.07M
                    }
288
4.07M
                } break;
289
6.09M
            case ' ':
290
6.09M
            case '\f':
291
6.11M
            case '\t':
292
6.22M
            case char_CR:
293
9.03M
            case char_EOL:
294
9.03M
            case char_NULL:
295
9.03M
                break;
296
5.49M
            default:
297
5.50M
              retry_as_oper:{
298
5.50M
                    byte *n = --pdfpsbuf;
299
5.50M
                    int len, i;
300
5.50M
                    int (*opfunc)(gs_memory_t *mem, pdf_ps_ctx_t *stack, byte *buf, byte *bufend) = NULL;
301
5.50M
                    pdf_ps_oper_list_t *ops = cs->ops;
302
303
19.9M
                    while (pdfpsbuf < buflim && !pdf_ps_end_object((int)*pdfpsbuf))
304
14.4M
                        pdfpsbuf++;
305
306
5.50M
                    if (arraydepth == 0) {
307
5.23M
                        len = pdfpsbuf - n;
308
69.1M
                        for (i = 0; ops[i].opname != NULL; i++) {
309
66.7M
                            if (len == ops[i].opnamelen && !memcmp(n, ops[i].opname, len)) {
310
2.83M
                                opfunc = ops[i].oper;
311
2.83M
                                break;
312
2.83M
                            }
313
66.7M
                        }
314
315
5.23M
                        if (opfunc) {
316
2.83M
                            code = (*opfunc) (cs->pdfi_ctx->memory, cs, pdfpsbuf, buflim);
317
2.83M
                            if (code > 0) {
318
2.31M
                                pdfpsbuf += code;
319
2.31M
                                code = 0;
320
2.31M
                            }
321
2.83M
                        }
322
5.23M
                    }
323
5.50M
                }
324
5.50M
                break;
325
25.4M
        }
326
25.4M
    }
327
8.67k
    if ((stackdepth = pdf_ps_stack_count(cs)) > 0) {
328
973
        pdf_ps_stack_pop(cs, stackdepth);
329
973
    }
330
8.67k
    return code;
331
8.67k
}
332
333
static inline bool pdf_ps_name_cmp(pdf_ps_stack_object_t *obj, const char *namestr)
334
225k
{
335
225k
    byte *d = NULL;
336
225k
    int l1, l2;
337
338
225k
    if (namestr) {
339
225k
        l2 = strlen(namestr);
340
225k
    }
341
342
225k
    if (obj->type == PDF_PS_OBJ_NAME) {
343
225k
        d = obj->val.name;
344
225k
        l1 = obj->size;
345
225k
    }
346
0
    else if (obj->type == PDF_PS_OBJ_STRING) {
347
0
        d = obj->val.name;
348
0
        l1 = obj->size;
349
0
    }
350
225k
    if (d != NULL && namestr != NULL && l1 == l2) {
351
225k
        return memcmp(d, namestr, l1) == 0 ? true : false;
352
225k
    }
353
0
    return false;
354
225k
}
355
356
static int
357
ps_font_def_func(gs_memory_t *mem, pdf_ps_ctx_t *s, byte *buf, byte *bufend)
358
111k
{
359
111k
    int code = 0, code2 = 0;
360
111k
    ps_font_interp_private *priv = (ps_font_interp_private *) s->client_data;
361
362
111k
    if ((code = pdf_ps_stack_count(s)) < 2) {
363
80
        return pdf_ps_stack_pop(s, code);
364
80
    }
365
366
111k
    if (pdf_ps_obj_has_type(&s->cur[-1], PDF_PS_OBJ_NAME)) {
367
106k
        switch (s->cur[-1].size) {
368
369
9
          case 4:
370
9
              if (pdf_ps_name_cmp(&s->cur[-1], "XUID")) {
371
0
                  if (pdf_ps_obj_has_type(&s->cur[0], PDF_PS_OBJ_ARRAY) && uid_is_valid(&priv->gsu.gst1.UID) == false) {
372
0
                      int i, size = s->cur[0].size;
373
0
                      long *xvals = (long *)gs_alloc_bytes(mem, size *sizeof(long), "ps_font_def_func(xuid vals)");
374
375
0
                      if (xvals != NULL) {
376
0
                          for (i = 0; i < size; i++) {
377
0
                              if (pdf_ps_obj_has_type(&s->cur[0].val.arr[i], PDF_PS_OBJ_INTEGER)) {
378
0
                                  xvals[i] = s->cur[0].val.arr[i].val.i;
379
0
                              }
380
0
                              else {
381
0
                                  gs_free_object(mem, xvals, "ps_font_def_func(xuid vals)");
382
0
                                  xvals = NULL;
383
0
                                  break;
384
0
                              }
385
0
                          }
386
0
                      }
387
0
                      if (xvals != NULL) {
388
0
                          if (priv->gsu.gst1.UID.xvalues != NULL)
389
0
                              gs_free_object(mem, priv->gsu.gst1.UID.xvalues, "ps_font_def_func(old xuid vals)");
390
0
                          uid_set_XUID(&priv->gsu.gst1.UID, xvals, size);
391
0
                      }
392
0
                  }
393
0
              }
394
9
              break;
395
396
7.10k
          case 5:
397
7.10k
              if (pdf_ps_name_cmp(&s->cur[-1], "StdHW")) {
398
3.36k
                  if (pdf_ps_obj_has_type(&s->cur[0], PDF_PS_OBJ_ARRAY) && s->cur[0].size > 0) {
399
3.36k
                      if (pdf_ps_obj_has_type(&s->cur[0].val.arr[0], PDF_PS_OBJ_INTEGER)) {
400
3.36k
                          priv->gsu.gst1.data.StdHW.values[0] = (float)s->cur[0].val.arr[0].val.i;
401
3.36k
                          priv->gsu.gst1.data.StdHW.count = 1;
402
3.36k
                      }
403
1
                      else if (pdf_ps_obj_has_type(&s->cur[0].val.arr[0], PDF_PS_OBJ_FLOAT)) {
404
1
                          priv->gsu.gst1.data.StdHW.values[0] = s->cur[0].val.arr[0].val.f;
405
1
                          priv->gsu.gst1.data.StdHW.count = 1;
406
1
                      }
407
3.36k
                  }
408
3.36k
              }
409
3.74k
              else if (pdf_ps_name_cmp(&s->cur[-1], "StdVW")) {
410
3.36k
                  if (pdf_ps_obj_has_type(&s->cur[0], PDF_PS_OBJ_ARRAY) && s->cur[0].size > 0) {
411
3.36k
                      if (pdf_ps_obj_has_type(&s->cur[0].val.arr[0], PDF_PS_OBJ_INTEGER)) {
412
3.36k
                          priv->gsu.gst1.data.StdVW.values[0] = (float)s->cur[0].val.arr[0].val.i;
413
3.36k
                          priv->gsu.gst1.data.StdVW.count = 1;
414
3.36k
                      }
415
1
                      else if (pdf_ps_obj_has_type(&s->cur[0].val.arr[0], PDF_PS_OBJ_FLOAT)) {
416
1
                          priv->gsu.gst1.data.StdVW.values[0] = s->cur[0].val.arr[0].val.f;
417
1
                          priv->gsu.gst1.data.StdVW.count = 1;
418
1
                      }
419
3.36k
                  }
420
3.36k
              }
421
380
              else if (pdf_ps_name_cmp(&s->cur[-1], "WMode")) {
422
338
                  if (pdf_ps_obj_has_type(&s->cur[0], PDF_PS_OBJ_INTEGER)) {
423
338
                      if (s->cur[0].val.i != 0) {
424
0
                          if (s->cur[0].val.i != 1)
425
0
                            pdfi_set_warning(s->pdfi_ctx, 0, NULL, W_PDF_BAD_WMODE, "ps_font_def_func", NULL);
426
0
                        priv->gsu.gst1.WMode = 1;
427
0
                      }
428
338
                      else
429
338
                        priv->gsu.gst1.WMode = 0;
430
338
                  }
431
338
              }
432
42
              else if (pdf_ps_name_cmp(&s->cur[-1], "lenIV")) {
433
18
                  if (pdf_ps_obj_has_type(&s->cur[0], PDF_PS_OBJ_INTEGER)) {
434
18
                      priv->gsu.gst1.data.lenIV = s->cur[0].val.i;
435
18
                  }
436
18
              }
437
7.10k
              break;
438
439
7.74k
          case 6:
440
7.74k
              if (pdf_ps_name_cmp(&s->cur[-1], "Notice") && priv->u.t1.notice == NULL) {
441
3.77k
                  if (pdf_ps_obj_has_type(&s->cur[0], PDF_PS_OBJ_STRING)) {
442
3.77k
                      pdf_string *subr_str;
443
444
3.77k
                      code = pdfi_object_alloc(s->pdfi_ctx, PDF_STRING, (unsigned int)s->cur[0].size, (pdf_obj **)&subr_str);
445
3.77k
                      if (code < 0) {
446
0
                          return code;
447
0
                      }
448
3.77k
                      pdfi_countup(subr_str);
449
3.77k
                      memcpy(subr_str->data, s->cur[0].val.name, s->cur[0].size);
450
451
3.77k
                      pdfi_countdown(priv->u.t1.notice);
452
3.77k
                      priv->u.t1.notice = subr_str;
453
3.77k
                  }
454
3.77k
              }
455
7.74k
              break;
456
23.8k
          case 8:
457
23.8k
              if (pdf_ps_name_cmp(&s->cur[-1], "FontName")) {
458
3.90k
                  int fnlen = 0;
459
3.90k
                  char *pname = NULL;
460
461
3.90k
                  if (pdf_ps_obj_has_type(&s->cur[0], PDF_PS_OBJ_NAME)) {
462
3.90k
                      fnlen = s->cur[0].size > gs_font_name_max ? gs_font_name_max : s->cur[0].size;
463
3.90k
                      pname = (char *)s->cur[0].val.name;
464
3.90k
                  }
465
1
                  else if (pdf_ps_obj_has_type(&s->cur[0], PDF_PS_OBJ_STRING)) {
466
0
                      fnlen = s->cur[0].size > gs_font_name_max ? gs_font_name_max : s->cur[0].size;
467
0
                      pname = (char *)s->cur[0].val.string;
468
0
                  }
469
3.90k
                  if (pname && priv->gsu.gst1.key_name.chars[0] == '\0') {
470
3.77k
                      memcpy(priv->gsu.gst1.key_name.chars, pname, fnlen);
471
3.77k
                      priv->gsu.gst1.key_name.chars[fnlen] = '\0';
472
3.77k
                      priv->gsu.gst1.key_name.size = fnlen;
473
474
3.77k
                      memcpy(priv->gsu.gst1.font_name.chars, pname, fnlen);
475
3.77k
                      priv->gsu.gst1.font_name.chars[fnlen] = '\0';
476
3.77k
                      priv->gsu.gst1.font_name.size = fnlen;
477
3.77k
                  }
478
3.90k
              }
479
19.9k
              else if (pdf_ps_name_cmp(&s->cur[-1], "FontBBox")) {
480
3.73k
                  if (s->cur[0].size > 0 && pdf_ps_obj_has_type(&s->cur[0], PDF_PS_OBJ_ARRAY)) {
481
3.72k
                      int i, j;
482
3.72k
                      double bbox[4] = { 0, 0, 1000, 1000 };
483
3.72k
                      if (pdf_ps_obj_has_type(&s->cur[0].val.arr[0], PDF_PS_OBJ_ARRAY)) { /* This is (probably) a Blend/FontBBox entry */
484
0
                          code = pdfi_array_alloc(s->pdfi_ctx, s->cur[0].size, &priv->u.t1.blendfontbbox);
485
0
                          if (code >= 0) {
486
0
                              pdfi_countup(priv->u.t1.blendfontbbox);
487
0
                              for (i = 0; i < s->cur[0].size; i++) {
488
0
                                  pdf_ps_stack_object_t *arr = &s->cur[0].val.arr[i];
489
0
                                  pdf_array *parr = NULL;
490
0
                                  pdf_num *n;
491
0
                                  if (pdf_ps_obj_has_type(arr, PDF_PS_OBJ_ARRAY)) {
492
0
                                      code = pdfi_array_alloc(s->pdfi_ctx, arr->size, &parr);
493
0
                                      if (code < 0)
494
0
                                          break;
495
0
                                      pdfi_countup(parr);
496
497
0
                                      for (j = 0; j < arr->size; j++) {
498
0
                                          if (pdf_ps_obj_has_type(&arr->val.arr[j], PDF_PS_OBJ_INTEGER)) {
499
0
                                              code = pdfi_object_alloc(s->pdfi_ctx, PDF_INT, 0, (pdf_obj **)&n);
500
0
                                              if (code >= 0)
501
0
                                                  n->value.i = arr->val.arr[j].val.i;
502
0
                                          }
503
0
                                          else if (pdf_ps_obj_has_type(&arr->val.arr[j], PDF_PS_OBJ_FLOAT)) {
504
0
                                              code = pdfi_object_alloc(s->pdfi_ctx, PDF_REAL, 0, (pdf_obj **)&n);
505
0
                                              if (code >= 0)
506
0
                                                  n->value.d = arr->val.arr[j].val.f;
507
0
                                          }
508
0
                                          else {
509
0
                                              code = pdfi_object_alloc(s->pdfi_ctx, PDF_INT, 0, (pdf_obj **)&n);
510
0
                                              if (code >= 0)
511
0
                                                  n->value.i = 0;
512
0
                                          }
513
0
                                          if (code < 0)
514
0
                                              break;
515
0
                                          pdfi_countup(n);
516
0
                                          code = pdfi_array_put(s->pdfi_ctx, parr, j, (pdf_obj *)n);
517
0
                                          pdfi_countdown(n);
518
0
                                          if (code < 0) break;
519
0
                                      }
520
0
                                  }
521
0
                                  if (code >= 0)
522
0
                                      code = pdfi_array_put(s->pdfi_ctx, priv->u.t1.blendfontbbox, i, (pdf_obj *)parr);
523
0
                                  pdfi_countdown(parr);
524
0
                              }
525
0
                          }
526
0
                      }
527
3.72k
                      else if (s->cur[0].size >= 4) {
528
18.6k
                          for (i = 0; i < 4; i++) {
529
14.9k
                              if (pdf_ps_obj_has_type(&s->cur[0].val.arr[i], PDF_PS_OBJ_INTEGER)) {
530
14.9k
                                  bbox[i] = (double)s->cur[0].val.arr[i].val.i;
531
14.9k
                              }
532
1
                              else if (pdf_ps_obj_has_type(&s->cur[0].val.arr[i], PDF_PS_OBJ_FLOAT)) {
533
1
                                  bbox[i] = (double)s->cur[0].val.arr[i].val.f;
534
1
                              }
535
14.9k
                          }
536
3.72k
                          priv->gsu.gst1.FontBBox.p.x = bbox[0];
537
3.72k
                          priv->gsu.gst1.FontBBox.p.y = bbox[1];
538
3.72k
                          priv->gsu.gst1.FontBBox.q.x = bbox[2];
539
3.72k
                          priv->gsu.gst1.FontBBox.q.y = bbox[3];
540
3.72k
                      }
541
3.72k
                  }
542
3.73k
              }
543
16.2k
              else if (pdf_ps_name_cmp(&s->cur[-1], "FontType")) {
544
3.76k
                  if (pdf_ps_obj_has_type(&s->cur[0], PDF_PS_OBJ_INTEGER)) {
545
3.76k
                      priv->gsu.gst1.FontType = s->cur[0].val.i;
546
3.76k
                      priv->u.t1.pdfi_font_type = s->cur[0].val.i == 1 ? e_pdf_font_type1 : e_pdf_cidfont_type0;
547
3.76k
                  }
548
1
                  else {
549
1
                      priv->gsu.gst1.FontType = 1;
550
1
                      priv->u.t1.pdfi_font_type = e_pdf_font_type1;
551
1
                  }
552
3.76k
              }
553
12.4k
              else if (pdf_ps_name_cmp(&s->cur[-1], "Encoding")) {
554
3.82k
                  pdf_array *new_enc = NULL;
555
556
3.82k
                  if (pdf_ps_obj_has_type(&s->cur[0], PDF_PS_OBJ_NAME)) {
557
3.06k
                      pdf_name *pname;
558
559
3.06k
                      code = pdfi_name_alloc(s->pdfi_ctx, (byte *) s->cur[0].val.name, s->cur[0].size, (pdf_obj **) &pname);
560
3.06k
                      if (code >= 0) {
561
3.06k
                          pdfi_countup(pname);
562
563
3.06k
                          code = pdfi_create_Encoding(s->pdfi_ctx, NULL, (pdf_obj *) pname, NULL, (pdf_obj **) &new_enc);
564
3.06k
                          if (code >= 0) {
565
3.05k
                              pdfi_countdown(priv->u.t1.Encoding);
566
3.05k
                              priv->u.t1.Encoding = new_enc;
567
3.05k
                          }
568
3.06k
                          pdfi_countdown(pname);
569
3.06k
                      }
570
3.06k
                  }
571
766
                  else if (pdf_ps_obj_has_type(&s->cur[0], PDF_PS_OBJ_ARRAY)) {
572
724
                      int i;
573
574
724
                      code = pdfi_array_alloc(s->pdfi_ctx, s->cur[0].size, &new_enc);
575
724
                      if (code >= 0) {
576
724
                          pdfi_countup(new_enc);
577
185k
                          for (i = 0; i < s->cur[0].size; i++) {
578
184k
                              pdf_name *n = NULL;
579
184k
                              byte *nm = (byte *) s->cur[0].val.arr[i].val.name;
580
184k
                              int nlen = s->cur[0].val.arr[i].size;
581
582
184k
                              code = pdfi_name_alloc(s->pdfi_ctx, (byte *) nm, nlen, (pdf_obj **) &n);
583
184k
                              if (code < 0)
584
0
                                  break;
585
184k
                              pdfi_countup(n);
586
184k
                              code = pdfi_array_put(s->pdfi_ctx, new_enc, (uint64_t) i, (pdf_obj *) n);
587
184k
                              pdfi_countdown(n);
588
184k
                              if (code < 0)
589
0
                                  break;
590
184k
                          }
591
724
                          if (code < 0) {
592
0
                              pdfi_countdown(new_enc);
593
0
                          }
594
724
                          else {
595
724
                              pdfi_countdown(priv->u.t1.Encoding);
596
724
                              priv->u.t1.Encoding = new_enc;
597
724
                              new_enc = NULL;
598
724
                          }
599
724
                      }
600
724
                  }
601
3.82k
              }
602
8.65k
              else if (pdf_ps_name_cmp(&s->cur[-1], "UniqueID") && uid_is_valid(&priv->gsu.gst1.UID) == false) {
603
                  /* Ignore UniqueID if we already have a XUID */
604
968
                  if (priv->gsu.gst1.UID.id >= 0) {
605
968
                      if (pdf_ps_obj_has_type(&s->cur[0], PDF_PS_OBJ_INTEGER)) {
606
968
                          uid_set_UniqueID(&priv->gsu.gst1.UID, s->cur[0].val.i);
607
968
                      }
608
968
                  }
609
968
              }
610
7.69k
              else if (pdf_ps_name_cmp(&s->cur[-1], "FullName")) {
611
3.77k
                  if (pdf_ps_obj_has_type(&s->cur[0], PDF_PS_OBJ_STRING) && priv->u.t1.fullname == NULL) {
612
3.77k
                      pdf_string *subr_str;
613
614
3.77k
                      code = pdfi_object_alloc(s->pdfi_ctx, PDF_STRING, (unsigned int)s->cur[0].size, (pdf_obj **)&subr_str);
615
3.77k
                      if (code < 0) {
616
0
                          return code;
617
0
                      }
618
3.77k
                      pdfi_countup(subr_str);
619
3.77k
                      memcpy(subr_str->data, s->cur[0].val.name, s->cur[0].size);
620
621
3.77k
                      pdfi_countdown(priv->u.t1.fullname);
622
3.77k
                      priv->u.t1.fullname = subr_str;
623
3.77k
                  }
624
3.77k
              }
625
23.8k
              break;
626
627
23.8k
          case 9:
628
20.5k
              if (pdf_ps_name_cmp(&s->cur[-1], "PaintType")) {
629
3.75k
                  if (pdf_ps_obj_has_type(&s->cur[0], PDF_PS_OBJ_INTEGER)) {
630
3.75k
                      priv->gsu.gst1.PaintType = s->cur[0].val.i;
631
3.75k
                  }
632
3.75k
              }
633
16.7k
              else if (pdf_ps_name_cmp(&s->cur[-1], "StemSnapH")) {
634
3.35k
                  if (pdf_ps_obj_has_type(&s->cur[0], PDF_PS_OBJ_ARRAY)) {
635
3.35k
                      int i, size = s->cur[0].size > 12 ? 12 : s->cur[0].size;
636
637
37.4k
                      for (i = 0; i < size; i++) {
638
34.0k
                          if (pdf_ps_obj_has_type(&s->cur[0].val.arr[i], PDF_PS_OBJ_INTEGER)) {
639
34.0k
                              priv->gsu.gst1.data.StemSnapH.values[i] = (float)s->cur[0].val.arr[i].val.i;
640
34.0k
                          }
641
2
                          else if (pdf_ps_obj_has_type(&s->cur[0].val.arr[i], PDF_PS_OBJ_FLOAT)) {
642
2
                              priv->gsu.gst1.data.StemSnapH.values[i] = s->cur[0].val.arr[i].val.f;
643
2
                          }
644
34.0k
                      }
645
3.35k
                      priv->gsu.gst1.data.StemSnapH.count = size;
646
3.35k
                  }
647
3.35k
              }
648
13.4k
              else if (pdf_ps_name_cmp(&s->cur[-1], "StemSnapV")) {
649
3.12k
                  if (pdf_ps_obj_has_type(&s->cur[0], PDF_PS_OBJ_ARRAY)) {
650
3.12k
                      int i, size = s->cur[0].size > 12 ? 12 : s->cur[0].size;
651
652
33.4k
                      for (i = 0; i < size; i++) {
653
30.3k
                          if (pdf_ps_obj_has_type(&s->cur[0].val.arr[i], PDF_PS_OBJ_INTEGER)) {
654
30.3k
                              priv->gsu.gst1.data.StemSnapV.values[i] = (float)s->cur[0].val.arr[i].val.i;
655
30.3k
                          }
656
2
                          else if (pdf_ps_obj_has_type(&s->cur[0].val.arr[i], PDF_PS_OBJ_FLOAT)) {
657
2
                              priv->gsu.gst1.data.StemSnapV.values[i] = s->cur[0].val.arr[i].val.f;
658
2
                          }
659
30.3k
                      }
660
3.12k
                      priv->gsu.gst1.data.StemSnapV.count = size;
661
3.12k
                  }
662
3.12k
              }
663
10.2k
              else if (pdf_ps_name_cmp(&s->cur[-1], "BlueScale")) {
664
3.58k
                  if (pdf_ps_obj_has_type(&s->cur[0], PDF_PS_OBJ_INTEGER)) {
665
0
                      priv->gsu.gst1.data.BlueScale = (float)s->cur[0].val.i;
666
0
                  }
667
3.58k
                  else if (pdf_ps_obj_has_type(&s->cur[0], PDF_PS_OBJ_FLOAT)) {
668
3.58k
                      priv->gsu.gst1.data.BlueScale = (float)s->cur[0].val.f;
669
3.58k
                  }
670
3.58k
              }
671
6.70k
              else if (pdf_ps_name_cmp(&s->cur[-1], "Copyright")) {
672
2.98k
                  if (pdf_ps_obj_has_type(&s->cur[0], PDF_PS_OBJ_STRING)) {
673
2.98k
                      pdf_string *subr_str;
674
675
2.98k
                      code = pdfi_object_alloc(s->pdfi_ctx, PDF_STRING, (unsigned int)s->cur[0].size, (pdf_obj **)&subr_str);
676
2.98k
                      if (code < 0) {
677
0
                          return code;
678
0
                      }
679
2.98k
                      pdfi_countup(subr_str);
680
2.98k
                      memcpy(subr_str->data, s->cur[0].val.name, s->cur[0].size);
681
682
2.98k
                      pdfi_countdown(priv->u.t1.copyright);
683
2.98k
                      priv->u.t1.copyright = subr_str;
684
2.98k
                  }
685
2.98k
              }
686
20.5k
              break;
687
688
20.5k
          case 10:
689
17.6k
              if (pdf_ps_name_cmp(&s->cur[-1], "FontMatrix")) {
690
3.75k
                  if (pdf_ps_obj_has_type(&s->cur[0], PDF_PS_OBJ_ARRAY) && s->cur[0].size >= 6
691
3.75k
                    && (priv->gsu.gst1.FontMatrix.xx * priv->gsu.gst1.FontMatrix.yy - priv->gsu.gst1.FontMatrix.yx * priv->gsu.gst1.FontMatrix.xy == 0)) {
692
3.74k
                      int i;
693
3.74k
                      double fmat[6] = { 0.001, 0, 0, 0.001, 0, 0 };
694
26.2k
                      for (i = 0; i < 6; i++) {
695
22.4k
                          if (pdf_ps_obj_has_type(&s->cur[0].val.arr[i], PDF_PS_OBJ_INTEGER)) {
696
3.15k
                              fmat[i] = (double)s->cur[0].val.arr[i].val.i;
697
3.15k
                          }
698
19.3k
                          else if (pdf_ps_obj_has_type(&s->cur[0].val.arr[i], PDF_PS_OBJ_FLOAT)) {
699
19.3k
                              fmat[i] = (double)s->cur[0].val.arr[i].val.f;
700
19.3k
                          }
701
22.4k
                      }
702
3.74k
                      priv->gsu.gst1.FontMatrix.xx = fmat[0];
703
3.74k
                      priv->gsu.gst1.FontMatrix.xy = fmat[1];
704
3.74k
                      priv->gsu.gst1.FontMatrix.yx = fmat[2];
705
3.74k
                      priv->gsu.gst1.FontMatrix.yy = fmat[3];
706
3.74k
                      priv->gsu.gst1.FontMatrix.tx = fmat[4];
707
3.74k
                      priv->gsu.gst1.FontMatrix.ty = fmat[5];
708
3.74k
                      priv->gsu.gst1.orig_FontMatrix = priv->gsu.gst1.FontMatrix;
709
3.74k
                  }
710
3.75k
              }
711
13.8k
              else if (pdf_ps_name_cmp(&s->cur[-1], "BlueValues")) {
712
3.38k
                  if (pdf_ps_obj_has_type(&s->cur[0], PDF_PS_OBJ_ARRAY)) {
713
3.38k
                      int i, size = s->cur[0].size < 14 ? s->cur[0].size : 14;
714
715
27.6k
                      for (i = 0; i < size; i++) {
716
24.2k
                          if (pdf_ps_obj_has_type(&s->cur[0].val.arr[i], PDF_PS_OBJ_INTEGER)) {
717
24.2k
                              priv->gsu.gst1.data.BlueValues.values[i] =
718
24.2k
                                  (float)s->cur[0].val.arr[i].val.i;
719
24.2k
                          }
720
0
                          else if (pdf_ps_obj_has_type(&s->cur[0].val.arr[i], PDF_PS_OBJ_FLOAT)) {
721
0
                              priv->gsu.gst1.data.BlueValues.values[i] = s->cur[0].val.arr[i].val.f;
722
0
                          }
723
0
                          else {
724
0
                              if (i == 0)
725
0
                                  priv->gsu.gst1.data.BlueValues.values[i] = 0;
726
0
                              else
727
0
                                  priv->gsu.gst1.data.BlueValues.values[i] = priv->gsu.gst1.data.BlueValues.values[i - 1] + 1;
728
0
                          }
729
24.2k
                      }
730
3.38k
                      priv->gsu.gst1.data.BlueValues.count = size;
731
3.38k
                  }
732
3.38k
              }
733
10.5k
              else if (pdf_ps_name_cmp(&s->cur[-1], "FamilyName")) {
734
3.75k
                  if (pdf_ps_obj_has_type(&s->cur[0], PDF_PS_OBJ_STRING) && priv->u.t1.familyname == NULL) {
735
3.75k
                      pdf_string *subr_str;
736
737
3.75k
                      code = pdfi_object_alloc(s->pdfi_ctx, PDF_STRING, (unsigned int)s->cur[0].size, (pdf_obj **)&subr_str);
738
3.75k
                      if (code < 0) {
739
0
                          return code;
740
0
                      }
741
3.75k
                      pdfi_countup(subr_str);
742
3.75k
                      memcpy(subr_str->data, s->cur[0].val.name, s->cur[0].size);
743
744
3.75k
                      pdfi_countdown(priv->u.t1.familyname);
745
3.75k
                      priv->u.t1.familyname = subr_str;
746
3.75k
                  }
747
3.75k
              }
748
17.6k
              break;
749
750
17.6k
          case 11:
751
3.80k
              if (pdf_ps_name_cmp(&s->cur[-1], "StrokeWidth")) {
752
20
                  if (pdf_ps_obj_has_type(&s->cur[0], PDF_PS_OBJ_FLOAT)) {
753
1
                      priv->gsu.gst1.StrokeWidth = s->cur[0].val.f;
754
1
                  }
755
19
                  else if (pdf_ps_obj_has_type(&s->cur[0], PDF_PS_OBJ_INTEGER)) {
756
19
                      priv->gsu.gst1.StrokeWidth = (float)s->cur[0].val.i;
757
19
                  }
758
20
              }
759
3.80k
              break;
760
3.79k
          case 12:
761
3.79k
              if (pdf_ps_name_cmp(&s->cur[-1], "WeightVector")) {
762
0
                  if (pdf_ps_obj_has_type(&s->cur[0], PDF_PS_OBJ_ARRAY)) {
763
0
                      int i, size = s->cur[0].size > 16 ? 16 : s->cur[0].size;
764
765
0
                      for (i = 0; i < size; i++) {
766
0
                          if (pdf_ps_obj_has_type(&s->cur[0].val.arr[i], PDF_PS_OBJ_INTEGER)) {
767
0
                              priv->gsu.gst1.data.WeightVector.values[i] = (float)s->cur[0].val.arr[i].val.i;
768
0
                          }
769
0
                          else if (pdf_ps_obj_has_type(&s->cur[0].val.arr[i], PDF_PS_OBJ_FLOAT)) {
770
0
                              priv->gsu.gst1.data.WeightVector.values[i] = s->cur[0].val.arr[i].val.f;
771
0
                          }
772
0
                          else {
773
0
                              priv->gsu.gst1.data.WeightVector.values[i] = 0;
774
0
                          }
775
0
                      }
776
0
                      priv->gsu.gst1.data.WeightVector.count = s->cur[0].size;
777
0
                  }
778
0
              }
779
3.79k
              break;
780
97
          case 14:
781
97
              if (pdf_ps_name_cmp(&s->cur[-1], "BlendAxisTypes")) {
782
0
                  if (pdf_ps_obj_has_type(&s->cur[0], PDF_PS_OBJ_ARRAY)) {
783
0
                      int i;
784
0
                      code = pdfi_array_alloc(s->pdfi_ctx, s->cur[0].size, &priv->u.t1.blendaxistypes);
785
0
                      if (code >= 0) {
786
0
                          pdfi_countup(priv->u.t1.blendaxistypes);
787
0
                          for (i = 0; i < s->cur[0].size; i++) {
788
0
                              pdf_ps_stack_object_t *so = &s->cur[0].val.arr[i];
789
0
                              pdf_name *n;
790
0
                              if (pdf_ps_obj_has_type(so, PDF_PS_OBJ_NAME)) {
791
0
                                  code = pdfi_object_alloc(s->pdfi_ctx, PDF_NAME, so->size, (pdf_obj **)&n);
792
0
                                  if (code >= 0) {
793
0
                                      pdfi_countup(n);
794
0
                                      memcpy(n->data, so->val.name, so->size);
795
0
                                      n->length = so->size;
796
0
                                      code = pdfi_array_put(s->pdfi_ctx, priv->u.t1.blendaxistypes, i, (pdf_obj *)n);
797
0
                                      pdfi_countdown(n);
798
0
                                  }
799
0
                              }
800
0
                              if (code < 0)
801
0
                                  break;
802
0
                          }
803
0
                      }
804
0
                  }
805
0
              }
806
97
              else if (pdf_ps_name_cmp(&s->cur[-1], "BlendDesignMap")) {
807
0
                  if (pdf_ps_obj_has_type(&s->cur[0], PDF_PS_OBJ_ARRAY)) {
808
0
                      int i, j, k;
809
0
                      pdf_ps_stack_object_t *arr1 = &s->cur[0], *arr2, *arr3;
810
0
                      pdf_array *parr2, *parr3;
811
0
                      code = pdfi_array_alloc(s->pdfi_ctx, arr1->size, &priv->u.t1.blenddesignmap);
812
0
                      if (code >= 0) {
813
0
                          pdfi_countup(priv->u.t1.blenddesignmap);
814
0
                          for (i = 0; i < arr1->size && code >= 0; i++) {
815
0
                              if (pdf_ps_obj_has_type(&arr1->val.arr[i], PDF_PS_OBJ_ARRAY)) {
816
0
                                  arr2 = &arr1->val.arr[i];
817
0
                                  code = pdfi_array_alloc(s->pdfi_ctx, arr2->size, &parr2);
818
0
                                  if (code < 0)
819
0
                                      break;
820
0
                                  for (j = 0; j < arr2->size; j++) {
821
0
                                      pdf_num *n;
822
823
0
                                      arr3 = &arr2->val.arr[j];
824
0
                                      code = pdfi_array_alloc(s->pdfi_ctx, arr3->size, &parr3);
825
0
                                      if (code < 0)
826
0
                                          break;
827
828
0
                                      for (k = 0; k < arr3->size; k++) {
829
0
                                          if (pdf_ps_obj_has_type(&arr3->val.arr[k], PDF_PS_OBJ_INTEGER)) {
830
0
                                              code = pdfi_object_alloc(s->pdfi_ctx, PDF_INT, 0, (pdf_obj **)&n);
831
0
                                              if (code >= 0)
832
0
                                                  n->value.i = arr3->val.arr[k].val.i;
833
0
                                          }
834
0
                                          else if (pdf_ps_obj_has_type(&arr1->val.arr[i], PDF_PS_OBJ_FLOAT)) {
835
0
                                              code = pdfi_object_alloc(s->pdfi_ctx, PDF_REAL, 0, (pdf_obj **)&n);
836
0
                                              if (code >= 0)
837
0
                                                  n->value.d = arr3->val.arr[k].val.f;
838
0
                                          }
839
0
                                          else {
840
0
                                              code = pdfi_object_alloc(s->pdfi_ctx, PDF_INT, 0, (pdf_obj **)&n);
841
0
                                              if (code >= 0)
842
0
                                                  n->value.i = 0;
843
0
                                          }
844
0
                                          if (code < 0)
845
0
                                              break;
846
0
                                          pdfi_countup(n);
847
0
                                          code = pdfi_array_put(s->pdfi_ctx, parr3, k, (pdf_obj *)n);
848
0
                                          pdfi_countdown(n);
849
0
                                          if (code < 0)
850
0
                                              break;
851
0
                                      }
852
0
                                      if (code < 0)
853
0
                                          break;
854
0
                                      pdfi_countup(parr3);
855
0
                                      code = pdfi_array_put(s->pdfi_ctx, parr2, j, (pdf_obj *)parr3);
856
0
                                      pdfi_countdown(parr3);
857
0
                                  }
858
0
                                  if (code < 0)
859
0
                                      break;
860
0
                                  pdfi_countup(parr2);
861
0
                                  code = pdfi_array_put(s->pdfi_ctx, priv->u.t1.blenddesignmap, i, (pdf_obj *)parr2);
862
0
                                  pdfi_countdown(parr2);
863
0
                              }
864
0
                          }
865
0
                      }
866
0
                  }
867
0
              }
868
97
              break;
869
870
2
          case 20:
871
2
              if (pdf_ps_name_cmp(&s->cur[-1], "BlendDesignPositions")) {
872
0
                  if (pdf_ps_obj_has_type(&s->cur[0], PDF_PS_OBJ_ARRAY)) {
873
0
                      code = pdfi_array_alloc(s->pdfi_ctx, s->cur[0].size, &priv->u.t1.blenddesignpositions);
874
0
                      if (code >= 0) {
875
0
                          int i, j;
876
0
                          pdfi_countup(priv->u.t1.blenddesignpositions);
877
878
0
                          for (i = 0; i < s->cur[0].size && code >= 0; i++) {
879
0
                              pdf_ps_stack_object_t *so = &s->cur[0].val.arr[i];
880
881
0
                              if (pdf_ps_obj_has_type(so, PDF_PS_OBJ_ARRAY)) {
882
0
                                  pdf_array *sa;
883
0
                                  code = pdfi_array_alloc(s->pdfi_ctx, so->size, &sa);
884
0
                                  if (code >= 0) {
885
0
                                      pdfi_countup(sa);
886
0
                                      for (j = 0; j < so->size; j++) {
887
0
                                          pdf_num *n;
888
0
                                          if (pdf_ps_obj_has_type(&so->val.arr[j], PDF_PS_OBJ_INTEGER)) {
889
0
                                              code = pdfi_object_alloc(s->pdfi_ctx, PDF_INT, 0, (pdf_obj **)&n);
890
0
                                              if (code >= 0)
891
0
                                                  n->value.i = so->val.arr[j].val.i;
892
0
                                          }
893
0
                                          else if (pdf_ps_obj_has_type(&so->val.arr[j], PDF_PS_OBJ_FLOAT)) {
894
0
                                              code = pdfi_object_alloc(s->pdfi_ctx, PDF_REAL, 0, (pdf_obj **)&n);
895
0
                                              if (code >= 0)
896
0
                                                  n->value.d = so->val.arr[j].val.f;
897
0
                                          }
898
0
                                          else {
899
0
                                              code = pdfi_object_alloc(s->pdfi_ctx, PDF_INT, 0, (pdf_obj **)&n);
900
0
                                              if (code >= 0)
901
0
                                                  n->value.i = 0;
902
0
                                          }
903
0
                                          if (code < 0)
904
0
                                              break;
905
0
                                          pdfi_countup(n);
906
0
                                          code = pdfi_array_put(s->pdfi_ctx, sa, j, (pdf_obj *)n);
907
0
                                          pdfi_countdown(n);
908
0
                                          if (code < 0) break;
909
0
                                      }
910
0
                                  }
911
0
                                  if (code >= 0) {
912
0
                                      code = pdfi_array_put(s->pdfi_ctx, priv->u.t1.blenddesignpositions, i, (pdf_obj *)sa);
913
0
                                  }
914
0
                                  pdfi_countdown(sa);
915
0
                              }
916
0
                          }
917
0
                      }
918
919
0
                  }
920
0
              }
921
2
              break;
922
923
22.1k
          default:
924
22.1k
              break;
925
106k
        }
926
106k
    }
927
928
111k
    code2 = pdf_ps_stack_pop(s, 2);
929
111k
    if (code < 0)
930
3
        return code;
931
111k
    else
932
111k
        return code2;
933
111k
}
934
935
static int
936
ps_font_true_func(gs_memory_t *mem, pdf_ps_ctx_t *s, byte *buf, byte *bufend)
937
249
{
938
249
    (void)mem;
939
249
    return pdf_ps_stack_push_boolean(s, true);
940
249
}
941
942
static int
943
ps_font_false_func(gs_memory_t *mem, pdf_ps_ctx_t *s, byte *buf, byte *bufend)
944
7.07k
{
945
7.07k
    (void)mem;
946
7.07k
    return pdf_ps_stack_push_boolean(s, false);
947
7.07k
}
948
949
static int
950
ps_font_dict_begin_func(gs_memory_t *mem, pdf_ps_ctx_t *s, byte *buf, byte *bufend)
951
14.6k
{
952
14.6k
    (void)mem;
953
14.6k
    return pdf_ps_stack_push_dict_mark(s);
954
14.6k
}
955
956
static int
957
ps_font_dict_end_func(gs_memory_t *mem, pdf_ps_ctx_t *s, byte *buf, byte *bufend)
958
13.8k
{
959
13.8k
    int dsize = pdf_ps_stack_count_to_mark(s, PDF_PS_OBJ_DICT_MARK);
960
961
13.8k
    (void)mem;
962
13.8k
    if (dsize >= 0)
963
10.0k
        return pdf_ps_stack_pop(s, dsize + 1);  /* Add one for the mark object */
964
3.79k
    else
965
3.79k
        return 0;
966
13.8k
}
967
968
static stream *
969
push_eexec_filter(gs_memory_t *mem, byte *buf, byte *bufend)
970
3.67k
{
971
3.67k
    stream *fs, *ffs = NULL;
972
3.67k
    stream *sstrm;
973
3.67k
    stream_exD_state *st;
974
3.67k
    byte *strbuf;
975
976
3.67k
    sstrm = file_alloc_stream(mem, "push_eexec_filter(buf stream)");
977
3.67k
    if (sstrm == NULL)
978
0
        return NULL;
979
980
    /* Because of streams <shrug!> we advance the buffer one byte */
981
3.67k
    buf++;
982
3.67k
    sread_string(sstrm, buf, bufend - buf);
983
3.67k
    sstrm->close_at_eod = false;
984
985
3.67k
    fs = s_alloc(mem, "push_eexec_filter(fs)");
986
3.67k
    strbuf = gs_alloc_bytes(mem, 4096, "push_eexec_filter(buf)");
987
3.67k
    st = gs_alloc_struct(mem, stream_exD_state, s_exD_template.stype, "push_eexec_filter(st)");
988
3.67k
    if (fs == NULL || st == NULL || strbuf == NULL) {
989
0
        sclose(sstrm);
990
0
        gs_free_object(mem, sstrm, "push_eexec_filter(buf stream)");
991
0
        gs_free_object(mem, fs, "push_eexec_filter(fs)");
992
0
        gs_free_object(mem, st, "push_eexec_filter(st)");
993
0
        goto done;
994
0
    }
995
3.67k
    memset(st, 0x00, sizeof(stream_exD_state));
996
997
3.67k
    s_std_init(fs, strbuf, 69, &s_filter_read_procs, s_mode_read);
998
3.67k
    st->memory = mem;
999
3.67k
    st->templat = &s_exD_template;
1000
3.67k
    fs->state = (stream_state *) st;
1001
3.67k
    fs->procs.process = s_exD_template.process;
1002
3.67k
    fs->strm = sstrm;
1003
3.67k
    (*s_exD_template.set_defaults) ((stream_state *) st);
1004
3.67k
    st->cstate = 55665;
1005
3.67k
    st->binary = -1;
1006
3.67k
    st->lenIV = 4;
1007
3.67k
    st->keep_spaces = true;
1008
3.67k
    (*s_exD_template.init) ((stream_state *) st);
1009
3.67k
    fs->close_at_eod = false;
1010
3.67k
    ffs = fs;
1011
3.67k
  done:
1012
3.67k
    return ffs;
1013
3.67k
}
1014
1015
static void
1016
pop_eexec_filter(gs_memory_t *mem, stream *s)
1017
3.67k
{
1018
3.67k
    stream *src = s->strm;
1019
3.67k
    byte *b = s->cbuf;
1020
1021
3.67k
    sclose(s);
1022
3.67k
    gs_free_object(mem, s, "pop_eexec_filter(s)");
1023
3.67k
    gs_free_object(mem, b, "pop_eexec_filter(b)");
1024
3.67k
    if (src)
1025
3.67k
        sclose(src);
1026
3.67k
    gs_free_object(mem, src, "pop_eexec_filter(strm)");
1027
3.67k
}
1028
1029
/* We decode the eexec data in place */
1030
static int
1031
ps_font_eexec_func(gs_memory_t *mem, pdf_ps_ctx_t *s, byte *buf, byte *bufend)
1032
3.67k
{
1033
3.67k
    stream *strm;
1034
3.67k
    int c;
1035
1036
3.67k
    if (bufend <= buf) {
1037
0
        return_error(gs_error_invalidfont);
1038
0
    }
1039
1040
3.67k
    strm = push_eexec_filter(mem, buf, bufend);
1041
296M
    while (1) {
1042
296M
        c = sgetc(strm);
1043
296M
        if (c < 0)
1044
3.67k
            break;
1045
296M
        *buf = (byte) c;
1046
296M
        buf++;
1047
296M
    }
1048
3.67k
    pop_eexec_filter(mem, strm);
1049
1050
3.67k
    return 0;
1051
3.67k
}
1052
1053
/* Normally, for us, "array" is a NULL op.
1054
 *The exception is when the name /Subrs is two objects
1055
 *down from the top of the stack, then we can use this call
1056
 *to record how many subrs we expect, and allocate space for them
1057
 */
1058
static int
1059
ps_font_array_func(gs_memory_t *mem, pdf_ps_ctx_t *s, byte *buf, byte *bufend)
1060
4.09k
{
1061
4.09k
    ps_font_interp_private *priv = (ps_font_interp_private *) s->client_data;
1062
4.09k
    int code = 0;
1063
1064
4.09k
    if (pdf_ps_stack_count(s) < 2) {
1065
4
        return pdf_ps_stack_pop(s, 1);
1066
4
    }
1067
4.08k
    if (pdf_ps_obj_has_type(&s->cur[-1], PDF_PS_OBJ_NAME) &&
1068
4.08k
        pdf_ps_obj_has_type(&s->cur[0], PDF_PS_OBJ_INTEGER) &&
1069
4.08k
        !memcmp(s->cur[-1].val.name, PDF_PS_OPER_NAME_AND_LEN("Subrs"))) {
1070
1071
3.28k
        if (s->cur[0].val.i > 0) {
1072
3.28k
            pdfi_countdown(priv->u.t1.Subrs);
1073
1074
3.28k
            code = pdfi_object_alloc(s->pdfi_ctx, PDF_ARRAY, (unsigned int)s->cur[0].val.i, (pdf_obj **)&priv->u.t1.Subrs);
1075
3.28k
            if (code < 0) {
1076
0
                return code;
1077
0
            }
1078
3.28k
            pdfi_countup(priv->u.t1.Subrs);
1079
3.28k
        }
1080
3.28k
        code = pdf_ps_stack_pop(s, 1);
1081
3.28k
    }
1082
800
    else if (pdf_ps_obj_has_type(&s->cur[-1], PDF_PS_OBJ_NAME) &&
1083
800
             pdf_ps_obj_has_type(&s->cur[0], PDF_PS_OBJ_INTEGER) &&
1084
800
             !memcmp(s->cur[-1].val.name, PDF_PS_OPER_NAME_AND_LEN("Encoding"))) {
1085
        /* We're defining a custom encoding array */
1086
786
        pdf_ps_stack_object_t *arr = NULL;
1087
786
        int size = s->cur[0].val.i;
1088
1089
786
        if (size > 0) {
1090
786
            arr = (pdf_ps_stack_object_t *) gs_alloc_bytes(mem, size *sizeof(pdf_ps_stack_object_t), "ps_font_array_func(encoding array)");
1091
786
            if (arr != NULL) {
1092
786
                code = pdf_ps_stack_pop(s, 1);
1093
786
                if (code < 0) {
1094
0
                    gs_free_object(mem, arr, "ps_font_array_func(encoding array)");
1095
0
                }
1096
786
                else {
1097
786
                    int i;
1098
1099
201k
                    for (i = 0; i < size; i++) {
1100
200k
                        pdf_ps_make_name(&arr[i], (byte *) notdefnamestr, strlen(notdefnamestr));
1101
200k
                    }
1102
786
                    code = pdf_ps_stack_push_array(s, arr, size);
1103
786
                }
1104
786
            }
1105
0
            else {
1106
0
                code = gs_note_error(gs_error_VMerror);
1107
0
            }
1108
786
        }
1109
786
    }
1110
4.08k
    return code;
1111
4.08k
}
1112
1113
/* Normally, for us, "dict" is a NULL op.
1114
 *The exception is when the name /CharStrings is two objects
1115
 *down from the top of the stack, then we can use this call
1116
 *to record how many charstrings we expect, and allocate space for them
1117
 */
1118
static int
1119
ps_font_dict_func(gs_memory_t *mem, pdf_ps_ctx_t *s, byte *buf, byte *bufend)
1120
14.6k
{
1121
14.6k
    ps_font_interp_private *priv = (ps_font_interp_private *) s->client_data;
1122
1123
14.6k
    if (pdf_ps_stack_count(s) < 2) {
1124
3.81k
        return pdf_ps_stack_pop(s, 1);
1125
3.81k
    }
1126
10.8k
    if (pdf_ps_obj_has_type(&s->cur[-1], PDF_PS_OBJ_NAME) &&
1127
10.8k
        pdf_ps_obj_has_type(&s->cur[0], PDF_PS_OBJ_INTEGER) &&
1128
10.8k
        !memcmp(s->cur[-1].val.name, PDF_PS_OPER_NAME_AND_LEN("CharStrings"))) {
1129
3.33k
        int code;
1130
3.33k
        pdf_dict *d = NULL;
1131
1132
3.33k
        if (priv->u.t1.CharStrings == NULL) {
1133
3.33k
            code = pdfi_dict_alloc(s->pdfi_ctx, s->cur[0].val.i, &d);
1134
3.33k
            if (code < 0) {
1135
0
                priv->u.t1.CharStrings = NULL;
1136
0
                (void)pdf_ps_stack_pop(s, 1);
1137
0
                return code;
1138
0
            }
1139
1140
3.33k
            priv->u.t1.CharStrings = d;
1141
3.33k
            pdfi_countup(priv->u.t1.CharStrings);
1142
3.33k
        }
1143
3.33k
    }
1144
10.8k
    return pdf_ps_stack_pop(s, 1);
1145
10.8k
}
1146
1147
static int
1148
pdf_ps_pop2_oper_func(gs_memory_t *mem, pdf_ps_ctx_t *s, byte *buf, byte *bufend)
1149
5.75k
{
1150
5.75k
    return pdf_ps_stack_pop(s, 2);
1151
5.75k
}
1152
1153
static int
1154
pdf_ps_pop4_oper_func(gs_memory_t *mem, pdf_ps_ctx_t *s, byte *buf, byte *bufend)
1155
786
{
1156
786
    return pdf_ps_stack_pop(s, 4);
1157
786
}
1158
1159
static int
1160
pdf_ps_standardencoding_oper_func(gs_memory_t *mem, pdf_ps_ctx_t *s, byte *buf, byte *bufend)
1161
3.06k
{
1162
3.06k
    return pdf_ps_stack_push_name(s, (byte *) "StandardEncoding", 16);
1163
3.06k
}
1164
1165
/* { string currentfile exch readstring pop } */
1166
static int
1167
pdf_ps_RD_oper_func(gs_memory_t *mem, pdf_ps_ctx_t *s, byte *buf, byte *bufend)
1168
2.31M
{
1169
2.31M
    ps_font_interp_private *priv = (ps_font_interp_private *) s->client_data;
1170
2.31M
    int code;
1171
2.31M
    int size = 0;
1172
1173
2.31M
    if (pdf_ps_stack_count(s) >= 1) {
1174
2.31M
        if (priv->u.t1.Subrs != NULL && priv->u.t1.CharStrings == NULL) {
1175
80.1k
            if (pdf_ps_obj_has_type(&s->cur[0], PDF_PS_OBJ_INTEGER) &&
1176
80.1k
                pdf_ps_obj_has_type(&s->cur[-1], PDF_PS_OBJ_INTEGER)) {
1177
80.1k
                int inx = s->cur[-1].val.i;
1178
1179
80.1k
                size = s->cur[0].val.i;
1180
80.1k
                if (size < 0)
1181
0
                    return_error(gs_error_invalidfont);
1182
1183
80.1k
                buf++;
1184
80.1k
                if (buf + size < bufend) {
1185
80.1k
                    pdf_string *subr_str;
1186
1187
80.1k
                    code = pdfi_object_alloc(s->pdfi_ctx, PDF_STRING, (unsigned int)size, (pdf_obj **)&subr_str);
1188
80.1k
                    if (code < 0) {
1189
0
                        return code;
1190
0
                    }
1191
80.1k
                    memcpy(subr_str->data, buf, size);
1192
80.1k
                    pdfi_countup(subr_str);
1193
80.1k
                    code = pdfi_array_put(s->pdfi_ctx, priv->u.t1.Subrs, inx, (pdf_obj *)subr_str);
1194
80.1k
                    pdfi_countdown(subr_str);
1195
80.1k
                    if (code < 0)
1196
0
                        return code;
1197
80.1k
                }
1198
80.1k
            }
1199
80.1k
        }
1200
2.23M
        else if (priv->u.t1.CharStrings != NULL) {
1201
2.23M
            if (pdf_ps_obj_has_type(&s->cur[0], PDF_PS_OBJ_INTEGER) &&
1202
2.23M
                pdf_ps_obj_has_type(&s->cur[-1], PDF_PS_OBJ_NAME)) {
1203
2.23M
                pdf_string *str = NULL;
1204
2.23M
                pdf_obj *key = NULL;
1205
1206
2.23M
                size = s->cur[0].val.i;
1207
2.23M
                if (size < 0)
1208
0
                    return_error(gs_error_invalidfont);
1209
1210
2.23M
                buf++;
1211
2.23M
                code = pdfi_name_alloc(s->pdfi_ctx, (byte *) s->cur[-1].val.name, s->cur[-1].size, &key);
1212
2.23M
                if (code < 0) {
1213
0
                    (void)pdf_ps_stack_pop(s, 2);
1214
0
                    return code;
1215
0
                }
1216
2.23M
                pdfi_countup(key);
1217
1218
2.23M
                if (buf + size < bufend) {
1219
2.23M
                    code = pdfi_object_alloc(s->pdfi_ctx, PDF_STRING, size, (pdf_obj **) &str);
1220
2.23M
                    if (code < 0) {
1221
0
                        pdfi_countdown(key);
1222
0
                        (void)pdf_ps_stack_pop(s, 2);
1223
0
                        return code;
1224
0
                    }
1225
2.23M
                    pdfi_countup(str);
1226
2.23M
                    memcpy(str->data, buf, size);
1227
1228
2.23M
                    code = pdfi_dict_put_obj(s->pdfi_ctx, priv->u.t1.CharStrings, key, (pdf_obj *) str, false);
1229
2.23M
                    if (code < 0) {
1230
0
                       pdfi_countdown(str);
1231
0
                       pdfi_countdown(key);
1232
0
                       (void)pdf_ps_stack_pop(s, 2);
1233
0
                       return code;
1234
0
                    }
1235
2.23M
                }
1236
2.23M
                pdfi_countdown(str);
1237
2.23M
                pdfi_countdown(key);
1238
2.23M
            }
1239
2.23M
        }
1240
2.31M
        code = pdf_ps_stack_pop(s, 2);
1241
2.31M
        return code < 0 ? code : size + 1;
1242
2.31M
    }
1243
0
    return 0;
1244
2.31M
}
1245
1246
static int
1247
pdf_ps_put_oper_func(gs_memory_t *mem, pdf_ps_ctx_t *s, byte *buf, byte *bufend)
1248
42.5k
{
1249
42.5k
    int code;
1250
1251
42.5k
    if ((code = pdf_ps_stack_count(s)) < 4) {
1252
13.7k
        return 0;
1253
13.7k
    }
1254
1255
28.8k
    if (pdf_ps_obj_has_type(&s->cur[-3], PDF_PS_OBJ_NAME) &&
1256
28.8k
        !memcmp(s->cur[-3].val.name, PDF_PS_OPER_NAME_AND_LEN("Encoding")) &&
1257
28.8k
        pdf_ps_obj_has_type(&s->cur[-2], PDF_PS_OBJ_ARRAY) &&
1258
28.8k
        pdf_ps_obj_has_type(&s->cur[-1], PDF_PS_OBJ_INTEGER) &&
1259
28.8k
        pdf_ps_obj_has_type(&s->cur[0], PDF_PS_OBJ_NAME)) {
1260
26.9k
        if (s->cur[-1].val.i >= 0 && s->cur[-1].val.i < s->cur[-2].size) {
1261
26.9k
            pdf_ps_make_name(&s->cur[-2].val.arr[s->cur[-1].val.i], s->cur[0].val.name, s->cur[0].size);
1262
26.9k
        }
1263
26.9k
    }
1264
1265
28.8k
    code = pdf_ps_stack_pop(s, 2);
1266
28.8k
    return code;
1267
42.5k
}
1268
1269
static int
1270
pdf_ps_closefile_oper_func(gs_memory_t *mem, pdf_ps_ctx_t *s, byte *buf, byte *bufend)
1271
3.13k
{
1272
3.13k
    return bufend - buf;
1273
3.13k
}
1274
1275
static pdf_ps_oper_list_t ps_font_oper_list[] = {
1276
    {PDF_PS_OPER_NAME_AND_LEN("RD"), pdf_ps_RD_oper_func},
1277
    {PDF_PS_OPER_NAME_AND_LEN("-|"), pdf_ps_RD_oper_func},
1278
    {PDF_PS_OPER_NAME_AND_LEN("|"), pdf_ps_put_oper_func},
1279
    {PDF_PS_OPER_NAME_AND_LEN("findresource"), clear_stack_oper_func},
1280
    {PDF_PS_OPER_NAME_AND_LEN("dict"), ps_font_dict_func},
1281
    {PDF_PS_OPER_NAME_AND_LEN("begin"), ps_font_dict_begin_func},
1282
    {PDF_PS_OPER_NAME_AND_LEN("end"), ps_font_dict_end_func},
1283
    {PDF_PS_OPER_NAME_AND_LEN("pop"), ps_pdf_null_oper_func},
1284
    {PDF_PS_OPER_NAME_AND_LEN("def"), ps_font_def_func},
1285
    {PDF_PS_OPER_NAME_AND_LEN("dup"), ps_pdf_null_oper_func},
1286
    {PDF_PS_OPER_NAME_AND_LEN("defineresource"), clear_stack_oper_func},
1287
    {PDF_PS_OPER_NAME_AND_LEN("definefont"), clear_stack_oper_func},
1288
    {PDF_PS_OPER_NAME_AND_LEN("readonly"), ps_pdf_null_oper_func},
1289
    {PDF_PS_OPER_NAME_AND_LEN("true"), ps_font_true_func},
1290
    {PDF_PS_OPER_NAME_AND_LEN("false"), ps_font_false_func},
1291
    {PDF_PS_OPER_NAME_AND_LEN("eexec"), ps_font_eexec_func},
1292
    {PDF_PS_OPER_NAME_AND_LEN("array"), ps_font_array_func},
1293
    {PDF_PS_OPER_NAME_AND_LEN("known"), pdf_ps_pop_oper_func},
1294
    {PDF_PS_OPER_NAME_AND_LEN("if"), pdf_ps_pop_oper_func},
1295
    {PDF_PS_OPER_NAME_AND_LEN("ifelse"), pdf_ps_pop2_oper_func},
1296
    {PDF_PS_OPER_NAME_AND_LEN("for"), pdf_ps_pop4_oper_func},
1297
    {PDF_PS_OPER_NAME_AND_LEN("put"), pdf_ps_put_oper_func},
1298
    {PDF_PS_OPER_NAME_AND_LEN("StandardEncoding"), pdf_ps_standardencoding_oper_func},
1299
    {PDF_PS_OPER_NAME_AND_LEN("closefile"), pdf_ps_closefile_oper_func},
1300
    {NULL, 0, NULL}
1301
};
1302
1303
int
1304
pdfi_read_ps_font(pdf_context *ctx, pdf_dict *font_dict, byte *fbuf, int fbuflen, ps_font_interp_private *ps_font_priv)
1305
3.86k
{
1306
3.86k
    int code = 0;
1307
3.86k
    pdf_ps_ctx_t ps_font_ctx;
1308
1309
3.86k
    code = pdfi_pscript_stack_init(ctx, ps_font_oper_list, ps_font_priv, &ps_font_ctx);
1310
3.86k
    if (code < 0)
1311
0
        goto error_out;
1312
1313
3.86k
    code = pdfi_pscript_interpret(&ps_font_ctx, fbuf, fbuflen);
1314
3.86k
    pdfi_pscript_stack_finit(&ps_font_ctx);
1315
    /* We have several files that have a load of garbage data in the stream after the font is defined,
1316
       and that can end up in a stackoverflow error, even though we have a complete font. Override it
1317
       and let the Type 1 specific code decide for itself if it can use the font.
1318
     */
1319
3.86k
    if (code == gs_error_pdf_stackoverflow)
1320
0
        code = 0;
1321
1322
3.86k
    return code;
1323
0
  error_out:
1324
0
    code = gs_error_invalidfont;
1325
0
    return code;
1326
3.86k
}