summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPaul Gardiner <paulg.artifex@glidos.net>2012-08-29 14:56:08 +0100
committerPaul Gardiner <paulg.artifex@glidos.net>2012-08-29 14:56:08 +0100
commit0dfdec8b758c7b51880c36d0c4cdad5a6583fad4 (patch)
tree1d8ac9117ec230e0f010794b0a79b873642272ec
parent6a5b8879b3b3b2a9ef085f38c1758d62456b921b (diff)
downloadmupdf-0dfdec8b758c7b51880c36d0c4cdad5a6583fad4.tar.xz
Forms: implement javascript Field.display property
-rw-r--r--pdf/mupdf-internal.h2
-rw-r--r--pdf/pdf_form.c107
-rw-r--r--pdf/pdf_js.c38
-rw-r--r--pdf/pdf_util.js6
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";