Coverage Report

Created: 2025-06-10 07:27

/src/ghostpdl/pdf/pdf_font1.c
Line
Count
Source (jump to first uncovered line)
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
3.30k
{
67
3.30k
    int code = 0;
68
3.30k
    pdf_obj *o;
69
3.30k
    const pdfi_t1_glyph_name_equivalents_t *gne = pdfi_t1_glyph_name_equivalents;
70
16.5k
    while(gne->name != NULL && code >= 0) {
71
13.2k
        code = pdfi_dict_get(cstrings->ctx, cstrings, gne->name, &o);
72
13.2k
        if (code >= 0) {
73
10.3k
            code = pdfi_dict_put(cstrings->ctx, cstrings, gne->altname, o);
74
10.3k
            pdfi_countdown(o);
75
10.3k
        }
76
13.2k
        if (code == gs_error_undefined)
77
2.85k
            code = 0;
78
13.2k
        gne++;
79
13.2k
    }
80
81
3.30k
    if (code >= 0) {
82
3.30k
        bool key_known;
83
3.30k
        pdf_string *pstr;
84
3.30k
        byte notdefstr[] = { 0x9E, 0x35, 0xCE, 0xD7, 0xFF, 0xD3, 0x62, 0x2F, 0x09 };
85
86
3.30k
        code = pdfi_dict_known(cstrings->ctx, cstrings, ".notdef", &key_known);
87
3.30k
        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
129
            code = pdfi_object_alloc(cstrings->ctx, PDF_STRING, sizeof(notdefstr), (pdf_obj **) &pstr);
92
129
            if (code >= 0) {
93
129
                memcpy(pstr->data, notdefstr, sizeof(notdefstr));
94
129
                (void)pdfi_dict_put(cstrings->ctx, cstrings, ".notdef", (pdf_obj *) pstr);
95
129
            }
96
129
        }
97
3.30k
    }
