summaryrefslogtreecommitdiff
path: root/test
diff options
context:
space:
mode:
authorCarlos Garcia Campos <carlosgc@gnome.org>2011-02-13 16:21:52 +0100
committerCarlos Garcia Campos <carlosgc@gnome.org>2011-02-13 16:24:53 +0100
commit675b3505f963a0110dac7f865654232cbb865ef5 (patch)
treee937c2fefa4c8c2d83af91bd8472d47d2a715552 /test
parent728c022cdc1ea12aa54077d44276f9d7714930d4 (diff)
tests: Merge splash and cairo tests into a single gtk-test tool
With a command line option to use cairo or splash backends.
Diffstat (limited to 'test')
-rw-r--r--test/CMakeLists.txt20
-rw-r--r--test/Makefile.am29
-rw-r--r--test/gtk-cairo-test.cc190
-rw-r--r--test/gtk-splash-test.cc311
-rw-r--r--test/gtk-test.cc397
5 files changed, 412 insertions, 535 deletions
diff --git a/test/CMakeLists.txt b/test/CMakeLists.txt
index acb867be..cff715c2 100644
--- a/test/CMakeLists.txt
+++ b/test/CMakeLists.txt
@@ -24,24 +24,14 @@ if (GTK_FOUND)
${CMAKE_BINARY_DIR}/glib
)
- if (ENABLE_SPLASH)
-
- set (gtk_splash_test_SRCS
- gtk-splash-test.cc
- )
- poppler_add_test(gtk-splash-test BUILD_GTK_TESTS ${gtk_splash_test_SRCS})
- target_link_libraries(gtk-splash-test poppler ${GTK2_LIBRARIES})
-
- endif (ENABLE_SPLASH)
+ set (gtk_splash_test_SRCS
+ gtk-test.cc
+ )
+ poppler_add_test(gtk-test BUILD_GTK_TESTS ${gtk_splash_test_SRCS})
+ target_link_libraries(gtk-test poppler-glib ${GTK2_LIBRARIES})
if (HAVE_CAIRO)
- set (gtk_cairo_test_SRCS
- gtk-cairo-test.cc
- )
- poppler_add_test(gtk-cairo-test BUILD_GTK_TESTS ${gtk_cairo_test_SRCS})
- target_link_libraries(gtk-cairo-test poppler-glib ${GTK2_LIBRARIES})
-
set (pdf_inspector_SRCS
pdf-inspector.cc
)
diff --git a/test/Makefile.am b/test/Makefile.am
index 38bf72dc..a0eb4d09 100644
--- a/test/Makefile.am
+++ b/test/Makefile.am
@@ -2,9 +2,6 @@ if BUILD_GTK_TEST
if BUILD_SPLASH_OUTPUT
-gtk_splash_test = \
- gtk-splash-test
-
splash_includes = \
-I$(top_srcdir)/splash
@@ -12,9 +9,6 @@ endif
if BUILD_CAIRO_OUTPUT
-gtk_cairo_test = \
- gtk-cairo-test
-
pdf_inspector = \
pdf_inspector
@@ -36,6 +30,9 @@ endif
pdf_fullrewrite = \
pdf-fullrewrite
+gtk_test = \
+ gtk-test
+
INCLUDES = \
-I$(top_srcdir) \
-I$(top_srcdir)/poppler \
@@ -45,27 +42,21 @@ INCLUDES = \
$(GTK_TEST_CFLAGS) \
$(FONTCONFIG_CFLAGS)
-noinst_PROGRAMS = $(gtk_splash_test) $(gtk_cairo_test) $(pdf_inspector) $(perf_test) $(pdf_fullrewrite)
+noinst_PROGRAMS = $(pdf_inspector) $(perf_test) $(pdf_fullrewrite) $(gtk_test)
AM_LDFLAGS = @auto_import_flags@
-gtk_splash_test_SOURCES = \
- gtk-splash-test.cc
-
-gtk_splash_test_LDADD = \
- $(top_builddir)/poppler/libpoppler.la \
- $(GTK_TEST_LIBS)
-
-gtk_cairo_test_SOURCES = \
- gtk-cairo-test.cc
+gtk_test_SOURCES = \
+ gtk-test.cc
-gtk_cairo_test_LDADD = \
- $(top_builddir)/poppler/libpoppler.la \
- $(top_builddir)/glib/libpoppler-glib.la \
+gtk_test_LDADD = \
+ $(top_builddir)/poppler/libpoppler.la \
+ $(top_builddir)/glib/libpoppler-glib.la \
$(CAIRO_LIBS) \
$(GTK_TEST_LIBS) \
$(FONTCONFIG_LIBS)
+
pdf_inspector_SOURCES = \
pdf-inspector.cc
diff --git a/test/gtk-cairo-test.cc b/test/gtk-cairo-test.cc
deleted file mode 100644
index 8c405685..00000000
--- a/test/gtk-cairo-test.cc
+++ /dev/null
@@ -1,190 +0,0 @@
-//========================================================================
-//
-// GDKSplashOutputDev.cc
-//
-// Copyright 2003 Glyph & Cog, LLC
-// Copyright 2004 Red Hat, Inc. (GDK port)
-//
-//========================================================================
-
-#include <config.h>
-
-#ifdef USE_GCC_PRAGMAS
-#pragma implementation
-#endif
-
-#include <math.h>
-#include <gdk/gdk.h>
-#include <gtk/gtk.h>
-#include <poppler.h>
-
-typedef struct
-{
- GtkWidget *window;
- GtkWidget *sw;
- GtkWidget *drawing_area;
- GtkWidget *spin_button;
- PopplerPage *page;
- PopplerDocument *document;
- cairo_surface_t *surface;
- int *window_count;
-} View;
-
-static void
-drawing_area_expose (GtkWidget *drawing_area,
- GdkEventExpose *event,
- void *data)
-{
- View *v = (View*) data;
- cairo_t *cr;
-
- gdk_window_clear (drawing_area->window);
- cr = gdk_cairo_create (drawing_area->window);
-
- cairo_set_source_surface (cr, v->surface, 0, 0);
- cairo_paint (cr);
- cairo_destroy (cr);
-}
-
-static void
-view_set_page (View *v, int page)
-{
- int w, h;
- double width, height;
- cairo_t *cr;
-
- v->page = poppler_document_get_page (v->document, page);
- poppler_page_get_size (v->page, &width, &height);
- w = (int) ceil(width);
- h = (int) ceil(height);
- cairo_surface_destroy (v->surface);
- v->surface = cairo_image_surface_create (CAIRO_FORMAT_ARGB32, w, h);
- cr = cairo_create (v->surface);
- poppler_page_render (v->page, cr);
- cairo_destroy (cr);
- gtk_widget_set_size_request (v->drawing_area, w, h);
- gtk_widget_queue_draw (v->drawing_area);
- gtk_spin_button_set_value (GTK_SPIN_BUTTON (v->spin_button), page);
-}
-
-static void
-page_changed_callback (GtkSpinButton *button, View *v)
-{
- int page;
-
- page = gtk_spin_button_get_value_as_int (button);
- view_set_page (v, page);
-}
-
-static void
-destroy_window_callback (GtkWindow *window, View *v)
-{
- if (--(*v->window_count) == 0)
- gtk_main_quit();
-}
-
-static View*
-view_new (const char *filename, int *window_count)
-{
- View *v;
- GtkWidget *window;
- GtkWidget *drawing_area;
- GtkWidget *sw;
- GtkWidget *vbox, *hbox;
- GtkWidget *spin_button;
- int n_pages;
-
- v = g_new0 (View, 1);
-
- v->document = poppler_document_new_from_file (filename, NULL, NULL);
- if (v->document == NULL)
- return NULL;
-
- window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
- vbox = gtk_vbox_new(FALSE, 5);
-
- gtk_container_add (GTK_CONTAINER (window), vbox);
- drawing_area = gtk_drawing_area_new ();
-
- sw = gtk_scrolled_window_new (NULL, NULL);
-
- gtk_box_pack_end (GTK_BOX (vbox), sw, TRUE, TRUE, 0);
- gtk_scrolled_window_add_with_viewport (GTK_SCROLLED_WINDOW (sw),
- drawing_area);
-
- n_pages = poppler_document_get_n_pages (v->document);
- spin_button = gtk_spin_button_new_with_range (0, n_pages - 1, 1);
- g_signal_connect (G_OBJECT (spin_button), "value-changed",
- G_CALLBACK (page_changed_callback), v);
- hbox = gtk_hbox_new (FALSE, 5);
- gtk_box_pack_end (GTK_BOX (hbox), spin_button, FALSE, TRUE, 0);
-
- gtk_box_pack_end (GTK_BOX (vbox), hbox, FALSE, TRUE, 0);
-
- gtk_widget_show_all (window);
- gtk_widget_realize (window);
-
- v->window = window;
- v->drawing_area = drawing_area;
- v->sw = sw;
- v->window_count = window_count;
- v->spin_button = spin_button;
-
- g_signal_connect (drawing_area,
- "expose_event",
- G_CALLBACK (drawing_area_expose),
- (void*) v);
-
- g_signal_connect (window,
- "destroy",
- G_CALLBACK (destroy_window_callback),
- (void*) v);
-
- return v;
-}
-
-static int option_page = 0;
-static GOptionEntry demo_options[] = {
- { "page", 0, 0, G_OPTION_ARG_INT, &option_page, "Page number", "PAGE" },
- { NULL }
-};
-
-int
-main (int argc, char *argv [])
-{
- View *v;
- int i, window_count;
- GOptionContext *ctx;
-
- ctx = g_option_context_new("FILENAME ...");
- g_option_context_add_main_entries(ctx, demo_options, "main");
- g_option_context_parse(ctx, &argc, &argv, NULL);
- g_option_context_free(ctx);
-
- gtk_init (&argc, &argv);
-
- if (argc == 1)
- {
- char *basename = g_path_get_basename (argv[0]);
- fprintf (stderr, "usage: %s PDF-FILES...\n", basename);
- g_free (basename);
- return -1;
- }
-
- window_count = 0;
- for (i = 1; i < argc; i++) {
- v = view_new (argv[i], &window_count);
- if (v == NULL) {
- g_printerr ("Error loading %s\n", argv[i]);
- continue;
- }
-
- view_set_page (v, option_page);
- window_count++;
- }
-
- if (window_count > 0)
- gtk_main ();
-
- return 0;
-}
diff --git a/test/gtk-splash-test.cc b/test/gtk-splash-test.cc
deleted file mode 100644
index 59fba286..00000000
--- a/test/gtk-splash-test.cc
+++ /dev/null
@@ -1,311 +0,0 @@
-//========================================================================
-//
-// GDKSplashOutputDev.cc
-//
-// Copyright 2003 Glyph & Cog, LLC
-// Copyright 2004 Red Hat, Inc. (GDK port)
-//
-//========================================================================
-
-#include <config.h>
-
-#ifdef USE_GCC_PRAGMAS
-#pragma implementation
-#endif
-
-#include <goo/gmem.h>
-#include <splash/SplashTypes.h>
-#include <splash/SplashBitmap.h>
-#include "Object.h"
-#include "SplashOutputDev.h"
-#include "GfxState.h"
-
-#include <gdk/gdk.h>
-
-#include "PDFDoc.h"
-#include "GlobalParams.h"
-#include "ErrorCodes.h"
-#include <gtk/gtk.h>
-
-//------------------------------------------------------------------------
-
-#define xOutMaxRGBCube 6 // max size of RGB color cube
-
-//------------------------------------------------------------------------
-// GDKSplashOutputDev
-//------------------------------------------------------------------------
-
-class GDKSplashOutputDev: public SplashOutputDev {
-public:
-
- GDKSplashOutputDev(GdkScreen *screen,
- void (*redrawCbkA)(void *data),
- void *redrawCbkDataA, SplashColor sc);
-
- virtual ~GDKSplashOutputDev();
-
- //----- initialization and control
-
- // End a page.
- virtual void endPage();
-
- // Dump page contents to display.
- virtual void dump();
-
- //----- update text state
- virtual void updateFont(GfxState *state);
-
- //----- special access
-
- // Clear out the document (used when displaying an empty window).
- void clear();
-
- // Copy the rectangle (srcX, srcY, width, height) to (destX, destY)
- // in destDC.
- void redraw(int srcX, int srcY,
- GdkWindow *drawable,
- int destX, int destY,
- int width, int height);
-
-private:
-
- int incrementalUpdate;
- void (*redrawCbk)(void *data);
- void *redrawCbkData;
-};
-
-//------------------------------------------------------------------------
-// Constants and macros
-//------------------------------------------------------------------------
-
-#define xoutRound(x) ((int)(x + 0.5))
-
-//------------------------------------------------------------------------
-// GDKSplashOutputDev
-//------------------------------------------------------------------------
-
-GDKSplashOutputDev::GDKSplashOutputDev(GdkScreen *screen,
- void (*redrawCbkA)(void *data),
- void *redrawCbkDataA, SplashColor sc):
- SplashOutputDev(splashModeRGB8, 4, gFalse, sc),
- incrementalUpdate (1)
-{
- redrawCbk = redrawCbkA;
- redrawCbkData = redrawCbkDataA;
-}
-
-GDKSplashOutputDev::~GDKSplashOutputDev() {
-}
-
-void GDKSplashOutputDev::clear() {
- startDoc(NULL);
- startPage(0, NULL);
-}
-
-void GDKSplashOutputDev::endPage() {
- SplashOutputDev::endPage();
- if (!incrementalUpdate) {
- (*redrawCbk)(redrawCbkData);
- }
-}
-
-void GDKSplashOutputDev::dump() {
- if (incrementalUpdate && redrawCbk) {
- (*redrawCbk)(redrawCbkData);
- }
-}
-
-void GDKSplashOutputDev::updateFont(GfxState *state) {
- SplashOutputDev::updateFont(state);
-}
-
-void GDKSplashOutputDev::redraw(int srcX, int srcY,
- GdkWindow *drawable,
- int destX, int destY,
- int width, int height) {
- cairo_t *cr;
- GdkPixbuf *pixbuf;
- int gdk_rowstride;
-
- gdk_rowstride = getBitmap()->getRowSize();
- pixbuf = gdk_pixbuf_new_from_data (getBitmap()->getDataPtr() + srcY * gdk_rowstride + srcX * 3,
- GDK_COLORSPACE_RGB, FALSE, 8,
- width, height, gdk_rowstride,
- NULL, NULL);
-
- cr = gdk_cairo_create (drawable);
- gdk_cairo_set_source_pixbuf (cr, pixbuf, 0, 0);
- cairo_paint (cr);
- cairo_destroy (cr);
-
- g_object_unref (pixbuf);
-}
-
-
-typedef struct
-{
- GtkWidget *window;
- GtkWidget *sw;
- GtkWidget *drawing_area;
- GDKSplashOutputDev *out;
- PDFDoc *doc;
-} View;
-
-static void
-drawing_area_expose (GtkWidget *drawing_area,
- GdkEventExpose *event,
- void *data)
-{
- View *v = (View*) data;
- GdkRectangle document;
- GdkRectangle draw;
-
- gdk_window_clear (drawing_area->window);
-
- document.x = 0;
- document.y = 0;
- document.width = v->out->getBitmapWidth();
- document.height = v->out->getBitmapHeight();
-
- if (gdk_rectangle_intersect (&document, &event->area, &draw))
- {
- v->out->redraw (draw.x, draw.y,
- drawing_area->window,
- draw.x, draw.y,
- draw.width, draw.height);
- }
-}
-
-static int
-view_load (View *v,
- const char *filename)
-{
- PDFDoc *newDoc;
- int err;
- GooString *filename_g;
- int w, h;
-
- filename_g = new GooString (filename);
-
- // open the PDF file
- newDoc = new PDFDoc(filename_g, 0, 0);
-
- delete filename_g;
-
- if (!newDoc->isOk())
- {
- err = newDoc->getErrorCode();
- delete newDoc;
- return err;
- }
-
- if (v->doc)
- delete v->doc;
- v->doc = newDoc;
-
- v->out->startDoc(v->doc->getXRef());
-
- v->doc->displayPage (v->out, 1, 72, 72, 0, gFalse, gTrue, gTrue);
-
- w = v->out->getBitmapWidth();
- h = v->out->getBitmapHeight();
-
- gtk_widget_set_size_request (v->drawing_area, w, h);
-
- return errNone;
-}
-
-static void
-view_show (View *v)
-{
- gtk_widget_show (v->window);
-}
-
-static void
-redraw_callback (void *data)
-{
- View *v = (View*) data;
-
- gtk_widget_queue_draw (v->drawing_area);
-}
-
-static View*
-view_new (void)
-{
- View *v;
- GtkWidget *window;
- GtkWidget *drawing_area;
- GtkWidget *sw;
-
- window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
-
- drawing_area = gtk_drawing_area_new ();
-
- sw = gtk_scrolled_window_new (NULL, NULL);
-
- gtk_container_add (GTK_CONTAINER (window), sw);
- gtk_scrolled_window_add_with_viewport (GTK_SCROLLED_WINDOW (sw), drawing_area);
-
- gtk_widget_show_all (sw);
-
- v = g_new0 (View, 1);
-
- v->window = window;
- v->drawing_area = drawing_area;
- v->sw = sw;
- SplashColor sc;
- sc[0] = 255;
- sc[1] = 255;
- sc[2] = 255;
- v->out = new GDKSplashOutputDev (gtk_widget_get_screen (window),
- redraw_callback, (void*) v, sc);
- v->doc = 0;
-
- g_signal_connect (drawing_area,
- "expose_event",
- G_CALLBACK (drawing_area_expose),
- (void*) v);
-
- return v;
-}
-
-int
-main (int argc, char *argv [])
-{
- View *v;
- int i;
-
- gtk_init (&argc, &argv);
-
- globalParams = new GlobalParams();
-
- if (argc == 1)
- {
- fprintf (stderr, "usage: %s PDF-FILES...\n", argv[0]);
- return -1;
- }
-
-
- i = 1;
- while (i < argc)
- {
- int err;
-
- v = view_new ();
-
- err = view_load (v, argv[i]);
-
- if (err != errNone)
- g_printerr ("Error loading document!\n");
-
- view_show (v);
-
- ++i;
- }
-
- gtk_main ();
-
- delete globalParams;
-
- return 0;
-}
diff --git a/test/gtk-test.cc b/test/gtk-test.cc
new file mode 100644
index 00000000..1e9e1ee1
--- /dev/null
+++ b/test/gtk-test.cc
@@ -0,0 +1,397 @@
+#include <config.h>
+
+#ifdef USE_GCC_PRAGMAS
+#pragma implementation
+#endif
+
+#include <goo/gmem.h>
+#include <splash/SplashTypes.h>
+#include <splash/SplashBitmap.h>
+#include "Object.h"
+#include "SplashOutputDev.h"
+#include "GfxState.h"
+
+#include <gdk/gdk.h>
+
+#include "PDFDoc.h"
+#include "GlobalParams.h"
+#include "ErrorCodes.h"
+#include <poppler.h>
+#include <poppler-private.h>
+#include <gtk/gtk.h>
+#include <math.h>
+
+static int page = 0;
+static gboolean cairo_output = FALSE;
+static gboolean splash_output = FALSE;
+static const char **file_arguments = NULL;
+static const GOptionEntry options[] = {
+ { "cairo", 'c', 0, G_OPTION_ARG_NONE, &cairo_output, "Cairo Output Device", NULL},
+ { "splash", 's', 0, G_OPTION_ARG_NONE, &splash_output, "Splash Output Device", NULL},
+ { "page", 'p', 0, G_OPTION_ARG_INT, &page, "Page number", "PAGE" },
+ { G_OPTION_REMAINING, 0, 0, G_OPTION_ARG_FILENAME_ARRAY, &file_arguments, NULL, "PDF-FILES…" },
+ { NULL }
+};
+
+static GList *view_list = NULL;
+
+//------------------------------------------------------------------------
+
+#define xOutMaxRGBCube 6 // max size of RGB color cube
+
+//------------------------------------------------------------------------
+// GDKSplashOutputDev
+//------------------------------------------------------------------------
+
+class GDKSplashOutputDev: public SplashOutputDev {
+public:
+
+ GDKSplashOutputDev(GdkScreen *screen,
+ void (*redrawCbkA)(void *data),
+ void *redrawCbkDataA, SplashColor sc);
+
+ virtual ~GDKSplashOutputDev();
+
+ //----- initialization and control
+
+ // End a page.
+ virtual void endPage();
+
+ // Dump page contents to display.
+ virtual void dump();
+
+ //----- update text state
+ virtual void updateFont(GfxState *state);
+
+ //----- special access
+
+ // Clear out the document (used when displaying an empty window).
+ void clear();
+
+ // Copy the rectangle (srcX, srcY, width, height) to (destX, destY)
+ // in destDC.
+ void redraw(int srcX, int srcY,
+ cairo_t *cr,
+ int destX, int destY,
+ int width, int height);
+
+private:
+
+ int incrementalUpdate;
+ void (*redrawCbk)(void *data);
+ void *redrawCbkData;
+};
+
+typedef struct
+{
+ PopplerDocument *doc;
+ GtkWidget *drawing_area;
+ GtkWidget *spin_button;
+ cairo_surface_t *surface;
+ GDKSplashOutputDev *out;
+} View;
+
+//------------------------------------------------------------------------
+// Constants and macros
+//------------------------------------------------------------------------
+
+#define xoutRound(x) ((int)(x + 0.5))
+
+//------------------------------------------------------------------------
+// GDKSplashOutputDev
+//------------------------------------------------------------------------
+
+GDKSplashOutputDev::GDKSplashOutputDev(GdkScreen *screen,
+ void (*redrawCbkA)(void *data),
+ void *redrawCbkDataA, SplashColor sc):
+ SplashOutputDev(splashModeRGB8, 4, gFalse, sc),
+ incrementalUpdate (1)
+{
+ redrawCbk = redrawCbkA;
+ redrawCbkData = redrawCbkDataA;
+}
+
+GDKSplashOutputDev::~GDKSplashOutputDev() {
+}
+
+void GDKSplashOutputDev::clear() {
+ startDoc(NULL);
+ startPage(0, NULL);
+}
+
+void GDKSplashOutputDev::endPage() {
+ SplashOutputDev::endPage();
+ if (!incrementalUpdate) {
+ (*redrawCbk)(redrawCbkData);
+ }
+}
+
+void GDKSplashOutputDev::dump() {
+ if (incrementalUpdate && redrawCbk) {
+ (*redrawCbk)(redrawCbkData);
+ }
+}
+
+void GDKSplashOutputDev::updateFont(GfxState *state) {
+ SplashOutputDev::updateFont(state);
+}
+
+void GDKSplashOutputDev::redraw(int srcX, int srcY,
+ cairo_t *cr,
+ int destX, int destY,
+ int width, int height) {
+ GdkPixbuf *pixbuf;
+ int gdk_rowstride;
+
+ gdk_rowstride = getBitmap()->getRowSize();
+ pixbuf = gdk_pixbuf_new_from_data (getBitmap()->getDataPtr() + srcY * gdk_rowstride + srcX * 3,
+ GDK_COLORSPACE_RGB, FALSE, 8,
+ width, height, gdk_rowstride,
+ NULL, NULL);
+
+ gdk_cairo_set_source_pixbuf (cr, pixbuf, 0, 0);
+ cairo_paint (cr);
+
+ g_object_unref (pixbuf);
+}
+
+static gboolean
+drawing_area_expose (GtkWidget *drawing_area,
+ GdkEventExpose *event,
+ View *view)
+{
+ cairo_t *cr;
+ GdkRectangle document;
+ GdkRectangle draw;
+
+ gdk_window_clear (drawing_area->window);
+
+ document.x = 0;
+ document.y = 0;
+ if (cairo_output) {
+ document.width = cairo_image_surface_get_width (view->surface);
+ document.height = cairo_image_surface_get_height (view->surface);
+ } else {
+ document.width = view->out->getBitmapWidth();
+ document.height = view->out->getBitmapHeight();
+ }
+
+ cr = gdk_cairo_create (drawing_area->window);
+ if (!gdk_rectangle_intersect (&document, &event->area, &draw))
+ return FALSE;
+
+ if (cairo_output) {
+ cairo_set_source_surface (cr, view->surface, 0, 0);
+ cairo_paint (cr);
+ } else {
+ view->out->redraw (draw.x, draw.y,
+ cr,
+ draw.x, draw.y,
+ draw.width, draw.height);
+ }
+
+ cairo_destroy (cr);
+
+ return TRUE;
+}
+
+static void
+view_set_page (View *view, int page)
+{
+ int w, h;
+
+ if (cairo_output) {
+ cairo_t *cr;
+ double width, height;
+ PopplerPage *poppler_page;
+
+ poppler_page = poppler_document_get_page (view->doc, page);
+ poppler_page_get_size (poppler_page, &width, &height);
+ w = (int) ceil(width);
+ h = (int) ceil(height);
+
+ if (view->surface)
+ cairo_surface_destroy (view->surface);
+ view->surface = cairo_image_surface_create (CAIRO_FORMAT_ARGB32, w, h);
+
+ cr = cairo_create (view->surface);
+ poppler_page_render (poppler_page, cr);
+
+ cairo_set_operator (cr, CAIRO_OPERATOR_DEST_OVER);
+ cairo_set_source_rgb (cr, 1., 1., 1.);
+ cairo_paint (cr);
+
+ cairo_destroy (cr);
+ g_object_unref (poppler_page);
+ } else {
+ view->doc->doc->displayPage (view->out, page + 1, 72, 72, 0, gFalse, gTrue, gTrue);
+ w = view->out->getBitmapWidth();
+ h = view->out->getBitmapHeight();
+ }
+
+ gtk_widget_set_size_request (view->drawing_area, w, h);
+ gtk_widget_queue_draw (view->drawing_area);
+ gtk_spin_button_set_value (GTK_SPIN_BUTTON (view->spin_button), page);
+}
+
+static void
+redraw_callback (void *data)
+{
+ View *view = (View*) data;
+
+ gtk_widget_queue_draw (view->drawing_area);
+}
+
+static void
+view_free (View *view)
+{
+ if (G_UNLIKELY (!view))
+ return;
+
+ g_object_unref (view->doc);
+ delete view->out;
+ cairo_surface_destroy (view->surface);
+ g_slice_free (View, view);
+}
+
+static void
+destroy_window_callback (GtkWindow *window, View *view)
+{
+ view_list = g_list_remove (view_list, view);
+ view_free (view);
+
+ if (!view_list)
+ gtk_main_quit ();
+}
+
+static void
+page_changed_callback (GtkSpinButton *button, View *view)
+{
+ int page;
+
+ page = gtk_spin_button_get_value_as_int (button);
+ view_set_page (view, page);
+}
+
+static View *
+view_new (PopplerDocument *doc)
+{
+ View *view;
+ GtkWidget *window;
+ GtkWidget *sw;
+ GtkWidget *vbox, *hbox;
+ guint n_pages;
+
+ view = g_slice_new0 (View);
+
+ view->doc = doc;
+
+ window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
+ g_signal_connect (window, "destroy",
+ G_CALLBACK (destroy_window_callback),
+ view);
+
+ vbox = gtk_vbox_new (FALSE, 5);
+
+ view->drawing_area = gtk_drawing_area_new ();
+ sw = gtk_scrolled_window_new (NULL, NULL);
+ gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (sw),
+ GTK_POLICY_AUTOMATIC,
+ GTK_POLICY_AUTOMATIC);
+ gtk_scrolled_window_add_with_viewport (GTK_SCROLLED_WINDOW (sw),
+ view->drawing_area);
+ gtk_widget_show (view->drawing_area);
+
+ gtk_box_pack_end (GTK_BOX (vbox), sw, TRUE, TRUE, 0);
+ gtk_widget_show (sw);
+
+ hbox = gtk_hbox_new (FALSE, 5);
+
+ n_pages = poppler_document_get_n_pages (doc);
+ view->spin_button = gtk_spin_button_new_with_range (0, n_pages - 1, 1);
+ g_signal_connect (view->spin_button, "value-changed",
+ G_CALLBACK (page_changed_callback), view);
+
+ gtk_box_pack_end (GTK_BOX (hbox), view->spin_button, FALSE, TRUE, 0);
+ gtk_widget_show (view->spin_button);
+
+ gtk_box_pack_end (GTK_BOX (vbox), hbox, FALSE, TRUE, 0);
+ gtk_widget_show (hbox);
+
+ gtk_container_add (GTK_CONTAINER (window), vbox);
+ gtk_widget_show (vbox);
+
+ gtk_widget_show (window);
+
+
+ if (!cairo_output) {
+ SplashColor sc = { 255, 255, 255};
+
+ view->out = new GDKSplashOutputDev (gtk_widget_get_screen (window),
+ redraw_callback, (void*) view, sc);
+ view->out->startDoc(view->doc->doc->getXRef());
+ }
+
+ g_signal_connect (view->drawing_area,
+ "expose_event",
+ G_CALLBACK (drawing_area_expose),
+ view);
+
+ return view;
+}
+
+int
+main (int argc, char *argv [])
+{
+ GOptionContext *ctx;
+
+ if (argc == 1) {
+ char *basename = g_path_get_basename (argv[0]);
+
+ g_printerr ("usage: %s PDF-FILES…\n", basename);
+ g_free (basename);
+
+ return -1;
+ }
+
+ ctx = g_option_context_new (NULL);
+ g_option_context_add_main_entries (ctx, options, "main");
+ g_option_context_parse (ctx, &argc, &argv, NULL);
+ g_option_context_free (ctx);
+
+ gtk_init (&argc, &argv);
+
+ globalParams = new GlobalParams();
+
+ for (int i = 0; file_arguments[i]; i++) {
+ View *view;
+ GFile *file;
+ gchar *uri;
+ PopplerDocument *doc;
+ GError *error = NULL;
+
+ file = g_file_new_for_commandline_arg (file_arguments[i]);
+ uri = g_file_get_uri (file);
+ g_object_unref (file);
+
+ doc = poppler_document_new_from_file (uri, NULL, &error);
+ if (!doc) {
+ g_printerr ("Error opening document %s: %s\n", uri, error->message);
+ g_error_free (error);
+ g_free (uri);
+
+ continue;
+ }
+
+ view = view_new (doc);
+ view_list = g_list_prepend (view_list, view);
+ view_set_page (view, CLAMP (page, 0, poppler_document_get_n_pages (doc) - 1));
+ g_free (uri);
+ }
+
+ gtk_main ();
+
+ delete globalParams;
+
+ return 0;
+}