<?xml version="1.0" encoding="UTF-8"?>
<commit>
  <added type="array"/>
  <modified type="array">
    <modified>
      <diff>@@ -5,6 +5,10 @@ include_directories(
   ${QT4_INCLUDE_DIR}
   ${CMAKE_CURRENT_BINARY_DIR}
 )
+if (HAVE_CAIRO)
+  include_directories(${CAIRO_INCLUDES})
+  add_definitions(${CAIRO_CFLAGS})
+endif (HAVE_CAIRO)
 
 set(poppler_qt4_SRCS
   poppler-annotation.cc
@@ -31,10 +35,19 @@ if (ENABLE_SPLASH)
     ${CMAKE_SOURCE_DIR}/poppler/ArthurOutputDev.cc
   )
 endif (ENABLE_SPLASH)
+if (HAVE_CAIRO)
+  set(poppler_qt4_SRCS ${poppler_qt4_SRCS}
+    ${CMAKE_SOURCE_DIR}/poppler/CairoOutputDev.cc
+    ${CMAKE_SOURCE_DIR}/poppler/CairoFontEngine.cc
+  )
+endif(HAVE_CAIRO)
 qt4_automoc(${poppler_qt4_SRCS})
 add_library(poppler-qt4 SHARED ${poppler_qt4_SRCS})
 set_target_properties(poppler-qt4 PROPERTIES VERSION 3.2.0 SOVERSION 3)
 target_link_libraries(poppler-qt4 poppler ${QT4_QTCORE_LIBRARY} ${QT4_QTGUI_LIBRARY} ${QT4_QTXML_LIBRARY})
+if (HAVE_CAIRO)
+  target_link_libraries(poppler-qt4 ${CAIRO_LIBRARIES})
+endif (HAVE_CAIRO)
 if(MSVC)
 target_link_libraries(poppler-qt4 poppler ${poppler_LIBS})
 endif(MSVC)</diff>
      <filename>qt4/src/CMakeLists.txt</filename>
    </modified>
    <modified>
      <diff>@@ -500,6 +500,7 @@ namespace Poppler {
 #if defined(HAVE_SPLASH)
         ret &lt;&lt; Document::SplashBackend;
         ret &lt;&lt; Document::ArthurBackend;
+        ret &lt;&lt; Document::CairoBackend;
 #endif
         return ret;
     }</diff>
      <filename>qt4/src/poppler-document.cc</filename>
    </modified>
    <modified>
      <diff>@@ -31,6 +31,7 @@
 #include &lt;QtGui/QPainter&gt;
 
 #include &lt;config.h&gt;
+#include &lt;math.h&gt;
 #include &lt;PDFDoc.h&gt;
 #include &lt;Catalog.h&gt;
 #include &lt;Form.h&gt;
@@ -273,6 +274,61 @@ QImage Page::renderToImage(double xres, double yres, int x, int y, int w, int h,
 #endif
       break;
     }
