diff --git a/poppler/Annot.cc b/poppler/Annot.cc index 0b3c5e4..48af4eb 100644 --- a/poppler/Annot.cc +++ b/poppler/Annot.cc @@ -67,6 +67,14 @@ #include "Link.h" #include +#if MULTITHREADED +# define lockAnnot gLockMutex(&mutex) +# define unlockAnnot gUnlockMutex(&mutex) +#else +# define lockAnnot +# define unlockAnnot +#endif + #define fieldFlagReadOnly 0x00000001 #define fieldFlagRequired 0x00000002 #define fieldFlagNoExport 0x00000004 @@ -1293,6 +1301,10 @@ void Annot::initialize(PDFDoc *docA, Dict *dict) { obj1.free(); dict->lookupNF("OC", &oc); + +#if MULTITHREADED + gInitMutex(&mutex); +#endif } void Annot::getRect(double *x1, double *y1, double *x2, double *y2) const { @@ -1338,7 +1350,8 @@ GBool Annot::inRect(double x, double y) const { return rect->contains(x, y); } -void Annot::update(const char *key, Object *value) { +void Annot::update(const char *key, Object *value, GBool lock) { + if (lock) lockAnnot; /* Set M to current time, unless we are updating M itself */ if (strcmp(key, "M") != 0) { delete modified; @@ -1352,9 +1365,11 @@ void Annot::update(const char *key, Object *value) { annotObj.dictSet(const_cast(key), value); xref->setModifiedObject(&annotObj, ref); + if (lock) unlockAnnot; } void Annot::setContents(GooString *new_content) { + lockAnnot; delete contents; if (new_content) { @@ -1370,10 +1385,12 @@ void Annot::setContents(GooString *new_content) { Object obj1; obj1.initString(contents->copy()); - update ("Contents", &obj1); + update ("Contents", &obj1, gFalse); + unlockAnnot; } void Annot::setName(GooString *new_name) { + lockAnnot; delete name; if (new_name) { @@ -1384,10 +1401,12 @@ void Annot::setName(GooString *new_name) { Object obj1; obj1.initString(name->copy()); - update ("NM", &obj1); + update ("NM", &obj1, gFalse); + unlockAnnot; } void Annot::setModified(GooString *new_modified) { + lockAnnot; delete modified; if (new_modified) @@ -1397,43 +1416,51 @@ void Annot::setModified(GooString *new_modified) { Object obj1; obj1.initString(modified->copy()); - update ("M", &obj1); + update ("M", &obj1, gFalse); + unlockAnnot; } void Annot::setFlags(Guint new_flags) { + lockAnnot; Object obj1; flags = new_flags; obj1.initInt(flags); - update ("F", &obj1); + update ("F", &obj1, gFalse); + unlockAnnot; } void Annot::setBorder(AnnotBorderArray *new_border) { + lockAnnot; delete border; if (new_border) { Object obj1; new_border->writeToObject(xref, &obj1); - update ("Border", &obj1); + update ("Border", &obj1, gFalse); border = new_border; } else { border = NULL; } + unlockAnnot; } void Annot::setColor(AnnotColor *new_color) { + lockAnnot; delete color; if (new_color) { Object obj1; new_color->writeToObject(xref, &obj1); - update ("C", &obj1); + update ("C", &obj1, gFalse); color = new_color; } else { color = NULL; } + unlockAnnot; } void Annot::setPage(int pageIndex, GBool updateP) { + lockAnnot; Page *pageobj = doc->getPage(pageIndex); Object obj1; @@ -1447,14 +1474,16 @@ void Annot::setPage(int pageIndex, GBool updateP) { } if (updateP) { - update("P", &obj1); + update("P", &obj1, gFalse); } + unlockAnnot; } -void Annot::setAppearanceState(const char *state) { +void Annot::setAppearanceState(const char *state, GBool lock) { if (!state) return; + if (lock) lockAnnot; delete appearState; appearState = new GooString(state); @@ -1463,7 +1492,7 @@ void Annot::setAppearanceState(const char *state) { Object obj1; obj1.initName(state); - update ("AS", &obj1); + update ("AS", &obj1, gFalse); // The appearance state determines the current appearance stream appearance.free(); @@ -1472,21 +1501,24 @@ void Annot::setAppearanceState(const char *state) { } else { appearance.initNull(); } + if (lock) unlockAnnot; } void Annot::invalidateAppearance() { + lockAnnot; if (appearStreams) { // Remove existing appearance streams appearStreams->removeAllStreams(); } delete appearStreams; appearStreams = NULL; - setAppearanceState("Off"); // Default appearance state + setAppearanceState("Off", gFalse); // Default appearance state Object obj1; obj1.initNull(); - update ("AP", &obj1); // Remove AP - update ("AS", &obj1); // Remove AS + update ("AP", &obj1, gFalse); // Remove AP + update ("AS", &obj1, gFalse); // Remove AS + unlockAnnot; } double Annot::getXMin() { @@ -1516,12 +1548,19 @@ void Annot::removeReferencedObjects() { } void Annot::incRefCnt() { + lockAnnot; refCnt++; + unlockAnnot; } void Annot::decRefCnt() { - if (--refCnt == 0) + lockAnnot; + if (--refCnt == 0) { + unlockAnnot; delete this; + return; + } + unlockAnnot; } Annot::~Annot() { @@ -1552,6 +1591,10 @@ Annot::~Annot() { delete color; oc.free(); + +#if MULTITHREADED + gDestroyMutex(&mutex); +#endif } void Annot::setColor(AnnotColor *color, GBool fill) { @@ -1744,6 +1787,7 @@ GBool Annot::isVisible(GBool printing) { void Annot::draw(Gfx *gfx, GBool printing) { Object obj; + lockAnnot; if (!isVisible (printing)) return; @@ -1752,6 +1796,7 @@ void Annot::draw(Gfx *gfx, GBool printing) { gfx->drawAnnot(&obj, (AnnotBorder *)NULL, color, rect->x1, rect->y1, rect->x2, rect->y2); obj.free(); + unlockAnnot; } //------------------------------------------------------------------------ @@ -2361,6 +2406,7 @@ void AnnotText::draw(Gfx *gfx, GBool printing) { if (!isVisible (printing)) return; + lockAnnot; if (appearance.isNull()) { ca = opacity; @@ -2422,6 +2468,7 @@ void AnnotText::draw(Gfx *gfx, GBool printing) { rect->x1, rect->y1, rect->x2, rect->y2); } obj.free(); + unlockAnnot; } //------------------------------------------------------------------------ @@ -2510,11 +2557,13 @@ void AnnotLink::draw(Gfx *gfx, GBool printing) { if (!isVisible (printing)) return; + lockAnnot; // draw the appearance stream appearance.fetch(gfx->getXRef(), &obj); gfx->drawAnnot(&obj, border, color, rect->x1, rect->y1, rect->x2, rect->y2); obj.free(); + unlockAnnot; } //------------------------------------------------------------------------ @@ -2939,6 +2988,7 @@ void AnnotFreeText::draw(Gfx *gfx, GBool printing) { if (!isVisible (printing)) return; + lockAnnot; if (appearance.isNull()) { generateFreeTextAppearance(); } @@ -2948,6 +2998,7 @@ void AnnotFreeText::draw(Gfx *gfx, GBool printing) { gfx->drawAnnot(&obj, (AnnotBorder *)NULL, color, rect->x1, rect->y1, rect->x2, rect->y2); obj.free(); + unlockAnnot; } // Before retrieving the res dict, regenerate the appearance stream if needed, @@ -3411,6 +3462,7 @@ void AnnotLine::draw(Gfx *gfx, GBool printing) { if (!isVisible (printing)) return; + lockAnnot; if (appearance.isNull()) { generateLineAppearance(); } @@ -3426,6 +3478,7 @@ void AnnotLine::draw(Gfx *gfx, GBool printing) { rect->x1, rect->y1, rect->x2, rect->y2); } obj.free(); + unlockAnnot; } // Before retrieving the res dict, regenerate the appearance stream if needed, @@ -3576,6 +3629,7 @@ void AnnotTextMarkup::draw(Gfx *gfx, GBool printing) { if (!isVisible (printing)) return; + lockAnnot; if (appearance.isNull() || type == typeHighlight) { GBool blendMultiply = gTrue; ca = opacity; @@ -3734,6 +3788,7 @@ void AnnotTextMarkup::draw(Gfx *gfx, GBool printing) { rect->x1, rect->y1, rect->x2, rect->y2); } obj.free(); + unlockAnnot; } //------------------------------------------------------------------------ @@ -4956,6 +5011,7 @@ void AnnotWidget::draw(Gfx *gfx, GBool printing) { if (!isVisible (printing)) return; + lockAnnot; addDingbatsResource = gFalse; // Only construct the appearance stream when @@ -4999,6 +5055,7 @@ void AnnotWidget::draw(Gfx *gfx, GBool printing) { gfx->popResources(); } obj.free(); + unlockAnnot; } @@ -5068,6 +5125,7 @@ void AnnotMovie::draw(Gfx *gfx, GBool printing) { if (!isVisible (printing)) return; + lockAnnot; if (appearance.isNull() && movie->getShowPoster()) { int width, height; Object poster; @@ -5151,6 +5209,7 @@ void AnnotMovie::draw(Gfx *gfx, GBool printing) { gfx->drawAnnot(&obj, (AnnotBorder *)NULL, color, rect->x1, rect->y1, rect->x2, rect->y2); obj.free(); + unlockAnnot; } //------------------------------------------------------------------------ @@ -5376,6 +5435,7 @@ void AnnotGeometry::draw(Gfx *gfx, GBool printing) { if (!isVisible (printing)) return; + lockAnnot; if (appearance.isNull()) { ca = opacity; @@ -5493,6 +5553,7 @@ void AnnotGeometry::draw(Gfx *gfx, GBool printing) { gfx->drawAnnot(&obj, (AnnotBorder *)NULL, color, rect->x1, rect->y1, rect->x2, rect->y2); obj.free(); + unlockAnnot; } //------------------------------------------------------------------------ @@ -5697,6 +5758,7 @@ void AnnotPolygon::draw(Gfx *gfx, GBool printing) { if (!isVisible (printing)) return; + lockAnnot; if (appearance.isNull()) { appearBBox = new AnnotAppearanceBBox(rect); ca = opacity; @@ -5783,6 +5845,7 @@ void AnnotPolygon::draw(Gfx *gfx, GBool printing) { rect->x1, rect->y1, rect->x2, rect->y2); } obj.free(); + unlockAnnot; } //------------------------------------------------------------------------ @@ -5934,6 +5997,7 @@ void AnnotInk::draw(Gfx *gfx, GBool printing) { if (!isVisible (printing)) return; + lockAnnot; if (appearance.isNull()) { appearBBox = new AnnotAppearanceBBox(rect); ca = opacity; @@ -5995,6 +6059,7 @@ void AnnotInk::draw(Gfx *gfx, GBool printing) { rect->x1, rect->y1, rect->x2, rect->y2); } obj.free(); + unlockAnnot; } //------------------------------------------------------------------------ @@ -6166,6 +6231,7 @@ void AnnotFileAttachment::draw(Gfx *gfx, GBool printing) { if (!isVisible (printing)) return; + lockAnnot; if (appearance.isNull()) { ca = opacity; @@ -6210,6 +6276,7 @@ void AnnotFileAttachment::draw(Gfx *gfx, GBool printing) { gfx->drawAnnot(&obj, border, color, rect->x1, rect->y1, rect->x2, rect->y2); obj.free(); + unlockAnnot; } //------------------------------------------------------------------------ @@ -6332,6 +6399,7 @@ void AnnotSound::draw(Gfx *gfx, GBool printing) { if (!isVisible (printing)) return; + lockAnnot; if (appearance.isNull()) { ca = opacity; @@ -6371,6 +6439,7 @@ void AnnotSound::draw(Gfx *gfx, GBool printing) { gfx->drawAnnot(&obj, border, color, rect->x1, rect->y1, rect->x2, rect->y2); obj.free(); + unlockAnnot; } //------------------------------------------------------------------------ diff --git a/poppler/Annot.h b/poppler/Annot.h index 68ddeb7..6a02d13 100644 --- a/poppler/Annot.h +++ b/poppler/Annot.h @@ -571,7 +571,7 @@ public: // new_color. void setColor(AnnotColor *new_color); - void setAppearanceState(const char *state); + void setAppearanceState(const char *state, GBool lock = gTrue); // Delete appearance streams and reset appearance state void invalidateAppearance(); @@ -626,7 +626,7 @@ protected: // Updates the field key of the annotation dictionary // and sets M to the current time - void update(const char *key, Object *value); + void update(const char *key, Object *value, GBool lock = gTrue); int refCnt; @@ -660,6 +660,9 @@ protected: GBool ok; bool hasRef; +#if MULTITHREADED + GooMutex mutex; +#endif }; //------------------------------------------------------------------------ diff --git a/poppler/FontInfo.cc b/poppler/FontInfo.cc index 35d5f5f..461e2d8 100644 --- a/poppler/FontInfo.cc +++ b/poppler/FontInfo.cc @@ -68,17 +68,19 @@ GooList *FontInfoScanner::scan(int nPages) { lastPage = doc->getNumPages() + 1; } + XRef *xrefA = doc->getXRef()->copy(); for (int pg = currentPage; pg < lastPage; ++pg) { page = doc->getPage(pg); if (!page) continue; - if ((resDict = page->getResourceDict())) { - scanFonts(resDict, result); + if ((resDict = page->getResourceDict(xrefA))) { + scanFonts(xrefA, resDict, result); + delete resDict; } annots = page->getAnnots(); for (int i = 0; i < annots->getNumAnnots(); ++i) { if (annots->getAnnot(i)->getAppearanceResDict(&obj1)->isDict()) { - scanFonts(obj1.getDict(), result); + scanFonts(xrefA, obj1.getDict(), result); } obj1.free(); } @@ -86,10 +88,11 @@ GooList *FontInfoScanner::scan(int nPages) { currentPage = lastPage; + delete xrefA; return result; } -void FontInfoScanner::scanFonts(Dict *resDict, GooList *fontsList) { +void FontInfoScanner::scanFonts(XRef *xrefA, Dict *resDict, GooList *fontsList) { Object obj1, obj2, objDict, resObj; Ref r; GfxFontDict *gfxFontDict; @@ -100,14 +103,14 @@ void FontInfoScanner::scanFonts(Dict *resDict, GooList *fontsList) { gfxFontDict = NULL; resDict->lookupNF("Font", &obj1); if (obj1.isRef()) { - obj1.fetch(doc->getXRef(), &obj2); + obj1.fetch(xrefA, &obj2); if (obj2.isDict()) { r = obj1.getRef(); - gfxFontDict = new GfxFontDict(doc->getXRef(), &r, obj2.getDict()); + gfxFontDict = new GfxFontDict(xrefA, &r, obj2.getDict()); } obj2.free(); } else if (obj1.isDict()) { - gfxFontDict = new GfxFontDict(doc->getXRef(), NULL, obj1.getDict()); + gfxFontDict = new GfxFontDict(xrefA, NULL, obj1.getDict()); } if (gfxFontDict) { for (i = 0; i < gfxFontDict->getNumFonts(); ++i) { @@ -116,7 +119,7 @@ void FontInfoScanner::scanFonts(Dict *resDict, GooList *fontsList) { // add this font to the list if not already found if (fonts.find(fontRef.num) == fonts.end()) { - fontsList->append(new FontInfo(font, doc)); + fontsList->append(new FontInfo(font, xrefA)); fonts.insert(fontRef.num); } } @@ -144,12 +147,12 @@ void FontInfoScanner::scanFonts(Dict *resDict, GooList *fontsList) { visitedObjects.insert(r.num); } - obj1.fetch(doc->getXRef(), &obj2); + obj1.fetch(xrefA, &obj2); if (obj2.isStream()) { obj2.streamGetDict()->lookup("Resources", &resObj); if (resObj.isDict() && resObj.getDict() != resDict) { - scanFonts(resObj.getDict(), fontsList); + scanFonts(xrefA, resObj.getDict(), fontsList); } resObj.free(); } @@ -161,7 +164,7 @@ void FontInfoScanner::scanFonts(Dict *resDict, GooList *fontsList) { } } -FontInfo::FontInfo(GfxFont *font, PDFDoc *doc) { +FontInfo::FontInfo(GfxFont *font, XRef *xref) { GooString *origName; Object fontObj, toUnicodeObj; int i; @@ -201,7 +204,7 @@ FontInfo::FontInfo(GfxFont *font, PDFDoc *doc) { // look for a ToUnicode map hasToUnicode = gFalse; - if (doc->getXRef()->fetch(fontRef.num, fontRef.gen, &fontObj)->isDict()) { + if (xref->fetch(fontRef.num, fontRef.gen, &fontObj)->isDict()) { hasToUnicode = fontObj.dictLookup("ToUnicode", &toUnicodeObj)->isStream(); toUnicodeObj.free(); } diff --git a/poppler/FontInfo.h b/poppler/FontInfo.h index db90440..96e141b 100644 --- a/poppler/FontInfo.h +++ b/poppler/FontInfo.h @@ -49,7 +49,7 @@ public: }; // Constructor. - FontInfo(GfxFont *fontA, PDFDoc *doc); + FontInfo(GfxFont *fontA, XRef *xrefA); // Copy constructor FontInfo(FontInfo& f); // Destructor. @@ -96,7 +96,7 @@ private: std::set fonts; std::set visitedObjects; - void scanFonts(Dict *resDict, GooList *fontsList); + void scanFonts(XRef *xrefA, Dict *resDict, GooList *fontsList); }; #endif diff --git a/poppler/Page.cc b/poppler/Page.cc index fa6d2a9..96040d8 100644 --- a/poppler/Page.cc +++ b/poppler/Page.cc @@ -359,6 +359,13 @@ Page::~Page() { #endif } +Dict *Page::getResourceDict(XRef *xrefA) { + lockPage; + Dict *dict = (xrefA == NULL) ? attrs->getResourceDict() : attrs->getResourceDict()->copy(xrefA); + unlockPage; + return dict; +} + void Page::replaceXRef(XRef *xrefA) { Object obj1; Dict *pageDict = pageObj.getDict()->copy(xrefA); @@ -386,10 +393,10 @@ void Page::replaceXRef(XRef *xrefA) { delete pageDict; } -Annots *Page::getAnnots() { +Annots *Page::getAnnots(XRef *xrefA) { if (!annots) { Object obj; - annots = new Annots(doc, num, getAnnots(&obj)); + annots = new Annots(doc, num, getAnnots(&obj, (xrefA == NULL) ? xref : xrefA)); obj.free(); } diff --git a/poppler/Page.h b/poppler/Page.h index 100731d..464b030 100644 --- a/poppler/Page.h +++ b/poppler/Page.h @@ -174,10 +174,10 @@ public: Ref getRef() { return pageRef; } // Get resource dictionary. - Dict *getResourceDict() { return attrs->getResourceDict(); } + Dict *getResourceDict(XRef *xrefA = NULL); // Get annotations array. - Object *getAnnots(Object *obj) { return annotsObj.fetch(xref, obj); } + Object *getAnnots(Object *obj, XRef *xrefA = NULL) { return annotsObj.fetch((xrefA == NULL) ? xref : xrefA, obj); } // Add a new annotation to the page void addAnnot(Annot *annot); // Remove an existing annotation from the page @@ -187,7 +187,7 @@ public: Links *getLinks(); // Return a list of annots. It will be valid until the page is destroyed - Annots *getAnnots(); + Annots *getAnnots(XRef *xrefA = NULL); // Get contents. Object *getContents(Object *obj) { return contents.fetch(xref, obj); } diff --git a/poppler/SplashOutputDev.cc b/poppler/SplashOutputDev.cc index 31d6fce..c03b2f9 100644 --- a/poppler/SplashOutputDev.cc +++ b/poppler/SplashOutputDev.cc @@ -1211,7 +1211,9 @@ SplashOutputDev::SplashOutputDev(SplashColorMode colorModeA, GBool reverseVideoA, SplashColorPtr paperColorA, GBool bitmapTopDownA, - GBool allowAntialiasA, SplashThinLineMode thinLineMode) { + GBool allowAntialiasA, + SplashThinLineMode thinLineMode, + GBool overprintPreviewA) { colorMode = colorModeA; bitmapRowPad = bitmapRowPadA; bitmapTopDown = bitmapTopDownA; @@ -1220,6 +1222,7 @@ SplashOutputDev::SplashOutputDev(SplashColorMode colorModeA, vectorAntialias = allowAntialias && globalParams->getVectorAntialias() && colorMode != splashModeMono1; + overprintPreview = overprintPreviewA; enableFreeTypeHinting = gFalse; enableSlightHinting = gFalse; setupScreenParams(72.0, 72.0); @@ -1674,7 +1677,7 @@ void SplashOutputDev::setOverprintMask(GfxColorSpace *colorSpace, grayIndexed); return; } - if (overprintFlag && globalParams->getOverprintPreview()) { + if (overprintFlag && overprintPreview) { mask = colorSpace->getOverprintMask(); if (singleColor && overprintMode && colorSpace->getMode() == csDeviceCMYK) { diff --git a/poppler/SplashOutputDev.h b/poppler/SplashOutputDev.h index d9fdd29..ce1d50d 100644 --- a/poppler/SplashOutputDev.h +++ b/poppler/SplashOutputDev.h @@ -40,6 +40,7 @@ #include "poppler-config.h" #include "OutputDev.h" #include "GfxState.h" +#include "GlobalParams.h" class PDFDoc; class Gfx8BitFont; @@ -164,7 +165,8 @@ public: GBool reverseVideoA, SplashColorPtr paperColorA, GBool bitmapTopDownA = gTrue, GBool allowAntialiasA = gTrue, - SplashThinLineMode thinLineMode = splashThinLineDefault); + SplashThinLineMode thinLineMode = splashThinLineDefault, + GBool overprintPreviewA = globalParams->getOverprintPreview()); // Destructor. virtual ~SplashOutputDev(); @@ -390,6 +392,7 @@ private: GBool bitmapUpsideDown; GBool allowAntialias; GBool vectorAntialias; + GBool overprintPreview; GBool enableFreeTypeHinting; GBool enableSlightHinting; GBool reverseVideo; // reverse video mode diff --git a/poppler/XRef.cc b/poppler/XRef.cc index e2e86ad..c0d37d0 100644 --- a/poppler/XRef.cc +++ b/poppler/XRef.cc @@ -1396,8 +1396,10 @@ void XRef::removeIndirectObject(Ref r) { return; } XRefEntry *e = getEntry(r.num); - if (e->type == xrefEntryFree) + if (e->type == xrefEntryFree) { + unlockXRef; return; + } e->obj.free(); e->type = xrefEntryFree; e->gen++; diff --git a/qt4/src/poppler-page.cc b/qt4/src/poppler-page.cc index f9ac443..7c47573 100644 --- a/qt4/src/poppler-page.cc +++ b/qt4/src/poppler-page.cc @@ -229,7 +229,8 @@ TextPage *PageData::prepareTextSearch(const QString &text, Page::SearchMode case // fetch ourselves a textpage TextOutputDev td(NULL, gTrue, 0, gFalse, gFalse); - parentDoc->doc->displayPage( &td, index + 1, 72, 72, rotation, false, true, false ); + parentDoc->doc->displayPage( &td, index + 1, 72, 72, rotation, false, true, false, + NULL, NULL, NULL, NULL, gTrue); TextPage *textPage=td.takeText(); return textPage; @@ -259,9 +260,9 @@ QImage Page::renderToImage(double xres, double yres, int x, int y, int w, int h, { #if defined(HAVE_SPLASH) SplashColor bgColor; + GBool overprint = gFalse; #if defined(SPLASH_CMYK) - GBool overprint = m_page->parentDoc->m_hints & Document::OverprintPreview ? gTrue : gFalse; - globalParams->setOverprintPreview(overprint); + overprint = m_page->parentDoc->m_hints & Document::OverprintPreview ? gTrue : gFalse; if (overprint) { Guchar c, m, y, k; @@ -300,7 +301,7 @@ QImage Page::renderToImage(double xres, double yres, int x, int y, int w, int h, #else splashModeXBGR8, #endif - 4, gFalse, bgColor, gTrue, AA); + 4, gFalse, bgColor, gTrue, AA, splashThinLineDefault, overprint); splash_output->setVectorAntialias(m_page->parentDoc->m_hints & Document::Antialiasing ? gTrue : gFalse); splash_output->setFreeTypeHinting(m_page->parentDoc->m_hints & Document::TextHinting ? gTrue : gFalse, diff --git a/qt4/src/poppler-ps-converter.cc b/qt4/src/poppler-ps-converter.cc index 63fb7b4..5793119 100644 --- a/qt4/src/poppler-ps-converter.cc +++ b/qt4/src/poppler-ps-converter.cc @@ -253,7 +253,7 @@ bool PSConverter::convert() NULL, NULL, annotDisplayDecideCbk, - &showAnnotations); + &showAnnotations, gTrue); if (d->pageConvertedCallback) (*d->pageConvertedCallback)(page, d->pageConvertedPayload); }