summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCarl Worth <cworth@cworth.org>2005-12-07 16:06:11 +0000
committerCarl Worth <cworth@cworth.org>2005-12-07 16:06:11 +0000
commit45c350e32810fecc09adecf5941ce9640543fb75 (patch)
treeb623be8abef1f2439189d8f67670c833cd93fe4f
parent964c56e72bf5d4b1911b59070413e3424b88b6f4 (diff)
Add checks for poppler and friends which are needed by pdf2png. Set CAIRO_CAN_TEST_PDF_SURFACE as both a #define and an automake conditional.
Build pdf2png if possible. Add support for testing the PDF backend. New utility program to convert a PDF file into a PNG image using poppler (thanks to Kristian Høgsberg). Ignore new stuff generated by PDF backend testing.
-rw-r--r--ChangeLog18
-rw-r--r--configure.in11
-rw-r--r--test/.cvsignore3
-rw-r--r--test/Makefile.am6
-rw-r--r--test/cairo-test.c70
-rw-r--r--test/pdf2png.c88
6 files changed, 194 insertions, 2 deletions
diff --git a/ChangeLog b/ChangeLog
index 65738cb0e..164c4bdda 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,23 @@
2005-12-07 Carl Worth <cworth@cworth.org>
+ * configure.in: Add checks for poppler and friends which are
+ needed by pdf2png. Set CAIRO_CAN_TEST_PDF_SURFACE as both a
+ #define and an automake conditional.
+
+ * test/Makefile.am: Build pdf2png if possible.
+
+ * test/cairo-test.c: (create_pdf_surface),
+ (pdf_surface_write_to_png), (cleanup_pdf), (cairo_test_expecting):
+ Add support for testing the PDF backend.
+
+ * test/pdf2png.c: (main): New utility program to convert a PDF
+ file into a PNG image using poppler (thanks to Kristian Høgsberg).
+
+ * test/.cvsignore: Ignore new stuff generated by PDF backend
+ testing.
+
+2005-12-07 Carl Worth <cworth@cworth.org>
+
* ROADMAP: Note that self-copy now works with the PS backend.
* src/cairo-array.c: (_cairo_array_init),
diff --git a/configure.in b/configure.in
index b7ceedbe8..8e70d5c15 100644
--- a/configure.in
+++ b/configure.in
@@ -408,13 +408,24 @@ if test x"$have_ft_load_sfnt_table" != "xyes" ; then
use_pdf=no
fi
+test_pdf=no
AM_CONDITIONAL(CAIRO_HAS_PDF_SURFACE, test "x$use_pdf" = "xyes")
if test "x$use_pdf" = "xyes"; then
PDF_SURFACE_FEATURE="#define CAIRO_HAS_PDF_SURFACE 1"
PDF_LIBS=-lz
+ PKG_CHECK_MODULES(POPPLER, poppler-glib pango gtk+-2.0, [test_pdf=yes], [test_pdf=no])
+ if test "x$test_pdf" = "xyes"; then
+ AC_DEFINE([CAIRO_CAN_TEST_PDF_SURFACE], 1, [Define to 1 if the PDF backend can be tested (need poppler and other dependencies for pdf2png)])
+ else
+ AC_MSG_WARN([PDF backend will not be tested since poppler is not available])
+ fi
fi
AC_SUBST(PDF_SURFACE_FEATURE)
+AM_CONDITIONAL(CAIRO_CAN_TEST_PDF_SURFACE, test "x$test_pdf" = "xyes")
+AC_SUBST(POPPLER_CFLAGS)
+AC_SUBST(POPPLER_LIBS)
+
CAIRO_LIBS="$CAIRO_LIBS $PDF_LIBS"
AC_SUBST(PDF_LIBS)
diff --git a/test/.cvsignore b/test/.cvsignore
index 8f42bbca8..f92d292ff 100644
--- a/test/.cvsignore
+++ b/test/.cvsignore
@@ -40,6 +40,7 @@ operator-source
paint
paint-with-alpha
path-data
+pdf2png
pdf-clip
pdf-clip.pdf
pdf-surface
@@ -76,6 +77,8 @@ xlib-surface
*-image-out.png
*-image-argb32-out.png
*-image-rgb24-out.png
+*-pdf-rgb24-out.png
+*-pdf-rgb24-out.pdf
*-ps-rgb24-out.png
*-ps-rgb24-out.ps
*-xcb-out.png
diff --git a/test/Makefile.am b/test/Makefile.am
index 220711136..798dd8f27 100644
--- a/test/Makefile.am
+++ b/test/Makefile.am
@@ -327,6 +327,12 @@ xlib_surface_LDADD = $(LDADDS)
noinst_PROGRAMS = imagediff
imagediff_LDADD = $(LDADDS)
+if CAIRO_CAN_TEST_PDF_SURFACE
+noinst_PROGRAMS += pdf2png
+pdf2png_CFLAGS = $(POPPLER_CFLAGS)
+pdf2png_LDADD = $(LDADDS) $(POPPLER_LIBS)
+endif
+
CLEANFILES = \
*.ps \
*-out.png \
diff --git a/test/cairo-test.c b/test/cairo-test.c
index 1fe856809..7209d73c4 100644
--- a/test/cairo-test.c
+++ b/test/cairo-test.c
@@ -574,8 +574,74 @@ cleanup_ps (void *closure)
free (ptc->filename);
free (ptc);
}
+#endif /* CAIRO_HAS_PS_SURFACE */
-#endif
+#if CAIRO_HAS_PDF_SURFACE && CAIRO_CAN_TEST_PDF_SURFACE
+#include "cairo-pdf.h"
+
+cairo_user_data_key_t pdf_closure_key;
+
+typedef struct _pdf_target_closure
+{
+ char *filename;
+ int width;
+ int height;
+} pdf_target_closure_t;
+
+static cairo_surface_t *
+create_pdf_surface (cairo_test_t *test,
+ cairo_format_t format,
+ void **closure)
+{
+ int width = test->width;
+ int height = test->height;
+ pdf_target_closure_t *ptc;
+ cairo_surface_t *surface;
+
+ /* XXX: Is this the only format supported by the PDF surface backend? */
+ assert (format == CAIRO_FORMAT_RGB24);
+
+ *closure = ptc = xmalloc (sizeof (pdf_target_closure_t));
+
+ ptc->width = width;
+ ptc->height = height;
+
+ xasprintf (&ptc->filename, "%s-%s%s", test->name, "pdf-rgb24-out", ".pdf");
+ surface = cairo_pdf_surface_create (ptc->filename, width, height);
+ if (cairo_surface_status (surface)) {
+ free (ptc->filename);
+ free (ptc);
+ return NULL;
+ }
+ cairo_pdf_surface_set_dpi (surface, 72., 72.);
+ cairo_surface_set_user_data (surface, &pdf_closure_key, ptc, NULL);
+ return surface;
+}
+
+static cairo_status_t
+pdf_surface_write_to_png (cairo_surface_t *surface, const char *filename)
+{
+ pdf_target_closure_t *ptc = cairo_surface_get_user_data (surface, &pdf_closure_key);
+ char command[4096];
+
+ cairo_surface_finish (surface);
+ sprintf (command, "./pdf2png %s %s 1",
+ ptc->filename, filename);
+
+ if (system (command) != 0)
+ return CAIRO_STATUS_WRITE_ERROR;
+
+ return CAIRO_STATUS_SUCCESS;
+}
+
+static void
+cleanup_pdf (void *closure)
+{
+ pdf_target_closure_t *ptc = closure;
+ free (ptc->filename);
+ free (ptc);
+}
+#endif /* CAIRO_HAS_PDF_SURFACE && CAIRO_CAN_TEST_PDF_SURFACE */
static cairo_test_status_t
cairo_test_for_target (cairo_test_t *test,
@@ -725,7 +791,7 @@ cairo_test_expecting (cairo_test_t *test, cairo_test_draw_function_t draw,
{ "ps", CAIRO_FORMAT_RGB24,
create_ps_surface, ps_surface_write_to_png, cleanup_ps },
#endif
-#if 0 && CAIRO_HAS_PDF_SURFACE
+#if CAIRO_HAS_PDF_SURFACE && CAIRO_CAN_TEST_PDF_SURFACE
{ "pdf", CAIRO_FORMAT_RGB24,
create_pdf_surface, pdf_surface_write_to_png, cleanup_pdf },
#endif
diff --git a/test/pdf2png.c b/test/pdf2png.c
new file mode 100644
index 000000000..3edb17cc3
--- /dev/null
+++ b/test/pdf2png.c
@@ -0,0 +1,88 @@
+/*
+ * Copyright © 2005 Red Hat, Inc.
+ *
+ * Permission to use, copy, modify, distribute, and sell this software
+ * and its documentation for any purpose is hereby granted without
+ * fee, provided that the above copyright notice appear in all copies
+ * and that both that copyright notice and this permission notice
+ * appear in supporting documentation, and that the name of
+ * Red Hat, Inc. not be used in advertising or publicity pertaining to
+ * distribution of the software without specific, written prior
+ * permission. Red Hat, Inc. makes no representations about the
+ * suitability of this software for any purpose. It is provided "as
+ * is" without express or implied warranty.
+ *
+ * RED HAT, INC. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS
+ * SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS, IN NO EVENT SHALL RED HAT, INC. BE LIABLE FOR ANY SPECIAL,
+ * INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER
+ * RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION
+ * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR
+ * IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+ *
+ * Author: Kristian Høgsberg <krh@redhat.com>
+ */
+
+#include <stdlib.h>
+#include <poppler.h>
+
+#define FAIL(msg) \
+ do { fprintf (stderr, "FAIL: %s\n", msg); exit (-1); } while (0)
+
+#define PIXELS_PER_POINT 1
+
+int main (int argc, char *argv[])
+{
+ PopplerDocument *document;
+ PopplerPage *page;
+ GdkPixbuf *pixbuf;
+ double width, height;
+ GError *error;
+ const char *filename = argv[1];
+ const char *output_filename = argv[2];
+ const char *page_label = argv[3];
+ gchar *absolute, *uri;
+
+ if (argc != 4)
+ FAIL ("usage: pdf2png input_file.pdf output_file.png page");
+
+ g_type_init ();
+
+ error = NULL;
+
+ if (g_path_is_absolute(filename)) {
+ absolute = g_strdup (filename);
+ } else {
+ gchar *dir = g_get_current_dir ();
+ absolute = g_build_filename (dir, filename, (gchar *) 0);
+ free (dir);
+ }
+
+ uri = g_filename_to_uri (absolute, NULL, &error);
+ free (absolute);
+ if (uri == NULL)
+ FAIL (error->message);
+
+ document = poppler_document_new_from_file (uri, NULL, &error);
+ if (document == NULL)
+ FAIL (error->message);
+
+ page = poppler_document_get_page_by_label (document, page_label);
+ if (page == NULL)
+ FAIL ("page not found");
+
+ poppler_page_get_size (page, &width, &height);
+
+ pixbuf = gdk_pixbuf_new (GDK_COLORSPACE_RGB, FALSE, 8,
+ width * PIXELS_PER_POINT,
+ height * PIXELS_PER_POINT);
+ gdk_pixbuf_fill (pixbuf, 0xffffffff);
+ poppler_page_render_to_pixbuf (page, 0, 0, width , height,
+ PIXELS_PER_POINT, 0, pixbuf);
+
+ gdk_pixbuf_save (pixbuf, output_filename, "png", &error, NULL);
+ if (error != NULL)
+ FAIL (error->message);
+
+ return 0;
+}