4 pdf_cmap_size(fz_context *ctx, pdf_cmap *cmap)
8 if (cmap->storable.refs < 0)
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;
18 * Load CMap stream in PDF file
21 pdf_load_embedded_cmap(pdf_document *doc, pdf_obj *stmobj)
23 fz_stream *file = NULL;
24 pdf_cmap *cmap = NULL;
28 fz_context *ctx = doc->ctx;
36 if (pdf_obj_marked(stmobj))
37 fz_throw(ctx, FZ_ERROR_GENERIC, "Recursion in embedded cmap");
39 if ((cmap = pdf_find_item(ctx, pdf_free_cmap_imp, stmobj)) != NULL)
46 file = pdf_open_stream(doc, pdf_to_num(stmobj), pdf_to_gen(stmobj));
48 cmap = pdf_load_cmap(ctx, file);
53 wmode = pdf_dict_gets(stmobj, "WMode");
54 if (pdf_is_int(wmode))
55 pdf_set_cmap_wmode(ctx, cmap, pdf_to_int(wmode));
56 obj = pdf_dict_gets(stmobj, "UseCMap");
59 usecmap = pdf_load_system_cmap(ctx, pdf_to_name(obj));
60 pdf_set_usecmap(ctx, cmap, usecmap);
61 pdf_drop_cmap(ctx, usecmap);
63 else if (pdf_is_indirect(obj))
67 usecmap = pdf_load_embedded_cmap(doc, obj);
70 pdf_set_usecmap(ctx, cmap, usecmap);
71 pdf_drop_cmap(ctx, usecmap);
74 pdf_store_item(ctx, stmobj, cmap, pdf_cmap_size(ctx, cmap));
81 pdf_drop_cmap(ctx, cmap);
83 fz_rethrow_message(ctx, "cannot open cmap stream (%d %d R)", pdf_to_num(stmobj), pdf_to_gen(stmobj));
85 fz_rethrow_message(ctx, "cannot parse cmap stream (%d %d R)", pdf_to_num(stmobj), pdf_to_gen(stmobj));
87 fz_rethrow_message(ctx, "cannot load system usecmap '%s'", pdf_to_name(obj));
92 fz_rethrow_message(ctx, "cannot load embedded usecmap (%d %d R)", pdf_to_num(obj), pdf_to_gen(obj));
100 * Create an Identity-* CMap (for both 1 and 2-byte encodings)
103 pdf_new_identity_cmap(fz_context *ctx, int wmode, int bytes)
105 pdf_cmap *cmap = pdf_new_cmap(ctx);
108 unsigned int high = (1 << (bytes * 8)) - 1;
109 sprintf(cmap->cmap_name, "Identity-%c", wmode ? 'V' : 'H');
110 pdf_add_codespace(ctx, cmap, 0, high, bytes);
111 pdf_map_range_to_range(ctx, cmap, 0, high, 0);
112 pdf_sort_cmap(ctx, cmap);
113 pdf_set_cmap_wmode(ctx, cmap, wmode);
117 pdf_drop_cmap(ctx, cmap);
124 * Load predefined CMap from system.
127 pdf_load_system_cmap(fz_context *ctx, char *cmap_name)
132 cmap = pdf_load_builtin_cmap(ctx, cmap_name);
134 fz_throw(ctx, FZ_ERROR_GENERIC, "no builtin cmap file: %s", cmap_name);
136 if (cmap->usecmap_name[0] && !cmap->usecmap)
138 usecmap = pdf_load_system_cmap(ctx, cmap->usecmap_name);
140 fz_throw(ctx, FZ_ERROR_GENERIC, "no builtin cmap file: %s", cmap->usecmap_name);
141 pdf_set_usecmap(ctx, cmap, usecmap);