2005-04-05  Kristian Høgsberg  <krh@redhat.com>

        * NEWS: Attempt to sum up changes since 0.1.2.

        * configure.ac: Bump release to 0.2.0, add AC_DEFINEs for cairo
        and splash availability.

        * poppler/CairoFontEngine.cc: Disable hinting.

        * glib/poppler-page.cc (poppler_page_render_to_pixbuf): Choose
        either splash or cairo rendering, based on configure choice.
        (cairo_render_to_pixbuf): New function to render using the cairo
        backend.
        (splash_render_to_pixbuf): Split out the splash code to this
        function.
diff --git a/ChangeLog b/ChangeLog
index 9581149..3dcf461 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,19 @@
+2005-04-05  Kristian Høgsberg  <krh@redhat.com>
+
+	* NEWS: Attempt to sum up changes since 0.1.2.
+
+	* configure.ac: Bump release to 0.2.0, add AC_DEFINEs for cairo
+	and splash availability.
+
+	* poppler/CairoFontEngine.cc: Disable hinting.
+
+	* glib/poppler-page.cc (poppler_page_render_to_pixbuf): Choose
+	either splash or cairo rendering, based on configure choice.
+	(cairo_render_to_pixbuf): New function to render using the cairo
+	backend.
+	(splash_render_to_pixbuf): Split out the splash code to this
+	function.
+
 2005-04-04  Kristian Høgsberg  <krh@redhat.com>
 
 	* ChangeLog: Add this entry to test commit mailer script.
diff --git a/NEWS b/NEWS
index 7b03c72..d5add4f 100644
--- a/NEWS
+++ b/NEWS
@@ -1,7 +1,9 @@
-Release 0.2.0  (Not out yet...)
+Release 0.2.0  (Tue Apr  5 12:32:10 EDT 2005)
 
-	- Add glib wrapper for poppler
+	- Add glib wrapper for poppler, which will use cairo rendering
+	  if available
 	- Support for page labels
+	- configure and build fixes.
 
 Release 0.1.2  (Wed Mar  9 10:45:58 EST 2005)
 
diff --git a/configure.ac b/configure.ac
index 2a1a2bf..1a90c57 100644
--- a/configure.ac
+++ b/configure.ac
@@ -1,7 +1,7 @@
 dnl Based on Xpdf configure.in and evince configure.ac
 
 AC_PREREQ(2.59)
-AC_INIT(poppler, 0.1.2)
+AC_INIT(poppler, 0.2.0)
 AM_INIT_AUTOMAKE(AC_PACKAGE_NAME, AC_PACKAGE_VERSION)
 AM_CONFIG_HEADER(config.h)
 AM_CONFIG_HEADER(poppler/poppler-config.h)
@@ -142,6 +142,10 @@
   PKG_CHECK_MODULES(SPLASH, fontconfig)
 fi
 AM_CONDITIONAL(BUILD_SPLASH_OUTPUT, test x$enable_splash_output = xyes)
