diff options
author | Paul Gardiner <paulg.artifex@glidos.net> | 2012-08-29 14:56:08 +0100 |
---|---|---|
committer | Paul Gardiner <paulg.artifex@glidos.net> | 2012-08-29 14:56:08 +0100 |
commit | 0dfdec8b758c7b51880c36d0c4cdad5a6583fad4 (patch) | |
tree | 1d8ac9117ec230e0f010794b0a79b873642272ec | |
parent | 6a5b8879b3b3b2a9ef085f38c1758d62456b921b (diff) | |
download | mupdf-0dfdec8b758c7b51880c36d0c4cdad5a6583fad4.tar.xz |
Forms: implement javascript Field.display property
-rw-r--r-- | pdf/mupdf-internal.h | 2 | ||||
-rw-r--r-- | pdf/pdf_form.c | 107 | ||||
-rw-r--r-- | pdf/pdf_js.c | 38 | ||||
-rw-r--r-- | pdf/pdf_util.js | 6 |
4 files changed, 153 insertions, 0 deletions
diff --git a/pdf/mupdf-internal.h b/pdf/mupdf-internal.h index ec44a2f4..9229bf2d 100644 --- a/pdf/mupdf-internal.h +++ b/pdf/mupdf-internal.h @@ -573,6 +573,8 @@ void pdf_field_setBorderStyle(pdf_document *doc, pdf_obj *field, char *text); void pdf_field_buttonSetCaption(pdf_document *doc, pdf_obj *field, char *text); void pdf_field_setFillColor(pdf_document *doc, pdf_obj *field, pdf_obj *col); void pdf_field_setTextColor(pdf_document *doc, pdf_obj *field, pdf_obj *col); +int pdf_field_getDisplay(pdf_document *doc, pdf_obj *field); +void pdf_field_setDisplay(pdf_document *doc, pdf_obj *field, int d); /* * Page tree, pages and related objects diff --git a/pdf/pdf_form.c b/pdf/pdf_form.c index 1a902df3..f0d06177 100644 --- a/pdf/pdf_form.c +++ b/pdf/pdf_form.c @@ -23,6 +23,20 @@ enum enum { + F_Invisible = 1 << (1-1), + F_Hidden = 1 << (2-1), + F_Print = 1 << (3-1), + F_NoZoom = 1 << (4-1), + F_NoRotate = 1 << (5-1), + F_NoView = 1 << (6-1), + F_ReadOnly = 1 << (7-1), + F_Locked = 1 << (8-1), + F_ToggleNoView = 1 << (9-1), + F_LockedContents = 1 << (10-1) +}; + +enum +{ BS_Solid, BS_Dashed, BS_Beveled, @@ -30,6 +44,16 @@ enum BS_Underline }; +/* Must be kept in sync with definitions in pdf_util.js */ +enum +{ + Display_Visible, + Display_Hidden, + Display_NoPrint, + Display_NoView +}; + + enum { Q_Left = 0, @@ -1997,6 +2021,89 @@ void pdf_field_buttonSetCaption(pdf_document *doc, pdf_obj *field, char *text) } } +int pdf_field_getDisplay(pdf_document *doc, pdf_obj *field) +{ + pdf_obj *kids; + int f, res = Display_Visible; + + /* Base response on first of children. Not ideal, + * but not clear how to handle children with + * differing values */ + while ((kids = pdf_dict_gets(field, "Kids")) != NULL) + field = pdf_array_get(kids, 0); + + f = pdf_to_int(pdf_dict_gets(field, "F")); + + if (f & F_Hidden) + { + res = Display_Hidden; + } + else if (f & F_Print) + { + if (f & F_NoView) + res = Display_NoView; + } + else + { + if (f & F_NoView) + res = Display_Hidden; + else + res = Display_NoPrint; + } + + return res; +} + +void pdf_field_setDisplay(pdf_document *doc, pdf_obj *field, int d) +{ + fz_context *ctx = doc->ctx; + pdf_obj *kids = pdf_dict_gets(field, "Kids"); + + if (!kids) + { + int mask = (F_Hidden|F_Print|F_NoView); + int f = pdf_to_int(pdf_dict_gets(field, "F")) & ~mask; + pdf_obj *fo = NULL; + + switch (d) + { + case Display_Visible: + f |= F_Print; + break; + case Display_Hidden: + f |= F_Hidden; + break; + case Display_NoView: + f |= (F_Print|F_NoView); + break; + case Display_NoPrint: + break; + } + + fz_var(fo); + fz_try(ctx) + { + fo = pdf_new_int(ctx, f); + pdf_dict_puts(field, "F", fo); + } + fz_always(ctx) + { + pdf_drop_obj(fo); + } + fz_catch(ctx) + { + fz_rethrow(ctx); + } + } + else + { + int i, n = pdf_array_len(kids); + + for (i = 0; i < n; i++) + pdf_field_setDisplay(doc, pdf_array_get(kids, i), d); + } +} + void pdf_field_setFillColor(pdf_document *doc, pdf_obj *field, pdf_obj *col) { pdf_dict_putp(field, "MK/BG", col); diff --git a/pdf/pdf_js.c b/pdf/pdf_js.c index 000a3837..f533b834 100644 --- a/pdf/pdf_js.c +++ b/pdf/pdf_js.c @@ -67,6 +67,43 @@ static pdf_jsimp_obj *field_buttonSetCaption(void *jsctx, void *obj, int argc, p return NULL; } +static pdf_jsimp_obj *field_getDisplay(void *jsctx, void *obj) +{ + pdf_js *js = (pdf_js *)jsctx; + fz_context *ctx = js->doc->ctx; + pdf_obj *field = (pdf_obj *)obj; + pdf_jsimp_obj *res = NULL; + + fz_try(ctx) + { + int d = pdf_field_getDisplay(js->doc, field); + res = pdf_jsimp_fromNumber(js->imp, (double)d); + } + fz_catch(ctx) + { + fz_warn(ctx, "%s", ctx->error->message); + } + + return res; +} + +static void field_setDisplay(void *jsctx, void *obj, pdf_jsimp_obj *val) +{ + pdf_js *js = (pdf_js *)jsctx; + fz_context *ctx = js->doc->ctx; + pdf_obj *field = (pdf_obj *)obj; + + fz_try(ctx) + { + int ival = (int)pdf_jsimp_toNumber(js->imp, val); + pdf_field_setDisplay(js->doc, field, ival); + } + fz_catch(ctx) + { + fz_warn(ctx, "%s", ctx->error->message); + } +} + static pdf_jsimp_obj *field_getFillColor(void *jsctx, void *obj) { return NULL; @@ -363,6 +400,7 @@ static void declare_dom(pdf_js *js) pdf_jsimp_addproperty(imp, js->fieldtype, "borderStyle", field_getBorderStyle, field_setBorderStyle); pdf_jsimp_addproperty(imp, js->fieldtype, "textColor", field_getTextColor, field_setTextColor); pdf_jsimp_addproperty(imp, js->fieldtype, "fillColor", field_getFillColor, field_setFillColor); + pdf_jsimp_addproperty(imp, js->fieldtype, "display", field_getDisplay, field_setDisplay); pdf_jsimp_addmethod(imp, js->fieldtype, "buttonSetCaption", field_buttonSetCaption); /* Create the app type */ diff --git a/pdf/pdf_util.js b/pdf/pdf_util.js index 536016b9..e8edeb66 100644 --- a/pdf/pdf_util.js +++ b/pdf/pdf_util.js @@ -31,6 +31,12 @@ MuPDF.convertCase = function(str,cmd) } } +/* display must be kept in sync with an enum in pdf_form.c */ +var display = new Array(); +display.visible = 0; +display.hidden = 1; +display.noPrint = 2; +display.noView = 3; var border = new Array(); border.s = "Solid"; border.d = "Dashed"; |