summarylogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--.SRCINFO51
-rw-r--r--PKGBUILD70
-rw-r--r--subpixel.patch227
3 files changed, 348 insertions, 0 deletions
diff --git a/.SRCINFO b/.SRCINFO
new file mode 100644
index 000000000000..9e34b25daa57
--- /dev/null
+++ b/.SRCINFO
@@ -0,0 +1,51 @@
+# Generated by mksrcinfo v8
+# Mon Jan 4 10:13:45 UTC 2016
+pkgbase = poppler-lcdfilter
+ pkgver = 0.39.0
+ pkgrel = 1
+ url = http://poppler.freedesktop.org/
+ arch = i686
+ arch = x86_64
+ license = GPL
+ makedepends = libjpeg
+ makedepends = gcc-libs
+ makedepends = cairo
+ makedepends = fontconfig
+ makedepends = openjpeg
+ makedepends = gtk2
+ makedepends = qt4
+ makedepends = pkgconfig
+ makedepends = lcms2
+ makedepends = gobject-introspection
+ makedepends = icu
+ makedepends = qt5-base
+ makedepends = git
+ makedepends = python2
+ options = !emptydirs
+ source = http://poppler.freedesktop.org/poppler-0.39.0.tar.xz
+ source = git://anongit.freedesktop.org/poppler/test
+ source = subpixel.patch
+ md5sums = 5100960c61b932430b5d74068d71f530
+ md5sums = SKIP
+ md5sums = 643f0ea557725dba8119897d493e36b2
+
+pkgname = poppler-lcdfilter
+ pkgdesc = PDF rendering library based on xpdf 3.0
+ depends = libjpeg
+ depends = gcc-libs
+ depends = cairo
+ depends = fontconfig
+ depends = openjpeg
+ depends = lcms2
+ optdepends = poppler-data: encoding data to display PDF documents containing CJK characters
+ provides = poppler=0.39.0
+ conflicts = poppler-qt3<0.39.0
+ conflicts = poppler
+
+pkgname = poppler-glib-lcdfilter
+ pkgdesc = Poppler glib bindings
+ depends = poppler-lcdfilter=0.39.0
+ depends = glib2
+ provides = poppler-glib=0.39.0
+ conflicts = poppler-glib
+
diff --git a/PKGBUILD b/PKGBUILD
new file mode 100644
index 000000000000..92eb95763047
--- /dev/null
+++ b/PKGBUILD
@@ -0,0 +1,70 @@
+# $Id$
+# Maintainer: Jan de Groot <jgc@archlinux.org>
+
+_pkgbase=poppler
+pkgbase=poppler-lcdfilter
+pkgname=('poppler-lcdfilter' 'poppler-glib-lcdfilter')
+pkgver=0.39.0
+pkgrel=1
+arch=(i686 x86_64)
+license=('GPL')
+makedepends=('libjpeg' 'gcc-libs' 'cairo' 'fontconfig' 'openjpeg' 'gtk2' 'qt4' 'pkgconfig' 'lcms2' 'gobject-introspection' 'icu' 'qt5-base' 'git' 'python2')
+options=('!emptydirs')
+url="http://poppler.freedesktop.org/"
+source=(http://poppler.freedesktop.org/${_pkgbase}-${pkgver}.tar.xz
+ git://anongit.freedesktop.org/poppler/test
+ subpixel.patch)
+md5sums=('5100960c61b932430b5d74068d71f530'
+ 'SKIP'
+ '643f0ea557725dba8119897d493e36b2')
+
+build() {
+ cd ${_pkgbase}-${pkgver}
+ patch -Np1 -i ../subpixel.patch
+ ./configure --prefix=/usr --sysconfdir=/etc \
+ --localstatedir=/var --disable-static \
+ --enable-cairo-output \
+ --enable-xpdf-headers \
+ --enable-libjpeg --enable-zlib \
+ --enable-poppler-qt4 \
+ --enable-poppler-qt5 \
+ --enable-poppler-glib
+
+ make
+}
+
+check() {
+ cd "${srcdir}/${_pkgbase}-${pkgver}"
+ LANG=en_US.UTF8 make check
+}
+
+package_poppler-lcdfilter() {
+ pkgdesc="PDF rendering library based on xpdf 3.0"
+ depends=('libjpeg' 'gcc-libs' 'cairo' 'fontconfig' 'openjpeg' 'lcms2')
+ optdepends=('poppler-data: encoding data to display PDF documents containing CJK characters')
+ conflicts=("poppler-qt3<${pkgver}" "poppler")
+ provides=("poppler=$pkgver")
+
+ cd "${srcdir}/${_pkgbase}-${pkgver}"
+ sed -e 's/^glib_subdir =.*/glib_subdir =/' \
+ -e 's/^qt4_subdir =.*/qt4_subdir =/' \
+ -e 's/^qt5_subdir =.*/qt5_subdir =/' -i Makefile
+ make DESTDIR="${pkgdir}" install
+
+ rm -f "${pkgdir}"/usr/lib/pkgconfig/poppler-{glib,qt4,qt5}.pc
+}
+
+package_poppler-glib-lcdfilter() {
+ pkgdesc="Poppler glib bindings"
+ depends=("poppler-lcdfilter=${pkgver}" 'glib2')
+ conflicts=("poppler-glib")
+ provides=("poppler-glib=$pkgver")
+
+ cd "${_pkgbase}-${pkgver}"
+ make -C poppler DESTDIR="${pkgdir}" install-libLTLIBRARIES
+ make -C glib DESTDIR="${pkgdir}" install
+ install -m755 -d "${pkgdir}/usr/lib/pkgconfig"
+ install -m644 poppler-glib.pc "${pkgdir}/usr/lib/pkgconfig/"
+ rm -f "${pkgdir}"/usr/lib/libpoppler.*
+ rm -f "${pkgdir}/usr/bin/poppler-glib-demo"
+}
diff --git a/subpixel.patch b/subpixel.patch
new file mode 100644
index 000000000000..9a4627e451b6
--- /dev/null
+++ b/subpixel.patch
@@ -0,0 +1,227 @@
+diff --git a/glib/demo/render.c b/glib/demo/render.c
+index 78d24bb..b05d8bf 100644
+--- a/glib/demo/render.c
++++ b/glib/demo/render.c
+@@ -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,22 @@ pgd_render_start (GtkButton *button,
+ width, height);
+ cr = cairo_create (demo->surface);
+
++ fo = cairo_font_options_create ();
++ cairo_get_font_options (cr, fo);
++ cairo_font_options_set_hint_style (fo, CAIRO_HINT_STYLE_SLIGHT);
++
++ subpixel_rendering = poppler_page_support_subpixel_rendering (page);
++ 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 +161,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 --git a/glib/poppler-page.cc b/glib/poppler-page.cc
+index 3d63bfd..3dc5585 100644
+--- a/glib/poppler-page.cc
++++ b/glib/poppler-page.cc
+@@ -2424,3 +2424,13 @@ poppler_page_get_text_attributes_for_area (PopplerPage *page,
+
+ 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 --git a/glib/poppler-page.h b/glib/poppler-page.h
+index fdbfd38..0f02a3a 100644
+--- a/glib/poppler-page.h
++++ b/glib/poppler-page.h
+@@ -109,6 +109,7 @@ GList *poppler_page_get_text_attributes (PopplerPage *pa
+ 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 --git a/poppler/CairoFontEngine.cc b/poppler/CairoFontEngine.cc
+index 1d611b5..f4ffb08 100644
+--- a/poppler/CairoFontEngine.cc
++++ b/poppler/CairoFontEngine.cc
+@@ -189,7 +189,6 @@ _ft_new_face_uncached (FT_Library lib,
+ }
+
+ font_face = cairo_ft_font_face_create_for_ft_face (face,
+- FT_LOAD_NO_HINTING |
+ FT_LOAD_NO_BITMAP);
+ if (cairo_font_face_set_user_data (font_face,
+ &_ft_cairo_key,
+@@ -358,7 +357,6 @@ _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_NO_BITMAP);
+ if (cairo_font_face_set_user_data (l->font_face,
+ &_ft_cairo_key,
+diff --git a/poppler/Gfx.cc b/poppler/Gfx.cc
+index 577c482..be2f11a 100644
+--- a/poppler/Gfx.cc
++++ b/poppler/Gfx.cc
+@@ -4684,6 +4684,62 @@ void Gfx::doImage(Object *ref, Stream *str, GBool inlineImg) {
+ 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 --git a/poppler/Gfx.h b/poppler/Gfx.h
+index a82f9f4..6a7e2c7 100644
+--- a/poppler/Gfx.h
++++ b/poppler/Gfx.h
+@@ -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 --git a/poppler/Page.cc b/poppler/Page.cc
+index a4af340..bcb51e0 100644
+--- a/poppler/Page.cc
++++ b/poppler/Page.cc
+@@ -370,6 +370,20 @@ Dict *Page::getResourceDictCopy(XRef *xrefA) {
+ 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 --git a/poppler/Page.h b/poppler/Page.h
+index 2aaabae..a49d34f 100644
+--- a/poppler/Page.h
++++ b/poppler/Page.h
+@@ -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