diff options
author | Jeffrey Feng | 2018-05-22 00:46:24 +0800 |
---|---|---|
committer | Jeffrey Feng | 2018-05-22 00:46:24 +0800 |
commit | 5d29dd5df91b24f7d08d06d6df6bbcd34ec4a2b5 (patch) | |
tree | 297fa0dbf5189e31456cc1f544afbec9778b252d | |
download | aur-5d29dd5df91b24f7d08d06d6df6bbcd34ec4a2b5.tar.gz |
LCD subpixel patch for evince and poppler
-rw-r--r-- | .SRCINFO | 61 | ||||
-rw-r--r-- | 01-evince-subpixel-rendering-by-poppler.patch | 52 | ||||
-rw-r--r-- | 02-subpixel-rendering-for-poppler-and-glib.patch | 285 | ||||
-rw-r--r-- | 03-cairo-backend-for-poppler-qt5.patch | 235 | ||||
-rw-r--r-- | PKGBUILD | 96 |
5 files changed, 729 insertions, 0 deletions
diff --git a/.SRCINFO b/.SRCINFO new file mode 100644 index 000000000000..51ffc713f44f --- /dev/null +++ b/.SRCINFO @@ -0,0 +1,61 @@ +pkgbase = evince-lcd-standalone + pkgdesc = Document viewer (PDF, Postscript, djvu, etc.) with built-in LCD subpixel rendering support + pkgver = 3.28.2 + pkgrel = 1 + url = https://wiki.gnome.org/Apps/Evince + arch = x86_64 + groups = gnome + license = GPL + makedepends = itstool + makedepends = libnautilus-extension + makedepends = texlive-bin + makedepends = gobject-introspection + makedepends = intltool + makedepends = docbook-xsl + makedepends = gtk-doc + makedepends = gnome-common + makedepends = git + makedepends = python + makedepends = python2 + makedepends = libjpeg + makedepends = gcc-libs + makedepends = cairo + makedepends = fontconfig + makedepends = openjpeg + makedepends = gtk2 + makedepends = qt4 + makedepends = qt5-base + makedepends = icu + makedepends = pkgconfig + makedepends = lcms2 + depends = gtk3 + depends = libgxps + depends = libspectre + depends = gsfonts + depends = djvulibre + depends = t1lib + depends = dconf + depends = libsecret + depends = gsettings-desktop-schemas + depends = gnome-desktop + depends = libarchive + depends = gst-plugins-base-libs + optdepends = texlive-bin: DVI support + optdepends = gvfs: bookmark support and session saving + provides = evince=3.28.2 + conflicts = evince + conflicts = evince-lcdfilter + options = !emptydirs + source = git+https://git.gnome.org/browse/evince#commit=7fc165add2f0b002b2c7c790671c9a6d1348c3ce + source = http://poppler.freedesktop.org/poppler-0.43.0.tar.xz + source = 01-evince-subpixel-rendering-by-poppler.patch + source = 02-subpixel-rendering-for-poppler-and-glib.patch + source = 03-cairo-backend-for-poppler-qt5.patch + sha256sums = SKIP + sha256sums = SKIP + sha256sums = SKIP + sha256sums = SKIP + sha256sums = SKIP + +pkgname = evince-lcd-standalone + diff --git a/01-evince-subpixel-rendering-by-poppler.patch b/01-evince-subpixel-rendering-by-poppler.patch new file mode 100644 index 000000000000..ccacd99a9d8e --- /dev/null +++ b/01-evince-subpixel-rendering-by-poppler.patch @@ -0,0 +1,52 @@ +From: Jeffrey Feng <galago1992@gmail.com> +Subject: [PATCH 1/3] evince subpixel rendering provided by poppler cairo backend +--- +diff -rup a/backend/pdf b/backend/pdf|diffstat + ev-poppler.cc | 23 ++++++++++++++++++++--- + 1 file changed, 20 insertions(+), 3 deletions(-) + +diff -rup a/backend/pdf/ev-poppler.cc b/backend/pdf/ev-poppler.cc +--- a/backend/pdf/ev-poppler.cc 2018-05-21 22:07:17.707456820 +0800 ++++ b/backend/pdf/ev-poppler.cc 2018-05-21 22:20:05.643425328 +0800 +@@ -388,11 +388,26 @@ pdf_page_render (PopplerPage *page, + cairo_t *cr; + double page_width, page_height; + double xscale, yscale; ++ gboolean subpixel_rendering; ++ cairo_font_options_t *fo; + + surface = cairo_image_surface_create (CAIRO_FORMAT_ARGB32, + width, height); + cr = cairo_create (surface); + ++ fo = cairo_font_options_create (); ++ cairo_get_font_options (cr, fo); ++ subpixel_rendering = poppler_page_support_subpixel_rendering (page); ++ // printf("subpixel_rendering: %d\n", subpixel_rendering); ++ if (subpixel_rendering) { ++ cairo_set_source_rgb (cr, 1., 1., 1.); ++ cairo_paint (cr); ++ cairo_font_options_set_antialias (fo, CAIRO_ANTIALIAS_SUBPIXEL); ++ cairo_font_options_set_subpixel_order (fo, CAIRO_SUBPIXEL_ORDER_RGB); ++ } ++ cairo_set_font_options (cr, fo); ++ cairo_font_options_destroy (fo); ++ + switch (rc->rotation) { + case 90: + cairo_translate (cr, width, 0); +@@ -415,9 +430,11 @@ pdf_page_render (PopplerPage *page, + cairo_rotate (cr, rc->rotation * G_PI / 180.0); + poppler_page_render (page, cr); + +- cairo_set_operator (cr, CAIRO_OPERATOR_DEST_OVER); +- cairo_set_source_rgb (cr, 1., 1., 1.); +- cairo_paint (cr); ++ if (!subpixel_rendering) { ++ cairo_set_operator (cr, CAIRO_OPERATOR_DEST_OVER); ++ cairo_set_source_rgb (cr, 1., 1., 1.); ++ cairo_paint (cr); ++ } + + cairo_destroy (cr); + diff --git a/02-subpixel-rendering-for-poppler-and-glib.patch b/02-subpixel-rendering-for-poppler-and-glib.patch new file mode 100644 index 000000000000..77dd40fb220d --- /dev/null +++ b/02-subpixel-rendering-for-poppler-and-glib.patch @@ -0,0 +1,285 @@ +From: Jeffrey Feng <galago1992@gmail.com> +Subject: [PATCH 2/3] subpixel rendering for poppler and poppler-glib +--- +diff -rup a/ b/|diffstat + glib/demo/render.c | 25 +++++++++++++++++--- + glib/poppler-page.cc | 10 ++++++++ + glib/poppler-page.h | 1 + poppler/CairoFontEngine.cc | 6 ++-- + poppler/CairoOutputDev.cc | 17 +++++++++++++ + poppler/Gfx.cc | 56 +++++++++++++++++++++++++++++++++++++++++++++ + poppler/Gfx.h | 3 ++ + poppler/Page.cc | 14 +++++++++++ + poppler/Page.h | 3 ++ + 9 files changed, 129 insertions(+), 6 deletions(-) + + diff -rup a/glib/demo/render.c b/glib/demo/render.c +--- a/glib/demo/render.c 2014-02-09 23:10:30.000000000 +0800 ++++ b/glib/demo/render.c 2018-05-18 21:21:13.000000000 +0800 +@@ -82,12 +82,14 @@ pgd_render_start (GtkButton *button, + PgdRenderDemo *demo) + { + PopplerPage *page; ++ gboolean subpixel_rendering; + gdouble page_width, page_height; + gdouble width, height; + gint x, y; + gchar *str; + GTimer *timer; + cairo_t *cr; ++ cairo_font_options_t *fo; + + page = poppler_document_get_page (demo->doc, demo->page); + if (!page) +@@ -116,6 +118,21 @@ pgd_render_start (GtkButton *button, + width, height); + cr = cairo_create (demo->surface); + ++ fo = cairo_font_options_create (); ++ cairo_get_font_options (cr, fo); ++ ++ subpixel_rendering = poppler_page_support_subpixel_rendering (page); ++ // printf("subpixel_rendering %d\n", subpixel_rendering); ++ if (subpixel_rendering) { ++ cairo_set_source_rgb (cr, 1., 1., 1.); ++ cairo_paint (cr); ++ cairo_font_options_set_antialias (fo, CAIRO_ANTIALIAS_SUBPIXEL); ++ cairo_font_options_set_subpixel_order (fo, CAIRO_SUBPIXEL_ORDER_RGB); ++ } ++ ++ cairo_set_font_options (cr, fo); ++ cairo_font_options_destroy (fo); ++ + cairo_save (cr); + switch (demo->rotate) { + case 90: +@@ -143,9 +160,11 @@ pgd_render_start (GtkButton *button, + poppler_page_render (page, cr); + cairo_restore (cr); + +- cairo_set_operator (cr, CAIRO_OPERATOR_DEST_OVER); +- cairo_set_source_rgb (cr, 1., 1., 1.); +- cairo_paint (cr); ++ if (!subpixel_rendering) { ++ cairo_set_operator (cr, CAIRO_OPERATOR_DEST_OVER); ++ cairo_set_source_rgb (cr, 1., 1., 1.); ++ cairo_paint (cr); ++ } + + g_timer_stop (timer); + +diff -rup a/glib/poppler-page.cc b/glib/poppler-page.cc +--- a/glib/poppler-page.cc 2016-03-02 07:35:24.000000000 +0800 ++++ b/glib/poppler-page.cc 2018-05-18 21:21:13.000000000 +0800 +@@ -2424,3 +2424,13 @@ poppler_page_get_text_attributes_for_are + + return g_list_reverse(attributes); + } ++ ++gboolean ++poppler_page_support_subpixel_rendering (PopplerPage *page) ++{ ++ CairoOutputDev *output_dev; ++ g_return_val_if_fail (POPPLER_IS_PAGE (page), FALSE); ++ ++ output_dev = page->document->output_dev; ++ return page->page->supportSubpixelRendering(output_dev); ++} +diff -rup a/glib/poppler-page.h b/glib/poppler-page.h +--- a/glib/poppler-page.h 2016-03-02 07:35:24.000000000 +0800 ++++ b/glib/poppler-page.h 2018-05-18 21:21:13.000000000 +0800 +@@ -109,6 +109,7 @@ GList *poppler_page_get_ + void poppler_page_free_text_attributes (GList *list); + GList * poppler_page_get_text_attributes_for_area (PopplerPage *page, + PopplerRectangle *area); ++gboolean poppler_page_support_subpixel_rendering (PopplerPage *page); + + /* A rectangle on a page, with coordinates in PDF points. */ + #define POPPLER_TYPE_RECTANGLE (poppler_rectangle_get_type ()) +diff -rup a/poppler/CairoFontEngine.cc b/poppler/CairoFontEngine.cc +--- a/poppler/CairoFontEngine.cc 2016-04-29 06:05:41.000000000 +0800 ++++ b/poppler/CairoFontEngine.cc 2018-05-20 12:51:49.952696424 +0800 +@@ -132,7 +132,7 @@ CairoFont::getSubstitutionCorrection(Gfx + 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); + +@@ -190,7 +190,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, +@@ -359,7 +359,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, +diff -rup a/poppler/CairoOutputDev.cc b/poppler/CairoOutputDev.cc +--- a/poppler/CairoOutputDev.cc 2016-04-29 06:05:11.000000000 +0800 ++++ b/poppler/CairoOutputDev.cc 2018-05-18 21:21:13.000000000 +0800 +@@ -1402,6 +1402,7 @@ void CairoOutputDev::drawChar(GfxState * + void CairoOutputDev::endString(GfxState *state) + { + int render; ++ GfxFontType fontType; + + if (!currentFont) + return; +@@ -1419,6 +1420,18 @@ void CairoOutputDev::endString(GfxState + goto finish; + } + ++ fontType = state->getFont()->getType(); ++ // Do not enable subpixel rendering for type3 font ++ // For some reason it does not work ++ if (fontType == fontType3) { ++ cairo_save(cairo); ++ cairo_font_options_t *fo; ++ fo = cairo_font_options_create (); ++ cairo_get_font_options (cairo, fo); ++ cairo_font_options_set_antialias (fo, CAIRO_ANTIALIAS_DEFAULT); ++ cairo_set_font_options (cairo, fo); ++ } ++ + if (!(render & 1)) { + LOG (printf ("fill string\n")); + cairo_set_source (cairo, fill_pattern); +@@ -1469,6 +1482,10 @@ void CairoOutputDev::endString(GfxState + } + + finish: ++ // pair with the previous cairo_save to disable subpixel rendering for type3 fonts ++ if (fontType == fontType3) { ++ cairo_restore(cairo); ++ } + gfree (glyphs); + glyphs = NULL; + if (use_show_text_glyphs) { +diff -rup a/poppler/Gfx.cc b/poppler/Gfx.cc +--- a/poppler/Gfx.cc 2016-03-17 03:16:12.000000000 +0800 ++++ b/poppler/Gfx.cc 2018-05-18 21:21:13.000000000 +0800 +@@ -4726,6 +4726,62 @@ void Gfx::doImage(Object *ref, Stream *s + error(errSyntaxError, getPos(), "Bad image parameters"); + } + ++GBool Gfx::checkNormalBlendModeOnly(Object *str) { ++ // printf("check blender mode start\n"); ++ char *cmd; ++ Object obj; ++ Object args[maxArgs]; ++ int numArgs, i; ++ GBool onlyNormalBlendMode; ++ Parser myParser(xref, new Lexer(xref, str), gFalse); ++ ++ numArgs = 0; ++ onlyNormalBlendMode = gTrue; ++ ++ myParser.getObj(&obj); ++ while (!obj.isEOF()) { ++ if (obj.isCmd()) { ++ cmd = obj.getCmd(); ++ ++ if (strcmp(cmd, "gs") == 0) { ++ Object obj1, obj2; ++ GfxBlendMode mode; ++ if (res->lookupGState(args[0].getName(), &obj1)) { ++ if (!obj1.dictLookup("BM", &obj2)->isNull()) { ++ if (state->parseBlendMode(&obj2, &mode)) { ++ // printf("check blend mode: %d\n", mode); ++ onlyNormalBlendMode &= (mode == gfxBlendNormal); ++ } ++ } ++ obj2.free(); ++ } ++ obj1.free(); ++ } ++ obj.free(); ++ ++ for (i = 0; i < numArgs; ++i) ++ args[i].free(); ++ numArgs = 0; ++ ++ } else if (numArgs < maxArgs) { ++ args[numArgs++] = obj; ++ } else { ++ obj.free(); ++ } ++ ++ myParser.getObj(&obj); ++ } ++ obj.free(); ++ ++ if (numArgs > 0) { ++ for (i = 0; i < numArgs; ++i) ++ args[i].free(); ++ } ++ ++ return onlyNormalBlendMode; ++} ++ ++ + GBool Gfx::checkTransparencyGroup(Dict *resDict) { + // check the effect of compositing objects as a group: + // look for ExtGState entries with ca != 1 or CA != 1 or BM != normal +diff -rup a/poppler/Gfx.h b/poppler/Gfx.h +--- a/poppler/Gfx.h 2015-11-16 05:05:22.000000000 +0800 ++++ b/poppler/Gfx.h 2018-05-18 21:21:13.000000000 +0800 +@@ -186,6 +186,9 @@ public: + // Get the current graphics state object. + GfxState *getState() { return state; } + ++ // Check whether a stream only contains normal blend mode (to enable subpixel rendering) ++ GBool checkNormalBlendModeOnly(Object *str); ++ + GBool checkTransparencyGroup(Dict *resDict); + + void drawForm(Object *str, Dict *resDict, double *matrix, double *bbox, +diff -rup a/poppler/Page.cc b/poppler/Page.cc +--- a/poppler/Page.cc 2016-02-07 20:41:06.000000000 +0800 ++++ b/poppler/Page.cc 2018-05-18 21:21:13.000000000 +0800 +@@ -370,6 +370,20 @@ Dict *Page::getResourceDictCopy(XRef *xr + return dict ? dict->copy(xrefA) : NULL; + } + ++GBool Page::supportSubpixelRendering(OutputDev *out) { ++ GBool supported = gFalse; ++ Object obj; ++ PDFRectangle box; ++ ++ contents.fetch(xref, &obj); ++ if (!obj.isNull()) { ++ Gfx gfx(doc, out, attrs->getResourceDict(), &box, NULL); ++ supported = gfx.checkNormalBlendModeOnly(&obj); ++ } ++ obj.free(); ++ return supported; ++} ++ + void Page::replaceXRef(XRef *xrefA) { + Object obj1; + Dict *pageDict = pageObj.getDict()->copy(xrefA); +diff -rup a/poppler/Page.h b/poppler/Page.h +--- a/poppler/Page.h 2015-11-16 05:05:22.000000000 +0800 ++++ b/poppler/Page.h 2018-05-18 21:21:13.000000000 +0800 +@@ -179,6 +179,9 @@ public: + Dict *getResourceDict(); + Dict *getResourceDictCopy(XRef *xrefA); + ++ // Whether the content in this page supports subpixel rendering (lcdfilter) ++ GBool supportSubpixelRendering(OutputDev *out); ++ + // Get annotations array. + Object *getAnnots(Object *obj, XRef *xrefA = NULL) { return annotsObj.fetch((xrefA == NULL) ? xref : xrefA, obj); } + // Add a new annotation to the page diff --git a/03-cairo-backend-for-poppler-qt5.patch b/03-cairo-backend-for-poppler-qt5.patch new file mode 100644 index 000000000000..8e422f5949c9 --- /dev/null +++ b/03-cairo-backend-for-poppler-qt5.patch @@ -0,0 +1,235 @@ +From: Jeffrey Feng <galago1992@gmail.com> +Subject: [PATCH 3/3] cairo backend for poppler-qt5 +--- +diff -rup a/qt5 b/qt5|diffstat + demos/viewer.cpp | 6 ++- + src/CMakeLists.txt | 14 +++++++ + 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, 111 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,19 @@ 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 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}") diff --git a/PKGBUILD b/PKGBUILD new file mode 100644 index 000000000000..fe1b9702810a --- /dev/null +++ b/PKGBUILD @@ -0,0 +1,96 @@ +# Maintainer: Jeffrey Feng <galago1992@gmail.com> + +pkgname=evince-lcd-standalone +_pkgname=evince +pkgver=3.28.2 +pkgrel=1 +pkgdesc="Document viewer (PDF, Postscript, djvu, etc.) with built-in LCD subpixel rendering support" +url="https://wiki.gnome.org/Apps/Evince" +arch=(x86_64) +license=(GPL) +depends=('gtk3' 'libgxps' 'libspectre' 'gsfonts' 'djvulibre' 't1lib' 'dconf' + 'libsecret' 'gsettings-desktop-schemas' 'gnome-desktop' 'libarchive' + 'gst-plugins-base-libs') +makedepends=('itstool' 'libnautilus-extension' 'texlive-bin' 'gobject-introspection' + 'intltool' 'docbook-xsl' 'gtk-doc' 'gnome-common' 'git' 'python' + 'python2' 'libjpeg' 'gcc-libs' 'cairo' 'fontconfig' 'openjpeg' 'gtk2' + 'qt4' 'qt5-base' 'icu' 'pkgconfig' 'lcms2') +optdepends=('texlive-bin: DVI support' + 'gvfs: bookmark support and session saving') +provides=("evince=$pkgver") +conflicts=('evince' 'evince-lcdfilter') +groups=(gnome) +options=('!emptydirs') +_commit=7fc165add2f0b002b2c7c790671c9a6d1348c3ce #2a4995479ccf65f5bd15df13f9b6c810c3156b58 +source=("git+https://git.gnome.org/browse/evince#commit=$_commit" + "http://poppler.freedesktop.org/poppler-0.43.0.tar.xz" + 01-evince-subpixel-rendering-by-poppler.patch + 02-subpixel-rendering-for-poppler-and-glib.patch + 03-cairo-backend-for-poppler-qt5.patch) +sha256sums=('SKIP' + 'SKIP' + 'SKIP' + 'SKIP' + 'SKIP') + +pkgver() { + cd $_pkgname + git describe --tags | sed 's/-/+/g' +} + +prepare() { + cd $_pkgname + NOCONFIGURE=1 ./autogen.sh +} + + +build() { + #patch poppler + cd poppler-0.43.0 + patch -Np1<../02-subpixel-rendering-for-poppler-and-glib.patch + patch -Np1<../03-cairo-backend-for-poppler-qt5.patch + + # poppler > 0.43 fails to work with LCD subpixel rendering patch. + cd $srcdir + mkdir -p build&&cd $_ + cmake ../poppler-0.43.0 -DENABLE_XPDF_HEADERS=ON -DENABLE_LIBOPENJPEG=FALSE + make DESTDIR="$srcdir" install + + # rename shared libraries to resolve conflicts with existing poppler installation. + cd $srcdir/usr/local/lib + rm `find . -type l` + mv libpoppler.so.60.0.0 libpoppler.so.60 + mv libpoppler-glib.so.8.7.0 libpoppler-glib.so.87 + + # patch evince and build + cd $srcdir/$_pkgname + patch -Np1<../01-evince-subpixel-rendering-by-poppler.patch + + BROWSER_PLUGIN_DIR=/usr/lib/epiphany/plugins \ + POPPLER_CFLAGS="-I$srcdir/usr/local/include/poppler/glib -I$srcdir/usr/local/include/poppler `pkg-config --cflags glib-2.0 gobject-2.0 cairo libxml-2.0`" \ + POPPLER_LIBS="-L$srcdir/usr/local/lib -l:libpoppler-glib.so.87 -l:libpoppler.so.60 `pkg-config --libs glib-2.0 gobject-2.0 cairo libxml-2.0`" \ + ./configure --prefix=/usr --sysconfdir=/etc --localstatedir=/var \ + --libexecdir=/usr/lib/$_pkgname \ + --disable-static \ + --enable-compile-warnings=minimum \ + --enable-introspection \ + --enable-nautilus \ + --enable-pdf \ + --enable-tiff \ + --enable-djvu \ + --enable-dvi \ + --enable-t1lib \ + --enable-comics \ + --enable-gtk-doc \ + --enable-multimedia \ + --disable-schemas-compile + + make +} + +package() { + cd $_pkgname + make DESTDIR="$pkgdir" install + libdir=$pkgdir/usr/lib + cp $srcdir/usr/local/lib/{libpoppler-glib.so.87,libpoppler.so.60} $libdir +} |