diff options
Diffstat (limited to 'source/pdf/pdf-interpret-imp.h')
-rw-r--r-- | source/pdf/pdf-interpret-imp.h | 151 |
1 files changed, 151 insertions, 0 deletions
diff --git a/source/pdf/pdf-interpret-imp.h b/source/pdf/pdf-interpret-imp.h new file mode 100644 index 00000000..2aafb830 --- /dev/null +++ b/source/pdf/pdf-interpret-imp.h @@ -0,0 +1,151 @@ +#ifndef PDF_INTERPRET_IMP_H +#define PDF_INTERPRET_IMP_H + +#include "mupdf/pdf.h" + +typedef struct pdf_csi_s pdf_csi; +typedef struct pdf_gstate_s pdf_gstate; + +typedef void (*pdf_operator_fn)(pdf_csi *, void *user); +typedef void (*pdf_process_annot_fn)(pdf_csi *csi, void *user, pdf_obj *resources, pdf_annot *annot); +typedef void (*pdf_process_stream_fn)(pdf_csi *csi, void *user, pdf_lexbuf *buf); +typedef void (*pdf_process_contents_fn)(pdf_csi *csi, void *user, pdf_obj *resources, pdf_obj *contents); + +typedef enum { + /* The first section of op's all run without a try/catch */ + PDF_OP_dquote, + PDF_OP_squote, + PDF_OP_B, + PDF_OP_Bstar, + PDF_OP_BDC, + PDF_OP_BI, + PDF_OP_BMC, + PDF_OP_BT, + PDF_OP_BX, + PDF_OP_CS, + PDF_OP_DP, + PDF_OP_EMC, + PDF_OP_ET, + PDF_OP_EX, + PDF_OP_F, + PDF_OP_G, + PDF_OP_J, + PDF_OP_K, + PDF_OP_M, + PDF_OP_MP, + PDF_OP_Q, + PDF_OP_RG, + PDF_OP_S, + PDF_OP_SC, + PDF_OP_SCN, + PDF_OP_Tstar, + PDF_OP_TD, + PDF_OP_TJ, + PDF_OP_TL, + PDF_OP_Tc, + PDF_OP_Td, + PDF_OP_Tj, + PDF_OP_Tm, + PDF_OP_Tr, + PDF_OP_Ts, + PDF_OP_Tw, + PDF_OP_Tz, + PDF_OP_W, + PDF_OP_Wstar, + PDF_OP_b, + PDF_OP_bstar, + PDF_OP_c, + PDF_OP_cm, + PDF_OP_cs, + PDF_OP_d, + PDF_OP_d0, + PDF_OP_d1, + PDF_OP_f, + PDF_OP_fstar, + PDF_OP_g, + PDF_OP_h, + PDF_OP_i, + PDF_OP_j, + PDF_OP_k, + PDF_OP_l, + PDF_OP_m, + PDF_OP_n, + PDF_OP_q, + PDF_OP_re, + PDF_OP_rg, + PDF_OP_ri, + PDF_OP_s, + PDF_OP_sc, + PDF_OP_scn, + PDF_OP_v, + PDF_OP_w, + PDF_OP_y, + /* ops in this second section require additional try/catch handling */ + PDF_OP_Do, + PDF_OP_Tf, + PDF_OP_gs, + PDF_OP_sh, + /* END is used to signify end of stream (finalise and close down) */ + PDF_OP_END, + /* And finally we have a max */ + PDF_OP_MAX +} PDF_OP; + +typedef struct pdf_processor_s { + pdf_operator_fn op_table[PDF_OP_MAX]; + pdf_process_annot_fn process_annot; + pdf_process_stream_fn process_stream; + pdf_process_contents_fn process_contents; +} pdf_processor; + +typedef struct pdf_process_s +{ + const pdf_processor *processor; + void *state; +} pdf_process; + +struct pdf_csi_s +{ + pdf_document *doc; + + /* Current resource dict and file. These are in here to reduce param + * passing. */ + pdf_obj *rdb; + fz_stream *file; + + /* Operator table */ + pdf_process process; + + /* interpreter stack */ + pdf_obj *obj; + char name[256]; + unsigned char string[256]; + int string_len; + float stack[32]; + int top; + + int xbalance; + int in_text; + + /* cookie support */ + fz_cookie *cookie; +}; + +static inline void pdf_process_op(pdf_csi *csi, int op, const pdf_process *process) +{ + process->processor->op_table[op](csi, process->state); +} + +void pdf_process_contents_object(pdf_csi *csi, pdf_obj *rdb, pdf_obj *contents); +void pdf_process_stream(pdf_csi *csi, pdf_lexbuf *buf); + +/* Functions to set up pdf_process structures */ +pdf_process *pdf_process_run(pdf_process *process, fz_device *dev, const fz_matrix *ctm, const char *event, pdf_gstate *gstate, int nested); + +/* Functions to actually use the pdf_process structures to process pages, + * annotations and glyphs */ +void pdf_process_annot(pdf_document *doc, pdf_page *page, pdf_annot *annot, const pdf_process *process, fz_cookie *cookie); +void pdf_process_page_contents(pdf_document *doc, pdf_page *page, const pdf_process *process, fz_cookie *cookie); +void pdf_process_glyph(pdf_document *doc, pdf_obj *resources, fz_buffer *contents, pdf_process *process); + +#endif |