[poppler] glib/tests poppler/Annot.cc poppler/Annot.h
GitLab Mirror
gitlab-mirror at kemper.freedesktop.org
Sun Nov 22 17:32:14 UTC 2020
glib/tests/CMakeLists.txt | 2 +-
poppler/Annot.cc | 28 +++++++++++++++++++++++++++-
poppler/Annot.h | 3 +++
3 files changed, 31 insertions(+), 2 deletions(-)
New commits:
commit aaf2e8083141fcea5dacbc6af6a679533ad8dc55
Author: Albert Astals Cid <aacid at kde.org>
Date: Sun Nov 22 18:01:10 2020 +0100
Tweak the don't use Appearance stream if annot is typeHighlight
After playing hand editing files and opening them in Adobe Reader i
*think* the condition is "if the appearance stream has a ExtGState in
its Resources dict, then use the appearance stream, otherwise draw it
ourselves
diff --git a/glib/tests/CMakeLists.txt b/glib/tests/CMakeLists.txt
index 32eefd01..5f49511c 100644
--- a/glib/tests/CMakeLists.txt
+++ b/glib/tests/CMakeLists.txt
@@ -47,7 +47,7 @@ poppler_add_testcase(poppler-check-bb checkbox_issue_159.pdf 2.84 14.17 553.18 8
poppler_add_testcase(poppler-check-bb NestedLayers.pdf 0 191 612 792)
poppler_add_testcase(poppler-check-bb A6EmbeddedFiles.pdf 18 18 558.36 751.92)
poppler_add_testcase(poppler-check-bb latex-hyperref-checkbox-issue-655.pdf 148.71 123.81 308.11 704.57)
-poppler_add_testcase(poppler-check-bb utf16le-annot.pdf 52.98 55.61 101.23 95.29)
+poppler_add_testcase(poppler-check-bb utf16le-annot.pdf 55.47 54.78 98.74 96.12)
poppler_add_testcase(poppler-check-bb type3.pdf -p 10 125.80 130 509.30 695 125.80 132 538.03 693)
add_executable(pdfdrawbb pdfdrawbb.c)
diff --git a/poppler/Annot.cc b/poppler/Annot.cc
index 52fe0ac7..0ba629c4 100644
--- a/poppler/Annot.cc
+++ b/poppler/Annot.cc
@@ -3557,6 +3557,32 @@ void AnnotTextMarkup::setQuadrilaterals(AnnotQuadrilaterals *quadPoints)
invalidateAppearance();
}
+bool AnnotTextMarkup::shouldCreateApperance(Gfx *gfx) const
+{
+ if (appearance.isNull())
+ return true;
+
+ // Adobe Reader seems to have a complex condition for when to use the
+ // appearance stream of typeHighlight, which is "use it if it has a Resources dictionary with ExtGState"
+ // this is reverse engineering of me editing a file by hand and checking what it does so the real
+ // condition may be more or less complex
+ if (type == typeHighlight) {
+ XRef *xref = gfx->getXRef();
+ const Object fetchedApperance = appearance.fetch(xref);
+ if (fetchedApperance.isStream()) {
+ const Object resources = fetchedApperance.streamGetDict()->lookup("Resources");
+ if (resources.isDict()) {
+ if (resources.dictLookup("ExtGState").isDict()) {
+ return false;
+ }
+ }
+ }
+ return true;
+ }
+
+ return false;
+}
+
void AnnotTextMarkup::draw(Gfx *gfx, bool printing)
{
double ca = 1;
@@ -3566,7 +3592,7 @@ void AnnotTextMarkup::draw(Gfx *gfx, bool printing)
return;
annotLocker();
- if (appearance.isNull() || type == typeHighlight) {
+ if (shouldCreateApperance(gfx)) {
bool blendMultiply = true;
ca = opacity;
diff --git a/poppler/Annot.h b/poppler/Annot.h
index fe96916c..66f293b8 100644
--- a/poppler/Annot.h
+++ b/poppler/Annot.h
@@ -1167,6 +1167,9 @@ protected:
void initialize(PDFDoc *docA, Dict *dict);
std::unique_ptr<AnnotQuadrilaterals> quadrilaterals; // QuadPoints
+
+private:
+ bool shouldCreateApperance(Gfx *gfx) const;
};
//------------------------------------------------------------------------
More information about the poppler
mailing list