[gs-commits] mupdf 1.16.1.7 Add form filling to mutool run.

[email protected] (Tor Andersson)
Newsgroups gmane.comp.printing.ghostscript.cvs
Message-ID <[email protected]>
commit 21261baab6772225d14ec76187be937bc78255c5
Author: Tor Andersson <[email protected]>
Date:   Fri Jun 28 14:26:56 2019 +0200

    Add form filling to mutool run.
    
    Drop unneccessary 'doc' argument to text and choice widget accessors.
    
    Add pdf_choice_field_option accessors.

diff --git a/include/mupdf/pdf/form.h b/include/mupdf/pdf/form.h
index fcbedc9..d067faa 100644
--- a/include/mupdf/pdf/form.h
+++ b/include/mupdf/pdf/form.h
@@ -24,20 +24,26 @@ enum pdf_widget_tx_format
 	PDF_WIDGET_TX_FORMAT_TIME
 };
 
+pdf_widget *pdf_keep_widget(fz_context *ctx, pdf_widget *widget);
+void pdf_drop_widget(fz_context *ctx, pdf_widget *widget);
 pdf_widget *pdf_first_widget(fz_context *ctx, pdf_page *page);
 pdf_widget *pdf_next_widget(fz_context *ctx, pdf_widget *previous);
+int pdf_update_widget(fz_context *ctx, pdf_widget *widget);
 
 enum pdf_widget_type pdf_widget_type(fz_context *ctx, pdf_widget *widget);
 
 fz_rect pdf_bound_widget(fz_context *ctx, pdf_widget *widget);
 
-int pdf_text_widget_max_len(fz_context *ctx, pdf_document *doc, pdf_widget *tw);
-int pdf_text_widget_format(fz_context *ctx, pdf_document *doc, pdf_widget *tw);
+int pdf_text_widget_max_len(fz_context *ctx, pdf_widget *tw);
+int pdf_text_widget_format(fz_context *ctx, pdf_widget *tw);
 
-int pdf_choice_widget_options(fz_context *ctx, pdf_document *doc, pdf_widget *tw, int exportval, const char *opts[]);
-int pdf_choice_widget_is_multiselect(fz_context *ctx, pdf_document *doc, pdf_widget *tw);
-int pdf_choice_widget_value(fz_context *ctx, pdf_document *doc, pdf_widget *tw, const char *opts[]);
-void pdf_choice_widget_set_value(fz_context *ctx, pdf_document *doc, pdf_widget *tw, int n, const char *opts[]);
+int pdf_choice_widget_options(fz_context *ctx, pdf_widget *tw, int exportval, const char *opts[]);
+int pdf_choice_widget_is_multiselect(fz_context *ctx, pdf_widget *tw);
+int pdf_choice_widget_value(fz_context *ctx, pdf_widget *tw, const char *opts[]);
+void pdf_choice_widget_set_value(fz_context *ctx, pdf_widget *tw, int n, const char *opts[]);
+
+int pdf_choice_field_option_count(fz_context *ctx, pdf_obj *field);
+const char *pdf_choice_field_option(fz_context *ctx, pdf_obj *field, int export, int i);
 
 /* Field flags */
 enum
diff --git a/platform/gl/gl-form.c b/platform/gl/gl-form.c
index a2e06c8..5db7e4c 100644
--- a/platform/gl/gl-form.c
+++ b/platform/gl/gl-form.c
@@ -264,9 +264,9 @@ static void ch_dialog(void)
 
 	label = pdf_field_label(ctx, ch_widget->obj);
 	label_h = ui_break_lines((char*)label, NULL, 20, 394, NULL);
-	n = pdf_choice_widget_options(ctx, ch_widget->page->doc, ch_widget, 0, NULL);
+	n = pdf_choice_widget_options(ctx, ch_widget, 0, NULL);
 	options = fz_malloc_array(ctx, n, const char *);
-	pdf_choice_widget_options(ctx, ch_widget->page->doc, ch_widget, 0, options);
+	pdf_choice_widget_options(ctx, ch_widget, 0, options);
 	value = pdf_field_value(ctx, ch_widget->obj);
 
 	ui_dialog_begin(400, (ui.gridsize+4)*3 + ui.lineheight*(label_h-1));
