Coverage Report

Created: 2025-06-24 07:01

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