+    case Poppler::Document::CairoBackend:
+    {
+#if defined(HAVE_CAIRO)
+      CairoOutputDev *output_dev =
+        static_cast&lt;CairoOutputDev *&gt;(m_page-&gt;parentDoc-&gt;getOutputDev());
+      double width, height;
+      int cairo_width, cairo_height, cairo_rowstride, rotate;
+      unsigned char *cairo_data;
+      cairo_surface_t *surface;
+      cairo_t *cairo;
+
+      rotate = rotation + m_page-&gt;page-&gt;getRotate ();
+      if (rotate == 90 || rotate == 270) {
+        height = m_page-&gt;page-&gt;getCropWidth ();
+        width = m_page-&gt;page-&gt;getCropHeight ();
+      } else {
+        width = m_page-&gt;page-&gt;getCropWidth ();
+        height = m_page-&gt;page-&gt;getCropHeight ();
+      }
+
+      const double xscale = xres / 72.0;
+      const double yscale = yres / 72.0;
+      cairo_width = (int) ceil(width * xscale);
+      cairo_height = (int) ceil(height * yscale);
+
+      cairo_rowstride = cairo_width * 4;
+      cairo_data = (Guchar *) gmallocn (cairo_height, cairo_rowstride);
+      // Never transparent
+      memset (cairo_data, 0xff, cairo_height * cairo_rowstride);
+
+      surface = cairo_image_surface_create_for_data(cairo_data,
+                CAIRO_FORMAT_ARGB32,
+                cairo_width, cairo_height,
+                cairo_rowstride);
+
+      cairo = cairo_create (surface);
+      output_dev-&gt;setCairo (cairo);
+
+      m_page-&gt;parentDoc-&gt;doc-&gt;displayPageSlice(
+        output_dev, m_page-&gt;index + 1, xres, yres, rotation, false, true,
+        false, x, y, w, h);
+
+      // construct a qimage SHARING the raw bitmap data in memory
+      QImage tmpimg(cairo_data, cairo_width, cairo_height,
+                    QImage::Format_ARGB32);
+      img = tmpimg.copy();
+
+      // Clean up
+      output_dev-&gt;setCairo(NULL);
+      cairo_surface_destroy (surface);
+      cairo_destroy (cairo);
+      gfree(cairo_data);
+#endif
+      break;
+    }
   }
 
   return img;</diff>
      <filename>qt4/src/poppler-page.cc</filename>
    </modified>
    <modified>
      <diff>@@ -38,6 +38,9 @@
 #if defined(HAVE_SPLASH)
 #include &lt;SplashOutputDev.h&gt;
 #endif
+#if defined(HAVE_CAIRO)
+#include &lt;CairoOutputDev.h&gt;
+#endif
 
 #include &quot;poppler-qt4.h&quot;
 
@@ -145,6 +148,15 @@ namespace Poppler {
 #endif
 			break;
 			}
+			case Document::CairoBackend:
+			{
+#if defined(HAVE_CAIRO)
+			CairoOutputDev *cairoOutputDev = new CairoOutputDev();
+			cairoOutputDev-&gt;startDoc(doc-&gt;getXRef (), doc-&gt;getCatalog ());
+			m_outputDev = cairoOutputDev;
+#endif
+			break;
+			}
 			}
 		}
 		return m_outputDev;</diff>
      <filename>qt4/src/poppler-private.h</filename>
    </modified>
    <modified>
      <diff>@@ -669,7 +669,8 @@ delete it;
 	*/
 	enum RenderBackend {
 	    SplashBackend,   ///&lt; Splash backend
-	    ArthurBackend   ///&lt; Arthur (Qt4) backend
+	    ArthurBackend,   ///&lt; Arthur (Qt4) backend
+	    CairoBackend     ///&lt; Cairo backend
 	};
 
 	/**</diff>
      <filename>qt4/src/poppler-qt4.h</filename>
    </modified>
  </modified>
  <removed type="array"/>
  <parents type="array">
    <parent>
      <id>c839b706092583f6b12ed3cc634bf5af34b7a2bb</id>
    </parent>
  </parents>
  <author>
    <name>Paul Gideon Dann</name>
    <email>pdgiddie@gmail.com</email>
  </author>
  <url>http://github.com/giddie/poppler-qt4-cairo-backend/commit/26105ab3a7d1cf5a6fadce16bd0b6efd4672cb64</url>
  <id>26105ab3a7d1cf5a6fadce16bd0b6efd4672cb64</id>
  <committed-date>2009-10-20T10:00:20-07:00</committed-date>
  <authored-date>2009-05-20T03:42:28-07:00</authored-date>
  <message>Cairo backend added to Qt4 wrapper</message>
  <tree>340c31536d11ea561053dd466aaa796b2e7a7098</tree>
  <committer>
    <name>Paul Gideon Dann</name>
    <email>pdgiddie@gmail.com</email>
  </committer>
</commit>
