diff options
Diffstat (limited to 'source')
-rw-r--r-- | source/pdf/pdf-interpret.c | 97 |
1 files changed, 59 insertions, 38 deletions
diff --git a/source/pdf/pdf-interpret.c b/source/pdf/pdf-interpret.c index 35de1815..19f855f0 100644 --- a/source/pdf/pdf-interpret.c +++ b/source/pdf/pdf-interpret.c @@ -71,6 +71,11 @@ struct pdf_csi_s /* usage mode for optional content groups */ char *event; /* "View", "Print", "Export" */ + /* Current resource dict and file. These are in here to reduce param + * passing. */ + pdf_obj *rdb; + fz_stream *file; + /* interpreter stack */ pdf_obj *obj; char name[256]; @@ -1822,9 +1827,10 @@ pdf_run_extgstate(pdf_csi *csi, pdf_obj *rdb, pdf_obj *extgstate) * Operators */ -static void pdf_run_BDC(pdf_csi *csi, pdf_obj *rdb) +static void pdf_run_BDC(pdf_csi *csi) { pdf_obj *ocg; + pdf_obj *rdb = csi->rdb; /* If we are already in a hidden OCG, then we'll still be hidden - * just increment the depth so we pop back to visibility when we've @@ -1851,9 +1857,11 @@ static void pdf_run_BDC(pdf_csi *csi, pdf_obj *rdb) csi->in_hidden_ocg++; } -static void pdf_run_BI(pdf_csi *csi, pdf_obj *rdb, fz_stream *file) +static void pdf_run_BI(pdf_csi *csi) { fz_context *ctx = csi->dev->ctx; + pdf_obj *rdb = csi->rdb; + fz_stream *file = csi->file; int ch; fz_image *img; pdf_obj *obj; @@ -1925,11 +1933,12 @@ static void pdf_run_Bstar(pdf_csi *csi) pdf_show_path(csi, 0, 1, 1, 1); } -static void pdf_run_cs_imp(pdf_csi *csi, pdf_obj *rdb, int what) +static void pdf_run_cs_imp(pdf_csi *csi, int what) { fz_context *ctx = csi->dev->ctx; fz_colorspace *colorspace; pdf_obj *obj, *dict; + pdf_obj *rdb = csi->rdb; if (!strcmp(csi->name, "Pattern")) { @@ -1960,30 +1969,31 @@ static void pdf_run_cs_imp(pdf_csi *csi, pdf_obj *rdb, int what) } } -static void pdf_run_CS(pdf_csi *csi, pdf_obj *rdb) +static void pdf_run_CS(pdf_csi *csi) { csi->dev->flags &= ~FZ_DEVFLAG_STROKECOLOR_UNDEFINED; - pdf_run_cs_imp(csi, rdb, PDF_STROKE); + pdf_run_cs_imp(csi, PDF_STROKE); } -static void pdf_run_cs(pdf_csi *csi, pdf_obj *rdb) +static void pdf_run_cs(pdf_csi *csi) { csi->dev->flags &= ~FZ_DEVFLAG_FILLCOLOR_UNDEFINED; - pdf_run_cs_imp(csi, rdb, PDF_FILL); + pdf_run_cs_imp(csi, PDF_FILL); } static void pdf_run_DP(pdf_csi *csi) { } -static void pdf_run_Do(pdf_csi *csi, pdf_obj *rdb) +static void pdf_run_Do(pdf_csi *csi) { fz_context *ctx = csi->dev->ctx; pdf_obj *dict; pdf_obj *obj; pdf_obj *subtype; + pdf_obj *rdb = csi->rdb; dict = pdf_dict_gets(rdb, "XObject"); if (!dict) @@ -2135,13 +2145,14 @@ static void pdf_run_S(pdf_csi *csi) pdf_show_path(csi, 0, 0, 1, 0); } -static void pdf_run_SC_imp(pdf_csi *csi, pdf_obj *rdb, int what, pdf_material *mat) +static void pdf_run_SC_imp(pdf_csi *csi, int what, pdf_material *mat) { fz_context *ctx = csi->dev->ctx; pdf_obj *patterntype; pdf_obj *dict; pdf_obj *obj; int kind; + pdf_obj *rdb = csi->rdb; kind = mat->kind; if (csi->name[0]) @@ -2193,18 +2204,20 @@ static void pdf_run_SC_imp(pdf_csi *csi, pdf_obj *rdb, int what, pdf_material *m mat->gstate_num = csi->gparent; } -static void pdf_run_SC(pdf_csi *csi, pdf_obj *rdb) +static void pdf_run_SC(pdf_csi *csi) { pdf_gstate *gstate = csi->gstate + csi->gtop; + csi->dev->flags &= ~FZ_DEVFLAG_STROKECOLOR_UNDEFINED; - pdf_run_SC_imp(csi, rdb, PDF_STROKE, &gstate->stroke); + pdf_run_SC_imp(csi, PDF_STROKE, &gstate->stroke); } -static void pdf_run_sc(pdf_csi *csi, pdf_obj *rdb) +static void pdf_run_sc(pdf_csi *csi) { pdf_gstate *gstate = csi->gstate + csi->gtop; + csi->dev->flags &= ~FZ_DEVFLAG_FILLCOLOR_UNDEFINED; - pdf_run_SC_imp(csi, rdb, PDF_FILL, &gstate->fill); + pdf_run_SC_imp(csi, PDF_FILL, &gstate->fill); } static void pdf_run_Tc(pdf_csi *csi) @@ -2233,9 +2246,10 @@ static void pdf_run_TL(pdf_csi *csi) gstate->leading = csi->stack[0]; } -static void pdf_run_Tf(pdf_csi *csi, pdf_obj *rdb) +static void pdf_run_Tf(pdf_csi *csi) { fz_context *ctx = csi->dev->ctx; + pdf_obj *rdb = csi->rdb; pdf_gstate *gstate = csi->gstate + csi->gtop; pdf_obj *dict; pdf_obj *obj; @@ -2421,11 +2435,12 @@ static void pdf_run_g(pdf_csi *csi) pdf_set_color(csi, PDF_FILL, csi->stack); } -static void pdf_run_gs(pdf_csi *csi, pdf_obj *rdb) +static void pdf_run_gs(pdf_csi *csi) { pdf_obj *dict; pdf_obj *obj; fz_context *ctx = csi->dev->ctx; + pdf_obj *rdb = csi->rdb; dict = pdf_dict_gets(rdb, "ExtGState"); if (!dict) @@ -2516,14 +2531,15 @@ static void pdf_run_ri(pdf_csi *csi) { } -static void pdf_run(pdf_csi *csi) +static void pdf_run_s(pdf_csi *csi) { pdf_show_path(csi, 1, 0, 1, 0); } -static void pdf_run_sh(pdf_csi *csi, pdf_obj *rdb) +static void pdf_run_sh(pdf_csi *csi) { fz_context *ctx = csi->dev->ctx; + pdf_obj *rdb = csi->rdb; pdf_obj *dict; pdf_obj *obj; fz_shade *shd; @@ -2618,7 +2634,7 @@ static void pdf_run_dquote(pdf_csi *csi) #define C(a,b,c) (a | b << 8 | c << 16) static int -pdf_run_keyword(pdf_csi *csi, pdf_obj *rdb, fz_stream *file, char *buf) +pdf_run_keyword(pdf_csi *csi, char *buf) { fz_context *ctx = csi->dev->ctx; int key; @@ -2641,19 +2657,17 @@ pdf_run_keyword(pdf_csi *csi, pdf_obj *rdb, fz_stream *file, char *buf) case A('\''): pdf_run_squote(csi); break; case A('B'): pdf_run_B(csi); break; case B('B','*'): pdf_run_Bstar(csi); break; - case C('B','D','C'): pdf_run_BDC(csi, rdb); break; - case B('B','I'): - pdf_run_BI(csi, rdb, file); - break; + case C('B','D','C'): pdf_run_BDC(csi); break; + case B('B','I'): pdf_run_BI(csi); break; case C('B','M','C'): pdf_run_BMC(csi); break; case B('B','T'): pdf_run_BT(csi); break; case B('B','X'): pdf_run_BX(csi); break; - case B('C','S'): pdf_run_CS(csi, rdb); break; + case B('C','S'): pdf_run_CS(csi); break; case B('D','P'): pdf_run_DP(csi); break; case B('D','o'): fz_try(ctx) { - pdf_run_Do(csi, rdb); + pdf_run_Do(csi); } fz_catch(ctx) { @@ -2672,8 +2686,8 @@ pdf_run_keyword(pdf_csi *csi, pdf_obj *rdb, fz_stream *file, char *buf) case A('Q'): pdf_run_Q(csi); break; case B('R','G'): pdf_run_RG(csi); break; case A('S'): pdf_run_S(csi); break; - case B('S','C'): pdf_run_SC(csi, rdb); break; - case C('S','C','N'): pdf_run_SC(csi, rdb); break; + case B('S','C'): pdf_run_SC(csi); break; + case C('S','C','N'): pdf_run_SC(csi); break; case B('T','*'): pdf_run_Tstar(csi); break; case B('T','D'): pdf_run_TD(csi); break; case B('T','J'): pdf_run_TJ(csi); break; @@ -2683,7 +2697,7 @@ pdf_run_keyword(pdf_csi *csi, pdf_obj *rdb, fz_stream *file, char *buf) case B('T','f'): fz_try(ctx) { - pdf_run_Tf(csi, rdb); + pdf_run_Tf(csi); } fz_catch(ctx) { @@ -2702,7 +2716,7 @@ pdf_run_keyword(pdf_csi *csi, pdf_obj *rdb, fz_stream *file, char *buf) case B('b','*'): pdf_run_bstar(csi); break; case A('c'): pdf_run_c(csi); break; case B('c','m'): pdf_run_cm(csi); break; - case B('c','s'): pdf_run_cs(csi, rdb); break; + case B('c','s'): pdf_run_cs(csi); break; case A('d'): pdf_run_d(csi); break; case B('d','0'): pdf_run_d0(csi); break; case B('d','1'): pdf_run_d1(csi); break; @@ -2712,7 +2726,7 @@ pdf_run_keyword(pdf_csi *csi, pdf_obj *rdb, fz_stream *file, char *buf) case B('g','s'): fz_try(ctx) { - pdf_run_gs(csi, rdb); + pdf_run_gs(csi); } fz_catch(ctx) { @@ -2730,13 +2744,13 @@ pdf_run_keyword(pdf_csi *csi, pdf_obj *rdb, fz_stream *file, char *buf) case B('r','e'): pdf_run_re(csi); break; case B('r','g'): pdf_run_rg(csi); break; case B('r','i'): pdf_run_ri(csi); break; - case A('s'): pdf_run(csi); break; - case B('s','c'): pdf_run_sc(csi, rdb); break; - case C('s','c','n'): pdf_run_sc(csi, rdb); break; + case A('s'): pdf_run_s(csi); break; + case B('s','c'): pdf_run_sc(csi); break; + case C('s','c','n'): pdf_run_sc(csi); break; case B('s','h'): fz_try(ctx) { - pdf_run_sh(csi, rdb); + pdf_run_sh(csi); } fz_catch(ctx) { @@ -2758,9 +2772,10 @@ pdf_run_keyword(pdf_csi *csi, pdf_obj *rdb, fz_stream *file, char *buf) } static void -pdf_run_stream(pdf_csi *csi, pdf_obj *rdb, fz_stream *file, pdf_lexbuf *buf) +pdf_run_stream(pdf_csi *csi, pdf_lexbuf *buf) { fz_context *ctx = csi->dev->ctx; + fz_stream *file = csi->file; pdf_token tok = PDF_TOK_ERROR; int in_text_array = 0; int ignoring_errors = 0; @@ -2908,7 +2923,7 @@ pdf_run_stream(pdf_csi *csi, pdf_obj *rdb, fz_stream *file, pdf_lexbuf *buf) break; case PDF_TOK_KEYWORD: - if (pdf_run_keyword(csi, rdb, file, buf->scratch)) + if (pdf_run_keyword(csi, buf->scratch)) { tok = PDF_TOK_EOF; } @@ -2963,6 +2978,8 @@ pdf_run_contents_stream(pdf_csi *csi, pdf_obj *rdb, fz_stream *file) int save_in_text; int save_gbot; pdf_obj *save_obj; + pdf_obj *save_rdb = csi->rdb; + fz_stream *save_file = csi->file; fz_var(buf); @@ -2977,14 +2994,20 @@ pdf_run_contents_stream(pdf_csi *csi, pdf_obj *rdb, fz_stream *file) csi->gbot = csi->gtop; save_obj = csi->obj; csi->obj = NULL; + csi->rdb = rdb; + csi->file = file; fz_try(ctx) { - pdf_run_stream(csi, rdb, file, buf); + pdf_run_stream(csi, buf); } fz_always(ctx) { pdf_drop_obj(csi->obj); csi->obj = save_obj; + csi->rdb = save_rdb; + csi->file = save_file; + pdf_lexbuf_fin(buf); + fz_free(ctx, buf); } fz_catch(ctx) { @@ -2995,8 +3018,6 @@ pdf_run_contents_stream(pdf_csi *csi, pdf_obj *rdb, fz_stream *file) pdf_grestore(csi); csi->gbot = save_gbot; csi->in_text = save_in_text; - pdf_lexbuf_fin(buf); - fz_free(ctx, buf); } static void |