Coverage Report

Created: 2025-11-16 07:40

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/ghostpdl/pdf/pdf_font1.c
Line
Count
Source
1
/* Copyright (C) 2019-2025 Artifex Software, Inc.
2
   All Rights Reserved.
3
4
   This software is provided AS-IS with no warranty, either express or
5
   implied.
6
7
   This software is distributed under license and may not be copied,
8
   modified or distributed except as expressly authorized under the terms
9
   of the license contained in the file LICENSE in this distribution.
10
11
   Refer to licensing information at http://www.artifex.com or contact
12
   Artifex Software, Inc.,  39 Mesa Street, Suite 108A, San Francisco,
13
   CA 94129, USA, for further information.
14
*/
15
16
/* code for type 1 font handling */
17
#include "pdf_int.h"
18
19
#include "gsgdata.h"
20
#include "gstype1.h"
21
#include "gscencs.h"
22
23
#include "strmio.h"
24
#include "strimpl.h"
25
#include "stream.h"
26
#include "sfilter.h"
27
28
#include "pdf_deref.h"
29
#include "pdf_types.h"
30
#include "pdf_array.h"
31
#include "pdf_dict.h"
32
#include "pdf_file.h"
33
#include "pdf_font_types.h"
34
#include "pdf_font.h"
35
#include "pdf_fmap.h"
36
#include "pdf_font1.h"
37
#include "pdf_font1C.h"
38
#include "pdf_fontps.h"
39
#include "pdf_fontTT.h"
40
41
#include "gxtype1.h"        /* for gs_type1_state_s */
42
#include "gsutil.h"        /* For gs_next_ids() */
43
44
/* These are fonts for which we have to ignore "named" encodings */
45
typedef struct pdfi_t1_glyph_name_equivalents_s
46
{
47
    const char *name;
48
    const char *altname;
49
} pdfi_t1_glyph_name_equivalents_t;
50
51
static const pdfi_t1_glyph_name_equivalents_t pdfi_t1_glyph_name_equivalents[] =
52
{
53
  {"Ohungarumlaut", "Odblacute"},
54
  {"Uhungarumlaut", "Udblacute"},
55
  {"ohungarumlaut", "odblacute"},
56
  {"uhungarumlaut", "udblacute"},
57
  {NULL , NULL}
58
};
59
60
/* The Postscript code trawls the AGL to find all the equivalents.
61
   let's hope we can avoid that...
62
   Since none of the following show be required for a remotely valid
63
   Type 1, we just ignore errors (at least for now).
64
 */
65
static void pdfi_patch_charstrings_dict(pdf_dict *cstrings)
66
76.6k
{
67
76.6k
    int code = 0;
68
76.6k
    pdf_obj *o;
69
76.6k
    const pdfi_t1_glyph_name_equivalents_t *gne = pdfi_t1_glyph_name_equivalents;
70
383k
    while(gne->name != NULL && code >= 0) {
71
306k
        code = pdfi_dict_get(cstrings->ctx, cstrings, gne->name, &o);
72
306k
        if (code >= 0) {
73
246k
            code = pdfi_dict_put(cstrings->ctx, cstrings, gne->altname, o);
74
246k
            pdfi_countdown(o);
75
246k
        }
76
306k
        if (code == gs_error_undefined)
77
60.0k
            code = 0;
78
306k
        gne++;
79
306k
    }
80
81
76.6k
    if (code >= 0) {
82
76.6k
        bool key_known;
83
76.6k
        pdf_string *pstr;
84
76.6k
        byte notdefstr[] = { 0x9E, 0x35, 0xCE, 0xD7, 0xFF, 0xD3, 0x62, 0x2F, 0x09 };
85
86
76.6k
        code = pdfi_dict_known(cstrings->ctx, cstrings, ".notdef", &key_known);
87
76.6k
        if (code >=0 && key_known != true) {
88
            /* Seems there are plently of invalid Type 1 fonts without a .notdef,
89
               so make a fake one - a valid font will end up replacing this.
90
             */
91
2.07k
            code = pdfi_object_alloc(cstrings->ctx, PDF_STRING, sizeof(notdefstr), (pdf_obj **) &pstr);
92
2.07k
            if (code >= 0) {
93
2.07k
                memcpy(pstr->data, notdefstr, sizeof(notdefstr));
94
2.07k
                (void)pdfi_dict_put(cstrings->ctx, cstrings, ".notdef", (pdf_obj *) pstr);
95
2.07k
            }
96
2.07k
        }
97
76.6k
    }
98
76.6k
}
99
100
/* CALLBACKS */
101
static int
102
pdfi_t1_glyph_data(gs_font_type1 *pfont, gs_glyph glyph, gs_glyph_data_t *pgd)
103
94.2M
{
104
94.2M
    int code = 0;
105
94.2M
    pdf_font_type1 *pdffont1 = (pdf_font_type1 *) pfont->client_data;
106
94.2M
    pdf_context *ctx = (pdf_context *) pdffont1->ctx;
107
94.2M
    pdf_name *glyphname = NULL;
108
94.2M
    pdf_string *charstring = NULL;
109
94.2M
    gs_const_string gname;
110
111
94.2M
    code = (*ctx->get_glyph_name)((gs_font *)pfont, glyph, &gname);
112
94.2M
    if (code >= 0) {
113
94.2M
        code = pdfi_name_alloc(ctx, (byte *) gname.data, gname.size, (pdf_obj **)&glyphname);
114
94.2M
        if (code >= 0)
115
94.2M
            pdfi_countup(glyphname);
116
94.2M
    }
117
118
94.2M
    if (code >= 0) {
119
94.2M
        code = pdfi_dict_get_by_key(ctx, pdffont1->CharStrings, glyphname, (pdf_obj **)&charstring);
120
94.2M
        if (code < 0) {
121
452k
            code = pdfi_map_glyph_name_via_agl(pdffont1->CharStrings, glyphname, &charstring);
122
452k
        }
123
94.2M
        if (code >= 0)
124
93.7M
            gs_glyph_data_from_bytes(pgd, charstring->data, 0, charstring->length, NULL);
125
94.2M
    }
126
94.2M
    pdfi_countdown(charstring);
127
94.2M
    pdfi_countdown(glyphname);
128
129
94.2M
    return code;
130
94.2M
}
131
132
static int
133
pdfi_t1_subr_data(gs_font_type1 *pfont, int index, bool global, gs_glyph_data_t *pgd)
134
44.0M
{
135
44.0M
    int code = 0;
136
44.0M
    pdf_font_type1 *pdffont1 = (pdf_font_type1 *) pfont->client_data;
137
138
44.0M
    if (global == true || index < 0 || index >= (pdffont1->Subrs == NULL ? 0 : pdfi_array_size(pdffont1->Subrs))) {
139
482k
        code = gs_note_error(gs_error_rangecheck);
140
482k
    }
141
43.5M
    else {
142
43.5M
        pdf_string *subr_str = NULL;
143
43.5M
        code = pdfi_array_get_type(pdffont1->ctx, pdffont1->Subrs, index, PDF_STRING, (pdf_obj **)&subr_str);
144
43.5M
        if (code >= 0) {
145
43.5M
            gs_glyph_data_from_bytes(pgd, subr_str->data, 0, subr_str->length, NULL);
146
43.5M
        }
147
        /* decrementing is safe here, because the reference in the pdffont1->Subrs will persist */
148
43.5M
        pdfi_countdown(subr_str);
149
43.5M
    }
150
44.0M
    return code;
151
44.0M
}
152
153
static int
154
pdfi_t1_seac_data(gs_font_type1 *pfont, int ccode, gs_glyph *pglyph, gs_const_string *gstr, gs_glyph_data_t *pgd)
155
6.85k
{
156
6.85k
    int code = 0;
157
6.85k
    pdf_font_type1 *pdffont1 = (pdf_font_type1 *) pfont->client_data;
158
6.85k
    pdf_context *ctx = (pdf_context *) pdffont1->ctx;
159
6.85k
    gs_glyph glyph = gs_c_known_encode((gs_char)ccode, ENCODING_INDEX_STANDARD);
160
161
6.85k
    if (glyph == GS_NO_GLYPH)
162
44
        return_error(gs_error_rangecheck);
163
164
6.81k
    code = gs_c_glyph_name(glyph, gstr);
165
6.81k
    if (code >= 0) {
166
6.81k
        unsigned int nindex;
167
6.81k
        code = (*ctx->get_glyph_index)((gs_font *)pfont, (byte *)gstr->data, gstr->size, &nindex);
168
6.81k
        if (pglyph != NULL)
169
6.81k
            *pglyph = (gs_glyph)nindex;
170
6.81k
    }
171
172
6.81k
    if (code >= 0) {
173
6.81k
        pdf_name *glyphname = NULL;
174
6.81k
        pdf_string *charstring = NULL;
175
6.81k
        code = pdfi_name_alloc(ctx, (byte *) gstr->data, gstr->size, (pdf_obj **) &glyphname);
176
6.81k
        if (code >= 0) {
177
6.81k
            pdfi_countup(glyphname);
178
6.81k
            code = pdfi_dict_get_by_key(ctx, pdffont1->CharStrings, glyphname, (pdf_obj **)&charstring);
179
6.81k
            pdfi_countdown(glyphname);
180
6.81k
            if (code >= 0) {
181
6.78k
                if (pgd != NULL) {
182
0
                    gs_glyph_data_from_bytes(pgd, charstring->data, 0, charstring->length, NULL);
183
0
                }
184
6.78k
                pdfi_countdown(charstring);
185
6.78k
            }
186
6.81k
        }
187
6.81k
    }
188
189
6.81k
    return code;
190
6.85k
}
191
192
/* push/pop are null ops here */
193
static int
194
pdfi_t1_push(void *callback_data, const fixed *pf, int count)
195
0
{
196
0
    (void)callback_data;
197
0
    (void)pf;
198
0
    (void)count;
199
0
    return 0;
200
0
}
201
static int
202
pdfi_t1_pop(void *callback_data, fixed *pf)
203
0
{
204
0
    (void)callback_data;
205
0
    (void)pf;
206
0
    return 0;
207
0
}
208
209
static int
210
pdfi_t1_enumerate_glyph(gs_font *pfont, int *pindex,
211
                        gs_glyph_space_t glyph_space, gs_glyph *pglyph)
