diff options
author | Jeffrey Feng | 2018-05-27 10:17:48 +0800 |
---|---|---|
committer | Jeffrey Feng | 2018-05-27 10:17:48 +0800 |
commit | 4274b78682357b32ab7ba010a5e57b2be1fd3d74 (patch) | |
tree | 47fdb9308ca2435e9c58ff59aac15c58d6957566 | |
download | aur-4274b78682357b32ab7ba010a5e57b2be1fd3d74.tar.gz |
okular with LCD subpixel rendering backend
-rw-r--r-- | .SRCINFO | 69 | ||||
-rw-r--r-- | .gitignore | 5 | ||||
-rw-r--r-- | 01-okular-subpixel-rendering-by-poppler.patch | 67 | ||||
-rw-r--r-- | 02-subpixel-rendering-for-poppler-and-glib.patch | 309 | ||||
-rw-r--r-- | 03-cairo-backend-for-poppler-qt5.patch | 236 | ||||
-rw-r--r-- | PKGBUILD | 74 |
6 files changed, 760 insertions, 0 deletions
diff --git a/.SRCINFO b/.SRCINFO new file mode 100644 index 000000000000..227742ca80fc --- /dev/null +++ b/.SRCINFO @@ -0,0 +1,69 @@ +pkgbase = okular-lcd-standalone + pkgdesc = KDE Document viewer (PDF, Postscript, djvu, etc.) with built-in LCD subpixel rendering support + pkgver = 18.04.1 + pkgrel = 1 + url = https://kde.org/applications/graphics/okular/ + arch = x86_64 + groups = kde-applications + groups = kdegraphics + license = GPL + license = LGPL + license = FDL + makedepends = extra-cmake-modules + makedepends = ebook-tools + makedepends = kdegraphics-mobipocket + makedepends = kdoctools + makedepends = khtml + makedepends = chmlib + makedepends = discount + makedepends = git + makedepends = qt4 + makedepends = qt5-base + makedepends = icu + makedepends = gtk2 + makedepends = python2 + makedepends = libjpeg + makedepends = gcc-libs + makedepends = cairo + makedepends = fontconfig + makedepends = openjpeg + makedepends = pkgconfig + makedepends = lcms2 + makedepends = gobject-introspection + depends = djvulibre + depends = libspectre + depends = libkexiv2 + depends = qca-qt5 + depends = kpty + depends = kactivities + depends = threadweaver + depends = kjs + depends = kparts + depends = purpose + optdepends = ebook-tools: mobi and epub support + optdepends = discount: markdown support + optdepends = kdegraphics-mobipocket: mobi support + optdepends = kirigami2: mobile UI + optdepends = libzip: CHM support + optdepends = khtml: CHM support + optdepends = chmlib: CHM support + optdepends = calligra: ODT and ODP support + conflicts = kdegraphics-okular + conflicts = okular + conflicts = okular-git + replaces = kdegraphics-okular + replaces = okular + replaces = okular-git + source = git+https://github.com/KDE/okular#commit=ee57925c5779a572b8d5cc52ab59a380bd4b4e03 + source = http://poppler.freedesktop.org/poppler-0.43.0.tar.xz + source = 01-okular-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 = 4d44bfc0f34a3e26f2d1cc6f5a99cf4199c7a13ae5e1ed57c4b875703328d525 + sha256sums = 73c0fb71877633cefc37b13bcd7896263dc63b91fe13fa97c2c240292a2bc338 + sha256sums = c554b9411764ffcad7a91e22f78a594ca9851e631c70ec15a2b0d52bada0573c + +pkgname = okular-lcd-standalone + diff --git a/.gitignore b/.gitignore new file mode 100644 index 000000000000..198750ed322f --- /dev/null +++ b/.gitignore @@ -0,0 +1,5 @@ +okular/ +src/ +pkg/ +*.tar.xz + diff --git a/01-okular-subpixel-rendering-by-poppler.patch b/01-okular-subpixel-rendering-by-poppler.patch new file mode 100644 index 000000000000..daf738c941ed --- /dev/null +++ b/01-okular-subpixel-rendering-by-poppler.patch @@ -0,0 +1,67 @@ +From: Jeffrey Feng <galago1992@gmail.com> +Subject: [PATCH 1/3] okular LCD subpixel rendering by poppler +--- +git diff --stat + CMakeLists.txt | 7 +++---- + generators/poppler/CMakeLists.txt | 9 +++++++-- + 2 files changed, 10 insertions(+), 6 deletions(-) + +diff --git a/CMakeLists.txt b/CMakeLists.txt +index d067039e0..aa60b226d 100644 +--- a/CMakeLists.txt ++++ b/CMakeLists.txt +@@ -92,10 +92,8 @@ set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} ${CMAKE_SOURCE_DIR}/cmake/modules) + find_package(ZLIB REQUIRED) + + # This is here instead of in generators since we use if(Poppler_Qt5_FOUND) in autotests/ +-find_package(Poppler "0.12.1" COMPONENTS Qt5) +-set_package_properties("Poppler" PROPERTIES +- TYPE RECOMMENDED +- PURPOSE "Support for PDF files in okular.") ++set(Poppler_Qt5_FOUND 1) ++set(Poppler_VERSION "0.43.0") + + add_definitions(-DQT_USE_FAST_CONCATENATION -DQT_USE_FAST_OPERATOR_PLUS) + add_definitions(-DTRANSLATION_DOMAIN="okular") +@@ -116,6 +114,7 @@ if(BUILD_COVERAGE) + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fprofile-arcs -ftest-coverage") + set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -lgcov") + endif() ++STRING(REGEX REPLACE "--as-needed" "--no-as-needed" CMAKE_MODULE_LINKER_FLAGS ${CMAKE_MODULE_LINKER_FLAGS}) + + add_subdirectory( ui ) + add_subdirectory( shell ) +diff --git a/generators/poppler/CMakeLists.txt b/generators/poppler/CMakeLists.txt +index 73881f0e1..5e90efed8 100644 +--- a/generators/poppler/CMakeLists.txt ++++ b/generators/poppler/CMakeLists.txt +@@ -19,7 +19,7 @@ if (Poppler_VERSION VERSION_GREATER "0.36.99") + set (HAVE_POPPLER_0_37 1) + endif() + +-set(CMAKE_REQUIRED_LIBRARIES Poppler::Qt5 Qt5::Core Qt5::Gui) ++set(CMAKE_REQUIRED_LIBRARIES Qt5::Core Qt5::Gui) + + check_cxx_source_compiles(" + #include <poppler-qt5.h> +@@ -89,6 +89,8 @@ configure_file( + + include_directories( + ${CMAKE_CURRENT_SOURCE_DIR}/../.. ++ ${POPPLER_LIB_DIR}/../include/poppler ++ ${POPPLER_LIB_DIR}/../include/poppler/qt5 + ) + + ########### next target ############### +@@ -107,7 +109,10 @@ kconfig_add_kcfg_files(okularGenerator_poppler_PART_SRCS conf/pdfsettings.kcfgc + + okular_add_generator(okularGenerator_poppler ${okularGenerator_poppler_PART_SRCS}) + +-target_link_libraries(okularGenerator_poppler okularcore KF5::I18n KF5::Completion Poppler::Qt5 Qt5::Xml) ++set(POPPLER_LIB ${POPPLER_LIB_DIR}/libpoppler-lcd.so) ++set(POPPLER_QT5_LIB ${POPPLER_LIB_DIR}/libpoppler-qt5-lcd.so) ++set_target_properties(okularGenerator_poppler PROPERTIES INSTALL_RPATH ${POPPLER_LIB_RPATH}) ++target_link_libraries(okularGenerator_poppler okularcore KF5::I18n KF5::Completion ${POPPLER_QT5_LIB} ${POPPLER_LIB} Qt5::Xml) + + ########### install files ############### + install( FILES okularPoppler.desktop DESTINATION ${KDE_INSTALL_KSERVICES5DIR} ) 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..c82281872681 --- /dev/null +++ b/02-subpixel-rendering-for-poppler-and-glib.patch @@ -0,0 +1,309 @@ +From: Jeffrey Feng <galago1992@gmail.com> +Subject: [PATCH 2/3] subpixel rendering for poppler and poppler-glib +--- +diff -rup a/ b/|diffstat + CMakeLists.txt | 1 + glib/CMakeLists.txt | 1 + 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 ++ + 11 files changed, 131 insertions(+), 6 deletions(-) + +diff -rup a/CMakeLists.txt b/CMakeLists.txt +--- a/CMakeLists.txt 2016-04-29 06:13:57.000000000 +0800 ++++ b/CMakeLists.txt 2018-05-22 23:05:18.907662448 +0800 +@@ -501,6 +501,7 @@ add_library(poppler STATIC ${poppler_SRC + else(MSVC) + add_library(poppler SHARED ${poppler_SRCS}) + endif(MSVC) ++set_target_properties(poppler PROPERTIES OUTPUT_NAME "poppler-lcd") + set_target_properties(poppler PROPERTIES VERSION 60.0.0 SOVERSION 60) + target_link_libraries(poppler LINK_PRIVATE ${poppler_LIBS}) + install(TARGETS poppler RUNTIME DESTINATION bin LIBRARY DESTINATION lib${LIB_SUFFIX} ARCHIVE DESTINATION lib${LIB_SUFFIX}) +diff -rup a/glib/CMakeLists.txt b/glib/CMakeLists.txt +--- a/glib/CMakeLists.txt 2015-05-15 02:23:07.000000000 +0800 ++++ b/glib/CMakeLists.txt 2018-05-22 23:06:31.313659479 +0800 +@@ -81,6 +81,7 @@ set(poppler_glib_generated_SRCS + ${CMAKE_SOURCE_DIR}/poppler/CairoRescaleBox.cc + ) + add_library(poppler-glib SHARED ${poppler_glib_SRCS} ${poppler_glib_generated_SRCS}) ++set_target_properties(poppler-glib PROPERTIES OUTPUT_NAME "poppler-glib-lcd") + set_target_properties(poppler-glib PROPERTIES VERSION 8.7.0 SOVERSION 8) + target_link_libraries(poppler-glib poppler ${GLIB2_LIBRARIES} ${CAIRO_LIBRARIES} ${FREETYPE_LIBRARIES}) + if(HAVE_PTHREAD) +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..0bcfbd1a9a4b --- /dev/null +++ b/03-cairo-backend-for-poppler-qt5.patch @@ -0,0 +1,236 @@ +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 | 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}") diff --git a/PKGBUILD b/PKGBUILD new file mode 100644 index 000000000000..56b20b0345a0 --- /dev/null +++ b/PKGBUILD @@ -0,0 +1,74 @@ +# Maintainer: Jeffrey Feng <galago1992@gmail.com> + +pkgname=okular-lcd-standalone +_pkgname=okular +pkgver=18.04.1 +pkgrel=1 +pkgdesc='KDE Document viewer (PDF, Postscript, djvu, etc.) with built-in LCD subpixel rendering support' +arch=(x86_64) +url="https://kde.org/applications/graphics/okular/" +license=(GPL LGPL FDL) +groups=(kde-applications kdegraphics) +depends=(djvulibre libspectre libkexiv2 qca-qt5 kpty kactivities threadweaver kjs kparts purpose) +makedepends=(extra-cmake-modules ebook-tools kdegraphics-mobipocket kdoctools khtml chmlib discount git qt4 + qt5-base icu gtk2 python2 libjpeg gcc-libs cairo fontconfig openjpeg pkgconfig lcms2 gobject-introspection) +optdepends=('ebook-tools: mobi and epub support' 'discount: markdown support' + 'kdegraphics-mobipocket: mobi support' 'kirigami2: mobile UI' 'libzip: CHM support' + 'khtml: CHM support' 'chmlib: CHM support' 'calligra: ODT and ODP support') +conflicts=(kdegraphics-okular okular okular-git) +replaces=(kdegraphics-okular okular okular-git) +_commit=ee57925c5779a572b8d5cc52ab59a380bd4b4e03 +source=("git+https://github.com/KDE/okular#commit=$_commit" + "http://poppler.freedesktop.org/poppler-0.43.0.tar.xz" + 01-okular-subpixel-rendering-by-poppler.patch + 02-subpixel-rendering-for-poppler-and-glib.patch + 03-cairo-backend-for-poppler-qt5.patch) +sha256sums=('SKIP' + 'SKIP' + '4d44bfc0f34a3e26f2d1cc6f5a99cf4199c7a13ae5e1ed57c4b875703328d525' + '73c0fb71877633cefc37b13bcd7896263dc63b91fe13fa97c2c240292a2bc338' + 'c554b9411764ffcad7a91e22f78a594ca9851e631c70ec15a2b0d52bada0573c') +pkgver() { + cd $_pkgname + git describe --tags | sed 's/v//g' +} + +build() { + # patch okular + cd $srcdir/$_pkgname + patch -Np1<../01-okular-subpixel-rendering-by-poppler.patch + #patch poppler + cd $srcdir/poppler-0.43.0 + patch -Np1<../02-subpixel-rendering-for-poppler-and-glib.patch + patch -Np1<../03-cairo-backend-for-poppler-qt5.patch + + # build poppler (poppler > 0.43 fails to work with LCD subpixel rendering patch) + cd $srcdir + mkdir -p pbuild&&cd $_ + cmake ../poppler-0.43.0 \ + -DCMAKE_INSTALL_PREFIX=$srcdir/usr/local \ + -DENABLE_XPDF_HEADERS=ON \ + -DENABLE_LIBOPENJPEG=FALSE \ + -DBUILD_GTK_TESTS=OFF -DBUILD_QT4_TESTS=OFF \ + -DBUILD_QT5_TESTS=OFF -DBUILD_CPP_TESTS=OFF + make install + + # build okular + cd $srcdir + mkdir -p build&&cd $_ + cmake ../$_pkgname \ + -DCMAKE_INSTALL_PREFIX=/usr \ + -DCMAKE_INSTALL_LIBDIR=lib \ + -DBUILD_TESTING=OFF \ + -DPOPPLER_LIB_DIR=$srcdir/usr/local/lib \ + -DPOPPLER_LIB_RPATH=/usr/lib/qt/plugins/okular/poppler-lcd + make +} + +package() { + cd build + make DESTDIR="$pkgdir" install + libdir=$pkgdir/usr/lib/qt/plugins/okular/poppler-lcd + mkdir -p $libdir + cp "$srcdir/usr/local/lib/libpoppler-"{qt5-,}"lcd.so" $libdir +} |