]> rtime.felk.cvut.cz Git - hornmich/skoda-qr-demo.git/blob - QRScanner/mobile/jni/pdf/pdf-cmap-load.c
Add MuPDF native source codes
[hornmich/skoda-qr-demo.git] / QRScanner / mobile / jni / pdf / pdf-cmap-load.c
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(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         fz_context *ctx = doc->ctx;
29         int phase = 0;
30
31         fz_var(phase);
32         fz_var(obj);
33         fz_var(file);
34         fz_var(cmap);
35
36         if (pdf_obj_marked(stmobj))
37                 fz_throw(ctx, FZ_ERROR_GENERIC, "Recursion in embedded cmap");
38
39         if ((cmap = pdf_find_item(ctx, pdf_free_cmap_imp, stmobj)) != NULL)
40         {
41                 return cmap;
42         }
43
44         fz_try(ctx)
45         {
46                 file = pdf_open_stream(doc, pdf_to_num(stmobj), pdf_to_gen(stmobj));
47                 phase = 1;
48                 cmap = pdf_load_cmap(ctx, file);
49                 phase = 2;
50                 fz_close(file);
51                 file = NULL;
52
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");
57                 if (pdf_is_name(obj))
58                 {
59                         usecmap = pdf_load_system_cmap(ctx, pdf_to_name(obj));
60                         pdf_set_usecmap(ctx, cmap, usecmap);
61                         pdf_drop_cmap(ctx, usecmap);
62                 }
63                 else if (pdf_is_indirect(obj))
64                 {
65                         phase = 3;
66                         pdf_mark_obj(obj);
67                         usecmap = pdf_load_embedded_cmap(doc, obj);
68                         pdf_unmark_obj(obj);
69                         phase = 4;
70                         pdf_set_usecmap(ctx, cmap, usecmap);
71                         pdf_drop_cmap(ctx, usecmap);
72                 }
73
74                 pdf_store_item(ctx, stmobj, cmap, pdf_cmap_size(ctx, cmap));
75         }
76         fz_catch(ctx)
77         {
78                 if (file)
79                         fz_close(file);
80                 if (cmap)
81                         pdf_drop_cmap(ctx, cmap);
82                 if (phase < 1)
83                         fz_rethrow_message(ctx, "cannot open cmap stream (%d %d R)", pdf_to_num(stmobj), pdf_to_gen(stmobj));
84                 else if (phase < 2)
85                         fz_rethrow_message(ctx, "cannot parse cmap stream (%d %d R)", pdf_to_num(stmobj), pdf_to_gen(stmobj));
86                 else if (phase < 3)
87                         fz_rethrow_message(ctx, "cannot load system usecmap '%s'", pdf_to_name(obj));
88                 else
89                 {
90                         if (phase == 3)
91                                 pdf_unmark_obj(obj);
92                         fz_rethrow_message(ctx, "cannot load embedded usecmap (%d %d R)", pdf_to_num(obj), pdf_to_gen(obj));
93                 }
94         }
95
96         return cmap;
97 }
98
99 /*
100  * Create an Identity-* CMap (for both 1 and 2-byte encodings)
101  */
102 pdf_cmap *
103 pdf_new_identity_cmap(fz_context *ctx, int wmode, int bytes)
104 {
105         pdf_cmap *cmap = pdf_new_cmap(ctx);
106         fz_try(ctx)
107         {
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);
114         }
115         fz_catch(ctx)
116         {
117                 pdf_drop_cmap(ctx, cmap);
118                 fz_rethrow(ctx);
119         }
120         return cmap;
121 }
122
123 /*
124  * Load predefined CMap from system.
125  */
126 pdf_cmap *
127 pdf_load_system_cmap(fz_context *ctx, char *cmap_name)
128 {
129         pdf_cmap *usecmap;
130         pdf_cmap *cmap;
131
132         cmap = pdf_load_builtin_cmap(ctx, cmap_name);
133         if (!cmap)
134                 fz_throw(ctx, FZ_ERROR_GENERIC, "no builtin cmap file: %s", cmap_name);
135
136         if (cmap->usecmap_name[0] && !cmap->usecmap)
137         {
138                 usecmap = pdf_load_system_cmap(ctx, cmap->usecmap_name);
139                 if (!usecmap)
140                         fz_throw(ctx, FZ_ERROR_GENERIC, "no builtin cmap file: %s", cmap->usecmap_name);
141                 pdf_set_usecmap(ctx, cmap, usecmap);
142         }
143
144         return cmap;
145 }