summaryrefslogtreecommitdiff
path: root/print
diff options
context:
space:
mode:
authorwiz <wiz@pkgsrc.org>2007-11-11 23:30:17 +0000
committerwiz <wiz@pkgsrc.org>2007-11-11 23:30:17 +0000
commitd7bdd9826b98a45f2812bfee3424c8ea5b3484b6 (patch)
treecc6d7c35fc3851bda8759b73e2ef1c22ad8faf25 /print
parent7c0376101f2f31126ac6797cbc0372298160175f (diff)
downloadpkgsrc-d7bdd9826b98a45f2812bfee3424c8ea5b3484b6.tar.gz
Fix build with poppler-0.6.x.
From maintainer dieter roelants in PR 37358.
Diffstat (limited to 'print')
-rw-r--r--print/ruby-gnome2-poppler/Makefile6
-rw-r--r--print/ruby-gnome2-poppler/distinfo7
-rw-r--r--print/ruby-gnome2-poppler/patches/patch-aa32
-rw-r--r--print/ruby-gnome2-poppler/patches/patch-ab840
4 files changed, 883 insertions, 2 deletions
diff --git a/print/ruby-gnome2-poppler/Makefile b/print/ruby-gnome2-poppler/Makefile
index 6167e3bb9b9..775fe288c68 100644
--- a/print/ruby-gnome2-poppler/Makefile
+++ b/print/ruby-gnome2-poppler/Makefile
@@ -1,7 +1,8 @@
-# $NetBSD: Makefile,v 1.1.1.1 2007/05/27 02:00:02 obache Exp $
+# $NetBSD: Makefile,v 1.2 2007/11/11 23:30:17 wiz Exp $
#
PKGNAME= ${RUBY_PKGPREFIX}-gnome2-poppler-${VERSION}
+PKGREVISION= 1
COMMENT= Ruby binding of poppler-glib
CATEGORIES= print
@@ -10,8 +11,9 @@ RUBY_EXTCONF_SUBDIRS= poppler
DEPENDS+= ${RUBY_PKGPREFIX}-gnome2-glib>=${VERSION}:../../devel/ruby-gnome2-glib
DEPENDS+= ${RUBY_PKGPREFIX}-gnome2-gdkpixbuf>=${VERSION}:../../graphics/ruby-gnome2-gdkpixbuf
USE_TOOLS+= pkg-config
+DISTINFO_FILE?= ${.CURDIR}/distinfo
-BUILDLINK_API_DEPENDS.poppler-glib+= poppler-glib>=0.5.2
+BUILDLINK_API_DEPENDS.poppler-glib+= poppler-glib>=0.6.0
.include "../../graphics/ruby-rcairo/buildlink3.mk"
.include "../../print/poppler-glib/buildlink3.mk"
diff --git a/print/ruby-gnome2-poppler/distinfo b/print/ruby-gnome2-poppler/distinfo
new file mode 100644
index 00000000000..a4dd168d379
--- /dev/null
+++ b/print/ruby-gnome2-poppler/distinfo
@@ -0,0 +1,7 @@
+$NetBSD: distinfo,v 1.1 2007/11/11 23:30:17 wiz Exp $
+
+SHA1 (ruby-gnome2-all-0.16.0.tar.gz) = 488f6c1f139060e005f336c9c854c4dc5b3e6b7c
+RMD160 (ruby-gnome2-all-0.16.0.tar.gz) = c83c7cdcf633ad5cc213180f641a6c8f18002a9c
+Size (ruby-gnome2-all-0.16.0.tar.gz) = 1208856 bytes
+SHA1 (patch-aa) = e304eae9b1341db74e5bcc7e8aa51f3e6475b4fa
+SHA1 (patch-ab) = 82c0981b80df1dd5390f53561e510bf9e32575d0
diff --git a/print/ruby-gnome2-poppler/patches/patch-aa b/print/ruby-gnome2-poppler/patches/patch-aa
new file mode 100644
index 00000000000..6a3d83700ba
--- /dev/null
+++ b/print/ruby-gnome2-poppler/patches/patch-aa
@@ -0,0 +1,32 @@
+$NetBSD: patch-aa,v 1.1 2007/11/11 23:30:18 wiz Exp $
+
+--- poppler/src/rbpoppler.h.orig 2006-12-29 14:17:28.000000000 +0100
++++ poppler/src/rbpoppler.h
+@@ -38,16 +38,27 @@ extern GType poppler_dest_get_type (void
+ #define REGION2RVAL(obj) (BOXED2RVAL(obj, GDK_TYPE_REGION))
+ #define RVAL2DEST(obj) ((PopplerDest *)RVAL2BOXED(obj, POPPLER_TYPE_DEST))
+ #define DEST2RVAL(obj) (BOXED2RVAL(obj, POPPLER_TYPE_DEST))
++#define TRANS2RVAL(obj) (BOXED2RVAL(obj, POPPLER_TYPE_PAGE_TRANSITION))
++#define RVAL2TRANS(obj) ((PopplerPageTransition *)RVAL2BOXED(obj, POPPLER_TYPE_PAGE_TRANSITION))
++
+ #define DESTTYPE2RVAL(obj) (GENUM2RVAL(obj, POPPLER_TYPE_DEST_TYPE))
+ #define ACTIONTYPE2RVAL(obj) (GENUM2RVAL(obj, POPPLER_TYPE_ACTION_TYPE))
+ #define RVAL2ACTIONTYPE(obj) (RVAL2GENUM(obj, POPPLER_TYPE_ACTION_TYPE))
++#define SELSTYLE2RVAL(obj) (GENUM2RVAL(obj, POPPLER_TYPE_SELECTION_STYLE))
++#define RVAL2SELSTYLE(obj) (RVAL2GENUM(obj, POPPLER_TYPE_SELECTION_STYLE))
+ #define RVAL2COLOR(obj) ((GdkColor *)RVAL2BOXED(obj, GDK_TYPE_COLOR))
+
+ #define ACTION2RVAL(obj) (rb_poppler_ruby_object_from_action(obj))
+ #define RVAL2ACTION(obj) (rb_poppler_action_from_ruby_object(obj))
++#define FF2RVAL(obj) (rb_poppler_ruby_object_from_form_field(obj))
+
+ extern VALUE rb_poppler_ruby_object_from_action(PopplerAction *action);
+ extern PopplerAction *rb_poppler_action_from_ruby_object(VALUE action);
++#if POPPLER_CHECK_VERSION(0, 6, 0)
++extern VALUE rb_poppler_ruby_object_from_form_field(PopplerFormField *field);
++#endif
++
++#define RVAL2GDK_PIXBUF(pixbuf) (GDK_PIXBUF(RVAL2GOBJ(pixbuf)))
+
+
+ extern void Init_poppler_document(VALUE mPoppler);
diff --git a/print/ruby-gnome2-poppler/patches/patch-ab b/print/ruby-gnome2-poppler/patches/patch-ab
new file mode 100644
index 00000000000..84806fe5be7
--- /dev/null
+++ b/print/ruby-gnome2-poppler/patches/patch-ab
@@ -0,0 +1,840 @@
+$NetBSD: patch-ab,v 1.1 2007/11/11 23:30:18 wiz Exp $
+
+--- poppler/src/rbpoppler-page.c.orig 2006-12-29 14:17:28.000000000 +0100
++++ poppler/src/rbpoppler-page.c
+@@ -12,16 +12,39 @@
+
+ #include "rbpoppler.h"
+
++#define SELF(self) (POPPLER_PAGE(RVAL2GOBJ(self)))
+ #define RVAL2LM(obj) ((PopplerLinkMapping *)RVAL2BOXED(obj, POPPLER_TYPE_LINK_MAPPING))
++#define RVAL2IM(obj) ((PopplerImageMapping *)RVAL2BOXED(obj, POPPLER_TYPE_IMAGE_MAPPING))
++#define RVAL2FFM(obj) ((PopplerFormFieldMapping *)RVAL2BOXED(obj, POPPLER_TYPE_FORM_FIELD_MAPPING))
++#define RVAL2FF(obj) (POPPLER_FORM_FIELD(RVAL2GOBJ(obj)))
++#define RVAL2TF(obj) RVAL2FF(obj)
++#define RVAL2BF(obj) RVAL2FF(obj)
++#define RVAL2CF(obj) RVAL2FF(obj)
++
++#define TT2RVAL(obj) (GENUM2RVAL(obj, POPPLER_TYPE_PAGE_TRANSITION_TYPE))
++#define RVAL2TT(obj) (RVAL2GENUM(obj, POPPLER_TYPE_PAGE_TRANSITION_TYPE))
++#define TA2RVAL(obj) (GENUM2RVAL(obj, POPPLER_TYPE_PAGE_TRANSITION_ALIGNMENT))
++#define RVAL2TA(obj) (RVAL2GENUM(obj, POPPLER_TYPE_PAGE_TRANSITION_ALIGNMENT))
++#define TD2RVAL(obj) (GENUM2RVAL(obj, POPPLER_TYPE_PAGE_TRANSITION_DIRECTION))
++#define RVAL2TD(obj) (RVAL2GENUM(obj, POPPLER_TYPE_PAGE_TRANSITION_DIRECTION))
++#define FFT2RVAL(obj) (GENUM2RVAL(obj, POPPLER_TYPE_FORM_FIELD_TYPE))
++#define RVAL2FFT(obj) (RVAL2GENUM(obj, POPPLER_TYPE_FORM_FIELD_TYPE))
++#define FBT2RVAL(obj) (GENUM2RVAL(obj, POPPLER_TYPE_FORM_BUTTON_TYPE))
++#define FTT2RVAL(obj) (GENUM2RVAL(obj, POPPLER_TYPE_FORM_TEXT_TYPE))
++#define FCT2RVAL(obj) (GENUM2RVAL(obj, POPPLER_TYPE_FORM_CHOICE_TYPE))
+
+-static VALUE cPSFile;
++static VALUE cPSFile, cRectangle;
++
++#if POPPLER_CHECK_VERSION(0, 6, 0)
++VALUE cUnknownField, cTextField, cButtonField, cChoiceField, cSignatureField;
++#endif
+
+ static VALUE
+ page_render_to_pixbuf(VALUE self, VALUE src_x, VALUE src_y, VALUE src_width,
+ VALUE src_height, VALUE scale, VALUE rotation,
+ VALUE pixbuf)
+ {
+- poppler_page_render_to_pixbuf(RVAL2GOBJ(self), NUM2INT(src_x),
++ poppler_page_render_to_pixbuf(SELF(self), NUM2INT(src_x),
+ NUM2INT(src_y), NUM2INT(src_width),
+ NUM2INT(src_height), NUM2DBL(scale),
+ NUM2INT(rotation), RVAL2GOBJ(pixbuf));
+@@ -32,7 +55,7 @@ page_render_to_pixbuf(VALUE self, VALUE
+ static VALUE
+ page_render(VALUE self, VALUE cairo)
+ {
+- poppler_page_render(RVAL2GOBJ(self), RVAL2CRCONTEXT(cairo));
++ poppler_page_render(SELF(self), RVAL2CRCONTEXT(cairo));
+ return Qnil;
+ }
+ #endif
+@@ -40,7 +63,7 @@ page_render(VALUE self, VALUE cairo)
+ static VALUE
+ page_render_to_ps(VALUE self, VALUE ps_file)
+ {
+- poppler_page_render_to_ps(RVAL2GOBJ(self), RVAL2GOBJ(ps_file));
++ poppler_page_render_to_ps(SELF(self), RVAL2GOBJ(ps_file));
+ return Qnil;
+ }
+
+@@ -48,7 +71,7 @@ static VALUE
+ page_render_generic(int argc, VALUE *argv, VALUE self)
+ {
+ if (argc == 1) {
+- if (RTEST(rb_obj_is_kind_of(argv[0], cPSFile))) {
++ if (RVAL2CBOOL(rb_obj_is_kind_of(argv[0], cPSFile))) {
+ return page_render_to_ps(self, argv[0]);
+ } else {
+ #ifdef RB_POPPLER_CAIRO_AVAILABLE
+@@ -70,20 +93,34 @@ static VALUE
+ page_get_size(VALUE self)
+ {
+ double width, height;
+- poppler_page_get_size(RVAL2GOBJ(self), &width, &height);
++ poppler_page_get_size(SELF(self), &width, &height);
+ return rb_ary_new3(2, rb_float_new(width), rb_float_new(height));
+ }
+
+ static VALUE
+ page_get_index(VALUE self)
+ {
+- return INT2NUM(poppler_page_get_index(RVAL2GOBJ(self)));
++ return INT2NUM(poppler_page_get_index(SELF(self)));
++}
++
++#if POPPLER_CHECK_VERSION(0, 6, 0)
++static VALUE
++page_get_duration(VALUE self)
++{
++ return rb_float_new(poppler_page_get_duration(SELF(self)));
+ }
+
+ static VALUE
++page_get_transition(VALUE self)
++{
++ return TRANS2RVAL(poppler_page_get_transition(SELF(self)));
++}
++#endif
++
++static VALUE
+ page_get_thumbnail(VALUE self)
+ {
+- return GOBJ2RVAL(poppler_page_get_thumbnail(RVAL2GOBJ(self)));
++ return GOBJ2RVAL(poppler_page_get_thumbnail(SELF(self)));
+ }
+
+ static VALUE
+@@ -91,7 +128,7 @@ page_get_thumbnail_size(VALUE self)
+ {
+ int width, height;
+
+- if (poppler_page_get_thumbnail_size(RVAL2GOBJ(self), &width, &height))
++ if (poppler_page_get_thumbnail_size(SELF(self), &width, &height))
+ return rb_ary_new3(2, INT2NUM(width), INT2NUM(height));
+ else
+ return Qnil;
+@@ -100,17 +137,60 @@ page_get_thumbnail_size(VALUE self)
+ static VALUE
+ page_find_text(VALUE self, VALUE text)
+ {
+- return GLIST2ARY2F(poppler_page_find_text(RVAL2GOBJ(self), RVAL2CSTR(text)),
++ return GLIST2ARY2F(poppler_page_find_text(SELF(self), RVAL2CSTR(text)),
+ POPPLER_TYPE_RECTANGLE);
+ }
+
+ static VALUE
+-page_get_text(VALUE self, VALUE rect)
++page_get_text(int argc, VALUE *argv, VALUE self)
+ {
+ gchar *text;
+- VALUE rb_text;
++#if POPPLER_CHECK_VERSION(0, 6, 0)
++ PopplerSelectionStyle style = POPPLER_SELECTION_GLYPH;
++#endif
++ VALUE rb_text, arg1, arg2, rb_rect;
++ PopplerPage *page;
++
++ rb_scan_args(argc, argv, "02", &arg1, &arg2);
++
++ page = SELF(self);
++ if (NIL_P(arg1)) {
++ rb_rect = arg2;
++ } else {
++ if (RTEST(rb_obj_is_kind_of(arg2, cRectangle))) {
++ rb_rect = arg2;
++ } else {
++ rb_rect = Qnil;
++#if POPPLER_CHECK_VERSION(0, 6, 0)
++ if (!NIL_P(arg2)) {
++ style = RVAL2SELSTYLE(arg2);
++ }
++#endif
++ }
++ }
++
++ if (NIL_P(rb_rect)) {
++ PopplerRectangle rect;
++ double width, height;
++
++ rect.x1 = 0;
++ rect.y1 = 0;
++ poppler_page_get_size(page, &width, &height);
++ rect.x2 = width;
++ rect.y2 = height;
++ text = poppler_page_get_text(page,
++#if POPPLER_CHECK_VERSION(0, 6, 0)
++ style,
++#endif
++ &rect);
++ } else {
++ text = poppler_page_get_text(page,
++#if POPPLER_CHECK_VERSION(0, 6, 0)
++ style,
++#endif
++ RVAL2RECT(rb_rect));
++ }
+
+- text = poppler_page_get_text(RVAL2GOBJ(self), RVAL2RECT(rect));
+ rb_text = CSTR2RVAL(text);
+ g_free(text);
+ return rb_text;
+@@ -119,15 +199,50 @@ page_get_text(VALUE self, VALUE rect)
+ static VALUE
+ page_get_link_mapping(VALUE self)
+ {
+- return GLIST2ARY2F(poppler_page_get_link_mapping(RVAL2GOBJ(self)),
++ return GLIST2ARY2F(poppler_page_get_link_mapping(SELF(self)),
+ POPPLER_TYPE_LINK_MAPPING);
+ }
+
++#if POPPLER_CHECK_VERSION(0, 6, 0)
++static VALUE
++page_get_image_mapping(VALUE self)
++{
++ return GLIST2ARY2F(poppler_page_get_image_mapping(SELF(self)),
++ POPPLER_TYPE_IMAGE_MAPPING);
++}
++
++static VALUE
++page_get_form_field_mapping(VALUE self)
++{
++ return GLIST2ARY2F(poppler_page_get_form_field_mapping(SELF(self)),
++ POPPLER_TYPE_FORM_FIELD_MAPPING);
++}
++#endif
++
+ static VALUE
+-page_get_selection_region(VALUE self, VALUE scale, VALUE selection)
++page_get_selection_region(int argc, VALUE *argv, VALUE self)
+ {
+- return REGION2RVAL(poppler_page_get_selection_region(RVAL2GOBJ(self),
++#if POPPLER_CHECK_VERSION(0, 6, 0)
++ PopplerSelectionStyle style = POPPLER_SELECTION_GLYPH;
++#endif
++ VALUE arg2, arg3, scale, selection;
++
++ rb_scan_args(argc, argv, "21", &scale, &arg2, &arg3);
++
++ if (NIL_P(arg3)) {
++ selection = arg2;
++ } else {
++#if POPPLER_CHECK_VERSION(0, 6, 0)
++ style = RVAL2SELSTYLE(arg2);
++#endif
++ selection = arg3;
++ }
++
++ return REGION2RVAL(poppler_page_get_selection_region(SELF(self),
+ NUM2DBL(scale),
++#if POPPLER_CHECK_VERSION(0, 6, 0)
++ style,
++#endif
+ RVAL2RECT(selection)));
+ }
+
+@@ -136,15 +251,16 @@ page_get_selection_region(VALUE self, VA
+ static VALUE
+ page_render_selection(VALUE self, VALUE cairo,
+ VALUE selection, VALUE rb_old_selection,
+- VALUE glyph_color, VALUE background_color)
++ VALUE style, VALUE glyph_color, VALUE background_color)
+ {
+ PopplerRectangle *old_selection = NULL;
+
+ if (!NIL_P(rb_old_selection))
+ old_selection = RVAL2RECT(rb_old_selection);
+- poppler_page_render_selection(RVAL2GOBJ(self), RVAL2CRCONTEXT(cairo),
++ poppler_page_render_selection(SELF(self), RVAL2CRCONTEXT(cairo),
+ RVAL2RECT(selection),
+ old_selection,
++ RVAL2SELSTYLE(style),
+ RVAL2COLOR(glyph_color),
+ RVAL2COLOR(background_color));
+ return Qnil;
+@@ -159,17 +275,24 @@ static VALUE
+ page_render_selection_to_pixbuf(VALUE self, VALUE scale, VALUE rotation,
+ VALUE pixbuf, VALUE selection,
+ VALUE rb_old_selection,
++#ifdef HAVE_POPPLER_PAGE_RENDER_SELECTION_TO_PIXBUF
++ VALUE style,
++#endif
+ VALUE glyph_color, VALUE background_color)
+ {
+ PopplerRectangle *old_selection = NULL;
+
+ if (!NIL_P(rb_old_selection))
+ old_selection = RVAL2RECT(rb_old_selection);
+- poppler_page_render_selection_to_pixbuf(RVAL2GOBJ(self), NUM2DBL(scale),
++ poppler_page_render_selection_to_pixbuf(SELF(self),
++ NUM2DBL(scale),
+ NUM2INT(rotation),
+ RVAL2GOBJ(pixbuf),
+ RVAL2RECT(selection),
+ old_selection,
++#ifdef HAVE_POPPLER_PAGE_RENDER_SELECTION_TO_PIXBUF
++ RVAL2SELSTYLE(style),
++#endif
+ RVAL2COLOR(glyph_color),
+ RVAL2COLOR(background_color));
+ return Qnil;
+@@ -178,24 +301,86 @@ page_render_selection_to_pixbuf(VALUE se
+ static VALUE
+ page_render_selection_generic(int argc, VALUE *argv, VALUE self)
+ {
+- if (argc == 5) {
++ if (argc == 6) {
+ #if defined(RB_POPPLER_CAIRO_AVAILABLE) && \
+ defined(HAVE_POPPLER_PAGE_RENDER_SELECTION_TO_PIXBUF)
+ return page_render_selection(self, argv[0], argv[1], argv[2],
+- argv[3], argv[4]);
++ argv[3], argv[4], argv[5]);
+ #else
+ rb_raise(rb_eArgError, "cairo is not available");
+ #endif
++#ifdef HAVE_POPPLER_PAGE_RENDER_SELECTION_TO_PIXBUF
++ } else if (argc == 8) {
++ return page_render_selection_to_pixbuf(self, argv[0], argv[1],
++ argv[2], argv[3], argv[4],
++ argv[5], argv[6], argv[7]);
++#else
+ } else if (argc == 7) {
+ return page_render_selection_to_pixbuf(self, argv[0], argv[1],
+ argv[2], argv[3], argv[4],
+ argv[5], argv[6]);
++#endif
+ } else {
+ rb_raise(rb_eArgError,
+- "wrong number of arguments (%d for 5 or 7)", argc);
++ "wrong number of arguments (%d for 5 or %d)", argc,
++#ifdef HAVE_POPPLER_PAGE_RENDER_SELECTION_TO_PIXBUF
++ 8
++#else
++ 7
++#endif
++ );
+ }
+ }
+
++#if POPPLER_CHECK_VERSION(0, 6, 0)
++static VALUE
++page_get_crop_box(VALUE self)
++{
++ PopplerRectangle rect;
++
++ poppler_page_get_crop_box(SELF(self), &rect);
++ return RECT2RVAL(&rect);
++}
++#endif
++
++
++#define DEF_READER(prefix, name, member, self_to_c, member_to_rb) \
++static VALUE \
++prefix ## _get_ ## name(VALUE self) \
++{ \
++ return member_to_rb((self_to_c(self))->member); \
++}
++
++#define DEF_WRITER(prefix, name, member, self_to_c, value_to_c) \
++static VALUE \
++prefix ## _set_ ## name(VALUE self, VALUE value) \
++{ \
++ (self_to_c(self))->member = value_to_c(value); \
++ return Qnil; \
++}
++
++#define DEF_WRITER_WITH_SETTER(prefix, name, member, \
++ self_to_c, value_setter) \
++static VALUE \
++prefix ## _set_ ## name(VALUE self, VALUE value) \
++{ \
++ value_setter((self_to_c(self))->member, value); \
++ return Qnil; \
++}
++
++#define DEF_ACCESSOR(prefix, member, self_to_c, member_to_rb, value_to_c) \
++ DEF_READER(prefix, member, member, self_to_c, member_to_rb) \
++ DEF_WRITER(prefix, member, member, self_to_c, value_to_c) \
++
++#define DEF_ACCESSOR_WITH_SETTER(prefix, member, self_to_c, \
++ member_to_rb, value_setter) \
++ DEF_READER(prefix, member, member, self_to_c, member_to_rb) \
++ DEF_WRITER_WITH_SETTER(prefix, member, member, self_to_c, value_setter)
++
++#define DEF_ACCESSOR_WITH_NAME(prefix, name, member, self_to_c, \
++ member_to_rb, value_to_c) \
++ DEF_READER(prefix, name, member, self_to_c, member_to_rb) \
++ DEF_WRITER(prefix, name, member, self_to_c, value_to_c)
+
+
+ /* A rectangle on a page, with coordinates in PDF points. */
+@@ -213,107 +398,320 @@ rectangle_initialize(VALUE self, VALUE x
+ return Qnil;
+ }
+
++DEF_ACCESSOR(rectangle, x1, RVAL2RECT, rb_float_new, NUM2DBL)
++DEF_ACCESSOR(rectangle, y1, RVAL2RECT, rb_float_new, NUM2DBL)
++DEF_ACCESSOR(rectangle, x2, RVAL2RECT, rb_float_new, NUM2DBL)
++DEF_ACCESSOR(rectangle, y2, RVAL2RECT, rb_float_new, NUM2DBL)
++
+ static VALUE
+-rectangle_get_x1(VALUE self)
++rectangle_to_a(VALUE self)
+ {
+- return rb_float_new(RVAL2RECT(self)->x1);
++ PopplerRectangle *rectangle = RVAL2RECT(self);
++ return rb_ary_new3(4,
++ rb_float_new(rectangle->x1),
++ rb_float_new(rectangle->y1),
++ rb_float_new(rectangle->x2),
++ rb_float_new(rectangle->y2));
+ }
+
+-static VALUE
+-rectangle_get_y1(VALUE self)
++
++/* Mapping between areas on the current page and PopplerActions */
++#define RECT_ENTITY2RVAL(rect) RECT2RVAL(&(rect))
++#define RECT_ENTITY_SET(rect, rb_rect) rectangle_set(&(rect), rb_rect)
++static void
++rectangle_set(PopplerRectangle *rect, VALUE rb_rect)
+ {
+- return rb_float_new(RVAL2RECT(self)->y1);
++ *rect = *(RVAL2RECT(rb_rect));
+ }
+
+-static VALUE
+-rectangle_get_x2(VALUE self)
++DEF_ACCESSOR_WITH_SETTER(link_mapping, area,
++ RVAL2LM, RECT_ENTITY2RVAL, RECT_ENTITY_SET)
++DEF_ACCESSOR(link_mapping, action, RVAL2LM, ACTION2RVAL, RVAL2ACTION)
++
++#if POPPLER_CHECK_VERSION(0, 6, 0)
++
++/* Page Transition */
++DEF_ACCESSOR(page_trans, type, RVAL2TRANS, RVAL2TT, TT2RVAL)
++DEF_ACCESSOR(page_trans, alignment, RVAL2TRANS, RVAL2TA, TA2RVAL)
++DEF_ACCESSOR(page_trans, direction, RVAL2TRANS, RVAL2TD, TD2RVAL)
++DEF_ACCESSOR(page_trans, duration, RVAL2TRANS, NUM2INT, INT2NUM)
++DEF_ACCESSOR(page_trans, angle, RVAL2TRANS, NUM2INT, INT2NUM)
++DEF_ACCESSOR(page_trans, scale, RVAL2TRANS, NUM2DBL, rb_float_new)
++DEF_ACCESSOR(page_trans, rectangular, RVAL2TRANS, RVAL2CBOOL, CBOOL2RVAL)
++
++
++/* Mapping between areas on the current page and images */
++DEF_ACCESSOR_WITH_SETTER(image_mapping, area,
++ RVAL2IM, RECT_ENTITY2RVAL, RECT_ENTITY_SET)
++DEF_ACCESSOR(image_mapping, image, RVAL2IM, GOBJ2RVAL, RVAL2GDK_PIXBUF)
++
++
++/* Mapping between areas on the current page and form fields */
++VALUE
++rb_poppler_ruby_object_from_form_field(PopplerFormField *field)
++{
++ VALUE obj;
++
++ obj = rbgobj_ruby_object_from_instance2(field, FALSE);
++ if (NIL_P(obj)) {
++ switch (poppler_form_field_get_field_type(field)) {
++ case POPPLER_FORM_FIELD_UNKNOWN:
++ obj = rbgobj_create_object(cUnknownField);
++ break;
++ case POPPLER_FORM_FIELD_BUTTON:
++ obj = rbgobj_create_object(cButtonField);
++ break;
++ case POPPLER_FORM_FIELD_TEXT:
++ obj = rbgobj_create_object(cTextField);
++ break;
++ case POPPLER_FORM_FIELD_CHOICE:
++ obj = rbgobj_create_object(cChoiceField);
++ break;
++ case POPPLER_FORM_FIELD_SIGNATURE:
++ obj = rbgobj_create_object(cSignatureField);
++ break;
++ }
++ g_object_ref(field);
++ G_INITIALIZE(obj, (gpointer)field);
++ }
++
++ return obj;
++}
++
++DEF_ACCESSOR_WITH_SETTER(form_field_mapping, area,
++ RVAL2FFM, RECT_ENTITY2RVAL, RECT_ENTITY_SET)
++DEF_ACCESSOR(form_field_mapping, field, RVAL2FFM, FF2RVAL, RVAL2FF)
++
++/* FormField */
++VALUE
++form_field_get_id(VALUE self)
+ {
+- return rb_float_new(RVAL2RECT(self)->x2);
++ return INT2NUM(poppler_form_field_get_id(RVAL2FF(self)));
+ }
+
+-static VALUE
+-rectangle_get_y2(VALUE self)
++VALUE
++form_field_get_font_size(VALUE self)
++{
++ return rb_float_new(poppler_form_field_get_font_size(RVAL2FF(self)));
++}
++
++VALUE
++form_field_is_read_only(VALUE self)
+ {
+- return rb_float_new(RVAL2RECT(self)->y2);
++ return CBOOL2RVAL(poppler_form_field_is_read_only(RVAL2FF(self)));
+ }
+
++/* Button Field */
++VALUE
++button_field_get_button_type(VALUE self)
++{
++ return FBT2RVAL(poppler_form_field_button_get_button_type(RVAL2FF(self)));
++}
+
+-static VALUE
+-rectangle_set_x1(VALUE self, VALUE x1)
++VALUE
++button_field_get_state(VALUE self)
+ {
+- RVAL2RECT(self)->x1 = NUM2DBL(x1);
++ return CBOOL2RVAL(poppler_form_field_button_get_state(RVAL2BF(self)));
++}
++
++VALUE
++button_field_set_state(VALUE self, VALUE state)
++{
++ poppler_form_field_button_set_state(RVAL2BF(self), RVAL2CBOOL(state));
+ return Qnil;
+ }
+
+-static VALUE
+-rectangle_set_y1(VALUE self, VALUE y1)
++/* Text Field */
++VALUE
++text_field_get_text_type(VALUE self)
+ {
+- RVAL2RECT(self)->y1 = NUM2DBL(y1);
++ return FTT2RVAL(poppler_form_field_text_get_text_type(RVAL2TF(self)));
++}
++
++VALUE
++text_field_get_text(VALUE self)
++{
++ return CSTR2RVAL(poppler_form_field_text_get_text(RVAL2TF(self)));
++}
++
++VALUE
++text_field_set_text(VALUE self, VALUE text)
++{
++ poppler_form_field_text_set_text(RVAL2TF(self), RVAL2CSTR2(text));
+ return Qnil;
+ }
+
+-static VALUE
+-rectangle_set_x2(VALUE self, VALUE x2)
++VALUE
++text_field_get_max_length(VALUE self)
++{
++ return INT2NUM(poppler_form_field_text_get_max_len(RVAL2TF(self)));
++}
++
++VALUE
++text_field_do_spell_check(VALUE self)
++{
++ return CBOOL2RVAL(poppler_form_field_text_do_spell_check(RVAL2TF(self)));
++}
++
++VALUE
++text_field_do_scroll(VALUE self)
++{
++ return CBOOL2RVAL(poppler_form_field_text_do_scroll(RVAL2TF(self)));
++}
++
++VALUE
++text_field_is_rich_text(VALUE self)
++{
++ return CBOOL2RVAL(poppler_form_field_text_is_rich_text(RVAL2TF(self)));
++}
++
++VALUE
++text_field_is_password(VALUE self)
++{
++ return CBOOL2RVAL(poppler_form_field_text_is_password(RVAL2TF(self)));
++}
++
++
++/* Choice Field */
++VALUE
++choice_field_get_choice_type(VALUE self)
++{
++ return FCT2RVAL(poppler_form_field_choice_get_choice_type(RVAL2CF(self)));
++}
++
++VALUE
++choice_field_is_editable(VALUE self)
++{
++ return CBOOL2RVAL(poppler_form_field_choice_is_editable(RVAL2CF(self)));
++}
++
++VALUE
++choice_field_can_select_multiple(VALUE self)
++{
++ return CBOOL2RVAL(poppler_form_field_choice_can_select_multiple(RVAL2CF(self)));
++}
++
++VALUE
++choice_field_do_spell_check(VALUE self)
+ {
+- RVAL2RECT(self)->x2 = NUM2DBL(x2);
++ return CBOOL2RVAL(poppler_form_field_choice_do_spell_check(RVAL2CF(self)));
++}
++
++VALUE
++choice_field_commit_on_change(VALUE self)
++{
++ return CBOOL2RVAL(poppler_form_field_choice_commit_on_change(RVAL2CF(self)));
++}
++
++VALUE
++choice_field_get_n_items(VALUE self)
++{
++ return INT2NUM(poppler_form_field_choice_get_n_items(RVAL2CF(self)));
++}
++
++VALUE
++choice_field_get_item(VALUE self, VALUE index)
++{
++ return CSTR2RVAL(poppler_form_field_choice_get_item(RVAL2CF(self),
++ NUM2INT(index)));
++}
++
++VALUE
++choice_field_is_item_selected(VALUE self, VALUE index)
++{
++ return CBOOL2RVAL(poppler_form_field_choice_is_item_selected(RVAL2CF(self),
++ NUM2INT(index)));
++}
++
++VALUE
++choice_field_select_item(VALUE self, VALUE index)
++{
++ poppler_form_field_choice_select_item(RVAL2CF(self), NUM2INT(index));
+ return Qnil;
+ }
+
+-static VALUE
+-rectangle_set_y2(VALUE self, VALUE y2)
++VALUE
++choice_field_unselect_all(VALUE self)
+ {
+- RVAL2RECT(self)->y2 = NUM2DBL(y2);
++ poppler_form_field_choice_unselect_all(RVAL2CF(self));
+ return Qnil;
+ }
+
+-static VALUE
+-rectangle_to_a(VALUE self)
++VALUE
++choice_field_toggle_item(VALUE self, VALUE index)
+ {
+- PopplerRectangle *rectangle = RVAL2RECT(self);
+- return rb_ary_new3(4,
+- rb_float_new(rectangle->x1),
+- rb_float_new(rectangle->y1),
+- rb_float_new(rectangle->x2),
+- rb_float_new(rectangle->y2));
++ poppler_form_field_choice_toggle_item(RVAL2CF(self), NUM2INT(index));
++ return Qnil;
+ }
+
+-
+-/* Mapping between areas on the current page and PopplerActions */
+-static VALUE
+-link_mapping_get_area(VALUE self)
++VALUE
++choice_field_set_text(VALUE self, VALUE text)
+ {
+- return RECT2RVAL(&(RVAL2LM(self)->area));
++ poppler_form_field_choice_set_text(RVAL2CF(self), RVAL2CSTR2(text));
++ return Qnil;
+ }
+
+-static VALUE
+-link_mapping_get_action(VALUE self)
++VALUE
++choice_field_get_text(VALUE self)
+ {
+- return ACTION2RVAL(RVAL2LM(self)->action);
++ return CSTR2RVAL(poppler_form_field_choice_get_text(RVAL2CF(self)));
+ }
++#endif
+
+ void
+ Init_poppler_page(VALUE mPoppler)
+ {
+- VALUE cPage, cRectangle, cLinkMapping;
++ VALUE cPage, cLinkMapping;
++#if POPPLER_CHECK_VERSION(0, 6, 0)
++ VALUE cPageTransition, cImageMapping, cFormFieldMapping, cFormField;
++#endif
+
+ cPage = G_DEF_CLASS(POPPLER_TYPE_PAGE, "Page", mPoppler);
+ cRectangle = G_DEF_CLASS(POPPLER_TYPE_RECTANGLE, "Rectangle", mPoppler);
+ cLinkMapping = G_DEF_CLASS(POPPLER_TYPE_LINK_MAPPING, "LinkMapping",
+ mPoppler);
++#if POPPLER_CHECK_VERSION(0, 6, 0)
++ cPageTransition = G_DEF_CLASS(POPPLER_TYPE_PAGE_TRANSITION,
++ "PageTransition", mPoppler);
++ cImageMapping = G_DEF_CLASS(POPPLER_TYPE_IMAGE_MAPPING,
++ "ImageMapping", mPoppler);
++ cFormFieldMapping = G_DEF_CLASS(POPPLER_TYPE_FORM_FIELD_MAPPING,
++ "FormFieldMapping", mPoppler);
++
++ cFormField = G_DEF_CLASS(POPPLER_TYPE_FORM_FIELD, "FormField", mPoppler);
++ cUnknownField = rb_define_class_under(mPoppler, "UnknownField", cFormField);
++ cTextField = rb_define_class_under(mPoppler, "TextField", cFormField);
++ cButtonField = rb_define_class_under(mPoppler, "ButtonField", cFormField);
++ cChoiceField = rb_define_class_under(mPoppler, "ChoiceField", cFormField);
++ cSignatureField = rb_define_class_under(mPoppler, "SignatureField",
++ cFormField);
++#endif
+ cPSFile = rb_const_get(mPoppler, rb_intern("PSFile"));
+
+ rb_define_method(cPage, "render", page_render_generic, -1);
+ rb_define_method(cPage, "size", page_get_size, 0);
+ rb_define_method(cPage, "index", page_get_index, 0);
++#if POPPLER_CHECK_VERSION(0, 6, 0)
++ rb_define_method(cPage, "duration", page_get_duration, 0);
++ rb_define_method(cPage, "transition", page_get_transition, 0);
++#endif
+ rb_define_method(cPage, "thumbnail", page_get_thumbnail, 0);
+ rb_define_method(cPage, "thumbnail_size", page_get_thumbnail_size, 0);
+ rb_define_method(cPage, "find_text", page_find_text, 1);
+- rb_define_method(cPage, "get_text", page_get_text, 1);
++ rb_define_method(cPage, "get_text", page_get_text, -1);
+ rb_define_method(cPage, "link_mapping", page_get_link_mapping, 0);
++#if POPPLER_CHECK_VERSION(0, 6, 0)
++ rb_define_method(cPage, "image_mapping", page_get_image_mapping, 0);
++ rb_define_method(cPage, "form_field_mapping",
++ page_get_form_field_mapping, 0);
++#endif
+ rb_define_method(cPage, "get_selection_region",
+- page_get_selection_region, 2);
++ page_get_selection_region, -1);
+ rb_define_method(cPage, "render_selection",
+ page_render_selection_generic, -1);
++#if POPPLER_CHECK_VERSION(0, 6, 0)
++ rb_define_method(cPage, "crop_box", page_get_crop_box, 0);
++#endif
+
+ G_DEF_SETTERS(cPage);
+
+@@ -335,5 +733,102 @@ Init_poppler_page(VALUE mPoppler)
+ rb_define_method(cLinkMapping, "area", link_mapping_get_area, 0);
+ rb_define_method(cLinkMapping, "action", link_mapping_get_action, 0);
+
++ rb_define_method(cLinkMapping, "set_area", link_mapping_set_area, 1);
++ rb_define_method(cLinkMapping, "set_action", link_mapping_set_action, 1);
++
+ G_DEF_SETTERS(cLinkMapping);
++
++#if POPPLER_CHECK_VERSION(0, 6, 0)
++/* Page Transition */
++ rb_define_method(cPageTransition, "type", page_trans_get_type, 0);
++ rb_define_method(cPageTransition, "alignment", page_trans_get_alignment, 0);
++ rb_define_method(cPageTransition, "direction", page_trans_get_direction, 0);
++ rb_define_method(cPageTransition, "duration", page_trans_get_duration, 0);
++ rb_define_method(cPageTransition, "angle", page_trans_get_angle, 0);
++ rb_define_method(cPageTransition, "scale", page_trans_get_scale, 0);
++ rb_define_method(cPageTransition, "rectangular",
++ page_trans_get_rectangular, 0);
++
++ rb_define_method(cPageTransition, "set_type", page_trans_set_type, 1);
++ rb_define_method(cPageTransition, "set_alignment",
++ page_trans_set_alignment, 1);
++ rb_define_method(cPageTransition, "set_direction",
++ page_trans_set_direction, 1);
++ rb_define_method(cPageTransition, "set_duration",
++ page_trans_set_duration, 1);
++ rb_define_method(cPageTransition, "set_angle", page_trans_set_angle, 1);
++ rb_define_method(cPageTransition, "set_scale", page_trans_set_scale, 1);
++ rb_define_method(cPageTransition, "set_rectangular",
++ page_trans_set_rectangular, 1);
++
++ G_DEF_SETTERS(cPageTransition);
++
++
++/* Mapping between areas on the current page and images */
++ rb_define_method(cImageMapping, "area", image_mapping_get_area, 0);
++ rb_define_method(cImageMapping, "image", image_mapping_get_image, 0);
++
++ rb_define_method(cImageMapping, "set_area", image_mapping_set_area, 1);
++ rb_define_method(cImageMapping, "set_image", image_mapping_set_image, 1);
++
++ G_DEF_SETTERS(cImageMapping);
++
++
++/* Mapping between areas on the current page and form fields */
++ rb_define_method(cFormFieldMapping, "area", form_field_mapping_get_area, 0);
++ rb_define_method(cFormFieldMapping, "field", form_field_mapping_get_field,
++ 0);
++
++ rb_define_method(cFormFieldMapping, "set_area",
++ form_field_mapping_set_area, 1);
++ rb_define_method(cFormFieldMapping, "set_field",
++ form_field_mapping_set_field, 1);
++
++ G_DEF_SETTERS(cFormFieldMapping);
++
++/* FormField */
++ rb_define_method(cFormField, "id", form_field_get_id, 0);
++ rb_define_method(cFormField, "font_size", form_field_get_font_size, 0);
++ rb_define_method(cFormField, "read_only?", form_field_is_read_only, 0);
++
++ G_DEF_SETTERS(cFormField);
++
++
++ rb_define_method(cButtonField, "active?", button_field_get_state, 0);
++ rb_define_method(cButtonField, "set_active", button_field_set_state, 1);
++
++ G_DEF_SETTERS(cButtonField);
++
++
++ rb_define_method(cTextField, "type", text_field_get_text_type, 0);
++ rb_define_method(cTextField, "text", text_field_get_text, 0);
++ rb_define_method(cTextField, "set_text", text_field_set_text, 1);
++ rb_define_method(cTextField, "max_length", text_field_get_max_length, 0);
++ rb_define_method(cTextField, "spell_check?", text_field_do_spell_check, 0);
++ rb_define_method(cTextField, "scroll?", text_field_do_scroll, 0);
++ rb_define_method(cTextField, "rich_text?", text_field_is_rich_text, 0);
++ rb_define_method(cTextField, "password?", text_field_is_password, 0);
++
++ G_DEF_SETTERS(cTextField);
++
++
++ rb_define_method(cChoiceField, "type", choice_field_get_choice_type, 0);
++ rb_define_method(cChoiceField, "editable?", choice_field_is_editable, 0);
++ rb_define_method(cChoiceField, "select_multiple?",
++ choice_field_can_select_multiple, 0);
++ rb_define_method(cChoiceField, "spell_check?",
++ choice_field_do_spell_check, 0);
++ rb_define_method(cChoiceField, "commit_on_change?",
++ choice_field_commit_on_change, 0);
++ rb_define_method(cChoiceField, "n_items", choice_field_get_n_items, 0);
++ rb_define_method(cChoiceField, "[]", choice_field_get_item, 1);
++ rb_define_method(cChoiceField, "selected?",
++ choice_field_is_item_selected, 1);
++ rb_define_method(cChoiceField, "select", choice_field_select_item, 1);
++ rb_define_method(cChoiceField, "unselect_all", choice_field_unselect_all, 0);
++ rb_define_method(cChoiceField, "text", choice_field_get_text, 0);
++ rb_define_method(cChoiceField, "set_text", choice_field_set_text, 1);
++
++ G_DEF_SETTERS(cChoiceField);
++#endif
+ }