diff --git a/platform/java/mupdf_native.c b/platform/java/mupdf_native.c
index 6bec80f..0ae437f 100644
--- a/platform/java/mupdf_native.c
+++ b/platform/java/mupdf_native.c
@@ -1755,16 +1755,16 @@ static inline jobject to_PDFWidget(fz_context *ctx, JNIEnv *env, pdf_widget *wid
 		(*env)->SetIntField(env, jwidget, fid_PDFWidget_fieldFlags, fieldFlags);
 		if (fieldType == PDF_WIDGET_TYPE_TEXT)
 		{
-			(*env)->SetIntField(env, jwidget, fid_PDFWidget_maxLen, pdf_text_widget_max_len(ctx, widget->page->doc, widget));
-			(*env)->SetIntField(env, jwidget, fid_PDFWidget_textFormat, pdf_text_widget_format(ctx, widget->page->doc, widget));
+			(*env)->SetIntField(env, jwidget, fid_PDFWidget_maxLen, pdf_text_widget_max_len(ctx, widget));
+			(*env)->SetIntField(env, jwidget, fid_PDFWidget_textFormat, pdf_text_widget_format(ctx, widget));
 		}
 		if (fieldType == PDF_WIDGET_TYPE_COMBOBOX || fieldType == PDF_WIDGET_TYPE_LISTBOX)
 		{
-			nopts = pdf_choice_widget_options(ctx, widget->page->doc, widget, 0, NULL);
+			nopts = pdf_choice_widget_options(ctx, widget, 0, NULL);
 			if (nopts > 0)
 			{
 				opts = fz_malloc(ctx, nopts * sizeof(*opts));
-				pdf_choice_widget_options(ctx, widget->page->doc, widget, 0, opts);
+				pdf_choice_widget_options(ctx, widget, 0, opts);
 				jopts = to_StringArray_safe(ctx, env, opts, nopts);
 				if (jopts)
 					(*env)->SetObjectField(env, jwidget, fid_PDFWidget_options, jopts);
diff --git a/source/pdf/pdf-form.c b/source/pdf/pdf-form.c
index 39a1298..0f13d41 100644
--- a/source/pdf/pdf-form.c
+++ b/source/pdf/pdf-form.c
@@ -844,10 +844,9 @@ pdf_update_widget(fz_context *ctx, pdf_widget *widget)
 	get the maximum number of
 	characters permitted in a text widget
 */
-int pdf_text_widget_max_len(fz_context *ctx, pdf_document *doc, pdf_widget *tw)
+int pdf_text_widget_max_len(fz_context *ctx, pdf_widget *tw)
 {
 	pdf_annot *annot = (pdf_annot *)tw;
-
 	return pdf_to_int(ctx, pdf_dict_get_inheritable(ctx, annot->obj, PDF_NAME(MaxLen)));
 }
 
@@ -855,7 +854,7 @@ int pdf_text_widget_max_len(fz_context *ctx, pdf_document *doc, pdf_widget *tw)
 	get the type of content
 	required by a text widget
 */
-int pdf_text_widget_format(fz_context *ctx, pdf_document *doc, pdf_widget *tw)
+int pdf_text_widget_format(fz_context *ctx, pdf_widget *tw)
 {
 	pdf_annot *annot = (pdf_annot *)tw;
 	int type = PDF_WIDGET_TX_FORMAT_NONE;
@@ -951,7 +950,7 @@ int pdf_set_choice_field_value(fz_context *ctx, pdf_widget *widget, const char *
 	is true, then the export values will be returned and not the list
 	values if there are export values present.
 */
-int pdf_choice_widget_options(fz_context *ctx, pdf_document *doc, pdf_widget *tw, int exportval, const char *opts[])
+int pdf_choice_widget_options(fz_context *ctx, pdf_widget *tw, int exportval, const char *opts[])
 {
 	pdf_annot *annot = (pdf_annot *)tw;
 	pdf_obj *optarr;
@@ -978,7 +977,23 @@ int pdf_choice_widget_options(fz_context *ctx, pdf_document *doc, pdf_widget *tw
 	return n;
 }
 
-int pdf_choice_widget_is_multiselect(fz_context *ctx, pdf_document *doc, pdf_widget *tw)
+int pdf_choice_field_option_count(fz_context *ctx, pdf_obj *field)
+{
+	pdf_obj *opt = pdf_dict_get_inheritable(ctx, field, PDF_NAME(Opt));
+	return pdf_array_len(ctx, opt);
+}
+
+const char *pdf_choice_field_option(fz_context *ctx, pdf_obj *field, int export, int i)
+{
+	pdf_obj *opt = pdf_dict_get_inheritable(ctx, field, PDF_NAME(Opt));
+	pdf_obj *ent = pdf_array_get(ctx, opt, i);
+	if (pdf_array_len(ctx, ent) == 2)
+		return pdf_array_get_text_string(ctx, ent, export ? 0 : 1);
+	else
+		return pdf_to_text_string(ctx, ent);
+}
+
+int pdf_choice_widget_is_multiselect(fz_context *ctx, pdf_widget *tw)
 {
 	pdf_annot *annot = (pdf_annot *)tw;
 
@@ -1000,7 +1015,7 @@ int pdf_choice_widget_is_multiselect(fz_context *ctx, pdf_document *doc, pdf_wid
 	with NULL as the array to find out how big the array need to
 	be. The filled in elements should not be freed by the caller.
 */
-int pdf_choice_widget_value(fz_context *ctx, pdf_document *doc, pdf_widget *tw, const char *opts[])
+int pdf_choice_widget_value(fz_context *ctx, pdf_widget *tw, const char *opts[])
 {
 	pdf_annot *annot = (pdf_annot *)tw;
 	pdf_obj *optarr;
@@ -1039,7 +1054,7 @@ int pdf_choice_widget_value(fz_context *ctx, pdf_document *doc, pdf_widget *tw,
 	caller should pass the number of options selected and an
 	array of their names
 */
-void pdf_choice_widget_set_value(fz_context *ctx, pdf_document *doc, pdf_widget *tw, int n, const char *opts[])
+void pdf_choice_widget_set_value(fz_context *ctx, pdf_widget *tw, int n, const char *opts[])
 {
 	pdf_annot *annot = (pdf_annot *)tw;
 	pdf_obj *optarr = NULL, *opt;
@@ -1053,7 +1068,7 @@ void pdf_choice_widget_set_value(fz_context *ctx, pdf_document *doc, pdf_widget
 	{
 		if (n != 1)
 		{
-			optarr = pdf_new_array(ctx, doc, n);
+			optarr = pdf_new_array(ctx, annot->page->doc, n);
 
 			for (i = 0; i < n; i++)
 			{
@@ -1073,8 +1088,8 @@ void pdf_choice_widget_set_value(fz_context *ctx, pdf_document *doc, pdf_widget
 		pdf_dict_del(ctx, annot->obj, PDF_NAME(I));
 
 		pdf_field_mark_dirty(ctx, annot->obj);
-		if (pdf_field_dirties_document(ctx, doc, annot->obj))
-			doc->dirty = 1;
+		if (pdf_field_dirties_document(ctx, annot->page->doc, annot->obj))
+			annot->page->doc->dirty = 1;
 	}
 	fz_catch(ctx)
 	{
diff --git a/source/tools/murun.c b/source/tools/murun.c
index 44b7d46..df0c913 100644
--- a/source/tools/murun.c
+++ b/source/tools/murun.c
@@ -285,6 +285,12 @@ static void ffi_gc_fz_document_writer(js_State *J, void *wri)
 
 #if FZ_ENABLE_PDF
 
+static void ffi_gc_pdf_widget(js_State *J, void *widget)
+{
+	fz_context *ctx = js_getcontext(J);
+	pdf_drop_widget(ctx, widget);
+}
+
 static void ffi_gc_pdf_annot(js_State *J, void *annot)
 {
 	fz_context *ctx = js_getcontext(J);
@@ -3442,6 +3448,16 @@ static void ffi_PDFDocument_newDictionary(js_State *J)
 	ffi_pushobj(J, obj);
 }
 
+static void ffi_PDFDocument_enableJS(js_State *J)
+{
+	fz_context *ctx = js_getcontext(J);
+	pdf_document *pdf = js_touserdata(J, 0, "pdf_document");
+	fz_try(ctx)
+		pdf_enable_js(ctx, pdf);
+	fz_catch(ctx)
+		rethrow(J);
+}
+
 static void ffi_PDFDocument_newGraftMap(js_State *J)
 {
 	fz_context *ctx = js_getcontext(J);
@@ -3884,21 +3900,48 @@ static void ffi_PDFObject_forEach(js_State *J)
 	}
 }
 
-static void ffi_PDFPage_getAnnotations(js_State *J)
+static void ffi_PDFPage_getWidgets(js_State *J)
 {
 	fz_context *ctx = js_getcontext(J);
 	pdf_page *page = js_touserdata(J, 0, "pdf_page");
-	pdf_annot *annot = NULL;
+	pdf_widget *widget = NULL;
 	int i = 0;
 
+	fz_try(ctx)
+		widget = pdf_first_widget(ctx, page);
+	fz_catch(ctx)
+		rethrow(J);
+
 	js_newarray(J);
 
+	while (widget) {
+		js_getregistry(J, "pdf_widget");
+		js_newuserdata(J, "pdf_widget", pdf_keep_widget(ctx, widget), ffi_gc_pdf_widget);
+		js_setindex(J, -2, i++);
+
+		fz_try(ctx)
+			widget = pdf_next_widget(ctx, widget);
+		fz_catch(ctx)
+			rethrow(J);
+	}
+}
+
+static void ffi_PDFPage_getAnnotations(js_State *J)
+{
+	fz_context *ctx = js_getcontext(J);
+	pdf_page *page = js_touserdata(J, 0, "pdf_page");
+	pdf_annot *annot = NULL;
+	int i = 0;
+
 	fz_try(ctx)
 		annot = pdf_first_annot(ctx, page);
 	fz_catch(ctx)
 		rethrow(J);
 
+	js_newarray(J);
+
 	while (annot) {
+		js_getregistry(J, "pdf_annot");
 		js_newuserdata(J, "pdf_annot", pdf_keep_annot(ctx, annot), ffi_gc_pdf_annot);
 		js_setindex(J, -2, i++);
 
@@ -3924,6 +3967,7 @@ static void ffi_PDFPage_createAnnotation(js_State *J)
 	}
 	fz_catch(ctx)
 		rethrow(J);
+	js_getregistry(J, "pdf_annot");
 	js_newuserdata(J, "pdf_annot", annot, ffi_gc_pdf_annot);
 }
 
@@ -4431,6 +4475,216 @@ static void ffi_PDFAnnotation_update(js_State *J)
 	js_pushboolean(J, changed);
 }
 
+
+static void ffi_PDFWidget_getFieldType(js_State *J)
+{
+	fz_context *ctx = js_getcontext(J);
+	pdf_widget *widget = js_touserdata(J, 0, "pdf_widget");
+	int type;
+	fz_try(ctx)
+		type = pdf_field_type(ctx, widget->obj);
+	fz_catch(ctx)
+		rethrow(J);
+	switch (type)
+	{
+	default:
+	case PDF_WIDGET_TYPE_BUTTON: js_pushstring(J, "button"); break;
+	case PDF_WIDGET_TYPE_CHECKBOX: js_pushstring(J, "checkbox"); break;
+	case PDF_WIDGET_TYPE_COMBOBOX: js_pushstring(J, "combobox"); break;
+	case PDF_WIDGET_TYPE_LISTBOX: js_pushstring(J, "listbox"); break;
+	case PDF_WIDGET_TYPE_RADIOBUTTON: js_pushstring(J, "radiobutton"); break;
+	case PDF_WIDGET_TYPE_SIGNATURE: js_pushstring(J, "signature"); break;
+	case PDF_WIDGET_TYPE_TEXT: js_pushstring(J, "text"); break;
+	}
+}
+
+static void ffi_PDFWidget_getFieldFlags(js_State *J)
+{
+	fz_context *ctx = js_getcontext(J);
+	pdf_widget *widget = js_touserdata(J, 0, "pdf_widget");
+	int flags;
+	fz_try(ctx)
+		flags = pdf_field_flags(ctx, widget->obj);
+	fz_catch(ctx)
+		rethrow(J);
+	js_pushnumber(J, flags);
+}
+
+static void ffi_PDFWidget_getRect(js_State *J)
+{
+	fz_context *ctx = js_getcontext(J);
+	pdf_widget *widget = js_touserdata(J, 0, "pdf_widget");
+	fz_rect rect;
+	fz_try(ctx)
+		rect = pdf_annot_rect(ctx, widget);
+	fz_catch(ctx)
+		rethrow(J);
+	ffi_pushrect(J, rect);
+}
+
+static void ffi_PDFWidget_setRect(js_State *J)
+{
+	fz_context *ctx = js_getcontext(J);
+	pdf_widget *widget = js_touserdata(J, 0, "pdf_widget");
+	fz_rect rect = ffi_torect(J, 1);
+	fz_try(ctx)
+		pdf_set_annot_rect(ctx, widget, rect);
+	fz_catch(ctx)
+		rethrow(J);
+}
+
+static void ffi_PDFWidget_getValue(js_State *J)
+{
+	fz_context *ctx = js_getcontext(J);
+	pdf_widget *widget = js_touserdata(J, 0, "pdf_widget");
+	const char *value;
+	fz_try(ctx)
+		value = pdf_field_value(ctx, widget->obj);
+	fz_catch(ctx)
+		rethrow(J);
+	js_pushstring(J, value);
+}
+
+static void ffi_PDFWidget_setTextValue(js_State *J)
+{
+	fz_context *ctx = js_getcontext(J);
+	pdf_widget *widget = js_touserdata(J, 0, "pdf_widget");
+	const char *value = js_tostring(J, 1);
+	fz_try(ctx)
+		pdf_set_text_field_value(ctx, widget, value);
+	fz_catch(ctx)
+		rethrow(J);
+}
+
+static void ffi_PDFWidget_setChoiceValue(js_State *J)
+{
+	fz_context *ctx = js_getcontext(J);
+	pdf_widget *widget = js_touserdata(J, 0, "pdf_widget");
+	const char *value = js_tostring(J, 1);
+	fz_try(ctx)
+		pdf_set_choice_field_value(ctx, widget, value);
+	fz_catch(ctx)
+		rethrow(J);
+}
+
+static void ffi_PDFWidget_toggle(js_State *J)
+{
+	fz_context *ctx = js_getcontext(J);
+	pdf_widget *widget = js_touserdata(J, 0, "pdf_widget");
+	int changed = 0;
+	fz_try(ctx)
+		changed = pdf_toggle_widget(ctx, widget);
+	fz_catch(ctx)
+		rethrow(J);
+	js_pushboolean(J, changed);
+}
+
+static void ffi_PDFWidget_getMaxLen(js_State *J)
+{
+	fz_context *ctx = js_getcontext(J);
+	pdf_widget *widget = js_touserdata(J, 0, "pdf_widget");
+	int maxLen = 0;
+	fz_try(ctx)
+		maxLen = pdf_text_widget_max_len(ctx, widget);
+	fz_catch(ctx)
+		rethrow(J);
+	js_pushnumber(J, maxLen);
+}
+
+static void ffi_PDFWidget_getOptions(js_State *J)
+{
+	fz_context *ctx = js_getcontext(J);
+	pdf_widget *widget = js_touserdata(J, 0, "pdf_widget");
+	int export = js_toboolean(J, 1);
+	const char *opt;
+	int i, n;
+	fz_try(ctx)
+		n = pdf_choice_field_option_count(ctx, widget->obj);
+	fz_catch(ctx)
+		rethrow(J);
+	js_newarray(J);
+	for (i = 0; i < n; ++i) {
+		fz_try(ctx)
+			opt = pdf_choice_field_option(ctx, widget->obj, export, i);
+		fz_catch(ctx)
+			rethrow(J);
+		js_pushstring(J, opt);
+	}
+	js_endtry(J);
+}
+
+static void ffi_PDFWidget_update(js_State *J)
+{
+	fz_context *ctx = js_getcontext(J);
+	pdf_widget *widget = js_touserdata(J, 0, "pdf_widget");
+	int changed = 0;
+	fz_try(ctx)
+		changed = pdf_update_widget(ctx, widget);
+	fz_catch(ctx)
+		rethrow(J);
+	js_pushboolean(J, changed);
+}
+
+static void ffi_PDFWidget_eventEnter(js_State *J)
+{
+	fz_context *ctx = js_getcontext(J);
+	pdf_widget *widget = js_touserdata(J, 0, "pdf_widget");
+	fz_try(ctx)
+		pdf_annot_event_enter(ctx, widget);
+	fz_catch(ctx)
+		rethrow(J);
+}
+
+static void ffi_PDFWidget_eventExit(js_State *J)
+{
+	fz_context *ctx = js_getcontext(J);
+	pdf_widget *widget = js_touserdata(J, 0, "pdf_widget");
+	fz_try(ctx)
+		pdf_annot_event_exit(ctx, widget);
+	fz_catch(ctx)
+		rethrow(J);
+}
+
+static void ffi_PDFWidget_eventDown(js_State *J)
+{
+	fz_context *ctx = js_getcontext(J);
+	pdf_widget *widget = js_touserdata(J, 0, "pdf_widget");
+	fz_try(ctx)
+		pdf_annot_event_down(ctx, widget);
+	fz_catch(ctx)
+		rethrow(J);
+}
+
+static void ffi_PDFWidget_eventUp(js_State *J)
+{
+	fz_context *ctx = js_getcontext(J);
+	pdf_widget *widget = js_touserdata(J, 0, "pdf_widget");
+	fz_try(ctx)
+		pdf_annot_event_up(ctx, widget);
+	fz_catch(ctx)
+		rethrow(J);
+}
+
+static void ffi_PDFWidget_eventFocus(js_State *J)
+{
+	fz_context *ctx = js_getcontext(J);
+	pdf_widget *widget = js_touserdata(J, 0, "pdf_widget");
+	fz_try(ctx)
+		pdf_annot_event_focus(ctx, widget);
+	fz_catch(ctx)
+		rethrow(J);
+}
+
+static void ffi_PDFWidget_eventBlur(js_State *J)
+{
+	fz_context *ctx = js_getcontext(J);
+	pdf_widget *widget = js_touserdata(J, 0, "pdf_widget");
+	fz_try(ctx)
+		pdf_annot_event_blur(ctx, widget);
+	fz_catch(ctx)
+		rethrow(J);
+}
+
 #endif /* FZ_ENABLE_PDF */
 
 int murun_main(int argc, char **argv)
@@ -4739,12 +4993,15 @@ int murun_main(int argc, char **argv)
 
 		jsB_propfun(J, "PDFDocument.newGraftMap", ffi_PDFDocument_newGraftMap, 0);
 		jsB_propfun(J, "PDFDocument.graftObject", ffi_PDFDocument_graftObject, 1);
+
+		jsB_propfun(J, "PDFDocument.enableJS", ffi_PDFDocument_enableJS, 0);
 	}
 	js_setregistry(J, "pdf_document");
 
 	js_getregistry(J, "fz_page");
 	js_newobjectx(J);
 	{
+		jsB_propfun(J, "PDFPage.getWidgets", ffi_PDFPage_getWidgets, 0);
 		jsB_propfun(J, "PDFPage.getAnnotations", ffi_PDFPage_getAnnotations, 0);
 		jsB_propfun(J, "PDFPage.createAnnotation", ffi_PDFPage_createAnnotation, 1);
 		jsB_propfun(J, "PDFPage.deleteAnnotation", ffi_PDFPage_deleteAnnotation, 1);
@@ -4759,6 +5016,7 @@ int murun_main(int argc, char **argv)
 		jsB_propfun(J, "PDFAnnotation.run", ffi_PDFAnnotation_run, 2);
 		jsB_propfun(J, "PDFAnnotation.toPixmap", ffi_PDFAnnotation_toPixmap, 3);
 		jsB_propfun(J, "PDFAnnotation.toDisplayList", ffi_PDFAnnotation_toDisplayList, 0);
+
 		jsB_propfun(J, "PDFAnnotation.getType", ffi_PDFAnnotation_getType, 0);
 		jsB_propfun(J, "PDFAnnotation.getFlags", ffi_PDFAnnotation_getFlags, 0);
 		jsB_propfun(J, "PDFAnnotation.setFlags", ffi_PDFAnnotation_setFlags, 1);
@@ -4780,14 +5038,49 @@ int murun_main(int argc, char **argv)
 		jsB_propfun(J, "PDFAnnotation.setAuthor", ffi_PDFAnnotation_setAuthor, 1);
 		jsB_propfun(J, "PDFAnnotation.getModificationDate", ffi_PDFAnnotation_getModificationDate, 0);
 		jsB_propfun(J, "PDFAnnotation.setModificationDate", ffi_PDFAnnotation_setModificationDate, 0);
+
 		jsB_propfun(J, "PDFAnnotation.updateAppearance", ffi_PDFAnnotation_updateAppearance, 0);
 		jsB_propfun(J, "PDFAnnotation.update", ffi_PDFAnnotation_update, 0);
 	}
+	js_dup(J);
+	js_setglobal(J, "PDFAnnot");
 	js_setregistry(J, "pdf_annot");
 
 	js_getregistry(J, "Userdata");
 	js_newobjectx(J);
 	{
+		// jsB_propfun(J, "PDFWidget.bound", ffi_PDFWidget_bound, 0);
+		// jsB_propfun(J, "PDFWidget.run", ffi_PDFWidget_run, 2);
+		// jsB_propfun(J, "PDFWidget.toPixmap", ffi_PDFWidget_toPixmap, 3);
+		// jsB_propfun(J, "PDFWidget.toDisplayList", ffi_PDFWidget_toDisplayList, 0);
+
+		jsB_propfun(J, "PDFWidget.getFieldType", ffi_PDFWidget_getFieldType, 0);
+		jsB_propfun(J, "PDFWidget.getFieldFlags", ffi_PDFWidget_getFieldFlags, 0);
+		jsB_propfun(J, "PDFWidget.getRect", ffi_PDFWidget_getRect, 0);
+		jsB_propfun(J, "PDFWidget.setRect", ffi_PDFWidget_setRect, 1);
+		jsB_propfun(J, "PDFWidget.getValue", ffi_PDFWidget_getValue, 0);
+		jsB_propfun(J, "PDFWidget.setTextValue", ffi_PDFWidget_setTextValue, 1);
+		jsB_propfun(J, "PDFWidget.setChoiceValue", ffi_PDFWidget_setChoiceValue, 1);
+		jsB_propfun(J, "PDFWidget.toggle", ffi_PDFWidget_toggle, 0);
+		jsB_propfun(J, "PDFWidget.getMaxLen", ffi_PDFWidget_getMaxLen, 0);
+		jsB_propfun(J, "PDFWidget.getOptions", ffi_PDFWidget_getOptions, 1);
+
+		jsB_propfun(J, "PDFWidget.update", ffi_PDFWidget_update, 0);
+
+		jsB_propfun(J, "PDFWidget.eventEnter", ffi_PDFWidget_eventEnter, 0);
+		jsB_propfun(J, "PDFWidget.eventExit", ffi_PDFWidget_eventExit, 0);
+		jsB_propfun(J, "PDFWidget.eventDown", ffi_PDFWidget_eventDown, 0);
+		jsB_propfun(J, "PDFWidget.eventUp", ffi_PDFWidget_eventUp, 0);
+		jsB_propfun(J, "PDFWidget.eventFocus", ffi_PDFWidget_eventFocus, 0);
+		jsB_propfun(J, "PDFWidget.eventBlur", ffi_PDFWidget_eventBlur, 0);
+	}
+	js_dup(J);
+	js_setglobal(J, "PDFWidget");
+	js_setregistry(J, "pdf_widget");
+
+	js_getregistry(J, "Userdata");
+	js_newobjectx(J);
+	{
 		jsB_propfun(J, "PDFObject.get", ffi_PDFObject_get, 1);
 		jsB_propfun(J, "PDFObject.put", ffi_PDFObject_put, 2);
 		jsB_propfun(J, "PDFObject.push", ffi_PDFObject_push, 1);

http://git.ghostscript.com/?p=mupdf.git;a=commit;h=21261baab6772225d14ec76187be937bc78255c5

--
MuPDF library
Artifex Software, Inc.
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.