212
106M
{
213
106M
    int code;
214
106M
    pdf_font_type1 *t1font = (pdf_font_type1 *) pfont->client_data;
215
106M
    pdf_context *ctx = (pdf_context *) t1font->ctx;
216
106M
    pdf_name *key;
217
106M
    uint64_t i = (uint64_t) *pindex;
218
219
106M
    (void)glyph_space;
220
221
106M
    if (*pindex <= 0)
222
656k
        code = pdfi_dict_key_first(ctx, t1font->CharStrings, (pdf_obj **) & key, &i);
223
106M
    else
224
106M
        code = pdfi_dict_key_next(ctx, t1font->CharStrings, (pdf_obj **) & key, &i);
225
106M
    if (code < 0) {
226
118k
        *pindex = 0;
227
118k
        code = 0;
228
118k
    }
229
106M
    else {
230
106M
        uint dummy = GS_NO_GLYPH;
231
232
106M
        code = (*ctx->get_glyph_index)(pfont, key->data, key->length, &dummy);
233
106M
        if (code < 0) {
234
0
            *pglyph = (gs_glyph) *pindex;
235
0
            goto exit;
236
0
        }
237
106M
        *pglyph = dummy;
238
106M
        if (*pglyph == GS_NO_GLYPH)
239
0
            *pglyph = (gs_glyph) *pindex;
240
106M
        *pindex = (int)i;
241
106M
    }
242
106M
  exit:
243
106M
    pdfi_countdown(key);
244
106M
    return code;
245
106M
}
246
247
/* This *should* only get called for SEAC lookups, which have to come from StandardEncoding
248
   so just try to lookup the string in the standard encodings
249
 */
250
int
251
pdfi_t1_global_glyph_code(const gs_font *pfont, gs_const_string *gstr, gs_glyph *pglyph)
252
2
{
253
2
    *pglyph = gs_c_name_glyph(gstr->data, gstr->size);
254
2
    return 0;
255
2
}
256
257
static int
258
pdfi_t1_glyph_outline(gs_font *pfont, int WMode, gs_glyph glyph,
259
                      const gs_matrix *pmat, gx_path *ppath, double sbw[4])
