Coverage Report

Created: 2026-10-28 08:05

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