Coverage Report

Created: 2025-08-28 07:06

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