Coverage Report

Created: 2026-04-01 07:17

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