Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
Download
7639 views
1
#include "mupdf/pdf.h"
2
3
unsigned int
4
pdf_cmap_size(fz_context *ctx, pdf_cmap *cmap)
5
{
6
if (cmap == NULL)
7
return 0;
8
if (cmap->storable.refs < 0)
9
return 0;
10
11
return pdf_cmap_size(ctx, cmap->usecmap) +
12
cmap->rcap * sizeof *cmap->ranges +
13
cmap->xcap * sizeof *cmap->xranges +
14
cmap->mcap * sizeof *cmap->mranges;
15
}
16
17
/*
18
* Load CMap stream in PDF file
19
*/
20
pdf_cmap *
21
pdf_load_embedded_cmap(fz_context *ctx, pdf_document *doc, pdf_obj *stmobj)
22
{
23
fz_stream *file = NULL;
24
pdf_cmap *cmap = NULL;
25
pdf_cmap *usecmap;
26
pdf_obj *wmode;
27
pdf_obj *obj = NULL;
28
int phase = 0;
29
30
fz_var(phase);
31
fz_var(obj);
32
fz_var(file);
33
fz_var(cmap);
34
35
if (pdf_obj_marked(ctx, stmobj))
36
fz_throw(ctx, FZ_ERROR_GENERIC, "Recursion in embedded cmap");
37
38
if ((cmap = pdf_find_item(ctx, pdf_drop_cmap_imp, stmobj)) != NULL)
39
{
40
return cmap;
41
}
42
43
fz_try(ctx)
44
{
45
file = pdf_open_stream(ctx, doc, pdf_to_num(ctx, stmobj), pdf_to_gen(ctx, stmobj));
46
phase = 1;
47
cmap = pdf_load_cmap(ctx, file);
48
phase = 2;
49
fz_drop_stream(ctx, file);
50
file = NULL;
51
52
wmode = pdf_dict_get(ctx, stmobj, PDF_NAME_WMode);
53
if (pdf_is_int(ctx, wmode))
54
pdf_set_cmap_wmode(ctx, cmap, pdf_to_int(ctx, wmode));
55
obj = pdf_dict_get(ctx, stmobj, PDF_NAME_UseCMap);
56
if (pdf_is_name(ctx, obj))
57
{
58
usecmap = pdf_load_system_cmap(ctx, pdf_to_name(ctx, obj));
59
pdf_set_usecmap(ctx, cmap, usecmap);
60
pdf_drop_cmap(ctx, usecmap);
61
}
62
else if (pdf_is_indirect(ctx, obj))
63
{
64
phase = 3;
65
pdf_mark_obj(ctx, obj);
66
usecmap = pdf_load_embedded_cmap(ctx, doc, obj);
67
pdf_unmark_obj(ctx, obj);
68
phase = 4;
69
pdf_set_usecmap(ctx, cmap, usecmap);
70
pdf_drop_cmap(ctx, usecmap);
71
}
72
73
pdf_store_item(ctx, stmobj, cmap, pdf_cmap_size(ctx, cmap));
74
}
75
fz_catch(ctx)
76
{
77
if (file)
78
fz_drop_stream(ctx, file);
79
if (cmap)
80
pdf_drop_cmap(ctx, cmap);
81
if (phase < 1)
82
fz_rethrow_message(ctx, "cannot open cmap stream (%d %d R)", pdf_to_num(ctx, stmobj), pdf_to_gen(ctx, stmobj));
83
else if (phase < 2)
84
fz_rethrow_message(ctx, "cannot parse cmap stream (%d %d R)", pdf_to_num(ctx, stmobj), pdf_to_gen(ctx, stmobj));
85
else if (phase < 3)
86
fz_rethrow_message(ctx, "cannot load system usecmap '%s'", pdf_to_name(ctx, obj));
87
else
88
{
89
if (phase == 3)
90
pdf_unmark_obj(ctx, obj);
91
fz_rethrow_message(ctx, "cannot load embedded usecmap (%d %d R)", pdf_to_num(ctx, obj), pdf_to_gen(ctx, obj));
92
}
93
}
94
95
return cmap;
96
}
97
98
/*
99
* Create an Identity-* CMap (for both 1 and 2-byte encodings)
100
*/
101
pdf_cmap *
102
pdf_new_identity_cmap(fz_context *ctx, int wmode, int bytes)
103
{
104
pdf_cmap *cmap = pdf_new_cmap(ctx);
105
fz_try(ctx)
106
{
107
unsigned int high = (1 << (bytes * 8)) - 1;
108
sprintf(cmap->cmap_name, "Identity-%c", wmode ? 'V' : 'H');
109
pdf_add_codespace(ctx, cmap, 0, high, bytes);
110
pdf_map_range_to_range(ctx, cmap, 0, high, 0);
111
pdf_sort_cmap(ctx, cmap);
112
pdf_set_cmap_wmode(ctx, cmap, wmode);
113
}
114
fz_catch(ctx)
115
{
116
pdf_drop_cmap(ctx, cmap);
117
fz_rethrow(ctx);
118
}
119
return cmap;
120
}
121
122
/*
123
* Load predefined CMap from system.
124
*/
125
pdf_cmap *
126
pdf_load_system_cmap(fz_context *ctx, char *cmap_name)
127
{
128
pdf_cmap *usecmap;
129
pdf_cmap *cmap;
130
131
cmap = pdf_load_builtin_cmap(ctx, cmap_name);
132
if (!cmap)
133
fz_throw(ctx, FZ_ERROR_GENERIC, "no builtin cmap file: %s", cmap_name);
134
135
if (cmap->usecmap_name[0] && !cmap->usecmap)
136
{
137
usecmap = pdf_load_system_cmap(ctx, cmap->usecmap_name);
138
if (!usecmap)
139
fz_throw(ctx, FZ_ERROR_GENERIC, "no builtin cmap file: %s", cmap->usecmap_name);
140
pdf_set_usecmap(ctx, cmap, usecmap);
141
}
142
143
return cmap;
144
}
145
146