Coverage Report

Created: 2022-10-31 07:00

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