98
3.30k
}
99
100
/* CALLBACKS */
101
static int
102
pdfi_t1_glyph_data(gs_font_type1 *pfont, gs_glyph glyph, gs_glyph_data_t *pgd)
103
19.2k
{
104
19.2k
    int code = 0;
105
19.2k
    pdf_font_type1 *pdffont1 = (pdf_font_type1 *) pfont->client_data;
106
19.2k
    pdf_context *ctx = (pdf_context *) pdffont1->ctx;
107
19.2k
    pdf_name *glyphname = NULL;
108
19.2k
    pdf_string *charstring = NULL;
109
19.2k
    gs_const_string gname;
110
111
19.2k
    code = (*ctx->get_glyph_name)((gs_font *)pfont, glyph, &gname);
112
19.2k
    if (code >= 0) {
113
19.2k
        code = pdfi_name_alloc(ctx, (byte *) gname.data, gname.size, (pdf_obj **)&glyphname);
114
19.2k
        if (code >= 0)
115
19.2k
            pdfi_countup(glyphname);
116
19.2k
    }
117
118
19.2k
    if (code >= 0) {
119
19.2k
        code = pdfi_dict_get_by_key(ctx, pdffont1->CharStrings, glyphname, (pdf_obj **)&charstring);
120
19.2k
        if (code < 0) {
121
93
            code = pdfi_map_glyph_name_via_agl(pdffont1->CharStrings, glyphname, &charstring);
122
93
        }
123
19.2k
        if (code >= 0)
124
19.1k
            gs_glyph_data_from_bytes(pgd, charstring->data, 0, charstring->length, NULL);
125
19.2k
    }
126
19.2k
    pdfi_countdown(charstring);
127
19.2k
    pdfi_countdown(glyphname);
128
129
19.2k
    return code;
130
19.2k
}
131
132
static int
133
pdfi_t1_subr_data(gs_font_type1 *pfont, int index, bool global, gs_glyph_data_t *pgd)
134
0
{
135
0
    int code = 0;
136
0
    pdf_font_type1 *pdffont1 = (pdf_font_type1 *) pfont->client_data;
137
138
0
    if (global == true || index < 0 || index >= (pdffont1->Subrs == NULL ? 0 : pdfi_array_size(pdffont1->Subrs))) {
139
0
        code = gs_note_error(gs_error_rangecheck);
140
0
    }
141
0
    else {
142
0
        pdf_string *subr_str = NULL;
143
0
        code = pdfi_array_get_type(pdffont1->ctx, pdffont1->Subrs, index, PDF_STRING, (pdf_obj **)&subr_str);
144
0
        if (code >= 0) {
145
0
            gs_glyph_data_from_bytes(pgd, subr_str->data, 0, subr_str->length, NULL);
146
0
        }
147
        /* decrementing is safe here, because the reference in the pdffont1->Subrs will persist */
148
0
        pdfi_countdown(subr_str);
149
0
    }
150
0
    return code;
151
0
}
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
0
{
156
0
    int code = 0;
157
0
    pdf_font_type1 *pdffont1 = (pdf_font_type1 *) pfont->client_data;
158
0
    pdf_context *ctx = (pdf_context *) pdffont1->ctx;
159
0
    gs_glyph glyph = gs_c_known_encode((gs_char)ccode, ENCODING_INDEX_STANDARD);
160
161
0
    if (glyph == GS_NO_GLYPH)
162
0
        return_error(gs_error_rangecheck);
163
164
0
    code = gs_c_glyph_name(glyph, gstr);
165
0
    if (code >= 0) {
166
0
        unsigned int nindex;
167
0
        code = (*ctx->get_glyph_index)((gs_font *)pfont, (byte *)gstr->data, gstr->size, &nindex);
168
0
        if (pglyph != NULL)
169
0
            *pglyph = (gs_glyph)nindex;
170
0
    }
171
172
0
    if (code >= 0) {
173
0
        pdf_name *glyphname = NULL;
174
0
        pdf_string *charstring = NULL;
175
0
        code = pdfi_name_alloc(ctx, (byte *) gstr->data, gstr->size, (pdf_obj **) &glyphname);
176
0
        if (code >= 0) {
177
0
            pdfi_countup(glyphname);
178
0
            code = pdfi_dict_get_by_key(ctx, pdffont1->CharStrings, glyphname, (pdf_obj **)&charstring);
179
0
            pdfi_countdown(glyphname);
180
0
            if (code >= 0) {
181
0
                if (pgd != NULL) {
182
0
                    gs_glyph_data_from_bytes(pgd, charstring->data, 0, charstring->length, NULL);
183
0
                }
184
0
                pdfi_countdown(charstring);
185
0
            }
186
0
        }
187
0
    }
188
189
0
    return code;
190
0
}
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
0
{
213
0
    int code;
214
0
    pdf_font_type1 *t1font = (pdf_font_type1 *) pfont->client_data;
215
0
    pdf_context *ctx = (pdf_context *) t1font->ctx;
216
0
    pdf_name *key;
217
0
    uint64_t i = (uint64_t) *pindex;
218
219
0
    (void)glyph_space;
220
221
0
    if (*pindex <= 0)
222
0
        code = pdfi_dict_key_first(ctx, t1font->CharStrings, (pdf_obj **) & key, &i);
223
0
    else
224
0
        code = pdfi_dict_key_next(ctx, t1font->CharStrings, (pdf_obj **) & key, &i);
225
0
    if (code < 0) {
226
0
        *pindex = 0;
227
0
        code = 0;
228
0
    }
229
0
    else {
230
0
        uint dummy = GS_NO_GLYPH;
231
232
0
        code = (*ctx->get_glyph_index)(pfont, key->data, key->length, &dummy);
233
0
        if (code < 0) {
234
0
            *pglyph = (gs_glyph) *pindex;
235
0
            goto exit;
236
0
        }
237
0
        *pglyph = dummy;
238
0
        if (*pglyph == GS_NO_GLYPH)
239
0
            *pglyph = (gs_glyph) *pindex;
240
0
        *pindex = (int)i;
241
0
    }
242
0
  exit:
243
0
    pdfi_countdown(key);
244
0
    return code;
245
0
}
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
0
{
253
0
    *pglyph = gs_c_name_glyph(gstr->data, gstr->size);
254
0
    return 0;
255
0
}
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
0
{
261
0
    gs_glyph_data_t gd;
262
0
    gs_glyph_data_t *pgd = &gd;
263
0
    gs_font_type1 *pfont1 = (gs_font_type1 *) pfont;
264
0
    int code = pdfi_t1_glyph_data(pfont1, glyph, pgd);
265
266
0
    if (code >= 0) {
267
0
        gs_type1_state cis = { 0 };
268
0
        gs_type1_state *pcis = &cis;
269
0
        gs_gstate gs;
270
0
        int value;
271
272
0
        if (pmat)
273
0
            gs_matrix_fixed_from_matrix(&gs.ctm, pmat);
274
0
        else {
275
0
            gs_matrix imat;
276
277
0
            gs_make_identity(&imat);
278
0
            gs_matrix_fixed_from_matrix(&gs.ctm, &imat);
279
0
        }
280
0
        gs.flatness = 0;
281
0
        code = gs_type1_interp_init(pcis, &gs, ppath, NULL, NULL, true, 0, pfont1);
282
0
        if (code < 0)
283
0
            return code;
284
285
0
        pcis->no_grid_fitting = true;
286
0
        gs_type1_set_callback_data(pcis, NULL);
287
        /* Continue interpreting. */
288
0
      icont:
289
0
        code = pfont1->data.interpret(pcis, pgd, &value);
290
0
        switch (code) {
291
0
            case 0:            /* all done */
292
                /* falls through */
293
0
            default:           /* code < 0, error */
294
0
                return code;
295
0
            case type1_result_callothersubr:   /* unknown OtherSubr */
296
0
                return_error(gs_error_rangecheck);      /* can't handle it */
297
0
            case type1_result_sbw:     /* [h]sbw, just continue */
298
0
                type1_cis_get_metrics(pcis, sbw);
299
0
                pgd = 0;
300
0
                goto icont;
301
0
        }
302
0
    }
303
0
    return code;
304
0
}
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
19.2k
{
309
19.2k
    if ((members & GLYPH_INFO_OUTLINE_WIDTHS) == 0)
310
19.2k
        return gs_type1_glyph_info(font, glyph, pmat, members, info);
311
312
0
    return gs_default_glyph_info(font, glyph, pmat, members, info);
313
19.2k
}
314
315
/* END CALLBACKS */
316
317
static stream *
318
push_pfb_filter(gs_memory_t *mem, byte *buf, byte *bufend)
319
26
{
320
26
    stream *fs, *ffs = NULL;
321
26
    stream *sstrm;
322
26
    stream_PFBD_state *st;
323
26
    byte *strbuf;
324
325
26
    sstrm = file_alloc_stream(mem, "push_pfb_filter(buf stream)");
326
26
    if (sstrm == NULL)
327
0
        return NULL;
328
329
26
    sread_string(sstrm, buf, bufend - buf);
330
26
    sstrm->close_at_eod = false;
331
332
26
    fs = s_alloc(mem, "push_pfb_filter(fs)");
333
26
    strbuf = gs_alloc_bytes(mem, 4096, "push_pfb_filter(buf)");
334
26
    st = gs_alloc_struct(mem, stream_PFBD_state, s_PFBD_template.stype, "push_pfb_filter(st)");
335
26
    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
26
    memset(st, 0x00, sizeof(stream_PFBD_state));
343
26
    (*s_PFBD_template.init)((stream_state *)st);
344
26
    st->binary_to_hex = true;
345
26
    s_std_init(fs, strbuf, 4096, &s_filter_read_procs, s_mode_read);
346
26
    st->memory = mem;
347
26
    st->templat = &s_PFBD_template;
348
26
    fs->state = (stream_state *) st;
349
26
    fs->procs.process = s_PFBD_template.process;
350
26
    fs->strm = sstrm;
351
26
    fs->close_at_eod = false;
352
26
    ffs = fs;
353
26
  done:
354
26
    return ffs;
355
26
}
356
357
static void
358
pop_pfb_filter(gs_memory_t *mem, stream *s)
359
26
{
360
26
    stream *src = s->strm;
361
26
    byte *b = s->cbuf;
362
363
26
    sclose(s);
364
26
    gs_free_object(mem, s, "push_pfb_filter(s)");
365
26
    gs_free_object(mem, b, "push_pfb_filter(b)");
366
26
    if (src)
367
26
        sclose(src);
368
26
    gs_free_object(mem, src, "push_pfb_filter(strm)");
369
26
}
370
371
static int
372
pdfi_t1_decode_pfb(pdf_context *ctx, byte *inbuf, int inlen, byte **outbuf, int *outlen)
373
13
{
374
13
    stream *strm;
375
13
    int c, code = 0;
376
13
    int decodelen = 0;
377
13
    byte *d, *decodebuf = NULL;
378
379
13
    *outbuf = NULL;
380
13
    *outlen = 0;
381
382
13
    strm = push_pfb_filter(ctx->memory, inbuf, inbuf + inlen);
383
13
    if (strm == NULL) {
384
0
        code = gs_note_error(gs_error_VMerror);
385
0
    }
386
13
    else {
387
364k
        while (1) {
388
364k
            c = sgetc(strm);
389
364k
            if (c < 0)
390
13
                break;
391
364k
            decodelen++;
392
364k
        }
393
13
        pop_pfb_filter(ctx->memory, strm);
394
13
        decodebuf = gs_alloc_bytes(ctx->memory, decodelen, "pdfi_t1_decode_pfb(decodebuf)");
395
13
        if (decodebuf == NULL) {
396
0
            code = gs_note_error(gs_error_VMerror);
397
0
        }
398
13
        else {
399
13
            d = decodebuf;
400
13
            strm = push_pfb_filter(ctx->memory, inbuf, inbuf + inlen);
401
364k
            while (1) {
402
364k
                c = sgetc(strm);
403
364k
                if (c < 0)
404
13
                    break;
405
364k
                *d = c;
406
364k
                d++;
407
364k
            }
408
13
            pop_pfb_filter(ctx->memory, strm);
409
13
            *outbuf = decodebuf;
410
13
            *outlen = decodelen;
411
13
        }
412
13
    }
413
13
    return code;
414
13
}
415
416
static int
417
pdfi_alloc_t1_font(pdf_context *ctx, pdf_font_type1 **font, uint32_t obj_num)
418
45.1k
{
419
45.1k
    pdf_font_type1 *t1font = NULL;
420
45.1k
    gs_font_type1 *pfont = NULL;
421
422
45.1k
    t1font = (pdf_font_type1 *) gs_alloc_bytes(ctx->memory, sizeof(pdf_font_type1), "pdfi (type 1 pdf_font)");
423
45.1k
    if (t1font == NULL)
424
0
        return_error(gs_error_VMerror);
425
426
45.1k
    memset(t1font, 0x00, sizeof(pdf_font_type1));
427
45.1k
    t1font->ctx = ctx;
428
45.1k
    t1font->type = PDF_FONT;
429
45.1k
    t1font->ctx = ctx;
430
45.1k
    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
45.1k
    pdfi_countup(t1font);
438
439
45.1k
    pfont = (gs_font_type1 *) gs_alloc_struct(ctx->memory, gs_font_type1, &st_gs_font_type1, "pdfi (Type 1 pfont)");
440
45.1k
    if (pfont == NULL) {
441
0
        pdfi_countdown(t1font);
442
0
        return_error(gs_error_VMerror);
443
0
    }
444
45.1k
    memset(pfont, 0x00, sizeof(gs_font_type1));
445
446
45.1k
    t1font->pfont = (gs_font_base *) pfont;
447
448
45.1k
    gs_make_identity(&pfont->orig_FontMatrix);
449
45.1k
    gs_make_identity(&pfont->FontMatrix);
450
45.1k
    pfont->next = pfont->prev = 0;
451
45.1k
    pfont->memory = ctx->memory;
452
45.1k
    pfont->dir = ctx->font_dir;
453
45.1k
    pfont->is_resource = false;
454
45.1k
    gs_notify_init(&pfont->notify_list, ctx->memory);
455
45.1k
    pfont->base = (gs_font *) t1font->pfont;
456
45.1k
    pfont->client_data = t1font;
457
45.1k
    pfont->WMode = 0;
458
45.1k
    pfont->PaintType = 0;
459
45.1k
    pfont->StrokeWidth = 0;
460
45.1k
    pfont->is_cached = 0;
461
45.1k
    pfont->FAPI = NULL;
462
45.1k
    pfont->FAPI_font_data = NULL;
463
45.1k
    pfont->procs.init_fstack = gs_default_init_fstack;
464
45.1k
    pfont->procs.next_char_glyph = gs_default_next_char_glyph;
465
45.1k
    pfont->FontType = ft_encrypted;
466
45.1k
    pfont->ExactSize = fbit_use_outlines;
467
45.1k
    pfont->InBetweenSize = fbit_use_outlines;
468
45.1k
    pfont->TransformedChar = fbit_use_outlines;
469
    /* We may want to do something clever with an XUID here */
470
45.1k
    pfont->id = gs_next_ids(ctx->memory, 1);
471
45.1k
    uid_set_UniqueID(&pfont->UID, pfont->id);
472
473
45.1k
    pfont->encoding_index = ENCODING_INDEX_UNKNOWN;
474
45.1k
    pfont->nearest_encoding_index = ENCODING_INDEX_UNKNOWN;
475
476
45.1k
    pfont->client_data = (void *)t1font;
477
478
45.1k
    *font = t1font;
479
45.1k
    return 0;
480
45.1k
}
481
482
static void
483
pdfi_t1_font_set_procs(pdf_context *ctx, pdf_font_type1 *font)
484
3.30k
{
485
3.30k
    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
3.30k
    pfont->procs.build_char = NULL;
490
491
3.30k
    pfont->procs.encode_char = pdfi_encode_char;
492
3.30k
    pfont->procs.glyph_name = ctx->get_glyph_name;
493
3.30k
    pfont->procs.decode_glyph = pdfi_decode_glyph;
494
3.30k
    pfont->procs.define_font = gs_no_define_font;
495
3.30k
    pfont->procs.make_font = gs_no_make_font;
496
497
3.30k
    font->default_font_info = gs_default_font_info;
498
3.30k
    pfont->procs.font_info = pdfi_default_font_info;
499
500
3.30k
    pfont->procs.glyph_info = pdfi_t1_glyph_info;
501
3.30k
    pfont->procs.glyph_outline = pdfi_t1_glyph_outline;
502
3.30k
    pfont->procs.same_font = gs_default_same_font;
503
3.30k
    pfont->procs.enumerate_glyph = pdfi_t1_enumerate_glyph;
504
505
3.30k
    pfont->data.procs.glyph_data = pdfi_t1_glyph_data;
506
3.30k
    pfont->data.procs.subr_data = pdfi_t1_subr_data;
507
3.30k
    pfont->data.procs.seac_data = pdfi_t1_seac_data;
508
3.30k
    pfont->data.procs.push_values = pdfi_t1_push;
509
3.30k
    pfont->data.procs.pop_value = pdfi_t1_pop;
510
3.30k
    pfont->data.interpret = gs_type1_interpret;
511
3.30k
}
512
513
static inline void
514
pdfi_type1_font_priv_defaults(ps_font_interp_private *pfpriv)
515
3.86k
{
516
3.86k
    pfpriv->gsu.gst1.data.lenIV = 4;
517
3.86k
    pfpriv->gsu.gst1.data.ExpansionFactor = 0.06;
518
3.86k
    pfpriv->gsu.gst1.data.BlueShift = 7;
519
3.86k
    pfpriv->gsu.gst1.data.BlueFuzz = 1;
520
3.86k
    pfpriv->gsu.gst1.data.BlueScale = 0.039625;
521
3.86k
    uid_set_invalid(&pfpriv->gsu.gst1.UID);
522
3.86k
}
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
3.86k
{
527
3.86k
    int code = 0;
528
3.86k
    double x_scale;
529
3.86k
    pdf_obj *fontdesc = NULL;
530
3.86k
    pdf_obj *basefont = NULL;
531
3.86k
    pdf_obj *mapname = NULL;
532
3.86k
    pdf_obj *tmp = NULL;
533
3.86k
    pdf_font_type1 *t1f = NULL;
534
3.86k
    pdf_obj *tounicode = NULL;
535
3.86k
    ps_font_interp_private fpriv = { 0 };
536
3.86k
    bool key_known;
537
3.86k
    bool force_symbolic = false;
538
539
3.86k
    if (font_dict != NULL)
540
1.23k
        (void)pdfi_dict_knownget_type(ctx, font_dict, "FontDescriptor", PDF_DICT, &fontdesc);
541
542
3.86k
    if (fbuf[0] == 128 && fbuf[1] == 1) {
543
13
        byte *decodebuf = NULL;
544
13
        int decodelen;
545
546
13
        code = pdfi_t1_decode_pfb(ctx, fbuf, fbuflen, &decodebuf, &decodelen);
547
13
        gs_free_object(ctx->memory, fbuf, "pdfi_read_type1_font");
548
13
        if (code < 0) {
549
0
            gs_free_object(ctx->memory, decodebuf, "pdfi_read_type1_font");
550
0
        }
551
13
        fbuf = decodebuf;
552
13
        fbuflen = decodelen;
553
13
    }
554
555
3.86k
    if (code >= 0) {
556
3.86k
        pdfi_type1_font_priv_defaults(&fpriv);
557
3.86k
        code = pdfi_read_ps_font(ctx, font_dict, fbuf, fbuflen, &fpriv);
558
3.86k
        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
3.86k
        if (code < 0 || fpriv.u.t1.CharStrings == NULL || pdfi_type_of(fpriv.u.t1.CharStrings) != PDF_DICT
562
3.86k
            || fpriv.u.t1.CharStrings->entries == 0) {
563
552
                code = gs_note_error(gs_error_invalidfont);
564
552
                goto error;
565
552
        }
566
3.30k
        code = pdfi_alloc_t1_font(ctx, &t1f, font_dict != NULL ? font_dict->object_num : 0);
567
3.30k
        if (code >= 0) {
568
3.30k
            gs_font_type1 *pfont1 = (gs_font_type1 *) t1f->pfont;
569
570
3.30k
            memcpy(&pfont1->data, &fpriv.gsu.gst1.data, sizeof(pfont1->data));
571
572
3.30k
            pdfi_t1_font_set_procs(ctx, t1f);
573
574
3.30k
            memcpy(&pfont1->FontMatrix, &fpriv.gsu.gst1.FontMatrix, sizeof(pfont1->FontMatrix));
575
3.30k
            memcpy(&pfont1->orig_FontMatrix, &fpriv.gsu.gst1.orig_FontMatrix, sizeof(pfont1->orig_FontMatrix));
576
3.30k
            memcpy(&pfont1->FontBBox, &fpriv.gsu.gst1.FontBBox, sizeof(pfont1->FontBBox));
577
3.30k
            memcpy(&pfont1->key_name, &fpriv.gsu.gst1.key_name, sizeof(pfont1->key_name));
578
3.30k
            memcpy(&pfont1->font_name, &fpriv.gsu.gst1.font_name, sizeof(pfont1->font_name));
579
3.30k
            if (fpriv.gsu.gst1.UID.id != 0)
580
3.30k
                memcpy(&pfont1->UID, &fpriv.gsu.gst1.UID, sizeof(pfont1->UID));
581
3.30k
            fpriv.gsu.gst1.UID.xvalues = NULL; /* In case of error */
582
3.30k
            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
3.30k
            else
588
3.30k
                pfont1->WMode = 0;
589
3.30k
            pfont1->PaintType = fpriv.gsu.gst1.PaintType;
590
3.30k
            pfont1->StrokeWidth = fpriv.gsu.gst1.StrokeWidth;
591
592
3.30k
            if (font_dict != NULL) {
593
681
                t1f->object_num = font_dict->object_num;
594
681
                t1f->generation_num = font_dict->generation_num;
595
681
                t1f->indirect_num = font_dict->indirect_num;
596
681
                t1f->indirect_gen = font_dict->indirect_gen;
597
681
            }
598
599
3.30k
            t1f->PDF_font = font_dict;
600
3.30k
            pdfi_countup(font_dict);
601
3.30k
            t1f->FontDescriptor = (pdf_dict *) fontdesc;
602
3.30k
            pdfi_countup(fontdesc);
603
3.30k
            t1f->Name = mapname;
604
3.30k
            pdfi_countup(mapname);
605
606
            /* We want basefont, but we can live without it */
607
3.30k
            if (font_dict != NULL) {
608
681
                (void)pdfi_dict_knownget_type(ctx, font_dict, "BaseFont", PDF_NAME, &basefont);
609
681
                t1f->BaseFont = basefont;
610
681
                pdfi_countup(basefont);
611
681
            }
612
613
3.30k
            if (t1f->FontDescriptor != NULL) {
614
681
                code = pdfi_dict_get_int(ctx, t1f->FontDescriptor, "Flags", &t1f->descflags);
615
681
                if (code >= 0) {
616
                    /* If both the symbolic and non-symbolic flag are set,
617
                       believe that latter.
618
                     */
619
681
                    if ((t1f->descflags & 32) != 0)
620
202
                        t1f->descflags = (t1f->descflags & ~4);
621
681
                }
622
681
            }
623
624
3.30k
            if (pdfi_font_known_symbolic(basefont)) {
625
3
                force_symbolic = true;
626
3
                t1f->descflags |= 4;
627
3
            }
628
629
3.30k
            if (ctx->args.ignoretounicode != true && font_dict != NULL) {
630
681
                code = pdfi_dict_get(ctx, font_dict, "ToUnicode", (pdf_obj **)&tounicode);
631
681
                if (code >= 0 && pdfi_type_of(tounicode) == PDF_STREAM) {
632
58
                    pdf_cmap *tu = NULL;
633
58
                    code = pdfi_read_cmap(ctx, tounicode, &tu);
634
58
                    pdfi_countdown(tounicode);
635
58
                    tounicode = (pdf_obj *)tu;
636
58
                }
637
681
                if (code < 0 || (tounicode != NULL && pdfi_type_of(tounicode) != PDF_CMAP)) {
638
623
                    pdfi_countdown(tounicode);
639
623
                    tounicode = NULL;
640
623
                    code = 0;
641
623
                }
642
681
            }
643
2.62k
            else {
644
2.62k
                tounicode = NULL;
645
2.62k
            }
646
3.30k
            t1f->ToUnicode = tounicode;
647
3.30k
            tounicode = NULL;
648
649
3.30k
            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
3.30k
            x_scale = 0.001 / hypot(pfont1->FontMatrix.xx, pfont1->FontMatrix.xy);
656
657
            /* ignore errors with widths... for now */
658
3.30k
            if (font_dict != NULL)
659
681
                (void)pdfi_font_create_widths(ctx, font_dict, (pdf_font*)t1f, x_scale);
660
661
3.30k
            if (font_dict != NULL)
662
681
                code = pdfi_dict_knownget(ctx, font_dict, "Encoding", &tmp);
663
2.62k
            else
664
2.62k
                code = gs_error_undefined;
665
3.30k
            if (code == 1) {
666
555
                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
555
                else if (pdfi_type_of(tmp) == PDF_DICT && (t1f->descflags & 4) != 0) {
671
375
                    code = pdfi_create_Encoding(ctx, (pdf_font *)t1f, tmp, (pdf_obj *)fpriv.u.t1.Encoding, (pdf_obj **) & t1f->Encoding);
672
375
                    if (code >= 0)
673
375
                        code = 1;
674
375
                }
675
180
                else {
676
180
                    code = pdfi_create_Encoding(ctx, (pdf_font *)t1f, tmp, NULL, (pdf_obj **) & t1f->Encoding);
677
180
                    if (code >= 0)
678
178
                        code = 1;
679
180
                }
680
555
                pdfi_countdown(tmp);
681
555
                tmp = NULL;
682
555
            }
683
2.75k
            else {
684
2.75k
                pdfi_countdown(tmp);
685
2.75k
                tmp = NULL;
686
2.75k
                code = 0;
687
2.75k
            }
688
689
3.30k
            if (code <= 0) {
690
2.75k
                t1f->Encoding = fpriv.u.t1.Encoding;
691
2.75k
                pdfi_countup(t1f->Encoding);
692
2.75k
            }
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
3.30k
            if (uid_is_XUID(&t1f->pfont->UID))
700
3.30k
                uid_free(&t1f->pfont->UID, t1f->pfont->memory, "pdfi_read_type1_font");
701
3.30k
            uid_set_invalid(&t1f->pfont->UID);
702
703
3.30k
            t1f->CharStrings = fpriv.u.t1.CharStrings;
704
3.30k
            pdfi_countup(t1f->CharStrings);
705
3.30k
            pdfi_patch_charstrings_dict(t1f->CharStrings);
706
707
3.30k
            t1f->Subrs = fpriv.u.t1.Subrs;
708
3.30k
            fpriv.u.t1.Subrs = NULL;
709
710
3.30k
            t1f->copyright = fpriv.u.t1.copyright;
711
3.30k
            t1f->notice = fpriv.u.t1.notice;
712
3.30k
            t1f->fullname = fpriv.u.t1.fullname;
713
3.30k
            t1f->familyname = fpriv.u.t1.familyname;
714
3.30k
            fpriv.u.t1.copyright = fpriv.u.t1.notice = fpriv.u.t1.fullname = fpriv.u.t1.familyname = NULL;
715
716
3.30k
            code = pdfi_font_generate_pseudo_XUID(ctx, font_dict, t1f->pfont);
717
3.30k
            if (code < 0) {
718
0
                goto error;
719
0
            }
720
721
3.30k
            t1f->blenddesignpositions = fpriv.u.t1.blenddesignpositions;
722
3.30k
            pdfi_countup(t1f->blenddesignpositions);
723
3.30k
            t1f->blenddesignmap = fpriv.u.t1.blenddesignmap;
724
3.30k
            pdfi_countup(t1f->blenddesignmap);
725
3.30k
            t1f->blendfontbbox = fpriv.u.t1.blendfontbbox;
726
3.30k
            pdfi_countup(t1f->blendfontbbox);
727
3.30k
            t1f->blendaxistypes = fpriv.u.t1.blendaxistypes;
728
3.30k
            pdfi_countup(t1f->blendaxistypes);
729
730
3.30k
            key_known = false;
731
3.30k
            if (t1f->FontDescriptor != NULL) {
732
681
                 code = pdfi_dict_known(ctx, t1f->FontDescriptor, "FontFile", &key_known);
733
681
                 if (code < 0 || key_known == false) {
734
23
                     code = pdfi_dict_known(ctx, t1f->FontDescriptor, "FontFile2", &key_known);
735
23
                     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
23
                 }
742
681
            }
743
3.30k
            t1f->pfont->is_resource = (key_known == false);
744
745
3.30k
            pdfi_font_set_orig_fonttype(ctx, (pdf_font *)t1f);
746
3.30k
            code = gs_definefont(ctx->font_dir, (gs_font *) t1f->pfont);
747
3.30k
            if (code < 0) {
748
0
                goto error;
749
0
            }
750
751
3.30k
            code = pdfi_fapi_passfont((pdf_font *) t1f, 0, NULL, NULL, NULL, 0);
752
3.30k
            if (code < 0) {
753
0
                goto error;
754
0
            }
755
            /* object_num can be zero if the dictionary was defined inline */
756
3.30k
            if (t1f->object_num != 0) {
757
658
                (void)replace_cache_entry(ctx, (pdf_obj *) t1f);
758
658
            }
759
3.30k
            *ppdffont = (pdf_font *) t1f;
760
3.30k
        }
761
3.30k
    }
762
763
3.86k
  error:
764
3.86k
    pdfi_countdown(fontdesc);
765
3.86k
    pdfi_countdown(basefont);
766
3.86k
    pdfi_countdown(tounicode);
767
3.86k
    pdfi_countdown(mapname);
768
3.86k
    pdfi_countdown(tmp);
769
3.86k
    pdfi_countdown(fpriv.u.t1.Encoding);
770
3.86k
    pdfi_countdown(fpriv.u.t1.CharStrings);
771
3.86k
    pdfi_countdown(fpriv.u.t1.blenddesignpositions);
772
3.86k
    pdfi_countdown(fpriv.u.t1.blenddesignmap);
773
3.86k
    pdfi_countdown(fpriv.u.t1.blendfontbbox);
774
3.86k
    pdfi_countdown(fpriv.u.t1.blendaxistypes);
775
3.86k
    pdfi_countdown(fpriv.u.t1.Subrs);
776
3.86k
    pdfi_countdown(fpriv.u.t1.copyright);
777
3.86k
    pdfi_countdown(fpriv.u.t1.notice);
778
3.86k
    pdfi_countdown(fpriv.u.t1.fullname);
779
3.86k
    pdfi_countdown(fpriv.u.t1.familyname);
780
3.86k
    if (fpriv.gsu.gst1.UID.xvalues != NULL) {
781
0
        gs_free_object(ctx->memory, fpriv.gsu.gst1.UID.xvalues, "pdfi_read_type1_font(xuid)");
782
0
    }
783
784
3.86k
    if (code < 0) {
785
552
        tmp = NULL;
786
552
        if (font_dict != NULL) {
787
552
            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
552
            else {
798
552
                (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
552
            }
800
552
        }
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
552
        pdfi_countdown(tmp);
805
552
        pdfi_countdown(t1f);
806
552
    }
807
3.86k
    return code;
808
3.86k
}
809
810
int
811
pdfi_copy_type1_font(pdf_context *ctx, pdf_font *spdffont, pdf_dict *font_dict, pdf_font **tpdffont)
812
41.7k
{
813
41.7k
    int code = 0;
814
41.7k
    pdf_font_type1 *font = NULL;
815
41.7k
    gs_font_type1 *spfont1 = (gs_font_type1 *) spdffont->pfont;
816
41.7k
    gs_font_type1 *dpfont1;
817
41.7k
    gs_id t_id;
818
41.7k
    pdf_obj *tmp;
819
41.7k
    bool force_symbolic = false;
820
821
41.7k
    if (font_dict == NULL)
822
0
        return_error(gs_error_invalidfont);
823
824
41.7k
    code = pdfi_alloc_t1_font(ctx, &font, font_dict->object_num);
825
41.7k
    if (code < 0)
826
0
        return code;
827
41.7k
    dpfont1 = (gs_font_type1 *) font->pfont;
828
829
41.7k
    t_id = dpfont1->id;
830
41.7k
    memcpy(dpfont1, spfont1, sizeof(gs_font_type1));
831
41.7k
    dpfont1->id = t_id;
832
41.7k
    dpfont1->FAPI = NULL;
833
41.7k
    dpfont1->FAPI_font_data = NULL;
834
835
41.7k
    memcpy(font, spdffont, sizeof(pdf_font_type1));
836
41.7k
    font->pfont = (gs_font_base *)dpfont1;
837
41.7k
    font->refcnt = 1;
838
41.7k
    dpfont1->client_data = (void *)font;
839
41.7k
    font->filename = NULL;
840
841
41.7k
    dpfont1->notify_list.memory = NULL;
842
41.7k
    dpfont1->notify_list.first = NULL;
843
41.7k
    gs_notify_init(&dpfont1->notify_list, dpfont1->memory);
844
845
41.7k
    font->PDF_font = font_dict;
846
41.7k
    font->object_num = font_dict->object_num;
847
41.7k
    font->generation_num = font_dict->generation_num;
848
41.7k
    pdfi_countup(font->PDF_font);
849
850
    /* We want basefont and descriptor, but we can live without them */
851
41.7k
    font->BaseFont = NULL;
852
41.7k
    code = pdfi_dict_knownget_type(ctx, font_dict, "BaseFont", PDF_NAME, &font->BaseFont);
853
41.7k
    if (code < 0) {
854
12
        pdfi_countdown(font->BaseFont);
855
12
        font->BaseFont = NULL;
856
12
    }
857
41.7k
    font->FontDescriptor = NULL;
858
41.7k
    code = pdfi_dict_knownget_type(ctx, font_dict, "FontDescriptor", PDF_DICT, (pdf_obj **)&font->FontDescriptor);
859
41.7k
    if (code < 0) {
860
314
        pdfi_countdown(font->FontDescriptor);
861
314
        font->FontDescriptor = NULL;
862
314
    }
863
864
41.7k
    pdfi_countup(font->Name);
865
41.7k
    pdfi_countup(font->CharStrings);
866
41.7k
    pdfi_countup(font->blenddesignpositions);
867
41.7k
    pdfi_countup(font->blenddesignmap);
868
41.7k
    pdfi_countup(font->blendfontbbox);
869
41.7k
    pdfi_countup(font->blendaxistypes);
870
41.7k
    pdfi_countup(font->Subrs);
871
41.7k
    pdfi_countup(font->copyright);
872
41.7k
    pdfi_countup(font->notice);
873
41.7k
    pdfi_countup(font->fullname);
874
41.7k
    pdfi_countup(font->familyname);
875
876
41.7k
    if (font->BaseFont != NULL && ((pdf_name *)font->BaseFont)->length <= gs_font_name_max - 1) {
877
41.7k
        memcpy(dpfont1->key_name.chars, ((pdf_name *)font->BaseFont)->data, ((pdf_name *)font->BaseFont)->length);
878
41.7k
        dpfont1->key_name.size = ((pdf_name *)font->BaseFont)->length;
879
41.7k
        dpfont1->key_name.chars[dpfont1->key_name.size] = '\0';
880
41.7k
        memcpy(dpfont1->font_name.chars, ((pdf_name *)font->BaseFont)->data, ((pdf_name *)font->BaseFont)->length);
881
41.7k
        dpfont1->font_name.size = ((pdf_name *)font->BaseFont)->length;
882
41.7k
        dpfont1->font_name.chars[dpfont1->font_name.size] = '\0';
883
41.7k
    }
884
885
41.7k
    font->Encoding = NULL;
886
41.7k
    font->ToUnicode = NULL;
887
41.7k
    font->Widths = NULL;
888
889
41.7k
    pdfi_font_set_first_last_char(ctx, font_dict, (pdf_font *)font);
890
41.7k
    (void)pdfi_font_create_widths(ctx, font_dict, (pdf_font *)font, (double)(0.001 / hypot(dpfont1->FontMatrix.xx, dpfont1->FontMatrix.xy)));
891
892
41.7k
    font->descflags = 0;
893
41.7k
    if (font->FontDescriptor != NULL) {
894
1.78k
        code = pdfi_dict_get_int(ctx, font->FontDescriptor, "Flags", &font->descflags);
895
1.78k
        if (code >= 0) {
896
            /* If both the symbolic and non-symbolic flag are set,
897
               believe that latter.
898
             */
899
1.77k
            if ((font->descflags & 32) != 0)
900
1.04k
                font->descflags = (font->descflags & ~4);
901
1.77k
        }
902
1.78k
    }
903
904
41.7k
    if (pdfi_font_known_symbolic(font->BaseFont)) {
905
60
        force_symbolic = true;
906
60
        font->descflags |= 4;
907
60
    }
908
909
41.7k
    tmp = NULL;
910
41.7k
    code = pdfi_dict_knownget(ctx, font_dict, "Encoding", &tmp);
911
41.7k
    if (code == 1) {
912
2.29k
        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
2.29k
        else if (pdfi_type_of(tmp) == PDF_DICT && (font->descflags & 4) != 0) {
917
304
            code = pdfi_create_Encoding(ctx, (pdf_font *)font, tmp, (pdf_obj *)spdffont->Encoding, (pdf_obj **) &font->Encoding);
918
304
            if (code >= 0)
919
304
                code = 1;
920
304
        }
921
1.98k
        else {
922
1.98k
            code = pdfi_create_Encoding(ctx, (pdf_font *)font, tmp, NULL, (pdf_obj **) & font->Encoding);
923
1.98k
            if (code >= 0)
924
1.94k
                code = 1;
925
1.98k
        }
926
2.29k
        pdfi_countdown(tmp);
927
2.29k
        tmp = NULL;
928
2.29k
    }
929
39.5k
    else {
930
39.5k
        pdfi_countdown(tmp);
931
39.5k
        tmp = NULL;
932
39.5k
        code = 0;
933
39.5k
    }
934
935
41.7k
    if (code <= 0) {
936
39.5k
        font->Encoding = spdffont->Encoding;
937
39.5k
        pdfi_countup(font->Encoding);
938
39.5k
    }
939
940
41.7k
    code = uid_copy(&font->pfont->UID, font->pfont->memory, "pdfi_copy_type1_font");
941
41.7k
    if (code < 0) {
942
0
        uid_set_invalid(&font->pfont->UID);
943
0
    }
944
41.7k
    if (spdffont->filename == NULL) {
945
15
        code = pdfi_font_generate_pseudo_XUID(ctx, font_dict, font->pfont);
946
15
        if (code < 0) {
947
0
            goto error;
948
0
        }
949
15
    }
950
951
41.7k
    if (ctx->args.ignoretounicode != true) {
952
41.7k
        code = pdfi_dict_get(ctx, font_dict, "ToUnicode", (pdf_obj **)&tmp);
953
41.7k
        if (code >= 0 && pdfi_type_of(tmp) == PDF_STREAM) {
954
461
            pdf_cmap *tu = NULL;
955
461
            code = pdfi_read_cmap(ctx, tmp, &tu);
956
461
            pdfi_countdown(tmp);
957
461
            tmp = (pdf_obj *)tu;
958
461
        }
959
41.7k
        if (code < 0 || (tmp != NULL && pdfi_type_of(tmp) != PDF_CMAP)) {
960
41.3k
            pdfi_countdown(tmp);
961
41.3k
            tmp = NULL;
962
41.3k
            code = 0;
963
41.3k
        }
964
41.7k
    }
965
0
    else {
966
0
        tmp = NULL;
967
0
    }
968
41.7k
    font->ToUnicode = tmp;
969
970
41.7k
    pdfi_font_set_orig_fonttype(ctx, (pdf_font *)font);
971
41.7k
    code = gs_definefont(ctx->font_dir, (gs_font *) font->pfont);
972
41.7k
    if (code < 0) {
973
0
        goto error;
974
0
    }
975
976
41.7k
    code = pdfi_fapi_passfont((pdf_font *) font, 0, NULL, NULL, NULL, 0);
977
41.7k
    if (code < 0) {
978
0
        goto error;
979
0
    }
980
    /* object_num can be zero if the dictionary was defined inline */
981
41.7k
    if (font->object_num != 0) {
982
2.81k
        (void)replace_cache_entry(ctx, (pdf_obj *) font);
983
2.81k
    }
984
985
41.7k
    *tpdffont = (pdf_font *)font;
986
987
41.7k
error:
988
41.7k
    if (code < 0)
989
0
        pdfi_countdown(font);
990
991
41.7k
    return code;
992
41.7k
}
993
994
int
995
pdfi_free_font_type1(pdf_obj *font)
996
45.1k
{
997
45.1k
    pdf_font_type1 *t1f = (pdf_font_type1 *) font;
998
999
45.1k
    gs_free_object(OBJ_MEMORY(font), t1f->pfont, "Free Type 1 gs_font");
1000
1001
45.1k
    pdfi_countdown(t1f->PDF_font);
1002
45.1k
    pdfi_countdown(t1f->BaseFont);
1003
45.1k
    pdfi_countdown(t1f->FontDescriptor);
1004
45.1k
    pdfi_countdown(t1f->Name);
1005
45.1k
    pdfi_countdown(t1f->Encoding);
1006
45.1k
    pdfi_countdown(t1f->ToUnicode);
1007
45.1k
    pdfi_countdown(t1f->CharStrings);
1008
45.1k
    pdfi_countdown(t1f->blenddesignpositions);
1009
45.1k
    pdfi_countdown(t1f->blenddesignmap);
1010
45.1k
    pdfi_countdown(t1f->blendfontbbox);
1011
45.1k
    pdfi_countdown(t1f->blendaxistypes);
1012
45.1k
    pdfi_countdown(t1f->Subrs);
1013
45.1k
    pdfi_countdown(t1f->filename);
1014
45.1k
    pdfi_countdown(t1f->copyright);
1015
45.1k
    pdfi_countdown(t1f->notice);
1016
45.1k
    pdfi_countdown(t1f->fullname);
1017
45.1k
    pdfi_countdown(t1f->familyname);
1018
1019
45.1k
    gs_free_object(OBJ_MEMORY(font), t1f->Widths, "Free Type 1 fontWidths");
1020
45.1k
    gs_free_object(OBJ_MEMORY(font), t1f, "Free Type 1 font");
1021
45.1k
    return 0;
1022
45.1k
}