Coverage Report

Created: 2026-09-14 07:34

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