260
1.52M
{
261
1.52M
    gs_glyph_data_t gd;
262
1.52M
    gs_glyph_data_t *pgd = &gd;
263
1.52M
    gs_font_type1 *pfont1 = (gs_font_type1 *) pfont;
264
1.52M
    int code = pdfi_t1_glyph_data(pfont1, glyph, pgd);
265
266
1.52M
    if (code >= 0) {
267
1.51M
        gs_type1_state cis = { 0 };
268
1.51M
        gs_type1_state *pcis = &cis;
269
1.51M
        gs_gstate gs;
270
1.51M
        int value;
271
272
1.51M
        if (pmat)
273
1.51M
            gs_matrix_fixed_from_matrix(&gs.ctm, pmat);
274
449
        else {
275
449
            gs_matrix imat;
276
277
449
            gs_make_identity(&imat);
278
449
            gs_matrix_fixed_from_matrix(&gs.ctm, &imat);
279
449
        }
280
1.51M
        gs.flatness = 0;
281
1.51M
        code = gs_type1_interp_init(pcis, &gs, ppath, NULL, NULL, true, 0, pfont1);
282
1.51M
        if (code < 0)
283
0
            return code;
284
285
1.51M
        pcis->no_grid_fitting = true;
286
1.51M
        gs_type1_set_callback_data(pcis, NULL);
287
        /* Continue interpreting. */
288
3.02M
      icont:
289
3.02M
        code = pfont1->data.interpret(pcis, pgd, &value);
290
3.02M
        switch (code) {
291
1.51M
            case 0:            /* all done */
292
                /* falls through */
293
1.51M
            default:           /* code < 0, error */
294
1.51M
                return code;
295
0
            case type1_result_callothersubr:   /* unknown OtherSubr */
296
0
                return_error(gs_error_rangecheck);      /* can't handle it */
297
1.51M
            case type1_result_sbw:     /* [h]sbw, just continue */
298
1.51M
                type1_cis_get_metrics(pcis, sbw);
299
1.51M
                pgd = 0;
300
1.51M
                goto icont;
301
3.02M
        }
302
3.02M
    }
303
10.1k
    return code;
304
1.52M
}
305
306
static int
307
pdfi_t1_glyph_info(gs_font *font, gs_glyph glyph, const gs_matrix *pmat, int members, gs_glyph_info_t *info)
308
68.8M
{
309
68.8M
    if ((members & GLYPH_INFO_OUTLINE_WIDTHS) == 0)
310
67.2M
        return gs_type1_glyph_info(font, glyph, pmat, members, info);
311
312
1.52M
    return gs_default_glyph_info(font, glyph, pmat, members, info);
313
68.8M
}
314
315
/* END CALLBACKS */
316
317
static stream *
318
push_pfb_filter(gs_memory_t *mem, byte *buf, byte *bufend)
319
464
{
320
464
    stream *fs, *ffs = NULL;
321
464
    stream *sstrm;
322
464
    stream_PFBD_state *st;
323
464
    byte *strbuf;
324
325
464
    sstrm = file_alloc_stream(mem, "push_pfb_filter(buf stream)");
326
464
    if (sstrm == NULL)
327
0
        return NULL;
328
329
464
    sread_string(sstrm, buf, bufend - buf);
330
464
    sstrm->close_at_eod = false;
331
332
464
    fs = s_alloc(mem, "push_pfb_filter(fs)");
333
464
    strbuf = gs_alloc_bytes(mem, 4096, "push_pfb_filter(buf)");
334
464
    st = gs_alloc_struct(mem, stream_PFBD_state, s_PFBD_template.stype, "push_pfb_filter(st)");
335
464
    if (fs == NULL || st == NULL || strbuf == NULL) {
336
0
        sclose(sstrm);
337
0
        gs_free_object(mem, sstrm, "push_pfb_filter(buf stream)");
338
0
        gs_free_object(mem, fs, "push_pfb_filter(fs)");
339
0
        gs_free_object(mem, st, "push_pfb_filter(st)");
340
0
        goto done;
341
0
    }
342
464
    memset(st, 0x00, sizeof(stream_PFBD_state));
343
464
    (*s_PFBD_template.init)((stream_state *)st);
344
464
    st->binary_to_hex = true;
345
464
    s_std_init(fs, strbuf, 4096, &s_filter_read_procs, s_mode_read);
346
464
    st->memory = mem;
347
464
    st->templat = &s_PFBD_template;
348
464
    fs->state = (stream_state *) st;
349
464
    fs->procs.process = s_PFBD_template.process;
350
464
    fs->strm = sstrm;
351
464
    fs->close_at_eod = false;
352
464
    ffs = fs;
353
464
  done:
354
464
    return ffs;
355
464
}
356
357
static void
358
pop_pfb_filter(gs_memory_t *mem, stream *s)
359
464
{
360
464
    stream *src = s->strm;
361
464
    byte *b = s->cbuf;
362
363
464
    sclose(s);
364
464
    gs_free_object(mem, s, "push_pfb_filter(s)");
365
464
    gs_free_object(mem, b, "push_pfb_filter(b)");
366
464
    if (src)
367
464
        sclose(src);
368
464
    gs_free_object(mem, src, "push_pfb_filter(strm)");
369
464
}
370
371
static int
372
pdfi_t1_decode_pfb(pdf_context *ctx, byte *inbuf, int inlen, byte **outbuf, int *outlen)
373
232
{
374
232
    stream *strm;
375
232
    int c, code = 0;
376
232
    int decodelen = 0;
377
232
    byte *d, *decodebuf = NULL;
378
379
232
    *outbuf = NULL;
380
232
    *outlen = 0;
381
382
232
    strm = push_pfb_filter(ctx->memory, inbuf, inbuf + inlen);
383
232
    if (strm == NULL) {
384
0
        code = gs_note_error(gs_error_VMerror);
385
0
    }
386
232
    else {
387
5.29M
        while (1) {
388
5.29M
            c = sgetc(strm);
389
5.29M
            if (c < 0)
390
232
                break;
391
5.29M
            decodelen++;
392
5.29M
        }
393
232
        pop_pfb_filter(ctx->memory, strm);
394
232
        decodebuf = gs_alloc_bytes(ctx->memory, decodelen, "pdfi_t1_decode_pfb(decodebuf)");
395
232
        if (decodebuf == NULL) {
396
0
            code = gs_note_error(gs_error_VMerror);
397
0
        }
398
232
        else {
399
232
            d = decodebuf;
400
232
            strm = push_pfb_filter(ctx->memory, inbuf, inbuf + inlen);
401
5.29M
            while (1) {
402
5.29M
                c = sgetc(strm);
403
5.29M
                if (c < 0)
404
232
                    break;
405
5.29M
                *d = c;
406
5.29M
                d++;
407
5.29M
            }
408
232
            pop_pfb_filter(ctx->memory, strm);
409
232
            *outbuf = decodebuf;
410
232
            *outlen = decodelen;
411
232
        }
412
232
    }
413
232
    return code;
414
232
}
415
416
static int
417
pdfi_alloc_t1_font(pdf_context *ctx, pdf_font_type1 **font, uint32_t obj_num)
418
1.11M
{
419
1.11M
    pdf_font_type1 *t1font = NULL;
420
1.11M
    gs_font_type1 *pfont = NULL;
421
422
1.11M
    t1font = (pdf_font_type1 *) gs_alloc_bytes(ctx->memory, sizeof(pdf_font_type1), "pdfi (type 1 pdf_font)");
423
1.11M
    if (t1font == NULL)
424
0
        return_error(gs_error_VMerror);
425
426
1.11M
    memset(t1font, 0x00, sizeof(pdf_font_type1));
427
1.11M
    t1font->ctx = ctx;
428
1.11M
    t1font->type = PDF_FONT;
429
1.11M
    t1font->ctx = ctx;
430
1.11M
    t1font->pdfi_font_type = e_pdf_font_type1;
431
432
#if REFCNT_DEBUG
433
    t1font->UID = ctx->UID++;
434
    outprintf(ctx->memory, "Allocated object of type %c with UID %" PRIi64 "\n", t1font->type, t1font->UID);
435
#endif
436
437
1.11M
    pdfi_countup(t1font);
438
439
1.11M
    pfont = (gs_font_type1 *) gs_alloc_struct(ctx->memory, gs_font_type1, &st_gs_font_type1, "pdfi (Type 1 pfont)");
440
1.11M
    if (pfont == NULL) {
441
0
        pdfi_countdown(t1font);
442
0
        return_error(gs_error_VMerror);
443
0
    }
444
1.11M
    memset(pfont, 0x00, sizeof(gs_font_type1));
445
446
1.11M
    t1font->pfont = (gs_font_base *) pfont;
447
448
1.11M
    gs_make_identity(&pfont->orig_FontMatrix);
449
1.11M
    gs_make_identity(&pfont->FontMatrix);
450
1.11M
    pfont->next = pfont->prev = 0;
451
1.11M
    pfont->memory = ctx->memory;
452
1.11M
    pfont->dir = ctx->font_dir;
453
1.11M
    pfont->is_resource = false;
454
1.11M
    gs_notify_init(&pfont->notify_list, ctx->memory);
455
1.11M
    pfont->base = (gs_font *) t1font->pfont;
456
1.11M
    pfont->client_data = t1font;
457
1.11M
    pfont->WMode = 0;
458
1.11M
    pfont->PaintType = 0;
459
1.11M
    pfont->StrokeWidth = 0;
460
1.11M
    pfont->is_cached = 0;
461
1.11M
    pfont->FAPI = NULL;
462
1.11M
    pfont->FAPI_font_data = NULL;
463
1.11M
    pfont->procs.init_fstack = gs_default_init_fstack;
464
1.11M
    pfont->procs.next_char_glyph = gs_default_next_char_glyph;
465
1.11M
    pfont->FontType = ft_encrypted;
466
1.11M
    pfont->ExactSize = fbit_use_outlines;
467
1.11M
    pfont->InBetweenSize = fbit_use_outlines;
468
1.11M
    pfont->TransformedChar = fbit_use_outlines;
469
    /* We may want to do something clever with an XUID here */
470
1.11M
    pfont->id = gs_next_ids(ctx->memory, 1);
471
1.11M
    uid_set_UniqueID(&pfont->UID, pfont->id);
472
473
1.11M
    pfont->encoding_index = ENCODING_INDEX_UNKNOWN;
474
1.11M
    pfont->nearest_encoding_index = ENCODING_INDEX_UNKNOWN;
475
476
1.11M
    pfont->client_data = (void *)t1font;
477
478
1.11M
    *font = t1font;
479
1.11M
    return 0;
480
1.11M
}
481
482
static void
483
pdfi_t1_font_set_procs(pdf_context *ctx, pdf_font_type1 *font)
484
76.6k
{
485
76.6k
    gs_font_type1 *pfont = (gs_font_type1 *) font->pfont;
486
487
    /* The build_char proc will be filled in by FAPI -
488
       we won't worry about working without FAPI */
489
76.6k
    pfont->procs.build_char = NULL;
490
491
76.6k
    pfont->procs.encode_char = pdfi_encode_char;
492
76.6k
    pfont->procs.glyph_name = ctx->get_glyph_name;
493
76.6k
    pfont->procs.decode_glyph = pdfi_decode_glyph;
494
76.6k
    pfont->procs.define_font = gs_no_define_font;
495
76.6k
    pfont->procs.make_font = gs_no_make_font;
496
497
76.6k
    font->default_font_info = gs_default_font_info;
498
76.6k
    pfont->procs.font_info = pdfi_default_font_info;
499
500
76.6k
    pfont->procs.glyph_info = pdfi_t1_glyph_info;
501
76.6k
    pfont->procs.glyph_outline = pdfi_t1_glyph_outline;
502
76.6k
    pfont->procs.same_font = gs_default_same_font;
503
76.6k
    pfont->procs.enumerate_glyph = pdfi_t1_enumerate_glyph;
504
505
76.6k
    pfont->data.procs.glyph_data = pdfi_t1_glyph_data;
506
76.6k
    pfont->data.procs.subr_data = pdfi_t1_subr_data;
507
76.6k
    pfont->data.procs.seac_data = pdfi_t1_seac_data;
508
76.6k
    pfont->data.procs.push_values = pdfi_t1_push;
509
76.6k
    pfont->data.procs.pop_value = pdfi_t1_pop;
510
76.6k
    pfont->data.interpret = gs_type1_interpret;
511
76.6k
}
512
513
static inline void
514
pdfi_type1_font_priv_defaults(ps_font_interp_private *pfpriv)
515
84.3k
{
516
84.3k
    pfpriv->gsu.gst1.data.lenIV = 4;
517
84.3k
    pfpriv->gsu.gst1.data.ExpansionFactor = 0.06;
518
84.3k
    pfpriv->gsu.gst1.data.BlueShift = 7;
519
84.3k
    pfpriv->gsu.gst1.data.BlueFuzz = 1;
520
84.3k
    pfpriv->gsu.gst1.data.BlueScale = 0.039625;
521
84.3k
    uid_set_invalid(&pfpriv->gsu.gst1.UID);
522
84.3k
}
523
524
int
525
pdfi_read_type1_font(pdf_context *ctx, pdf_dict *font_dict, pdf_dict *stream_dict, pdf_dict *page_dict, byte *fbuf, int64_t fbuflen, pdf_font **ppdffont)
526
84.3k
{
527
84.3k
    int code = 0;
528
84.3k
    double x_scale;
529
84.3k
    pdf_obj *fontdesc = NULL;
530
84.3k
    pdf_obj *basefont = NULL;
531
84.3k
    pdf_obj *mapname = NULL;
532
84.3k
    pdf_obj *tmp = NULL;
533
84.3k
    pdf_font_type1 *t1f = NULL;
534
84.3k
    pdf_obj *tounicode = NULL;
535
84.3k
    ps_font_interp_private fpriv = { 0 };
536
84.3k
    bool key_known;
537
84.3k
    bool force_symbolic = false;
538
539
84.3k
    if (font_dict != NULL)
540
20.3k
        (void)pdfi_dict_knownget_type(ctx, font_dict, "FontDescriptor", PDF_DICT, &fontdesc);
541
542
84.3k
    if (fbuf[0] == 128 && fbuf[1] == 1) {
543
232
        byte *decodebuf = NULL;
544
232
        int decodelen;
545
546
232
        code = pdfi_t1_decode_pfb(ctx, fbuf, fbuflen, &decodebuf, &decodelen);
547
232
        gs_free_object(ctx->memory, fbuf, "pdfi_read_type1_font");
548
232
        if (code < 0) {
549
0
            gs_free_object(ctx->memory, decodebuf, "pdfi_read_type1_font");
550
0
        }
551
232
        fbuf = decodebuf;
552
232
        fbuflen = decodelen;
553
232
    }
554
555
84.3k
    if (code >= 0) {
556
84.3k
        pdfi_type1_font_priv_defaults(&fpriv);
557
84.3k
        code = pdfi_read_ps_font(ctx, font_dict, fbuf, fbuflen, &fpriv);
558
84.3k
        gs_free_object(ctx->memory, fbuf, "pdfi_read_type1_font");
559
560
        /* If we have a full CharStrings dictionary, we probably have enough to make a font */
561
84.3k
        if (code < 0 || fpriv.u.t1.CharStrings == NULL || pdfi_type_of(fpriv.u.t1.CharStrings) != PDF_DICT
562
76.7k
            || fpriv.u.t1.CharStrings->entries == 0) {
563
7.66k
                code = gs_note_error(gs_error_invalidfont);
564
7.66k
                goto error;
565
7.66k
        }
566
76.6k
        code = pdfi_alloc_t1_font(ctx, &t1f, font_dict != NULL ? font_dict->object_num : 0);
567
76.6k
        if (code >= 0) {
568
76.6k
            gs_font_type1 *pfont1 = (gs_font_type1 *) t1f->pfont;
569
570
76.6k
            memcpy(&pfont1->data, &fpriv.gsu.gst1.data, sizeof(pfont1->data));
571
572
76.6k
            pdfi_t1_font_set_procs(ctx, t1f);
573
574
76.6k
            memcpy(&pfont1->FontMatrix, &fpriv.gsu.gst1.FontMatrix, sizeof(pfont1->FontMatrix));
575
76.6k
            memcpy(&pfont1->orig_FontMatrix, &fpriv.gsu.gst1.orig_FontMatrix, sizeof(pfont1->orig_FontMatrix));
576
76.6k
            memcpy(&pfont1->FontBBox, &fpriv.gsu.gst1.FontBBox, sizeof(pfont1->FontBBox));
577
76.6k
            memcpy(&pfont1->key_name, &fpriv.gsu.gst1.key_name, sizeof(pfont1->key_name));
578
76.6k
            memcpy(&pfont1->font_name, &fpriv.gsu.gst1.font_name, sizeof(pfont1->font_name));
579
76.6k
            if (fpriv.gsu.gst1.UID.id != 0)
580
76.6k
                memcpy(&pfont1->UID, &fpriv.gsu.gst1.UID, sizeof(pfont1->UID));
581
76.6k
            fpriv.gsu.gst1.UID.xvalues = NULL; /* In case of error */
582
76.6k
            if (fpriv.gsu.gst1.WMode != 0) {
583
0
                if (fpriv.gsu.gst1.WMode != 1)
584
0
                    pdfi_set_warning(ctx, 0, NULL, W_PDF_BAD_WMODE, "pdfi_read_type1_font", NULL);
585
0
                pfont1->WMode = 1;
586
0
            }
587
76.6k
            else
588
76.6k
                pfont1->WMode = 0;
589
76.6k
            pfont1->PaintType = fpriv.gsu.gst1.PaintType;
590
76.6k
            pfont1->StrokeWidth = fpriv.gsu.gst1.StrokeWidth;
591
592
76.6k
            if (font_dict != NULL) {
593
12.6k
                t1f->object_num = font_dict->object_num;
594
12.6k
                t1f->generation_num = font_dict->generation_num;
595
12.6k
                t1f->indirect_num = font_dict->indirect_num;
596
12.6k
                t1f->indirect_gen = font_dict->indirect_gen;
597
12.6k
            }
598
599
76.6k
            t1f->PDF_font = font_dict;
600
76.6k
            pdfi_countup(font_dict);
601
76.6k
            t1f->FontDescriptor = (pdf_dict *) fontdesc;
602
76.6k
            pdfi_countup(fontdesc);
603
76.6k
            t1f->Name = mapname;
604
76.6k
            pdfi_countup(mapname);
605
606
            /* We want basefont, but we can live without it */
607
76.6k
            if (font_dict != NULL) {
608
12.6k
                (void)pdfi_dict_knownget_type(ctx, font_dict, "BaseFont", PDF_NAME, &basefont);
609
12.6k
                t1f->BaseFont = basefont;
610
12.6k
                pdfi_countup(basefont);
611
12.6k
            }
612
613
76.6k
            if (t1f->FontDescriptor != NULL) {
614
12.6k
                code = pdfi_dict_get_int(ctx, t1f->FontDescriptor, "Flags", &t1f->descflags);
615
12.6k
                if (code >= 0) {
616
                    /* If both the symbolic and non-symbolic flag are set,
617
                       believe that latter.
618
                     */
619
12.6k
                    if ((t1f->descflags & 32) != 0)
620
3.07k
                        t1f->descflags = (t1f->descflags & ~4);
621
12.6k
                }
622
12.6k
            }
623
624
76.6k
            if (pdfi_font_known_symbolic(basefont)) {
625
52
                force_symbolic = true;
626
52
                t1f->descflags |= 4;
627
52
            }
628
629
76.6k
            if (ctx->args.ignoretounicode != true && font_dict != NULL) {
630
12.6k
                code = pdfi_dict_get(ctx, font_dict, "ToUnicode", (pdf_obj **)&tounicode);
631
12.6k
                if (code >= 0 && pdfi_type_of(tounicode) == PDF_STREAM) {
632
1.01k
                    pdf_cmap *tu = NULL;
633
1.01k
                    code = pdfi_read_cmap(ctx, tounicode, &tu);
634
1.01k
                    pdfi_countdown(tounicode);
635
1.01k
                    tounicode = (pdf_obj *)tu;
636
1.01k
                }
637
12.6k
                if (code < 0 || (tounicode != NULL && pdfi_type_of(tounicode) != PDF_CMAP)) {
638
11.6k
                    pdfi_countdown(tounicode);
639
11.6k
                    tounicode = NULL;
640
11.6k
                    code = 0;
641
11.6k
                }
642
12.6k
            }
643
63.9k
            else {
644
63.9k
                tounicode = NULL;
645
63.9k
            }
646
76.6k
            t1f->ToUnicode = tounicode;
647
76.6k
            tounicode = NULL;
648
649
76.6k
            pdfi_font_set_first_last_char(ctx, font_dict, (pdf_font *)t1f);
650
651
            /* Widths are defined assuming a 1000x1000 design grid, but we apply
652
             * them in font space - so undo the 1000x1000 scaling, and apply
653
             * the inverse of the font's x scaling
654
             */
655
76.6k
            x_scale = 0.001 / hypot(pfont1->FontMatrix.xx, pfont1->FontMatrix.xy);
656
657
            /* ignore errors with widths... for now */
658
76.6k
            if (font_dict != NULL)
659
12.6k
                (void)pdfi_font_create_widths(ctx, font_dict, (pdf_font*)t1f, x_scale);
660
661
76.6k
            if (font_dict != NULL)
662
12.6k
                code = pdfi_dict_knownget(ctx, font_dict, "Encoding", &tmp);
663
63.9k
            else
664
63.9k
                code = gs_error_undefined;
665
76.6k
            if (code == 1) {
666
10.6k
                if (pdfi_type_of(tmp) == PDF_NAME && force_symbolic == true) {
667
0
                    t1f->Encoding = fpriv.u.t1.Encoding;
668
0
                    pdfi_countup(t1f->Encoding);
669
0
                }
670
10.6k
                else if (pdfi_type_of(tmp) == PDF_DICT && (t1f->descflags & 4) != 0) {
671
8.07k
                    code = pdfi_create_Encoding(ctx, (pdf_font *)t1f, tmp, (pdf_obj *)fpriv.u.t1.Encoding, (pdf_obj **) & t1f->Encoding);
672
8.07k
                    if (code >= 0)
673
8.07k
                        code = 1;
674
8.07k
                }
675
2.61k
                else {
676
2.61k
                    code = pdfi_create_Encoding(ctx, (pdf_font *)t1f, tmp, NULL, (pdf_obj **) & t1f->Encoding);
677
2.61k
                    if (code >= 0)
678
2.57k
                        code = 1;
679
2.61k
                }
680
10.6k
                pdfi_countdown(tmp);
681
10.6k
                tmp = NULL;
682
10.6k
            }
683
65.9k
            else {
684
65.9k
                pdfi_countdown(tmp);
685
65.9k
                tmp = NULL;
686
65.9k
                code = 0;
687
65.9k
            }
688
689
76.6k
            if (code <= 0) {
690
66.0k
                t1f->Encoding = fpriv.u.t1.Encoding;
691
66.0k
                pdfi_countup(t1f->Encoding);
692
66.0k
            }
693
            /* Since the underlying font stream can be shared between font descriptors,
694
               and the font descriptors can be shared between font objects, if we change
695
               the encoding, we can't share cached glyphs with other instances of this
696
               underlying font, so invalidate the UniqueID/XUID so the glyph cache won't
697
               try.
698
            */
699
76.6k
            if (uid_is_XUID(&t1f->pfont->UID))
700
76.6k
                uid_free(&t1f->pfont->UID, t1f->pfont->memory, "pdfi_read_type1_font");
701
76.6k
            uid_set_invalid(&t1f->pfont->UID);
702
703
76.6k
            t1f->CharStrings = fpriv.u.t1.CharStrings;
704
76.6k
            pdfi_countup(t1f->CharStrings);
705
76.6k
            pdfi_patch_charstrings_dict(t1f->CharStrings);
706
707
76.6k
            t1f->Subrs = fpriv.u.t1.Subrs;
708
76.6k
            fpriv.u.t1.Subrs = NULL;
709
710
76.6k
            t1f->copyright = fpriv.u.t1.copyright;
711
76.6k
            t1f->notice = fpriv.u.t1.notice;
712
76.6k
            t1f->fullname = fpriv.u.t1.fullname;
713
76.6k
            t1f->familyname = fpriv.u.t1.familyname;
714
76.6k
            fpriv.u.t1.copyright = fpriv.u.t1.notice = fpriv.u.t1.fullname = fpriv.u.t1.familyname = NULL;
715
716
76.6k
            code = pdfi_font_generate_pseudo_XUID(ctx, font_dict, t1f->pfont);
717
76.6k
            if (code < 0) {
718
0
                goto error;
719
0
            }
720
721
76.6k
            t1f->blenddesignpositions = fpriv.u.t1.blenddesignpositions;
722
76.6k
            pdfi_countup(t1f->blenddesignpositions);
723
76.6k
            t1f->blenddesignmap = fpriv.u.t1.blenddesignmap;
724
76.6k
            pdfi_countup(t1f->blenddesignmap);
725
76.6k
            t1f->blendfontbbox = fpriv.u.t1.blendfontbbox;
726
76.6k
            pdfi_countup(t1f->blendfontbbox);
727
76.6k
            t1f->blendaxistypes = fpriv.u.t1.blendaxistypes;
728
76.6k
            pdfi_countup(t1f->blendaxistypes);
729
730
76.6k
            key_known = false;
731
76.6k
            if (t1f->FontDescriptor != NULL) {
732
12.6k
                 code = pdfi_dict_known(ctx, t1f->FontDescriptor, "FontFile", &key_known);
733
12.6k
                 if (code < 0 || key_known == false) {
734
472
                     code = pdfi_dict_known(ctx, t1f->FontDescriptor, "FontFile2", &key_known);
735
472
                     if (code < 0 || key_known == false) {
736
0
                         code = pdfi_dict_known(ctx, t1f->FontDescriptor, "FontFile3", &key_known);
737
0
                         if (code < 0) {
738
0
                             key_known = false;
739
0
                         }
740
0
                     }
741
472
                 }
742
12.6k
            }
743
76.6k
            t1f->pfont->is_resource = (key_known == false);
744
745
76.6k
            pdfi_font_set_orig_fonttype(ctx, (pdf_font *)t1f);
746
76.6k
            code = gs_definefont(ctx->font_dir, (gs_font *) t1f->pfont);
747
76.6k
            if (code < 0) {
748
0
                goto error;
749
0
            }
750
751
76.6k
            code = pdfi_fapi_passfont((pdf_font *) t1f, 0, NULL, NULL, NULL, 0);
752
76.6k
            if (code < 0) {
753
0
                goto error;
754
0
            }
755
            /* object_num can be zero if the dictionary was defined inline */
756
76.6k
            if (t1f->object_num != 0) {
757
12.2k
                (void)replace_cache_entry(ctx, (pdf_obj *) t1f);
758
12.2k
            }
759
76.6k
            *ppdffont = (pdf_font *) t1f;
760
76.6k
        }
761
76.6k
    }
762
763
84.3k
  error:
764
84.3k
    pdfi_countdown(fontdesc);
765
84.3k
    pdfi_countdown(basefont);
766
84.3k
    pdfi_countdown(tounicode);
767
84.3k
    pdfi_countdown(mapname);
768
84.3k
    pdfi_countdown(tmp);
769
84.3k
    pdfi_countdown(fpriv.u.t1.Encoding);
770
84.3k
    pdfi_countdown(fpriv.u.t1.CharStrings);
771
84.3k
    pdfi_countdown(fpriv.u.t1.blenddesignpositions);
772
84.3k
    pdfi_countdown(fpriv.u.t1.blenddesignmap);
773
84.3k
    pdfi_countdown(fpriv.u.t1.blendfontbbox);
774
84.3k
    pdfi_countdown(fpriv.u.t1.blendaxistypes);
775
84.3k
    pdfi_countdown(fpriv.u.t1.Subrs);
776
84.3k
    pdfi_countdown(fpriv.u.t1.copyright);
777
84.3k
    pdfi_countdown(fpriv.u.t1.notice);
778
84.3k
    pdfi_countdown(fpriv.u.t1.fullname);
779
84.3k
    pdfi_countdown(fpriv.u.t1.familyname);
780
84.3k
    if (fpriv.gsu.gst1.UID.xvalues != NULL) {
781
1
        gs_free_object(ctx->memory, fpriv.gsu.gst1.UID.xvalues, "pdfi_read_type1_font(xuid)");
782
1
    }
783
784
84.3k
    if (code < 0) {
785
7.66k
        tmp = NULL;
786
7.66k
        if (font_dict != NULL) {
787
7.66k
            if (pdfi_dict_get(ctx, font_dict, ".Path", &tmp) >= 0)
788
0
            {
789
0
                char fname[gp_file_name_sizeof + 1];
790
0
                pdf_string *fobj = (pdf_string *)tmp;
791
792
0
                memcpy(fname, fobj->data, fobj->length > gp_file_name_sizeof ? gp_file_name_sizeof : fobj->length);
793
0
                fname[fobj->length > gp_file_name_sizeof ? gp_file_name_sizeof : fobj->length] = '\0';
794
795
0
                (void)pdfi_set_error_var(ctx, code, NULL, E_PDF_BADSTREAM, "pdfi_read_type1_font", "Error reading Type 1 font file %s\n", fname);
796
0
            }
797
7.66k
            else {
798
7.66k
                (void)pdfi_set_error_var(ctx, code, NULL, E_PDF_BADSTREAM, "pdfi_read_type1_font", "Error reading embedded Type 1 font object %u\n", font_dict->object_num);
799
7.66k
            }
800
7.66k
        }
801
0
        else {
802
0
            pdfi_set_error(ctx, code, NULL, E_PDF_BADSTREAM, "pdfi_read_truetype_font", "Error reading font\n");
803
0
        }
804
7.66k
        pdfi_countdown(tmp);
805
7.66k
        pdfi_countdown(t1f);
806
7.66k
    }
807
84.3k
    return code;
808
84.3k
}
809
810
int
811
pdfi_copy_type1_font(pdf_context *ctx, pdf_font *spdffont, pdf_dict *font_dict, pdf_font **tpdffont)
812
1.03M
{
813
1.03M
    int code = 0;
814
1.03M
    pdf_font_type1 *font = NULL;
815
1.03M
    gs_font_type1 *spfont1 = (gs_font_type1 *) spdffont->pfont;
816
1.03M
    gs_font_type1 *dpfont1;
817
1.03M
    gs_id t_id;
818
1.03M
    pdf_obj *tmp;
819
1.03M
    bool force_symbolic = false;
820
821
1.03M
    if (font_dict == NULL)
822
0
        return_error(gs_error_invalidfont);
823
824
1.03M
    code = pdfi_alloc_t1_font(ctx, &font, font_dict->object_num);
825
1.03M
    if (code < 0)
826
0
        return code;
827
1.03M
    dpfont1 = (gs_font_type1 *) font->pfont;
828
829
1.03M
    t_id = dpfont1->id;
830
1.03M
    memcpy(dpfont1, spfont1, sizeof(gs_font_type1));
831
1.03M
    dpfont1->id = t_id;
832
1.03M
    dpfont1->FAPI = NULL;
833
1.03M
    dpfont1->FAPI_font_data = NULL;
834
835
1.03M
    memcpy(font, spdffont, sizeof(pdf_font_type1));
836
1.03M
    font->pfont = (gs_font_base *)dpfont1;
837
1.03M
    font->refcnt = 1;
838
1.03M
    dpfont1->client_data = (void *)font;
839
1.03M
    font->filename = NULL;
840
841
1.03M
    dpfont1->notify_list.memory = NULL;
842
1.03M
    dpfont1->notify_list.first = NULL;
843
1.03M
    gs_notify_init(&dpfont1->notify_list, dpfont1->memory);
844
845
1.03M
    font->PDF_font = font_dict;
846
1.03M
    font->object_num = font_dict->object_num;
847
1.03M
    font->generation_num = font_dict->generation_num;
848
1.03M
    pdfi_countup(font->PDF_font);
849
850
    /* We want basefont and descriptor, but we can live without them */
851
1.03M
    font->BaseFont = NULL;
852
1.03M
    code = pdfi_dict_knownget_type(ctx, font_dict, "BaseFont", PDF_NAME, &font->BaseFont);
853
1.03M
    if (code < 0) {
854
340
        pdfi_countdown(font->BaseFont);
855
340
        font->BaseFont = NULL;
856
340
    }
857
1.03M
    font->FontDescriptor = NULL;
858
1.03M
    code = pdfi_dict_knownget_type(ctx, font_dict, "FontDescriptor", PDF_DICT, (pdf_obj **)&font->FontDescriptor);
859
1.03M
    if (code < 0) {
860
7.24k
        pdfi_countdown(font->FontDescriptor);
861
7.24k
        font->FontDescriptor = NULL;
862
7.24k
    }
863
864
1.03M
    pdfi_countup(font->Name);
865
1.03M
    pdfi_countup(font->CharStrings);
866
1.03M
    pdfi_countup(font->blenddesignpositions);
867
1.03M
    pdfi_countup(font->blenddesignmap);
868
1.03M
    pdfi_countup(font->blendfontbbox);
869
1.03M
    pdfi_countup(font->blendaxistypes);
870
1.03M
    pdfi_countup(font->Subrs);
871
1.03M
    pdfi_countup(font->copyright);
872
1.03M
    pdfi_countup(font->notice);
873
1.03M
    pdfi_countup(font->fullname);
874
1.03M
    pdfi_countup(font->familyname);
875
876
1.03M
    if (font->BaseFont != NULL && ((pdf_name *)font->BaseFont)->length <= gs_font_name_max - 1) {
877
1.03M
        memcpy(dpfont1->key_name.chars, ((pdf_name *)font->BaseFont)->data, ((pdf_name *)font->BaseFont)->length);
878
1.03M
        dpfont1->key_name.size = ((pdf_name *)font->BaseFont)->length;
879
1.03M
        dpfont1->key_name.chars[dpfont1->key_name.size] = '\0';
880
1.03M
        memcpy(dpfont1->font_name.chars, ((pdf_name *)font->BaseFont)->data, ((pdf_name *)font->BaseFont)->length);
881
1.03M
        dpfont1->font_name.size = ((pdf_name *)font->BaseFont)->length;
882
1.03M
        dpfont1->font_name.chars[dpfont1->font_name.size] = '\0';
883
1.03M
    }
884
885
1.03M
    font->Encoding = NULL;
886
1.03M
    font->ToUnicode = NULL;
887
1.03M
    font->Widths = NULL;
888
889
1.03M
    pdfi_font_set_first_last_char(ctx, font_dict, (pdf_font *)font);
890
1.03M
    (void)pdfi_font_create_widths(ctx, font_dict, (pdf_font *)font, (double)(0.001 / hypot(dpfont1->FontMatrix.xx, dpfont1->FontMatrix.xy)));
891
892
1.03M
    font->descflags = 0;
893
1.03M
    if (font->FontDescriptor != NULL) {
894
40.3k
        code = pdfi_dict_get_int(ctx, font->FontDescriptor, "Flags", &font->descflags);
895
40.3k
        if (code >= 0) {
896
            /* If both the symbolic and non-symbolic flag are set,
897
               believe that latter.
898
             */
899
40.1k
            if ((font->descflags & 32) != 0)
900
28.9k
                font->descflags = (font->descflags & ~4);
901
40.1k
        }
902
40.3k
    }
903
904
1.03M
    if (pdfi_font_known_symbolic(font->BaseFont)) {
905
2.67k
        force_symbolic = true;
906
2.67k
        font->descflags |= 4;
907
2.67k
    }
908
909
1.03M
    tmp = NULL;
910
1.03M
    code = pdfi_dict_knownget(ctx, font_dict, "Encoding", &tmp);
911
1.03M
    if (code == 1) {
912
54.5k
        if (pdfi_type_of(tmp) == PDF_NAME && force_symbolic == true) {
913
0
            font->Encoding = spdffont->Encoding;
914
0
            pdfi_countup(font->Encoding);
915
0
        }
916
54.5k
        else if (pdfi_type_of(tmp) == PDF_DICT && (font->descflags & 4) != 0) {
917
5.02k
            code = pdfi_create_Encoding(ctx, (pdf_font *)font, tmp, (pdf_obj *)spdffont->Encoding, (pdf_obj **) &font->Encoding);
918
5.02k
            if (code >= 0)
919
5.02k
                code = 1;
920
5.02k
        }
921
49.5k
        else {
922
49.5k
            code = pdfi_create_Encoding(ctx, (pdf_font *)font, tmp, NULL, (pdf_obj **) & font->Encoding);
923
49.5k
            if (code >= 0)
924
48.5k
                code = 1;
925
49.5k
        }
926
54.5k
        pdfi_countdown(tmp);
927
54.5k
        tmp = NULL;
928
54.5k
    }
929
982k
    else {
930
982k
        pdfi_countdown(tmp);
931
982k
        tmp = NULL;
932
982k
        code = 0;
933
982k
    }
934
935
1.03M
    if (code <= 0) {
936
983k
        font->Encoding = spdffont->Encoding;
937
983k
        pdfi_countup(font->Encoding);
938
983k
    }
939
940
1.03M
    code = uid_copy(&font->pfont->UID, font->pfont->memory, "pdfi_copy_type1_font");
941
1.03M
    if (code < 0) {
942
0
        uid_set_invalid(&font->pfont->UID);
943
0
    }
944
1.03M
    if (spdffont->filename == NULL) {
945
160
        code = pdfi_font_generate_pseudo_XUID(ctx, font_dict, font->pfont);
946
160
        if (code < 0) {
947
0
            goto error;
948
0
        }
949
160
    }
950
951
1.03M
    if (ctx->args.ignoretounicode != true) {
952
1.03M
        code = pdfi_dict_get(ctx, font_dict, "ToUnicode", (pdf_obj **)&tmp);
953
1.03M
        if (code >= 0 && pdfi_type_of(tmp) == PDF_STREAM) {
954
11.2k
            pdf_cmap *tu = NULL;
955
11.2k
            code = pdfi_read_cmap(ctx, tmp, &tu);
956
11.2k
            pdfi_countdown(tmp);
957
11.2k
            tmp = (pdf_obj *)tu;
958
11.2k
        }
959
1.03M
        if (code < 0 || (tmp != NULL && pdfi_type_of(tmp) != PDF_CMAP)) {
960
1.02M
            pdfi_countdown(tmp);
961
1.02M
            tmp = NULL;
962
1.02M
            code = 0;
963
1.02M
        }
964
1.03M
    }
965
0
    else {
966
0
        tmp = NULL;
967
0
    }
968
1.03M
    font->ToUnicode = tmp;
969
970
1.03M
    pdfi_font_set_orig_fonttype(ctx, (pdf_font *)font);
971
1.03M
    code = gs_definefont(ctx->font_dir, (gs_font *) font->pfont);
972
1.03M
    if (code < 0) {
973
0
        goto error;
974
0
    }
975
976
1.03M
    code = pdfi_fapi_passfont((pdf_font *) font, 0, NULL, NULL, NULL, 0);
977
1.03M
    if (code < 0) {
978
0
        goto error;
979
0
    }
980
    /* object_num can be zero if the dictionary was defined inline */
981
1.03M
    if (font->object_num != 0) {
982
65.1k
        (void)replace_cache_entry(ctx, (pdf_obj *) font);
983
65.1k
    }
984
985
1.03M
    *tpdffont = (pdf_font *)font;
986
987
1.03M
error:
988
1.03M
    if (code < 0)
989
0
        pdfi_countdown(font);
990
991
1.03M
    return code;
992
1.03M
}
993
994
int
995
pdfi_free_font_type1(pdf_obj *font)
996
1.11M
{
997
1.11M
    pdf_font_type1 *t1f = (pdf_font_type1 *) font;
998
999
1.11M
    gs_free_object(OBJ_MEMORY(font), t1f->pfont, "Free Type 1 gs_font");
1000
1001
1.11M
    pdfi_countdown(t1f->PDF_font);
1002
1.11M
    pdfi_countdown(t1f->BaseFont);
1003
1.11M
    pdfi_countdown(t1f->FontDescriptor);
1004
1.11M
    pdfi_countdown(t1f->Name);
1005
1.11M
    pdfi_countdown(t1f->Encoding);
1006
1.11M
    pdfi_countdown(t1f->ToUnicode);
1007
1.11M
    pdfi_countdown(t1f->CharStrings);
1008
1.11M
    pdfi_countdown(t1f->blenddesignpositions);
1009
1.11M
    pdfi_countdown(t1f->blenddesignmap);
1010
1.11M
    pdfi_countdown(t1f->blendfontbbox);
1011
1.11M
    pdfi_countdown(t1f->blendaxistypes);
1012
1.11M
    pdfi_countdown(t1f->Subrs);
1013
1.11M
    pdfi_countdown(t1f->filename);
1014
1.11M
    pdfi_countdown(t1f->copyright);
1015
1.11M
    pdfi_countdown(t1f->notice);
1016
1.11M
    pdfi_countdown(t1f->fullname);
1017
1.11M
    pdfi_countdown(t1f->familyname);
1018
1019
1.11M
    gs_free_object(OBJ_MEMORY(font), t1f->Widths, "Free Type 1 fontWidths");
1020
    gs_free_object(OBJ_MEMORY(font), t1f, "Free Type 1 font");
1021
1.11M
    return 0;
1022
1.11M
}