summaryrefslogtreecommitdiff
path: root/source/pdf/pdf-interpret-imp.h
diff options
context:
space:
mode:
Diffstat (limited to 'source/pdf/pdf-interpret-imp.h')
-rw-r--r--source/pdf/pdf-interpret-imp.h151
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