Coverage Report

Created: 2026-08-08 08:00

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