Coverage Report

Created: 2026-04-09 07:06

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