Coverage Report

Created: 2026-02-14 07:09

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