app-text/poppler: Add experimental cairo-qt backend (USE-masked), bug #568000.
authorMaciej Mrozowski <reavertm@gentoo.org>
Tue, 22 Mar 2016 23:38:23 +0000 (00:38 +0100)
committerMaciej Mrozowski <reavertm@gentoo.org>
Tue, 22 Mar 2016 23:43:29 +0000 (00:43 +0100)
Package-Manager: portage-2.2.28

app-text/poppler/files/cairo-qt-experimental/0001-Cairo-backend-added-to-Qt4-wrapper.patch [new file with mode: 0644]
app-text/poppler/files/cairo-qt-experimental/0002-Setting-default-Qt4-backend-to-Cairo.patch [new file with mode: 0644]
app-text/poppler/files/cairo-qt-experimental/0003-Forcing-subpixel-rendering-in-Cairo-backend.patch [new file with mode: 0644]
app-text/poppler/files/cairo-qt-experimental/0004-Enabling-slight-hinting-in-Cairo-Backend.patch [new file with mode: 0644]
app-text/poppler/metadata.xml
app-text/poppler/poppler-0.42.0.ebuild
app-text/poppler/poppler-9999.ebuild
profiles/base/package.use.mask

diff --git a/app-text/poppler/files/cairo-qt-experimental/0001-Cairo-backend-added-to-Qt4-wrapper.patch b/app-text/poppler/files/cairo-qt-experimental/0001-Cairo-backend-added-to-Qt4-wrapper.patch
new file mode 100644 (file)
index 0000000..2246b29
--- /dev/null
@@ -0,0 +1,199 @@
+From e8fcbaca23878f0edd2015440eec55aaba0e8f9f Mon Sep 17 00:00:00 2001
+From: Paul Gideon Dann <pdgiddie@gmail.com>
+Date: Wed, 20 May 2009 11:42:28 +0100
+Subject: [PATCH 1/4] Cairo backend added to Qt4 wrapper
+
+---
+ qt4/src/CMakeLists.txt      | 15 ++++++++++
+ qt4/src/poppler-document.cc |  3 ++
+ qt4/src/poppler-page.cc     | 70 +++++++++++++++++++++++++++++++++++++++++++++
+ qt4/src/poppler-qt4.h       |  3 +-
+ qt4/tests/CMakeLists.txt    |  5 ++++
+ 5 files changed, 95 insertions(+), 1 deletion(-)
+
+diff --git a/qt4/src/CMakeLists.txt b/qt4/src/CMakeLists.txt
+index 189eca2..5338b55 100644
+--- a/qt4/src/CMakeLists.txt
++++ b/qt4/src/CMakeLists.txt
+@@ -6,6 +6,11 @@ include_directories(
+   ${CMAKE_CURRENT_BINARY_DIR}
+ )
++if (HAVE_CAIRO)
++  include_directories(${CAIRO_INCLUDE_DIRS})
++  add_definitions(${CAIRO_CFLAGS})
++endif (HAVE_CAIRO)
++
+ set(poppler_qt4_SRCS
+   poppler-annotation.cc
+   poppler-document.cc
+@@ -28,10 +33,20 @@ set(poppler_qt4_SRCS
+   poppler-media.cc
+   ArthurOutputDev.cc
+ )
++if (HAVE_CAIRO)
++  set(poppler_qt4_SRCS ${poppler_qt4_SRCS}
++    ${CMAKE_SOURCE_DIR}/poppler/CairoOutputDev.cc
++    ${CMAKE_SOURCE_DIR}/poppler/CairoRescaleBox.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 4.9.0 SOVERSION 4)
+ 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 --git a/qt4/src/poppler-document.cc b/qt4/src/poppler-document.cc
+index 94f997d..6decaaf 100644
+--- a/qt4/src/poppler-document.cc
++++ b/qt4/src/poppler-document.cc
+@@ -547,6 +547,9 @@ namespace Poppler {
+         ret << Document::SplashBackend;
+ #endif
+         ret << Document::ArthurBackend;
++#if defined(HAVE_CAIRO)
++        ret << Document::CairoBackend;
++#endif
+         return ret;
+     }
+diff --git a/qt4/src/poppler-page.cc b/qt4/src/poppler-page.cc
+index 83bcf4a..df1d344 100644
+--- a/qt4/src/poppler-page.cc
++++ b/qt4/src/poppler-page.cc
+@@ -40,6 +40,7 @@
+ #include <QtGui/QPainter>
+ #include <config.h>
++#include <math.h>
+ #include <PDFDoc.h>
+ #include <Catalog.h>
+ #include <Form.h>
+@@ -53,6 +54,9 @@
+ #include <SplashOutputDev.h>
+ #include <splash/SplashBitmap.h>
+ #endif
++#if defined(HAVE_CAIRO)
++#include <CairoOutputDev.h>
++#endif
+ #include "poppler-private.h"
+ #include "poppler-page-transition-private.h"
+@@ -405,6 +409,70 @@ QImage Page::renderToImage(double xres, double yres, int x, int y, int w, int h,
+       img = tmpimg;
+       break;
+     }
++    case Poppler::Document::CairoBackend:
++    {
++#if defined(HAVE_CAIRO)
++      CairoOutputDev *output_dev = new CairoOutputDev();
++      output_dev->startDoc(m_page->parentDoc->doc);
++      int buffer_width, buffer_height, rotate;
++      cairo_surface_t *surface;
++      cairo_t *cairo;
++
++      // If w or h are -1, that indicates the whole page, so we need to
++      // calculate how many pixels that corresponds to.  Otherwise, we can use w
++      // or h directly for our buffer size.
++      const QSize pageSize = this->pageSize();
++      if (w == -1) {
++        const double xscale = xres / 72.0;
++        const double width = pageSize.width();;
++        buffer_width = (int) ceil(width * xscale);
++      } else {
++        buffer_width = w;
++      }
++      if (h == -1) {
++        const double yscale = yres / 72.0;
++        const double height = pageSize.height();
++        buffer_height = (int) ceil(height * yscale);
++      } else {
++        buffer_height = h;
++      }
++
++      rotate = rotation + m_page->page->getRotate();
++
++      // FIXME: Okular never provides a rotation value, so I don't have any way
++      // of testing this right now.  The result is that subpixels are ordered
++      // incorrectly when the page is rotated.
++
++      //if (rotate == 90 || rotate == 270) {
++      //  const double temp = height;
++      //  height = width;
++      //  width = temp;
++      //}
++
++      img = QImage(buffer_width, buffer_height, QImage::Format_ARGB32);
++      img.fill(Qt::white);  // Never transparent
++
++      surface = cairo_image_surface_create_for_data(
++                  img.bits(),
++                  CAIRO_FORMAT_ARGB32,
++                  buffer_width, buffer_height,
++                  img.bytesPerLine());
++
++      cairo = cairo_create(surface);
++      output_dev->setCairo(cairo);
++
++      m_page->parentDoc->doc->displayPageSlice(
++        output_dev, m_page->index + 1, xres, yres, rotation, false, true,
++        false, x, y, w, h);
++
++      // Clean up
++      output_dev->setCairo(NULL);
++      cairo_destroy(cairo);
++      cairo_surface_destroy(surface);
++      delete output_dev;
++#endif
++      break;
++    }
+   }
+   return img;
+@@ -447,6 +515,8 @@ bool Page::renderToPainter(QPainter* painter, double xres, double yres, int x, i
+          painter->restore();
+       return true;
+     }
++    case Poppler::Document::CairoBackend:
++      return false;
+   }
+   return false;
+ }
+diff --git a/qt4/src/poppler-qt4.h b/qt4/src/poppler-qt4.h
+index c0340a4..118f8ba 100644
+--- a/qt4/src/poppler-qt4.h
++++ b/qt4/src/poppler-qt4.h
+@@ -886,7 +886,8 @@ delete it;
+       */
+       enum RenderBackend {
+           SplashBackend,   ///< Splash backend
+-          ArthurBackend   ///< Arthur (Qt4) backend
++          ArthurBackend,   ///< Arthur (Qt4) backend
++          CairoBackend     ///< Cairo backend
+       };
+       /**
+diff --git a/qt4/tests/CMakeLists.txt b/qt4/tests/CMakeLists.txt
+index bba868f..8c40471 100644
+--- a/qt4/tests/CMakeLists.txt
++++ b/qt4/tests/CMakeLists.txt
+@@ -8,6 +8,11 @@ include_directories(
+   ${QT4_INCLUDE_DIR}
+ )
++if (HAVE_CAIRO)
++  include_directories(${CAIRO_INCLUDE_DIRS})
++  add_definitions(${CAIRO_CFLAGS})
++endif (HAVE_CAIRO)
++
+ macro(QT4_ADD_SIMPLETEST exe source)
+   string(REPLACE "-" "" test_name ${exe})
+   set(${test_name}_SOURCES
+-- 
+2.7.3
+
diff --git a/app-text/poppler/files/cairo-qt-experimental/0002-Setting-default-Qt4-backend-to-Cairo.patch b/app-text/poppler/files/cairo-qt-experimental/0002-Setting-default-Qt4-backend-to-Cairo.patch
new file mode 100644 (file)
index 0000000..3a36039
--- /dev/null
@@ -0,0 +1,25 @@
+From 7ddcf7bf4296ed58dc316b0dd6b000057740e118 Mon Sep 17 00:00:00 2001
+From: Paul Gideon Dann <pdgiddie@gmail.com>
+Date: Wed, 20 May 2009 13:17:29 +0100
+Subject: [PATCH 2/4] Setting default Qt4 backend to Cairo
+
+---
+ qt4/src/poppler-private.cc | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/qt4/src/poppler-private.cc b/qt4/src/poppler-private.cc
+index cbf21b1..1c7f16c 100644
+--- a/qt4/src/poppler-private.cc
++++ b/qt4/src/poppler-private.cc
+@@ -236,7 +236,7 @@ namespace Debug {
+     void DocumentData::init()
+     {
+         m_fontInfoIterator = 0;
+-        m_backend = Document::SplashBackend;
++        m_backend = Document::CairoBackend;
+         paperColor = Qt::white;
+         m_hints = 0;
+         m_optContentModel = 0;
+-- 
+2.7.3
+
diff --git a/app-text/poppler/files/cairo-qt-experimental/0003-Forcing-subpixel-rendering-in-Cairo-backend.patch b/app-text/poppler/files/cairo-qt-experimental/0003-Forcing-subpixel-rendering-in-Cairo-backend.patch
new file mode 100644 (file)
index 0000000..21547b9
--- /dev/null
@@ -0,0 +1,30 @@
+From a9a6a3fcf4f2bf62e83d325a790624241084ad72 Mon Sep 17 00:00:00 2001
+From: Paul Gideon Dann <pdgiddie@gmail.com>
+Date: Wed, 20 May 2009 13:06:48 +0100
+Subject: [PATCH 3/4] Forcing subpixel rendering in Cairo backend
+
+---
+ poppler/CairoOutputDev.cc | 7 +++++++
+ 1 file changed, 7 insertions(+)
+
+diff --git a/poppler/CairoOutputDev.cc b/poppler/CairoOutputDev.cc
+index d0d6cb4..50e64f9 100644
+--- a/poppler/CairoOutputDev.cc
++++ b/poppler/CairoOutputDev.cc
+@@ -203,6 +203,13 @@ void CairoOutputDev::setCairo(cairo_t *cairo)
+   }
+   if (cairo != NULL) {
+     this->cairo = cairo_reference (cairo);
++    {
++      cairo_font_options_t *options = cairo_font_options_create ();
++      cairo_get_font_options (cairo, options);
++      cairo_font_options_set_antialias (options, CAIRO_ANTIALIAS_SUBPIXEL);
++      cairo_set_font_options (cairo, options);
++      cairo_font_options_destroy (options);
++    }
+       /* save the initial matrix so that we can use it for type3 fonts. */
+       //XXX: is this sufficient? could we miss changes to the matrix somehow?
+       cairo_get_matrix(cairo, &orig_matrix);
+-- 
+2.7.3
+
diff --git a/app-text/poppler/files/cairo-qt-experimental/0004-Enabling-slight-hinting-in-Cairo-Backend.patch b/app-text/poppler/files/cairo-qt-experimental/0004-Enabling-slight-hinting-in-Cairo-Backend.patch
new file mode 100644 (file)
index 0000000..0f62232
--- /dev/null
@@ -0,0 +1,45 @@
+From 1604ec6cb759b6f2b8aa006faa0ec990cd511b36 Mon Sep 17 00:00:00 2001
+From: Paul Gideon Dann <pdgiddie@gmail.com>
+Date: Thu, 21 May 2009 10:55:49 +0100
+Subject: [PATCH 4/4] Enabling slight hinting in Cairo Backend
+
+Originally suggested at:
+http://bugs.freedesktop.org/show_bug.cgi?id=3307#c20
+---
+ poppler/CairoFontEngine.cc | 6 +++---
+ 1 file changed, 3 insertions(+), 3 deletions(-)
+
+diff --git a/poppler/CairoFontEngine.cc b/poppler/CairoFontEngine.cc
+index 3cff917..75a1c50 100644
+--- a/poppler/CairoFontEngine.cc
++++ b/poppler/CairoFontEngine.cc
+@@ -132,7 +132,7 @@ CairoFont::getSubstitutionCorrection(GfxFont *gfxFont)
+       cairo_matrix_t m;
+       cairo_matrix_init_identity(&m);
+       cairo_font_options_t *options = cairo_font_options_create();
+-      cairo_font_options_set_hint_style(options, CAIRO_HINT_STYLE_NONE);
++      cairo_font_options_set_hint_style(options, CAIRO_HINT_STYLE_SLIGHT);
+       cairo_font_options_set_hint_metrics(options, CAIRO_HINT_METRICS_OFF);
+       cairo_scaled_font_t *scaled_font = cairo_scaled_font_create(cairo_font_face, &m, &m, options);
+@@ -189,7 +189,7 @@ _ft_new_face_uncached (FT_Library lib,
+   }
+   font_face = cairo_ft_font_face_create_for_ft_face (face,
+-                                                        FT_LOAD_NO_HINTING |
++                                                        FT_LOAD_TARGET_LIGHT |
+                                                         FT_LOAD_NO_BITMAP);
+   if (cairo_font_face_set_user_data (font_face,
+                                    &_ft_cairo_key,
+@@ -358,7 +358,7 @@ _ft_new_face (FT_Library lib,
+   _ft_open_faces = l;
+   l->font_face = cairo_ft_font_face_create_for_ft_face (tmpl.face,
+-                                                        FT_LOAD_NO_HINTING |
++                                                        FT_LOAD_TARGET_LIGHT |
+                                                         FT_LOAD_NO_BITMAP);
+   if (cairo_font_face_set_user_data (l->font_face,
+                                    &_ft_cairo_key,
+-- 
+2.7.3
+
index f6980580a3b442dc2cabc8a1d80d48086e68730c..896a3b681fac1098903356169b17b703c4a0331a 100644 (file)
@@ -16,6 +16,7 @@
 <use>
        <flag name="nss">Enable signatures handling with <pkg>dev-libs/nss</pkg></flag>
        <flag name="utils">Install command-line PDF converters and various utilities.</flag>
+       <flag name="cairo-qt">Enable experimental Cairo font rasterizer for Qt4 backend.</flag>
 </use>
 <slots>
        <subslots>Reflects ABI compatibility of libpoppler.so only,
index d7c5ef7461dbf98b4ad64068eca4b80db4761f4f..87e8a724546b4a0520a85649fe5b36cd583c9f05 100644 (file)
@@ -21,7 +21,9 @@ DESCRIPTION="PDF rendering library based on the xpdf-3.0 code base"
 HOMEPAGE="http://poppler.freedesktop.org/"
 
 LICENSE="GPL-2"
-IUSE="cairo cjk curl cxx debug doc +introspection +jpeg +jpeg2k +lcms nss png qt4 qt5 tiff +utils"
+IUSE="cairo cairo-qt cjk curl cxx debug doc +introspection +jpeg +jpeg2k +lcms nss png qt4 qt5 tiff +utils"
+
+REQUIRED_USE="cairo-qt? ( qt4 )"
 
 # No test data provided
 RESTRICT="test"
@@ -35,6 +37,7 @@ COMMON_DEPEND="
                >=x11-libs/cairo-1.10.0
                introspection? ( >=dev-libs/gobject-introspection-1.32.1:= )
        )
+       cairo-qt? ( >=x11-libs/cairo-1.10.0 )
        curl? ( net-misc/curl )
        jpeg? ( virtual/jpeg:0 )
        jpeg2k? ( media-libs/openjpeg:2= )
@@ -77,6 +80,16 @@ src_prepare() {
        if [[ ${CC} == clang ]] ; then
                sed -i -e 's/-fno-check-new//' cmake/modules/PopplerMacros.cmake || die
        fi
+
+       # Enable experimental patchset for subpixel font rendering using cairo
+       # backend for poppler-qt4 from https://github.com/giddie/poppler-qt4-cairo-backend.
+       if use cairo-qt; then
+               ewarn "Enabling unsupported, experimental cairo-qt patchset. Please do not report bugs."
+               epatch "${FILESDIR}/cairo-qt-experimental/0001-Cairo-backend-added-to-Qt4-wrapper.patch"
+               epatch "${FILESDIR}/cairo-qt-experimental/0002-Setting-default-Qt4-backend-to-Cairo.patch"
+               epatch "${FILESDIR}/cairo-qt-experimental/0003-Forcing-subpixel-rendering-in-Cairo-backend.patch"
+               epatch "${FILESDIR}/cairo-qt-experimental/0004-Enabling-slight-hinting-in-Cairo-Backend.patch"
+       fi
 }
 
 src_configure() {
index d7c5ef7461dbf98b4ad64068eca4b80db4761f4f..87e8a724546b4a0520a85649fe5b36cd583c9f05 100644 (file)
@@ -21,7 +21,9 @@ DESCRIPTION="PDF rendering library based on the xpdf-3.0 code base"
 HOMEPAGE="http://poppler.freedesktop.org/"
 
 LICENSE="GPL-2"
-IUSE="cairo cjk curl cxx debug doc +introspection +jpeg +jpeg2k +lcms nss png qt4 qt5 tiff +utils"
+IUSE="cairo cairo-qt cjk curl cxx debug doc +introspection +jpeg +jpeg2k +lcms nss png qt4 qt5 tiff +utils"
+
+REQUIRED_USE="cairo-qt? ( qt4 )"
 
 # No test data provided
 RESTRICT="test"
@@ -35,6 +37,7 @@ COMMON_DEPEND="
                >=x11-libs/cairo-1.10.0
                introspection? ( >=dev-libs/gobject-introspection-1.32.1:= )
        )
+       cairo-qt? ( >=x11-libs/cairo-1.10.0 )
        curl? ( net-misc/curl )
        jpeg? ( virtual/jpeg:0 )
        jpeg2k? ( media-libs/openjpeg:2= )
@@ -77,6 +80,16 @@ src_prepare() {
        if [[ ${CC} == clang ]] ; then
                sed -i -e 's/-fno-check-new//' cmake/modules/PopplerMacros.cmake || die
        fi
+
+       # Enable experimental patchset for subpixel font rendering using cairo
+       # backend for poppler-qt4 from https://github.com/giddie/poppler-qt4-cairo-backend.
+       if use cairo-qt; then
+               ewarn "Enabling unsupported, experimental cairo-qt patchset. Please do not report bugs."
+               epatch "${FILESDIR}/cairo-qt-experimental/0001-Cairo-backend-added-to-Qt4-wrapper.patch"
+               epatch "${FILESDIR}/cairo-qt-experimental/0002-Setting-default-Qt4-backend-to-Cairo.patch"
+               epatch "${FILESDIR}/cairo-qt-experimental/0003-Forcing-subpixel-rendering-in-Cairo-backend.patch"
+               epatch "${FILESDIR}/cairo-qt-experimental/0004-Enabling-slight-hinting-in-Cairo-Backend.patch"
+       fi
 }
 
 src_configure() {
index d06a550163ebef6dd231e23fd2d3768d3879f6ac..2f20df380c3704d64559d7cc932b2f62a23dcf0b 100644 (file)
@@ -5,6 +5,10 @@
 # This file requires >=portage-2.1.1
 # New entries go on top.
 
+# Maciej Mrozowski <reavertm@gmail.com> (23 Mar 2016)
+# Experimental cairo-qt backend (see bug #568000).
+app-text/poppler cairo-qt
+
 # Lars Wendler <polynomial-c@gentoo.org> (20 Mar 2016)
 # Need vulnerable libotr version (see bug #576914).
 net-im/centerim otr