/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 | } |