+AH_TEMPLATE([HAVE_SPLASH], [Use splash for rendering.])
+if test x$enable_splash_output = xyes; then
+  AC_DEFINE(HAVE_SPLASH)
+fi
 
 AC_ARG_ENABLE(cairo-output,
               AC_HELP_STRING([--disable-cairo-output],
@@ -149,14 +153,18 @@
               enable_cairo_output=$enableval,
               enable_cairo_output="try")
 if test x$enable_cairo_output = xyes; then
-  PKG_CHECK_MODULES(CAIRO, cairo = 0.4)
+  PKG_CHECK_MODULES(CAIRO, cairo = 0.4.0)
 elif test x$enable_cairo_output = xtry; then
-  PKG_CHECK_MODULES(CAIRO, cairo = 0.4,
+  PKG_CHECK_MODULES(CAIRO, cairo = 0.4.0,
                     [enable_cairo_output="yes"],
                     [enable_cairo_output="no"])
 fi
-AM_CONDITIONAL(BUILD_CAIRO_OUTPUT, test x$enable_cairo_output = xyes)
 
+AM_CONDITIONAL(BUILD_CAIRO_OUTPUT, test x$enable_cairo_output = xyes)
+AH_TEMPLATE([HAVE_CAIRO], [Use cairo for rendering.])
+if test x$enable_cairo_output = xyes; then
+  AC_DEFINE(HAVE_CAIRO)
+fi
 
 AC_ARG_ENABLE(poppler-glib,
               AC_HELP_STRING([--disable-poppler-glib],
diff --git a/glib/Makefile.am b/glib/Makefile.am
index 41704e0..4b4164b 100644
--- a/glib/Makefile.am
+++ b/glib/Makefile.am
@@ -1,9 +1,20 @@
+if BUILD_CAIRO_OUTPUT
+
+cairo_includes =				\
+	$(CAIRO_CFLAGS)
+
+cairo_libs =					\
+	$(CAIRO_LIBS)
+
+endif
+
 INCLUDES =					\
 	-I$(top_srcdir)				\
 	-I$(top_srcdir)/poppler			\
 	$(cairo_includes)			\
 	$(POPPLER_GLIB_CFLAGS)			\
 	$(FREETYPE_CFLAGS)			\
+	$(cairo_includes)			\
 	-DDATADIR=\""$(datadir)"\"
 
 poppler_glib_includedir = $(includedir)/poppler/glib
@@ -23,7 +34,8 @@
 
 libpoppler_glib_la_LIBADD =			\
 	$(POPPLER_GLIB_LIBS)			\
-	$(FREETYPE_LIBS)
+	$(FREETYPE_LIBS)			\
+	$(cairo_libs)
 
 noinst_PROGRAMS = test-poppler-glib
 
@@ -34,4 +46,5 @@
 	$(top_builddir)/poppler/libpoppler.la	\
 	libpoppler-glib.la			\
 	$(POPPLER_GLIB_LIBS)			\
-	$(FREETYPE_LIBS)
+	$(FREETYPE_LIBS)			\
+	$(cairo_libs)
diff --git a/glib/poppler-page.cc b/glib/poppler-page.cc
index ef32f64..acfc3c4 100644
--- a/glib/poppler-page.cc
+++ b/glib/poppler-page.cc
@@ -16,6 +16,7 @@
  * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
  */
 
+#include "config.h"
 #include <math.h>
 
 #include <goo/GooList.h>
@@ -26,9 +27,16 @@
 #include <ErrorCodes.h>
 #include <UnicodeMap.h>
 #include <GfxState.h>
-#include <SplashOutputDev.h>
 #include <TextOutputDev.h>
 
+#if defined (HAVE_CAIRO)
+#include <CairoOutputDevImage.h>
+#endif
+
+#if defined (HAVE_SPLASH)
+#include <SplashOutputDev.h>
+#endif
+
 #include "poppler.h"
 #include "poppler-private.h"
 
@@ -88,31 +96,75 @@
   return page->index;
 }
 
-/**
- * poppler_page_render_to_pixbuf:
- * @page: the page to render from
- * @src_x: x coordinate of upper left corner
- * @src_y: y coordinate of upper left corner
- * @src_width: width of rectangle to render
- * @src_height: height of rectangle to render
- * @ppp: pixels per point
- * @pixbuf: pixbuf to render into
- * @dest_x: x coordinate of offset into destination
- * @dest_y: y cooridnate of offset into destination
- *
- * First scale the document to match the specified pixels per point,
- * then render the rectangle given by the upper left corner at
- * (src_x, src_y) and src_width and src_height.  The rectangle is
- * rendered into the specified pixmap with the upper left corner
- * placed at (dest_x, dest_y).
- **/
-void
-poppler_page_render_to_pixbuf (PopplerPage *page,
-			       int src_x, int src_y,
-			       int src_width, int src_height,
-			       double scale,
-			       GdkPixbuf *pixbuf,
-			       int dest_x, int dest_y)
+#if defined (HAVE_CAIRO)
+
+static void
+cairo_render_to_pixbuf (PopplerPage *page,
+			int src_x, int src_y,
+			int src_width, int src_height,
+			double scale,
+			GdkPixbuf *pixbuf,
+			int dest_x, int dest_y)
+{
+  CairoOutputDevImage *output_dev;
+  int cairo_width, cairo_height, cairo_rowstride;
+  int pixbuf_rowstride, pixbuf_n_channels;
+  guchar *pixbuf_data, *cairo_data, *dst;
+  int x, y;
+
+  output_dev = new CairoOutputDevImage ();
+
+  output_dev->startDoc(page->document->doc->getXRef ());
+
+  page->page->displaySlice(output_dev, 72.0 * scale, 72.0 * scale,
+			   0, /* Rotate */
+			   gTrue, /* Crop */
+			   src_x, src_y,
+			   src_width, src_height,
+			   NULL, /* links */
+			   page->document->doc->getCatalog ());
+
+  output_dev->getBitmap (&cairo_data,
+			 &cairo_width, &cairo_height, &cairo_rowstride);
+
+  pixbuf_data = gdk_pixbuf_get_pixels (pixbuf);
+  pixbuf_rowstride = gdk_pixbuf_get_rowstride (pixbuf);
+  pixbuf_n_channels = gdk_pixbuf_get_n_channels (pixbuf);
+
+  if (dest_x + cairo_width > gdk_pixbuf_get_width (pixbuf))
+    cairo_width = gdk_pixbuf_get_width (pixbuf) - dest_x;
+  if (dest_y + cairo_height > gdk_pixbuf_get_height (pixbuf))
+    cairo_height = gdk_pixbuf_get_height (pixbuf) - dest_y;
+
+  for (y = 0; y < cairo_height; y++)
+    {
+      unsigned int *src;
+
+      src = (unsigned int *) (cairo_data + y * cairo_rowstride);
+      dst = pixbuf_data + (dest_y + y) * pixbuf_rowstride +
+	dest_x * pixbuf_n_channels;
+      for (x = 0; x < cairo_width; x++) 
+	{
+	  dst[0] = (*src >> 16) & 0xff;
+	  dst[1] = (*src >> 8) & 0xff; 
+	  dst[2] = (*src >> 0) & 0xff;
+	  dst += pixbuf_n_channels;
+	  src++;
+	}
+    }
+
+  delete output_dev;
+}
+
+#elif defined (HAVE_SPLASH)
+
+static void
+splash_render_to_pixbuf (PopplerPage *page,
+			 int src_x, int src_y,
+			 int src_width, int src_height,
+			 double scale,
+			 GdkPixbuf *pixbuf,
+			 int dest_x, int dest_y)
 {
   SplashOutputDev *output_dev;
   SplashColor white;
@@ -124,10 +176,6 @@
   guchar *pixbuf_data, *dst;
   int x, y;
 
-  g_return_if_fail (POPPLER_IS_PAGE (page));
-  g_return_if_fail (scale > 0.0);
-  g_return_if_fail (pixbuf != NULL);
-
   white.rgb8 = splashMakeRGB8 (0xff, 0xff, 0xff);
   output_dev = new SplashOutputDev(splashModeRGB8, gFalse, white);
 
@@ -178,6 +226,50 @@
   delete output_dev;
 }
 
+#endif
+
+/**
+ * poppler_page_render_to_pixbuf:
+ * @page: the page to render from
+ * @src_x: x coordinate of upper left corner
+ * @src_y: y coordinate of upper left corner
+ * @src_width: width of rectangle to render
+ * @src_height: height of rectangle to render
+ * @ppp: pixels per point
+ * @pixbuf: pixbuf to render into
+ * @dest_x: x coordinate of offset into destination
+ * @dest_y: y cooridnate of offset into destination
+ *
+ * First scale the document to match the specified pixels per point,
+ * then render the rectangle given by the upper left corner at
+ * (src_x, src_y) and src_width and src_height.  The rectangle is
+ * rendered into the specified pixmap with the upper left corner
+ * placed at (dest_x, dest_y).
+ **/
+void
+poppler_page_render_to_pixbuf (PopplerPage *page,
+			       int src_x, int src_y,
+			       int src_width, int src_height,
+			       double scale,
+			       GdkPixbuf *pixbuf,
+			       int dest_x, int dest_y)
+{
+
+  g_return_if_fail (POPPLER_IS_PAGE (page));
+  g_return_if_fail (scale > 0.0);
+  g_return_if_fail (pixbuf != NULL);
+
+#if defined(HAVE_CAIRO)
+  cairo_render_to_pixbuf (page, src_x, src_y, src_width, src_height,
+			  scale, pixbuf, dest_x, dest_y);
+#elif defined(HAVE_SPLASH)
+  splash_render_to_pixbuf (page, src_x, src_y, src_width, src_height,
+			   scale, pixbuf, dest_x, dest_y);
+#else
+#error No rendering backend available
+#endif
+}
+
 static void
 destroy_thumb_data (guchar *pixels, gpointer data)
 {
diff --git a/poppler/CairoFontEngine.cc b/poppler/CairoFontEngine.cc
index 291fc68..ddb3e9c 100644
--- a/poppler/CairoFontEngine.cc
+++ b/poppler/CairoFontEngine.cc
@@ -252,7 +252,7 @@
 
 cairo_font_t *
 CairoFont::getFont(cairo_matrix_t *font_scale) {
-    return cairo_ft_font_create_for_ft_face (face, FT_LOAD_DEFAULT, font_scale);
+    return cairo_ft_font_create_for_ft_face (face, FT_LOAD_NO_HINTING, font_scale);
 }
 
 unsigned long
diff --git a/poppler/CairoOutputDevImage.cc b/poppler/CairoOutputDevImage.cc
index 3bc3a2e..ec66ff7 100644
--- a/poppler/CairoOutputDevImage.cc
+++ b/poppler/CairoOutputDevImage.cc
@@ -64,24 +64,18 @@
 }
 
 
-SplashBitmap *CairoOutputDevImage::getBitmap() {
+void CairoOutputDevImage::getBitmap(unsigned char **data,
+				    int *width, int *height,
+				    int *rowstride) {
   SplashBitmap *bitmap;
   int w, h;
   unsigned char *src;
   unsigned int *dest;
 
-  bitmap = new SplashBitmap (pixels_w, pixels_h, splashModeRGB8);
-
-  for (h = 0; h < pixels_h; h++) {
-    src = pixels + 4*pixels_w * h;
-    dest = (unsigned int *)
-      ((unsigned char *)bitmap->getDataPtr().rgb8 + bitmap->getRowSize()*h);
-    for (w = 0; w < pixels_w; w++) {
-      *dest++ = splashMakeRGB8 (src[2], src[1], src[0]);
-      src += 4;
-    }
-  }
-  return bitmap;
+  *data = pixels;
+  *width = pixels_w;
+  *height = pixels_h;
+  *rowstride = 4 * pixels_w;
 }
 
 
diff --git a/poppler/CairoOutputDevImage.h b/poppler/CairoOutputDevImage.h
index 97ea19a..5911c92 100644
--- a/poppler/CairoOutputDevImage.h
+++ b/poppler/CairoOutputDevImage.h
@@ -33,7 +33,8 @@
 
   virtual void createCairo(GfxState *state);
 
-  SplashBitmap *getBitmap();
+  void getBitmap(unsigned char **data,
+		 int *width, int *height, int *rowstride);
   
 private:
   unsigned char *pixels;