Go to most recent revision | Details | Last modification | View Log | RSS feed
Rev | Author | Line No. | Line |
---|---|---|---|
4680 | right-hear | 1 | #ifndef _MUXPS_H_ |
2 | #define _MUXPS_H_ |
||
3 | |||
4 | #ifndef _FITZ_H_ |
||
5 | #error "fitz.h must be included before muxps.h" |
||
6 | #endif |
||
7 | |||
8 | typedef unsigned char byte; |
||
9 | |||
10 | /* |
||
11 | * XPS and ZIP constants. |
||
12 | */ |
||
13 | |||
14 | typedef struct xps_context_s xps_context; |
||
15 | |||
16 | #define REL_START_PART \ |
||
17 | "http://schemas.microsoft.com/xps/2005/06/fixedrepresentation" |
||
18 | #define REL_REQUIRED_RESOURCE \ |
||
19 | "http://schemas.microsoft.com/xps/2005/06/required-resource" |
||
20 | #define REL_REQUIRED_RESOURCE_RECURSIVE \ |
||
21 | "http://schemas.microsoft.com/xps/2005/06/required-resource#recursive" |
||
22 | |||
23 | #define ZIP_LOCAL_FILE_SIG 0x04034b50 |
||
24 | #define ZIP_DATA_DESC_SIG 0x08074b50 |
||
25 | #define ZIP_CENTRAL_DIRECTORY_SIG 0x02014b50 |
||
26 | #define ZIP_END_OF_CENTRAL_DIRECTORY_SIG 0x06054b50 |
||
27 | |||
28 | /* |
||
29 | * Memory, and string functions. |
||
30 | */ |
||
31 | |||
32 | int xps_strcasecmp(char *a, char *b); |
||
33 | void xps_absolute_path(char *output, char *base_uri, char *path, int output_size); |
||
34 | |||
35 | /* |
||
36 | * XML document model |
||
37 | */ |
||
38 | |||
39 | typedef struct element xml_element; |
||
40 | |||
41 | xml_element *xml_parse_document(byte *buf, int len); |
||
42 | xml_element *xml_next(xml_element *item); |
||
43 | xml_element *xml_down(xml_element *item); |
||
44 | char *xml_tag(xml_element *item); |
||
45 | char *xml_att(xml_element *item, const char *att); |
||
46 | void xml_free_element(xml_element *item); |
||
47 | void xml_print_element(xml_element *item, int level); |
||
48 | |||
49 | /* |
||
50 | * Container parts. |
||
51 | */ |
||
52 | |||
53 | typedef struct xps_part_s xps_part; |
||
54 | |||
55 | struct xps_part_s |
||
56 | { |
||
57 | char *name; |
||
58 | int size; |
||
59 | int cap; |
||
60 | byte *data; |
||
61 | }; |
||
62 | |||
63 | xps_part *xps_new_part(xps_context *ctx, char *name, int size); |
||
64 | xps_part *xps_read_part(xps_context *ctx, char *partname); |
||
65 | void xps_free_part(xps_context *ctx, xps_part *part); |
||
66 | |||
67 | /* |
||
68 | * Document structure. |
||
69 | */ |
||
70 | |||
71 | typedef struct xps_document_s xps_document; |
||
72 | typedef struct xps_page_s xps_page; |
||
73 | |||
74 | struct xps_document_s |
||
75 | { |
||
76 | char *name; |
||
77 | xps_document *next; |
||
78 | }; |
||
79 | |||
80 | struct xps_page_s |
||
81 | { |
||
82 | char *name; |
||
83 | int width; |
||
84 | int height; |
||
85 | xml_element *root; |
||
86 | xps_page *next; |
||
87 | }; |
||
88 | |||
89 | int xps_read_page_list(xps_context *ctx); |
||
90 | void xps_debug_page_list(xps_context *ctx); |
||
91 | void xps_free_page_list(xps_context *ctx); |
||
92 | |||
93 | int xps_count_pages(xps_context *ctx); |
||
94 | int xps_load_page(xps_page **page, xps_context *ctx, int number); |
||
95 | void xps_free_page(xps_context *ctx, xps_page *page); |
||
96 | |||
97 | /* |
||
98 | * Images, fonts, and colorspaces. |
||
99 | */ |
||
100 | |||
101 | int xps_decode_jpeg(fz_pixmap **imagep, byte *rbuf, int rlen); |
||
102 | int xps_decode_png(fz_pixmap **imagep, byte *rbuf, int rlen); |
||
103 | int xps_decode_tiff(fz_pixmap **imagep, byte *rbuf, int rlen); |
||
104 | |||
105 | typedef struct xps_font_cache_s xps_font_cache; |
||
106 | |||
107 | struct xps_font_cache_s |
||
108 | { |
||
109 | char *name; |
||
110 | fz_font *font; |
||
111 | xps_font_cache *next; |
||
112 | }; |
||
113 | |||
114 | typedef struct xps_glyph_metrics_s xps_glyph_metrics; |
||
115 | |||
116 | struct xps_glyph_metrics_s |
||
117 | { |
||
118 | float hadv, vadv, vorg; |
||
119 | }; |
||
120 | |||
121 | int xps_count_font_encodings(fz_font *font); |
||
122 | void xps_identify_font_encoding(fz_font *font, int idx, int *pid, int *eid); |
||
123 | void xps_select_font_encoding(fz_font *font, int idx); |
||
124 | int xps_encode_font_char(fz_font *font, int key); |
||
125 | |||
126 | void xps_measure_font_glyph(xps_context *ctx, fz_font *font, int gid, xps_glyph_metrics *mtx); |
||
127 | |||
128 | void xps_debug_path(xps_context *ctx); |
||
129 | |||
130 | void xps_parse_color(xps_context *ctx, char *base_uri, char *hexstring, fz_colorspace **csp, float *samples); |
||
131 | void xps_set_color(xps_context *ctx, fz_colorspace *colorspace, float *samples); |
||
132 | |||
133 | /* |
||
134 | * Resource dictionaries. |
||
135 | */ |
||
136 | |||
137 | typedef struct xps_resource_s xps_resource; |
||
138 | |||
139 | struct xps_resource_s |
||
140 | { |
||
141 | char *name; |
||
142 | char *base_uri; /* only used in the head nodes */ |
||
143 | xml_element *base_xml; /* only used in the head nodes, to free the xml document */ |
||
144 | xml_element *data; |
||
145 | xps_resource *next; |
||
146 | xps_resource *parent; /* up to the previous dict in the stack */ |
||
147 | }; |
||
148 | |||
149 | int xps_parse_resource_dictionary(xps_context *ctx, xps_resource **dictp, char *base_uri, xml_element *root); |
||
150 | void xps_free_resource_dictionary(xps_context *ctx, xps_resource *dict); |
||
151 | void xps_resolve_resource_reference(xps_context *ctx, xps_resource *dict, char **attp, xml_element **tagp, char **urip); |
||
152 | |||
153 | void xps_debug_resource_dictionary(xps_resource *dict); |
||
154 | |||
155 | /* |
||
156 | * Fixed page/graphics parsing. |
||
157 | */ |
||
158 | |||
159 | void xps_parse_fixed_page(xps_context *ctx, fz_matrix ctm, xps_page *page); |
||
160 | void xps_parse_canvas(xps_context *ctx, fz_matrix ctm, fz_rect area, char *base_uri, xps_resource *dict, xml_element *node); |
||
161 | void xps_parse_path(xps_context *ctx, fz_matrix ctm, char *base_uri, xps_resource *dict, xml_element *node); |
||
162 | void xps_parse_glyphs(xps_context *ctx, fz_matrix ctm, char *base_uri, xps_resource *dict, xml_element *node); |
||
163 | void xps_parse_solid_color_brush(xps_context *ctx, fz_matrix ctm, char *base_uri, xps_resource *dict, xml_element *node); |
||
164 | void xps_parse_image_brush(xps_context *ctx, fz_matrix ctm, fz_rect area, char *base_uri, xps_resource *dict, xml_element *node); |
||
165 | void xps_parse_visual_brush(xps_context *ctx, fz_matrix ctm, fz_rect area, char *base_uri, xps_resource *dict, xml_element *node); |
||
166 | void xps_parse_linear_gradient_brush(xps_context *ctx, fz_matrix ctm, fz_rect area, char *base_uri, xps_resource *dict, xml_element *node); |
||
167 | void xps_parse_radial_gradient_brush(xps_context *ctx, fz_matrix ctm, fz_rect area, char *base_uri, xps_resource *dict, xml_element *node); |
||
168 | |||
169 | void xps_parse_tiling_brush(xps_context *ctx, fz_matrix ctm, fz_rect area, char *base_uri, xps_resource *dict, xml_element *root, void(*func)(xps_context*, fz_matrix, fz_rect, char*, xps_resource*, xml_element*, void*), void *user); |
||
170 | |||
171 | void xps_parse_matrix_transform(xps_context *ctx, xml_element *root, fz_matrix *matrix); |
||
172 | void xps_parse_render_transform(xps_context *ctx, char *text, fz_matrix *matrix); |
||
173 | void xps_parse_rectangle(xps_context *ctx, char *text, fz_rect *rect); |
||
174 | |||
175 | void xps_begin_opacity(xps_context *ctx, fz_matrix ctm, fz_rect area, char *base_uri, xps_resource *dict, char *opacity_att, xml_element *opacity_mask_tag); |
||
176 | void xps_end_opacity(xps_context *ctx, char *base_uri, xps_resource *dict, char *opacity_att, xml_element *opacity_mask_tag); |
||
177 | |||
178 | void xps_parse_brush(xps_context *ctx, fz_matrix ctm, fz_rect area, char *base_uri, xps_resource *dict, xml_element *node); |
||
179 | void xps_parse_element(xps_context *ctx, fz_matrix ctm, fz_rect area, char *base_uri, xps_resource *dict, xml_element *node); |
||
180 | |||
181 | void xps_clip(xps_context *ctx, fz_matrix ctm, xps_resource *dict, char *clip_att, xml_element *clip_tag); |
||
182 | |||
183 | /* |
||
184 | * The interpreter context. |
||
185 | */ |
||
186 | |||
187 | typedef struct xps_entry_s xps_entry; |
||
188 | |||
189 | struct xps_entry_s |
||
190 | { |
||
191 | char *name; |
||
192 | int offset; |
||
193 | int csize; |
||
194 | int usize; |
||
195 | }; |
||
196 | |||
197 | struct xps_context_s |
||
198 | { |
||
199 | char *directory; |
||
200 | fz_stream *file; |
||
201 | int zip_count; |
||
202 | xps_entry *zip_table; |
||
203 | |||
204 | char *start_part; /* fixed document sequence */ |
||
205 | xps_document *first_fixdoc; /* first fixed document */ |
||
206 | xps_document *last_fixdoc; /* last fixed document */ |
||
207 | xps_page *first_page; /* first page of document */ |
||
208 | xps_page *last_page; /* last page of document */ |
||
209 | |||
210 | char *base_uri; /* base uri for parsing XML and resolving relative paths */ |
||
211 | char *part_uri; /* part uri for parsing metadata relations */ |
||
212 | |||
213 | /* We cache font resources */ |
||
214 | xps_font_cache *font_table; |
||
215 | |||
216 | /* Opacity attribute stack */ |
||
217 | float opacity[64]; |
||
218 | int opacity_top; |
||
219 | |||
220 | /* Current color */ |
||
221 | fz_colorspace *colorspace; |
||
222 | float color[8]; |
||
223 | float alpha; |
||
224 | |||
225 | /* Current device */ |
||
226 | fz_device *dev; |
||
227 | }; |
||
228 | |||
229 | int xps_open_file(xps_context **ctxp, char *filename); |
||
230 | int xps_open_stream(xps_context **ctxp, fz_stream *file); |
||
231 | void xps_free_context(xps_context *ctx); |
||
232 | |||
233 | #endif |