qt5/src/ArthurOutputDev.cc | 14 ++++++++++++++ qt5/src/ArthurOutputDev.h | 9 +++++++++ 2 files changed, 23 insertions(+)
New commits: commit e0926ca8a94bafa6d5bfd694064c5e30da2b79db Author: Oliver Sander <oliver.san...@tu-dresden.de> Date: Thu Oct 5 18:32:40 2017 +0200 Properly implement saveState / restoreState Not all of the internal state was actually saved/restored in those methods, which lead to inconsistencies between the ArthurOutputDev state and the GfxState object. Bug #103118 diff --git a/qt5/src/ArthurOutputDev.cc b/qt5/src/ArthurOutputDev.cc index f199e656..3be12672 100644 --- a/qt5/src/ArthurOutputDev.cc +++ b/qt5/src/ArthurOutputDev.cc @@ -137,12 +137,26 @@ void ArthurOutputDev::endPage() { void ArthurOutputDev::saveState(GfxState *state) { + m_currentPenStack.push(m_currentPen); + m_currentBrushStack.push(m_currentBrush); + m_rawFontStack.push(m_rawFont); + m_codeToGIDStack.push(m_codeToGID); + m_painter->save(); } void ArthurOutputDev::restoreState(GfxState *state) { m_painter->restore(); + + m_codeToGID = m_codeToGIDStack.top(); + m_codeToGIDStack.pop(); + m_rawFont = m_rawFontStack.top(); + m_rawFontStack.pop(); + m_currentBrush = m_currentBrushStack.top(); + m_currentBrushStack.pop(); + m_currentPen = m_currentPenStack.top(); + m_currentPenStack.pop(); } void ArthurOutputDev::updateAll(GfxState *state) diff --git a/qt5/src/ArthurOutputDev.h b/qt5/src/ArthurOutputDev.h index 496f5a72..480c7827 100644 --- a/qt5/src/ArthurOutputDev.h +++ b/qt5/src/ArthurOutputDev.h @@ -36,6 +36,7 @@ #include <memory> #include <map> +#include <stack> #include "goo/gtypes.h" #include "OutputDev.h" @@ -172,14 +173,21 @@ public: private: QPainter *m_painter; FontHinting m_fontHinting; + QPen m_currentPen; + // The various stacks are used to implement the 'saveState' and 'restoreState' methods + std::stack<QPen> m_currentPenStack; + QBrush m_currentBrush; + std::stack<QBrush> m_currentBrushStack; + GBool m_needFontUpdate; // set when the font needs to be updated SplashFontEngine *m_fontEngine; XRef *xref; // xref table for current document // The current font in use QRawFont* m_rawFont; + std::stack<QRawFont*> m_rawFontStack; // Identify a font by its 'Ref' and its font size struct ArthurFontID @@ -199,6 +207,7 @@ private: // The table that maps character codes to glyph indexes int* m_codeToGID; + std::stack<int*> m_codeToGIDStack; }; #endif _______________________________________________ poppler mailing list poppler@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/poppler