summarylogtreecommitdiffstats
path: root/03-cairo-backend-for-poppler-qt5.patch
diff options
context:
space:
mode:
Diffstat (limited to '03-cairo-backend-for-poppler-qt5.patch')
-rw-r--r--03-cairo-backend-for-poppler-qt5.patch236
1 files changed, 236 insertions, 0 deletions
diff --git a/03-cairo-backend-for-poppler-qt5.patch b/03-cairo-backend-for-poppler-qt5.patch
new file mode 100644
index 000000000000..2da34b3a3eb5
--- /dev/null
+++ b/03-cairo-backend-for-poppler-qt5.patch
@@ -0,0 +1,236 @@
+From: Jeffrey Feng <galago1992@gmail.com>
+Subject: [PATCH 3/4] cairo backend for poppler-qt5
+---
+diff -rup a/qt5 b/qt5|diffstat
+ demos/viewer.cpp | 6 ++-
+ src/CMakeLists.txt | 15 +++++++
+ src/poppler-document.cc | 3 +
+ src/poppler-page.cc | 83 +++++++++++++++++++++++++++++++++++++++++++++++-
+ src/poppler-private.cc | 2 -
+ src/poppler-qt5.h | 3 +
+ tests/CMakeLists.txt | 4 ++
+ 7 files changed, 112 insertions(+), 4 deletions(-)
+
+diff -rup a/qt5/demos/viewer.cpp b/qt5/demos/viewer.cpp
+--- a/qt5/demos/viewer.cpp 2014-02-09 23:10:33.000000000 +0800
++++ b/qt5/demos/viewer.cpp 2018-05-20 11:50:24.585847554 +0800
+@@ -74,13 +74,17 @@ PdfViewer::PdfViewer()
+ m_settingsRenderBackendGrp->setExclusive(true);
+ act = settingsRenderMenu->addAction(tr("Splash"));
+ act->setCheckable(true);
+- act->setChecked(true);
+ act->setData(qVariantFromValue(0));
+ m_settingsRenderBackendGrp->addAction(act);
+ act = settingsRenderMenu->addAction(tr("Arthur"));
+ act->setCheckable(true);
+ act->setData(qVariantFromValue(1));
+ m_settingsRenderBackendGrp->addAction(act);
++ act = settingsRenderMenu->addAction(tr("Cairo"));
++ act->setCheckable(true);
++ act->setChecked(true);
++ act->setData(qVariantFromValue(2));
++ m_settingsRenderBackendGrp->addAction(act);
+ connect(m_settingsRenderBackendGrp, SIGNAL(triggered(QAction*)),
+ this, SLOT(slotRenderBackend(QAction*)));
+
+diff -rup a/qt5/src/CMakeLists.txt b/qt5/src/CMakeLists.txt
+--- a/qt5/src/CMakeLists.txt 2016-03-02 07:35:24.000000000 +0800
++++ b/qt5/src/CMakeLists.txt 2018-05-19 11:01:30.000000000 +0800
+@@ -6,6 +6,10 @@ include_directories(
+ ${Qt5Core_INCLUDE_DIRS}
+ ${CMAKE_CURRENT_BINARY_DIR}
+ )
++if (HAVE_CAIRO)
++ include_directories(${CAIRO_INCLUDE_DIRS})
++ add_definitions(${CAIRO_CFLAGS})
++endif (HAVE_CAIRO)
+
+ set(poppler_qt5_SRCS
+ poppler-annotation.cc
+@@ -29,9 +33,20 @@ set(poppler_qt5_SRCS
+ poppler-media.cc
+ ArthurOutputDev.cc
+ )
++if (HAVE_CAIRO)
++ set(poppler_qt5_SRCS ${poppler_qt5_SRCS}
++ ${CMAKE_SOURCE_DIR}/poppler/CairoOutputDev.cc
++ ${CMAKE_SOURCE_DIR}/poppler/CairoRescaleBox.cc
++ ${CMAKE_SOURCE_DIR}/poppler/CairoFontEngine.cc
++ )
++endif(HAVE_CAIRO)
+ add_library(poppler-qt5 SHARED ${poppler_qt5_SRCS})
++set_target_properties(poppler-qt5 PROPERTIES OUTPUT_NAME "poppler-qt5-lcd")
+ set_target_properties(poppler-qt5 PROPERTIES VERSION 1.6.0 SOVERSION 1)
+ target_link_libraries(poppler-qt5 poppler ${Qt5Core_LIBRARIES} ${Qt5Gui_LIBRARIES} ${Qt5Xml_LIBRARIES})
++if (HAVE_CAIRO)
++ target_link_libraries(poppler-qt5 ${CAIRO_LIBRARIES})
++endif (HAVE_CAIRO)
+ if(MSVC)
+ target_link_libraries(poppler-qt5 poppler ${poppler_LIBS})
+ endif(MSVC)
+diff -rup a/qt5/src/poppler-document.cc b/qt5/src/poppler-document.cc
+--- a/qt5/src/poppler-document.cc 2015-09-08 23:34:57.000000000 +0800
++++ b/qt5/src/poppler-document.cc 2018-05-19 11:04:11.000000000 +0800
+@@ -528,6 +528,9 @@ namespace Poppler {
+ ret << Document::SplashBackend;
+ #endif
+ ret << Document::ArthurBackend;
++#if defined(HAVE_CAIRO)
++ ret << Document::CairoBackend;
++#endif
+ return ret;
+ }
+
+diff -rup a/qt5/src/poppler-page.cc b/qt5/src/poppler-page.cc
+--- a/qt5/src/poppler-page.cc 2016-04-29 05:58:39.000000000 +0800
++++ b/qt5/src/poppler-page.cc 2018-05-20 12:26:07.000000000 +0800
+@@ -41,6 +41,7 @@
+ #include <QtGui/QPainter>
+
+ #include <config.h>
++#include <math.h>
+ #include <PDFDoc.h>
+ #include <Catalog.h>
+ #include <Form.h>
+@@ -54,7 +55,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"
+ #include "poppler-page-private.h"
+@@ -406,6 +409,82 @@ QImage Page::renderToImage(double xres,
+ 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;
++ cairo_font_options_t *fo;
++ GBool subpixel_rendering;
++ // 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);
++ fo = cairo_font_options_create ();
++ cairo_get_font_options (cairo, fo);
++ subpixel_rendering = m_page->page->supportSubpixelRendering (output_dev);
++ if (subpixel_rendering) {
++ cairo_set_source_rgb (cairo, 1., 1., 1.);
++ cairo_font_options_set_antialias (fo, CAIRO_ANTIALIAS_SUBPIXEL);
++ cairo_font_options_set_subpixel_order (fo, CAIRO_SUBPIXEL_ORDER_RGB);
++ }
++ cairo_set_font_options (cairo, fo);
++ cairo_font_options_destroy (fo);
++
++ 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;
+@@ -448,6 +527,8 @@ bool Page::renderToPainter(QPainter* pai
+ painter->restore();
+ return true;
+ }
++ case Poppler::Document::CairoBackend:
++ return false;
+ }
+ return false;
+ }
+diff -rup a/qt5/src/poppler-private.cc b/qt5/src/poppler-private.cc
+--- a/qt5/src/poppler-private.cc 2015-09-08 23:31:07.000000000 +0800
++++ b/qt5/src/poppler-private.cc 2018-05-19 12:25:04.000000000 +0800
+@@ -234,7 +234,7 @@ namespace Debug {
+
+ void DocumentData::init()
+ {
+- m_backend = Document::SplashBackend;
++ m_backend = Document::CairoBackend;
+ paperColor = Qt::white;
+ m_hints = 0;
+ m_optContentModel = 0;
+diff -rup a/qt5/src/poppler-qt5.h b/qt5/src/poppler-qt5.h
+--- a/qt5/src/poppler-qt5.h 2015-09-02 05:46:49.000000000 +0800
++++ b/qt5/src/poppler-qt5.h 2018-05-19 11:12:36.000000000 +0800
+@@ -876,7 +876,8 @@ delete it;
+ */
+ enum RenderBackend {
+ SplashBackend, ///< Splash backend
+- ArthurBackend ///< Arthur (Qt) backend
++ ArthurBackend, ///< Arthur (Qt) backend
++ CairoBackend ///< Cairo backend
+ };
+
+ /**
+diff -rup a/qt5/tests/CMakeLists.txt b/qt5/tests/CMakeLists.txt
+--- a/qt5/tests/CMakeLists.txt 2016-03-02 07:35:24.000000000 +0800
++++ b/qt5/tests/CMakeLists.txt 2018-05-20 11:46:08.806858043 +0800
+@@ -10,6 +10,10 @@ include_directories(
+ ${Qt5Xml_INCLUDE_DIRS}
+ ${Qt5Widgets_INCLUDE_DIRS}
+ )
++if (HAVE_CAIRO)
++ include_directories(${CAIRO_INCLUDE_DIRS})
++ add_definitions(${CAIRO_CFLAGS})
++endif (HAVE_CAIRO)
+
+ set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${Qt5Core_EXECUTABLE_COMPILE_FLAGS}")
+ set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${Qt5Gui_EXECUTABLE_COMPILE_FLAGS}")