poppler/Annot.cc | 70 +++++++++++++++++--------------------- poppler/Annot.h | 2 - poppler/BBoxOutputDev.cc | 3 - poppler/CairoFontEngine.cc | 30 +++++----------- poppler/CairoFontEngine.h | 4 +- poppler/CairoOutputDev.cc | 2 - poppler/FontInfo.cc | 5 +- poppler/Gfx.cc | 18 +++------ poppler/Gfx.h | 6 +-- poppler/GfxFont.cc | 35 ++----------------- poppler/GfxFont.h | 18 ++------- poppler/GfxState.cc | 12 +----- poppler/GfxState.h | 6 +-- poppler/MarkedContentOutputDev.cc | 13 +------ poppler/MarkedContentOutputDev.h | 16 +++----- poppler/PSOutputDev.cc | 7 +-- poppler/PreScanOutputDev.cc | 2 - poppler/SplashOutputDev.cc | 6 +-- poppler/TextOutputDev.cc | 11 +---- poppler/TextOutputDev.h | 2 - qt5/src/QPainterOutputDev.cc | 30 ++++++++-------- qt6/src/QPainterOutputDev.cc | 30 ++++++++-------- utils/HtmlFonts.cc | 8 ++-- utils/HtmlFonts.h | 2 - utils/HtmlOutputDev.cc | 9 ++-- 25 files changed, 133 insertions(+), 214 deletions(-)
New commits: commit 6388c277453f59336bfe5af45f0a5dbb161947bc Author: Oliver Sander <oliver.san...@tu-dresden.de> Date: Fri Jan 7 09:46:47 2022 +0100 Replace hand-coded reference counting in GfxFont by std::shared_ptr diff --git a/poppler/Annot.cc b/poppler/Annot.cc index ccc07af3..3102c7cd 100644 --- a/poppler/Annot.cc +++ b/poppler/Annot.cc @@ -2970,7 +2970,7 @@ std::unique_ptr<DefaultAppearance> AnnotFreeText::getDefaultAppearance() const return std::make_unique<DefaultAppearance>(appearanceString.get()); } -static GfxFont *createAnnotDrawFont(XRef *xref, Dict *fontParentDict, const char *resourceName = "AnnotDrawFont", const char *fontname = "Helvetica") +static std::unique_ptr<GfxFont> createAnnotDrawFont(XRef *xref, Dict *fontParentDict, const char *resourceName = "AnnotDrawFont", const char *fontname = "Helvetica") { const Ref dummyRef = { -1, -1 }; @@ -3041,7 +3041,7 @@ void AnnotFreeText::generateFreeTextAppearance() const double textwidth = width - 2 * textmargin; appearBuilder.appendf("{0:.2f} {0:.2f} {1:.2f} {2:.2f} re W n\n", textmargin, textwidth, height - 2 * textmargin); - GfxFont *font = nullptr; + std::unique_ptr<const GfxFont> font = nullptr; // look for font name in the default resources Form *form = doc->getCatalog()->getForm(); // form is owned by catalog, no need to clean it up @@ -3085,7 +3085,7 @@ void AnnotFreeText::generateFreeTextAppearance() while (i < contents->getLength()) { GooString out; double linewidth, xpos; - layoutText(contents.get(), &out, &i, font, &linewidth, textwidth / da.getFontPtSize(), nullptr, false); + layoutText(contents.get(), &out, &i, *font, &linewidth, textwidth / da.getFontPtSize(), nullptr, false); linewidth *= da.getFontPtSize(); switch (quadding) { case quaddingCentered: @@ -3104,7 +3104,6 @@ void AnnotFreeText::generateFreeTextAppearance() xposPrev = xpos; } - font->decRefCnt(); appearBuilder.append("ET Q\n"); double bbox[4]; @@ -3407,7 +3406,7 @@ void AnnotLine::generateLineAppearance() const double lineendingSize = std::min(6. * borderWidth, main_len / 2); Dict *fontResDict; - GfxFont *font; + std::unique_ptr<const GfxFont> font; // Calculate caption width and height if (caption) { @@ -3418,7 +3417,7 @@ void AnnotLine::generateLineAppearance() while (i < contents->getLength()) { GooString out; double linewidth; - layoutText(contents.get(), &out, &i, font, &linewidth, 0, nullptr, false); + layoutText(contents.get(), &out, &i, *font, &linewidth, 0, nullptr, false); linewidth *= fontsize; if (linewidth > captionwidth) { captionwidth = linewidth; @@ -3502,7 +3501,7 @@ void AnnotLine::generateLineAppearance() while (i < contents->getLength()) { GooString out; double linewidth, xpos; - layoutText(contents.get(), &out, &i, font, &linewidth, 0, nullptr, false); + layoutText(contents.get(), &out, &i, *font, &linewidth, 0, nullptr, false); linewidth *= fontsize; xpos = (captionwidth - linewidth) / 2; appearBuilder.appendf("{0:.2f} {1:.2f} Td\n", xpos - xposPrev, -fontsize); @@ -3511,7 +3510,6 @@ void AnnotLine::generateLineAppearance() xposPrev = xpos; } appearBuilder.append("ET\n"); - font->decRefCnt(); } // Draw leader lines @@ -4016,7 +4014,7 @@ bool AnnotWidget::setFormAdditionalAction(FormAdditionalActionsType formAddition // TODO: Handle surrogate pairs in UTF-16. // Should be able to generate output for any CID-keyed font. // Doesn't handle vertical fonts--should it? -void Annot::layoutText(const GooString *text, GooString *outBuf, int *i, const GfxFont *font, double *width, double widthLimit, int *charCount, bool noReencode) +void Annot::layoutText(const GooString *text, GooString *outBuf, int *i, const GfxFont &font, double *width, double widthLimit, int *charCount, bool noReencode) { CharCode c; Unicode uChar; @@ -4097,13 +4095,13 @@ void Annot::layoutText(const GooString *text, GooString *outBuf, int *i, const G if (noReencode) { outBuf->append(uChar); } else { - const CharCodeToUnicode *ccToUnicode = font->getToUnicode(); + const CharCodeToUnicode *ccToUnicode = font.getToUnicode(); if (!ccToUnicode) { // This assumes an identity CMap. outBuf->append((uChar >> 8) & 0xff); outBuf->append(uChar & 0xff); } else if (ccToUnicode->mapToCharCode(&uChar, &c, 1)) { - if (font->isCIDFont()) { + if (font.isCIDFont()) { // TODO: This assumes an identity CMap. It should be extended to // handle the general case. outBuf->append((c >> 8) & 0xff); @@ -4130,7 +4128,7 @@ void Annot::layoutText(const GooString *text, GooString *outBuf, int *i, const G // Compute width of character just output if (outBuf->getLength() > last_o2) { dx = 0.0; - font->getNextChar(outBuf->c_str() + last_o2, outBuf->getLength() - last_o2, &c, &uAux, &uLen, &dx, &dy, &ox, &oy); + font.getNextChar(outBuf->c_str() + last_o2, outBuf->getLength() - last_o2, &c, &uAux, &uLen, &dx, &dy, &ox, &oy); w += dx; } @@ -4185,7 +4183,7 @@ void Annot::layoutText(const GooString *text, GooString *outBuf, int *i, const G while (len > 0) { dx = 0.0; - n = font->getNextChar(s, len, &c, &uAux, &uLen, &dx, &dy, &ox, &oy); + n = font.getNextChar(s, len, &c, &uAux, &uLen, &dx, &dy, &ox, &oy); if (n == 0) { break; @@ -4239,7 +4237,7 @@ bool AnnotAppearanceBuilder::drawText(const GooString *text, const GooString *da int tfPos, tmPos, j; int rot; bool freeText = false; // true if text should be freed before return - GfxFont *fontToFree = nullptr; + std::unique_ptr<const GfxFont> fontToFree = nullptr; //~ if there is no MK entry, this should use the existing content stream, //~ and only replace the marked content portion of it @@ -4282,11 +4280,15 @@ bool AnnotAppearanceBuilder::drawText(const GooString *text, const GooString *da } } if (tok->getLength() >= 1 && tok->getChar(0) == '/') { - if (!resources || !(font = resources->lookupFont(tok->c_str() + 1))) { + if (!resources || !(font = resources->lookupFont(tok->c_str() + 1).get())) { if (xref != nullptr && resourcesDict != nullptr) { const char *fallback = determineFallbackFont(tok->toStr(), defaultFallback); + // The font variable sometimes points to an object that needs to be deleted + // and sometimes not, depending on whether the call to lookupFont above fails. + // When the code path right here is taken, the destructor of fontToFree + // (which is a std::unique_ptr) will delete the font object at the end of this method. fontToFree = createAnnotDrawFont(xref, resourcesDict, tok->c_str() + 1, fallback); - font = fontToFree; + font = fontToFree.get(); } else { error(errSyntaxError, -1, "Unknown font in field's DA string"); } @@ -4364,7 +4366,7 @@ bool AnnotAppearanceBuilder::drawText(const GooString *text, const GooString *da y = dy - 3; int i = 0; while (i < text->getLength()) { - Annot::layoutText(text, &convertedText, &i, font, &w, wMax / fontSize, nullptr, forceZapfDingbats); + Annot::layoutText(text, &convertedText, &i, *font, &w, wMax / fontSize, nullptr, forceZapfDingbats); y -= fontSize; } // approximate the descender for the last line @@ -4408,7 +4410,7 @@ bool AnnotAppearanceBuilder::drawText(const GooString *text, const GooString *da int i = 0; xPrev = 0; while (i < text->getLength()) { - Annot::layoutText(text, &convertedText, &i, font, &w, wMax / fontSize, nullptr, forceZapfDingbats); + Annot::layoutText(text, &convertedText, &i, *font, &w, wMax / fontSize, nullptr, forceZapfDingbats); w *= fontSize; // compute text start position @@ -4460,7 +4462,7 @@ bool AnnotAppearanceBuilder::drawText(const GooString *text, const GooString *da } int i = 0; - Annot::layoutText(text, &convertedText, &i, font, nullptr, 0.0, &charCount, forceZapfDingbats); + Annot::layoutText(text, &convertedText, &i, *font, nullptr, 0.0, &charCount, forceZapfDingbats); if (charCount > comb) charCount = comb; @@ -4533,7 +4535,7 @@ bool AnnotAppearanceBuilder::drawText(const GooString *text, const GooString *da // regular (non-comb) formatting } else { int ii = 0; - Annot::layoutText(text, &convertedText, &ii, font, &w, 0.0, nullptr, forceZapfDingbats); + Annot::layoutText(text, &convertedText, &ii, *font, &w, 0.0, nullptr, forceZapfDingbats); // compute font autosize if (fontSize == 0) { @@ -4605,9 +4607,6 @@ bool AnnotAppearanceBuilder::drawText(const GooString *text, const GooString *da if (freeText) { delete text; } - if (fontToFree) { - fontToFree->decRefCnt(); - } return true; } @@ -4621,7 +4620,7 @@ bool AnnotAppearanceBuilder::drawListBox(const FormFieldChoice *fieldChoice, con const GfxFont *font; double fontSize, borderWidth, x, y, w, wMax; int tfPos, tmPos, i, j; - GfxFont *fontToFree = nullptr; + std::unique_ptr<const GfxFont> fontToFree; //~ if there is no MK entry, this should use the existing content stream, //~ and only replace the marked content portion of it @@ -4657,11 +4656,15 @@ bool AnnotAppearanceBuilder::drawListBox(const FormFieldChoice *fieldChoice, con if (tfPos >= 0) { tok = daToks[tfPos]; if (tok->getLength() >= 1 && tok->getChar(0) == '/') { - if (!resources || !(font = resources->lookupFont(tok->c_str() + 1))) { + if (!resources || !(font = resources->lookupFont(tok->c_str() + 1).get())) { if (xref != nullptr && resourcesDict != nullptr) { const char *fallback = determineFallbackFont(tok->toStr(), "Helvetica"); + // The font variable sometimes points to an object that needs to be deleted + // and sometimes not, depending on whether the call to lookupFont above fails. + // When the code path right here is taken, the destructor of fontToFree + // (which is a std::unique_ptr) will delete the font object at the end of this method. fontToFree = createAnnotDrawFont(xref, resourcesDict, tok->c_str() + 1, fallback); - font = fontToFree; + font = fontToFree.get(); } else { error(errSyntaxError, -1, "Unknown font in field's DA string"); } @@ -4694,12 +4697,9 @@ bool AnnotAppearanceBuilder::drawListBox(const FormFieldChoice *fieldChoice, con for (auto entry : daToks) { delete entry; } - if (fontToFree) { - fontToFree->decRefCnt(); - } return false; } - Annot::layoutText(fieldChoice->getChoice(i), &convertedText, &j, font, &w, 0.0, nullptr, false); + Annot::layoutText(fieldChoice->getChoice(i), &convertedText, &j, *font, &w, 0.0, nullptr, false); if (w > wMax) { wMax = w; } @@ -4733,7 +4733,7 @@ bool AnnotAppearanceBuilder::drawListBox(const FormFieldChoice *fieldChoice, con // compute text width and start position j = 0; - Annot::layoutText(fieldChoice->getChoice(i), &convertedText, &j, font, &w, 0.0, nullptr, false); + Annot::layoutText(fieldChoice->getChoice(i), &convertedText, &j, *font, &w, 0.0, nullptr, false); w *= fontSize; switch (quadding) { case quaddingLeftJustified: @@ -4788,9 +4788,6 @@ bool AnnotAppearanceBuilder::drawListBox(const FormFieldChoice *fieldChoice, con for (auto entry : daToks) { delete entry; } - if (fontToFree) { - fontToFree->decRefCnt(); - } return true; } @@ -5057,7 +5054,7 @@ void AnnotAppearanceBuilder::drawSignatureFieldText(const GooString &text, const const double textwidth = width - 2 * textmargin; // create a Helvetica fake font - GfxFont *font = createAnnotDrawFont(xref, resourcesDict, da.getFontName().getName()); + std::unique_ptr<const GfxFont> font = createAnnotDrawFont(xref, resourcesDict, da.getFontName().getName()); // calculate the string tokenization int i = 0; @@ -5065,7 +5062,7 @@ void AnnotAppearanceBuilder::drawSignatureFieldText(const GooString &text, const while (i < text.getLength()) { GooString out; double textWidth; - Annot::layoutText(&text, &out, &i, font, &textWidth, textwidth / da.getFontPtSize(), nullptr, false); + Annot::layoutText(&text, &out, &i, *font, &textWidth, textwidth / da.getFontPtSize(), nullptr, false); outTexts.emplace_back(out.toStr(), textWidth * da.getFontPtSize()); } @@ -5103,7 +5100,6 @@ void AnnotAppearanceBuilder::drawSignatureFieldText(const GooString &text, const yDelta = -da.getFontPtSize(); } - font->decRefCnt(); append("ET Q\n"); } diff --git a/poppler/Annot.h b/poppler/Annot.h index 3a7b8e74..a18c6768 100644 --- a/poppler/Annot.h +++ b/poppler/Annot.h @@ -755,7 +755,7 @@ public: // Check if point is inside the annot rectangle. bool inRect(double x, double y) const; - static void layoutText(const GooString *text, GooString *outBuf, int *i, const GfxFont *font, double *width, double widthLimit, int *charCount, bool noReencode); + static void layoutText(const GooString *text, GooString *outBuf, int *i, const GfxFont &font, double *width, double widthLimit, int *charCount, bool noReencode); private: void readArrayNum(Object *pdfArray, int key, double *value); diff --git a/poppler/BBoxOutputDev.cc b/poppler/BBoxOutputDev.cc index 991bcc76..1204f00a 100644 --- a/poppler/BBoxOutputDev.cc +++ b/poppler/BBoxOutputDev.cc @@ -93,7 +93,6 @@ void BBoxOutputDev::drawSoftMaskedImage(GfxState *state, Object *ref, Stream *st void BBoxOutputDev::drawChar(GfxState *state, double x, double y, double dx, double dy, double originX, double originY, CharCode code, int nBytes, const Unicode *u, int uLen) { - GfxFont *font; double leftent, rightent, ascent, descent; const double *fm, *fb; double fontSize, w, adjust; @@ -102,7 +101,7 @@ void BBoxOutputDev::drawChar(GfxState *state, double x, double y, double dx, dou if (!text) return; - font = state->getFont(); + const GfxFont *const font = state->getFont().get(); if (!font) return; diff --git a/poppler/CairoFontEngine.cc b/poppler/CairoFontEngine.cc index 1c892165..d06812ec 100644 --- a/poppler/CairoFontEngine.cc +++ b/poppler/CairoFontEngine.cc @@ -550,9 +550,9 @@ static const cairo_user_data_key_t type3_font_key = { 0 }; typedef struct _type3_font_info { - _type3_font_info(GfxFont *fontA, PDFDoc *docA, CairoFontEngine *fontEngineA, bool printingA, XRef *xrefA) : font(fontA), doc(docA), fontEngine(fontEngineA), printing(printingA), xref(xrefA) { } + _type3_font_info(const std::shared_ptr<const GfxFont> &fontA, PDFDoc *docA, CairoFontEngine *fontEngineA, bool printingA, XRef *xrefA) : font(fontA), doc(docA), fontEngine(fontEngineA), printing(printingA), xref(xrefA) { } - GfxFont *font; + std::shared_ptr<const GfxFont> font; PDFDoc *doc; CairoFontEngine *fontEngine; bool printing; @@ -562,18 +562,15 @@ typedef struct _type3_font_info static void _free_type3_font_info(void *closure) { type3_font_info_t *info = (type3_font_info_t *)closure; - - info->font->decRefCnt(); delete info; } static cairo_status_t _init_type3_glyph(cairo_scaled_font_t *scaled_font, cairo_t *cr, cairo_font_extents_t *extents) { type3_font_info_t *info; - GfxFont *font; info = (type3_font_info_t *)cairo_font_face_get_user_data(cairo_scaled_font_get_font_face(scaled_font), &type3_font_key); - font = info->font; + std::shared_ptr<const GfxFont> font = info->font; const double *mat = font->getFontBBox(); extents->ascent = mat[3]; /* y2 */ extents->descent = -mat[3]; /* -y1 */ @@ -594,15 +591,13 @@ static cairo_status_t _render_type3_glyph(cairo_scaled_font_t *scaled_font, unsi double wx, wy; PDFRectangle box; type3_font_info_t *info; - GfxFont *font; - Dict *resDict; Gfx *gfx; info = (type3_font_info_t *)cairo_font_face_get_user_data(cairo_scaled_font_get_font_face(scaled_font), &type3_font_key); - font = info->font; - resDict = ((Gfx8BitFont *)font)->getResources(); - charProcs = ((Gfx8BitFont *)(info->font))->getCharProcs(); + std::shared_ptr<const GfxFont> font = info->font; + Dict *resDict = ((Gfx8BitFont *)font.get())->getResources(); + charProcs = ((Gfx8BitFont *)(info->font.get()))->getCharProcs(); if (!charProcs) return CAIRO_STATUS_USER_FONT_ERROR; @@ -657,28 +652,25 @@ static cairo_status_t _render_type3_glyph(cairo_scaled_font_t *scaled_font, unsi return CAIRO_STATUS_SUCCESS; } -CairoType3Font *CairoType3Font::create(GfxFont *gfxFont, PDFDoc *doc, CairoFontEngine *fontEngine, bool printing, XRef *xref) +CairoType3Font *CairoType3Font::create(const std::shared_ptr<const GfxFont> &gfxFont, PDFDoc *doc, CairoFontEngine *fontEngine, bool printing, XRef *xref) { cairo_font_face_t *font_face; Ref ref; int *codeToGID; unsigned int codeToGIDLen; int i, j; - char **enc; - Dict *charProcs; char *name; - charProcs = ((Gfx8BitFont *)gfxFont)->getCharProcs(); + Dict *charProcs = ((Gfx8BitFont *)gfxFont.get())->getCharProcs(); ref = *gfxFont->getID(); font_face = cairo_user_font_face_create(); cairo_user_font_face_set_init_func(font_face, _init_type3_glyph); cairo_user_font_face_set_render_glyph_func(font_face, _render_type3_glyph); - gfxFont->incRefCnt(); type3_font_info_t *info = new type3_font_info_t(gfxFont, doc, fontEngine, printing, xref); cairo_font_face_set_user_data(font_face, &type3_font_key, (void *)info, _free_type3_font_info); - enc = ((Gfx8BitFont *)gfxFont)->getEncoding(); + char **enc = ((Gfx8BitFont *)gfxFont.get())->getEncoding(); codeToGID = (int *)gmallocn(256, sizeof(int)); codeToGIDLen = 256; for (i = 0; i < 256; ++i) { @@ -735,7 +727,7 @@ CairoFontEngine::~CairoFontEngine() } } -CairoFont *CairoFontEngine::getFont(GfxFont *gfxFont, PDFDoc *doc, bool printing, XRef *xref) +CairoFont *CairoFontEngine::getFont(const std::shared_ptr<GfxFont> &gfxFont, PDFDoc *doc, bool printing, XRef *xref) { int i, j; Ref ref; @@ -760,7 +752,7 @@ CairoFont *CairoFontEngine::getFont(GfxFont *gfxFont, PDFDoc *doc, bool printing if (fontType == fontType3) font = CairoType3Font::create(gfxFont, doc, this, printing, xref); else - font = CairoFreeTypeFont::create(gfxFont, xref, lib, useCIDs); + font = CairoFreeTypeFont::create(gfxFont.get(), xref, lib, useCIDs); // XXX: if font is null should we still insert it into the cache? if (fontCache[cairoFontCacheSize - 1]) { diff --git a/poppler/CairoFontEngine.h b/poppler/CairoFontEngine.h index 47eb3e7f..b7444b13 100644 --- a/poppler/CairoFontEngine.h +++ b/poppler/CairoFontEngine.h @@ -83,7 +83,7 @@ private: class CairoType3Font : public CairoFont { public: - static CairoType3Font *create(GfxFont *gfxFont, PDFDoc *doc, CairoFontEngine *fontEngine, bool printing, XRef *xref); + static CairoType3Font *create(const std::shared_ptr<const GfxFont> &gfxFont, PDFDoc *doc, CairoFontEngine *fontEngine, bool printing, XRef *xref); ~CairoType3Font() override; bool matches(Ref &other, bool printing) override; @@ -109,7 +109,7 @@ public: CairoFontEngine(const CairoFontEngine &) = delete; CairoFontEngine &operator=(const CairoFontEngine &other) = delete; - CairoFont *getFont(GfxFont *gfxFont, PDFDoc *doc, bool printing, XRef *xref); + CairoFont *getFont(const std::shared_ptr<GfxFont> &gfxFont, PDFDoc *doc, bool printing, XRef *xref); private: CairoFont *fontCache[cairoFontCacheSize]; diff --git a/poppler/CairoOutputDev.cc b/poppler/CairoOutputDev.cc index e44a41dd..96e6baa7 100644 --- a/poppler/CairoOutputDev.cc +++ b/poppler/CairoOutputDev.cc @@ -671,7 +671,7 @@ void CairoOutputDev::updateFont(GfxState *state) /* NOTE: adjusting by a constant is hack. The correct solution * is probably to use user-fonts and compute the scale on a per * glyph basis instead of for the entire font */ - double w = currentFont->getSubstitutionCorrection(state->getFont()); + double w = currentFont->getSubstitutionCorrection(state->getFont().get()); matrix.xx = m[0] * fontSize * state->getHorizScaling() * w; matrix.yx = m[1] * fontSize * state->getHorizScaling() * w; matrix.xy = -m[2] * fontSize; diff --git a/poppler/FontInfo.cc b/poppler/FontInfo.cc index d4cbc83b..7cf240fd 100644 --- a/poppler/FontInfo.cc +++ b/poppler/FontInfo.cc @@ -97,7 +97,6 @@ std::vector<FontInfo *> FontInfoScanner::scan(int nPages) void FontInfoScanner::scanFonts(XRef *xrefA, Dict *resDict, std::vector<FontInfo *> *fontsList) { GfxFontDict *gfxFontDict; - GfxFont *font; // scan the fonts in this resource dictionary gfxFontDict = nullptr; @@ -113,12 +112,12 @@ void FontInfoScanner::scanFonts(XRef *xrefA, Dict *resDict, std::vector<FontInfo } if (gfxFontDict) { for (int i = 0; i < gfxFontDict->getNumFonts(); ++i) { - if ((font = gfxFontDict->getFont(i))) { + if (const std::shared_ptr<GfxFont> &font = gfxFontDict->getFont(i)) { Ref fontRef = *font->getID(); // add this font to the list if not already found if (fonts.insert(fontRef.num).second) { - fontsList->push_back(new FontInfo(font, xrefA)); + fontsList->push_back(new FontInfo(font.get(), xrefA)); } } } diff --git a/poppler/Gfx.cc b/poppler/Gfx.cc index 873fb287..f70d8931 100644 --- a/poppler/Gfx.cc +++ b/poppler/Gfx.cc @@ -293,14 +293,13 @@ GfxResources::~GfxResources() delete fonts; } -GfxFont *GfxResources::doLookupFont(const char *name) const +std::shared_ptr<GfxFont> GfxResources::doLookupFont(const char *name) const { - GfxFont *font; const GfxResources *resPtr; for (resPtr = this; resPtr; resPtr = resPtr->next) { if (resPtr->fonts) { - if ((font = resPtr->fonts->lookup(name))) + if (std::shared_ptr<GfxFont> font = resPtr->fonts->lookup(name)) return font; } } @@ -308,12 +307,12 @@ GfxFont *GfxResources::doLookupFont(const char *name) const return nullptr; } -GfxFont *GfxResources::lookupFont(const char *name) +std::shared_ptr<GfxFont> GfxResources::lookupFont(const char *name) { return doLookupFont(name); } -const GfxFont *GfxResources::lookupFont(const char *name) const +std::shared_ptr<const GfxFont> GfxResources::lookupFont(const char *name) const { return doLookupFont(name); } @@ -1174,7 +1173,6 @@ void Gfx::opSetExtGState(Object args[], int numArgs) } obj2 = obj1.dictLookup("Font"); if (obj2.isArray()) { - GfxFont *font; if (obj2.arrayGetLength() == 2) { const Object &fargs0 = obj2.arrayGetNF(0); Object fargs1 = obj2.arrayGet(1); @@ -1182,7 +1180,7 @@ void Gfx::opSetExtGState(Object args[], int numArgs) Object fobj = fargs0.fetch(xref); if (fobj.isDict()) { Ref r = fargs0.getRef(); - font = GfxFont::makeFont(xref, args[0].getName(), r, fobj.getDict()); + std::shared_ptr<GfxFont> font = GfxFont::makeFont(xref, args[0].getName(), r, fobj.getDict()); state->setFont(font, fargs1.getNum()); fontChanged = true; } @@ -3603,7 +3601,7 @@ void Gfx::opSetCharSpacing(Object args[], int numArgs) void Gfx::opSetFont(Object args[], int numArgs) { - GfxFont *font; + std::shared_ptr<GfxFont> font; if (!(font = res->lookupFont(args[0].getName()))) { // unsetting the font (drawing no text) is better than using the @@ -3617,7 +3615,6 @@ void Gfx::opSetFont(Object args[], int numArgs) fflush(stdout); } - font->incRefCnt(); state->setFont(font, args[1].getNum()); fontChanged = true; } @@ -3819,7 +3816,6 @@ void Gfx::opShowSpaceText(Object args[], int numArgs) void Gfx::doShowText(const GooString *s) { - GfxFont *font; int wMode; double riseX, riseY; CharCode code; @@ -3837,7 +3833,7 @@ void Gfx::doShowText(const GooString *s) bool patternFill; int len, n, uLen, nChars, nSpaces; - font = state->getFont(); + GfxFont *const font = state->getFont().get(); wMode = font->getWMode(); if (out->useDrawChar()) { diff --git a/poppler/Gfx.h b/poppler/Gfx.h index ae9fa76f..d7c1ca97 100644 --- a/poppler/Gfx.h +++ b/poppler/Gfx.h @@ -117,8 +117,8 @@ public: GfxResources(const GfxResources &) = delete; GfxResources &operator=(const GfxResources &other) = delete; - GfxFont *lookupFont(const char *name); - const GfxFont *lookupFont(const char *name) const; + std::shared_ptr<GfxFont> lookupFont(const char *name); + std::shared_ptr<const GfxFont> lookupFont(const char *name) const; Object lookupXObject(const char *name); Object lookupXObjectNF(const char *name); Object lookupMarkedContentNF(const char *name); @@ -131,7 +131,7 @@ public: GfxResources *getNext() const { return next; } private: - GfxFont *doLookupFont(const char *name) const; + std::shared_ptr<GfxFont> doLookupFont(const char *name) const; GfxFontDict *fonts; Object xObjDict; diff --git a/poppler/GfxFont.cc b/poppler/GfxFont.cc index 62b7429d..9d21a8d9 100644 --- a/poppler/GfxFont.cc +++ b/poppler/GfxFont.cc @@ -197,12 +197,11 @@ const GooString *GfxFontLoc::pathAsGooString() const // GfxFont //------------------------------------------------------------------------ -GfxFont *GfxFont::makeFont(XRef *xref, const char *tagA, Ref idA, Dict *fontDict) +std::unique_ptr<GfxFont> GfxFont::makeFont(XRef *xref, const char *tagA, Ref idA, Dict *fontDict) { GooString *nameA; Ref embFontIDA; GfxFontType typeA; - GfxFont *font; // get base font name nameA = nullptr; @@ -215,14 +214,14 @@ GfxFont *GfxFont::makeFont(XRef *xref, const char *tagA, Ref idA, Dict *fontDict typeA = getFontType(xref, fontDict, &embFontIDA); // create the font object - font = nullptr; + GfxFont *font; if (typeA < fontCIDType0) { font = new Gfx8BitFont(xref, tagA, idA, nameA, typeA, embFontIDA, fontDict); } else { font = new GfxCIDFont(xref, tagA, idA, nameA, typeA, embFontIDA, fontDict); } - return font; + return std::unique_ptr<GfxFont>(font); } GfxFont::GfxFont(const char *tagA, Ref idA, const GooString *nameA, GfxFontType typeA, Ref embFontIDA) : tag(tagA), id(idA), type(typeA) @@ -234,7 +233,6 @@ GfxFont::GfxFont(const char *tagA, Ref idA, const GooString *nameA, GfxFontType family = nullptr; stretch = StretchNotDefined; weight = WeightNotDefined; - refCnt = 1; hasToUnicode = false; } @@ -249,17 +247,6 @@ GfxFont::~GfxFont() } } -void GfxFont::incRefCnt() -{ - refCnt++; -} - -void GfxFont::decRefCnt() -{ - if (--refCnt == 0) - delete this; -} - bool GfxFont::isSubset() const { if (name) { @@ -984,7 +971,6 @@ Gfx8BitFont::Gfx8BitFont(XRef *xref, const char *tagA, Ref idA, GooString *nameA Object obj1; int n, i, a, b, m; - refCnt = 1; ctu = nullptr; // do font name substitution for various aliases of the Base 14 font @@ -1735,7 +1721,6 @@ GfxCIDFont::GfxCIDFont(XRef *xref, const char *tagA, Ref idA, GooString *nameA, int c1, c2; int excepsSize; - refCnt = 1; ascent = 0.95; descent = -0.35; fontBBox[0] = fontBBox[1] = fontBBox[2] = fontBBox[3] = 0; @@ -2379,8 +2364,7 @@ GfxFontDict::GfxFontDict(XRef *xref, Ref *fontDictRef, Dict *fontDict) // NULL and !isOk() so that when we do lookups // we can tell the difference between a missing font // and a font that is just !isOk() - fonts[i]->decRefCnt(); - fonts[i] = nullptr; + fonts[i].reset(); } } else { error(errSyntaxError, -1, "font resource is not a dictionary"); @@ -2389,16 +2373,7 @@ GfxFontDict::GfxFontDict(XRef *xref, Ref *fontDictRef, Dict *fontDict) } } -GfxFontDict::~GfxFontDict() -{ - for (auto &font : fonts) { - if (font) { - font->decRefCnt(); - } - } -} - -GfxFont *GfxFontDict::lookup(const char *tag) const +std::shared_ptr<GfxFont> GfxFontDict::lookup(const char *tag) const { for (const auto &font : fonts) { if (font && font->matches(tag)) { diff --git a/poppler/GfxFont.h b/poppler/GfxFont.h index c88de3c6..ee70a7af 100644 --- a/poppler/GfxFont.h +++ b/poppler/GfxFont.h @@ -188,16 +188,14 @@ public: }; // Build a GfxFont object. - static GfxFont *makeFont(XRef *xref, const char *tagA, Ref idA, Dict *fontDict); + static std::unique_ptr<GfxFont> makeFont(XRef *xref, const char *tagA, Ref idA, Dict *fontDict); GfxFont(const GfxFont &) = delete; GfxFont &operator=(const GfxFont &other) = delete; + virtual ~GfxFont(); bool isOk() const { return ok; } - void incRefCnt(); - void decRefCnt(); - // Get font tag. const std::string &getTag() const { return tag; } @@ -308,8 +306,6 @@ public: protected: GfxFont(const char *tagA, Ref idA, const GooString *nameA, GfxFontType typeA, Ref embFontIDA); - virtual ~GfxFont(); - static GfxFontType getFontType(XRef *xref, Dict *fontDict, Ref *embID); void readFontDescriptor(XRef *xref, Dict *fontDict); CharCodeToUnicode *readToUnicodeCMap(Dict *fontDict, int nBits, CharCodeToUnicode *ctu); @@ -330,7 +326,6 @@ protected: double missingWidth; // "default" width double ascent; // max height above baseline double descent; // max depth below baseline - int refCnt; bool ok; bool hasToUnicode; std::string encodingName; @@ -454,24 +449,21 @@ public: // Build the font dictionary, given the PDF font dictionary. GfxFontDict(XRef *xref, Ref *fontDictRef, Dict *fontDict); - // Destructor. - ~GfxFontDict(); - GfxFontDict(const GfxFontDict &) = delete; GfxFontDict &operator=(const GfxFontDict &) = delete; // Get the specified font. - GfxFont *lookup(const char *tag) const; + std::shared_ptr<GfxFont> lookup(const char *tag) const; // Iterative access. int getNumFonts() const { return fonts.size(); } - GfxFont *getFont(int i) const { return fonts[i]; } + const std::shared_ptr<GfxFont> &getFont(int i) const { return fonts[i]; } private: int hashFontObject(Object *obj); void hashFontObject1(const Object *obj, FNVHash *h); - std::vector<GfxFont *> fonts; + std::vector<std::shared_ptr<GfxFont>> fonts; }; #endif diff --git a/poppler/GfxState.cc b/poppler/GfxState.cc index c24332bd..f46e425e 100644 --- a/poppler/GfxState.cc +++ b/poppler/GfxState.cc @@ -6533,9 +6533,6 @@ GfxState::~GfxState() // this gets set to NULL by restore() delete path; } - if (font) { - font->decRefCnt(); - } delete defaultGrayColorSpace; delete defaultRGBColorSpace; @@ -6606,8 +6603,6 @@ GfxState::GfxState(const GfxState *state, bool copyPath) textKnockout = state->textKnockout; font = state->font; - if (font) - font->incRefCnt(); fontSize = state->fontSize; memcpy(textMat, state->textMat, sizeof(textMat)); charSpace = state->charSpace; @@ -6901,12 +6896,9 @@ void GfxState::setStrokePattern(GfxPattern *pattern) strokePattern = pattern; } -void GfxState::setFont(GfxFont *fontA, double fontSizeA) +void GfxState::setFont(std::shared_ptr<GfxFont> fontA, double fontSizeA) { - if (font) - font->decRefCnt(); - - font = fontA; + font = std::move(fontA); fontSize = fontSizeA; } diff --git a/poppler/GfxState.h b/poppler/GfxState.h index 64a78ae0..0d86d65e 100644 --- a/poppler/GfxState.h +++ b/poppler/GfxState.h @@ -1504,7 +1504,7 @@ public: bool getStrokeAdjust() const { return strokeAdjust; } bool getAlphaIsShape() const { return alphaIsShape; } bool getTextKnockout() const { return textKnockout; } - GfxFont *getFont() const { return font; } + const std::shared_ptr<GfxFont> &getFont() const { return font; } double getFontSize() const { return fontSize; } const double *getTextMat() const { return textMat; } double getCharSpace() const { return charSpace; } @@ -1585,7 +1585,7 @@ public: void setStrokeAdjust(bool sa) { strokeAdjust = sa; } void setAlphaIsShape(bool ais) { alphaIsShape = ais; } void setTextKnockout(bool tk) { textKnockout = tk; } - void setFont(GfxFont *fontA, double fontSizeA); + void setFont(std::shared_ptr<GfxFont> fontA, double fontSizeA); void setTextMat(double a, double b, double c, double d, double e, double f) { textMat[0] = a; @@ -1720,7 +1720,7 @@ private: bool alphaIsShape; // alpha is shape bool textKnockout; // text knockout - GfxFont *font; // font + std::shared_ptr<GfxFont> font; // font double fontSize; // font size double textMat[6]; // text matrix double charSpace; // character spacing diff --git a/poppler/MarkedContentOutputDev.cc b/poppler/MarkedContentOutputDev.cc index 3573adf2..4c5e42d0 100644 --- a/poppler/MarkedContentOutputDev.cc +++ b/poppler/MarkedContentOutputDev.cc @@ -26,8 +26,6 @@ MarkedContentOutputDev::MarkedContentOutputDev(int mcidA, const Object &stmObj) MarkedContentOutputDev::~MarkedContentOutputDev() { - if (currentFont) - currentFont->decRefCnt(); delete currentText; } @@ -101,7 +99,7 @@ void MarkedContentOutputDev::endMarkedContent(GfxState *state) } } -bool MarkedContentOutputDev::needFontChange(const GfxFont *font) const +bool MarkedContentOutputDev::needFontChange(const std::shared_ptr<const GfxFont> &font) const { if (currentFont == font) return false; @@ -149,14 +147,7 @@ void MarkedContentOutputDev::drawChar(GfxState *state, double xx, double yy, dou currentColor = color; if (fontChange) { - if (currentFont != nullptr) { - currentFont->decRefCnt(); - currentFont = nullptr; - } - if (state->getFont() != nullptr) { - currentFont = state->getFont(); - currentFont->incRefCnt(); - } + currentFont = state->getFont(); } double sp, dx2, dy2, w1, h1, x1, y1; diff --git a/poppler/MarkedContentOutputDev.h b/poppler/MarkedContentOutputDev.h index 8d46d1a2..ba2ef07c 100644 --- a/poppler/MarkedContentOutputDev.h +++ b/poppler/MarkedContentOutputDev.h @@ -43,24 +43,22 @@ public: delete data; } - GfxFont *getFont() const { return data->font; } + const std::shared_ptr<GfxFont> &getFont() const { return data->font; } GooString *getText() const { return data->text; } GfxRGB &getColor() const { return data->color; } private: // Note: Takes ownership of strings, increases refcount for font. - TextSpan(GooString *text, GfxFont *font, const GfxRGB color) : data(new Data) + TextSpan(GooString *text, std::shared_ptr<GfxFont> font, const GfxRGB color) : data(new Data) { data->text = text; - data->font = font; + data->font = std::move(font); data->color = color; - if (data->font) - data->font->incRefCnt(); } struct Data { - GfxFont *font; + std::shared_ptr<GfxFont> font; GooString *text; GfxRGB color; unsigned refcount; @@ -70,8 +68,6 @@ private: ~Data() { assert(refcount == 0); - if (font) - font->decRefCnt(); delete text; } @@ -116,9 +112,9 @@ private: void endSpan(); bool inMarkedContent() const { return mcidStack.size() > 0; } bool contentStreamMatch(); - bool needFontChange(const GfxFont *font) const; + bool needFontChange(const std::shared_ptr<const GfxFont> &font) const; - GfxFont *currentFont; + std::shared_ptr<GfxFont> currentFont; GooString *currentText; GfxRGB currentColor; TextSpanArray textSpans; diff --git a/poppler/PSOutputDev.cc b/poppler/PSOutputDev.cc index fb4af2e2..4b570af6 100644 --- a/poppler/PSOutputDev.cc +++ b/poppler/PSOutputDev.cc @@ -1921,7 +1921,6 @@ void PSOutputDev::setupFonts(Dict *resDict) { Ref r; GfxFontDict *gfxFontDict; - GfxFont *font; int i; gfxFontDict = nullptr; @@ -1937,8 +1936,8 @@ void PSOutputDev::setupFonts(Dict *resDict) } if (gfxFontDict) { for (i = 0; i < gfxFontDict->getNumFonts(); ++i) { - if ((font = gfxFontDict->getFont(i))) { - setupFont(font, resDict); + if (const std::shared_ptr<GfxFont> &font = gfxFontDict->getFont(i)) { + setupFont(font.get(), resDict); } } delete gfxFontDict; @@ -5009,7 +5008,7 @@ void PSOutputDev::doPath(const GfxPath *path) void PSOutputDev::drawString(GfxState *state, const GooString *s) { - GfxFont *font; + std::shared_ptr<GfxFont> font; int wMode; int *codeToGID; GooString *s2; diff --git a/poppler/PreScanOutputDev.cc b/poppler/PreScanOutputDev.cc index d28da26c..9823ac58 100644 --- a/poppler/PreScanOutputDev.cc +++ b/poppler/PreScanOutputDev.cc @@ -151,7 +151,7 @@ void PreScanOutputDev::beginStringOp(GfxState *state) check(state->getStrokeColorSpace(), state->getStrokeColor(), state->getStrokeOpacity(), state->getBlendMode()); } - const GfxFont *font = state->getFont(); + std::shared_ptr<const GfxFont> font = state->getFont(); state->getFontTransMat(&m11, &m12, &m21, &m22); //~ this should check for external fonts that are non-TrueType simpleTTF = fabs(m11 + m22) < 0.01 && m11 > 0 && fabs(m12) < 0.01 && fabs(m21) < 0.01 && fabs(state->getHorizScaling() - 1) < 0.001 && (font->getType() == fontTrueType || font->getType() == fontTrueTypeOT); diff --git a/poppler/SplashOutputDev.cc b/poppler/SplashOutputDev.cc index c337e4e4..57ac0260 100644 --- a/poppler/SplashOutputDev.cc +++ b/poppler/SplashOutputDev.cc @@ -1823,7 +1823,6 @@ void SplashOutputDev::updateFont(GfxState * /*state*/) void SplashOutputDev::doUpdateFont(GfxState *state) { - GfxFont *gfxFont; GfxFontType fontType; SplashOutFontFileID *id = nullptr; SplashFontFile *fontFile; @@ -1841,7 +1840,8 @@ void SplashOutputDev::doUpdateFont(GfxState *state) font = nullptr; tmpBuf = nullptr; - if (!(gfxFont = state->getFont())) { + GfxFont *const gfxFont = state->getFont().get(); + if (!gfxFont) { goto err1; } fontType = gfxFont->getType(); @@ -2266,7 +2266,7 @@ void SplashOutputDev::drawChar(GfxState *state, double x, double y, double dx, d bool SplashOutputDev::beginType3Char(GfxState *state, double x, double y, double dx, double dy, CharCode code, const Unicode *u, int uLen) { - GfxFont *gfxFont; + std::shared_ptr<const GfxFont> gfxFont; const Ref *fontID; const double *ctm, *bbox; T3FontCache *t3Font; diff --git a/poppler/TextOutputDev.cc b/poppler/TextOutputDev.cc index 67a6246d..cbfe8bca 100644 --- a/poppler/TextOutputDev.cc +++ b/poppler/TextOutputDev.cc @@ -350,8 +350,6 @@ public: TextFontInfo::TextFontInfo(const GfxState *state) { gfxFont = state->getFont(); - if (gfxFont) - gfxFont->incRefCnt(); #ifdef TEXTOUT_WORD_LIST fontName = (gfxFont && gfxFont->getName()) ? gfxFont->getName()->copy() : nullptr; flags = gfxFont ? gfxFont->getFlags() : 0; @@ -360,8 +358,6 @@ TextFontInfo::TextFontInfo(const GfxState *state) TextFontInfo::~TextFontInfo() { - if (gfxFont) - gfxFont->decRefCnt(); #ifdef TEXTOUT_WORD_LIST if (fontName) { delete fontName; @@ -2510,7 +2506,6 @@ void TextPage::clear() void TextPage::updateFont(const GfxState *state) { - GfxFont *gfxFont; const double *fm; const char *name; int code, mCode, letterCode, anyCode; @@ -2530,7 +2525,7 @@ void TextPage::updateFont(const GfxState *state) } // adjust the font size - gfxFont = state->getFont(); + GfxFont *const gfxFont = state->getFont().get(); curFontSize = state->getTransformedFontSize(); if (gfxFont && gfxFont->getType() == fontType3) { // This is a hack which makes it possible to deal with some Type 3 @@ -2573,7 +2568,6 @@ void TextPage::updateFont(const GfxState *state) void TextPage::beginWord(const GfxState *state) { - GfxFont *gfxFont; const double *fontm; double m[4], m2[4]; int rot; @@ -2588,7 +2582,7 @@ void TextPage::beginWord(const GfxState *state) // compute the rotation state->getFontTransMat(&m[0], &m[1], &m[2], &m[3]); - gfxFont = state->getFont(); + std::shared_ptr<GfxFont> gfxFont = state->getFont(); if (gfxFont && gfxFont->getType() == fontType3) { fontm = state->getFont()->getFontMatrix(); m2[0] = fontm[0] * m[0] + fontm[1] * m[2]; @@ -4751,7 +4745,6 @@ void TextSelectionPainter::endPage() while (begin < sel->end) { TextFontInfo *font = sel->word->font[begin]; - font->gfxFont->incRefCnt(); Matrix *mat = &sel->word->textMat[begin]; state->setTextMat(mat->m[0], mat->m[1], mat->m[2], mat->m[3], 0, 0); diff --git a/poppler/TextOutputDev.h b/poppler/TextOutputDev.h index 9df36278..bc25f648 100644 --- a/poppler/TextOutputDev.h +++ b/poppler/TextOutputDev.h @@ -119,7 +119,7 @@ public: #endif private: - GfxFont *gfxFont; + std::shared_ptr<GfxFont> gfxFont; #ifdef TEXTOUT_WORD_LIST GooString *fontName; int flags; diff --git a/qt5/src/QPainterOutputDev.cc b/qt5/src/QPainterOutputDev.cc index e0cf87fe..98a3c407 100644 --- a/qt5/src/QPainterOutputDev.cc +++ b/qt5/src/QPainterOutputDev.cc @@ -64,13 +64,13 @@ class QPainterOutputDevType3Font { public: - QPainterOutputDevType3Font(PDFDoc *doc, Gfx8BitFont *font); + QPainterOutputDevType3Font(PDFDoc *doc, const std::shared_ptr<Gfx8BitFont> &font); const QPicture &getGlyph(int gid) const; private: PDFDoc *m_doc; - Gfx8BitFont *m_font; + std::shared_ptr<Gfx8BitFont> m_font; mutable std::vector<std::unique_ptr<QPicture>> glyphs; @@ -78,7 +78,7 @@ public: std::vector<int> codeToGID; }; -QPainterOutputDevType3Font::QPainterOutputDevType3Font(PDFDoc *doc, Gfx8BitFont *font) : m_doc(doc), m_font(font) +QPainterOutputDevType3Font::QPainterOutputDevType3Font(PDFDoc *doc, const std::shared_ptr<Gfx8BitFont> &font) : m_doc(doc), m_font(font) { char *name; const Dict *charProcs = font->getCharProcs(); @@ -417,7 +417,7 @@ void QPainterOutputDev::updateStrokeOpacity(GfxState *state) void QPainterOutputDev::updateFont(GfxState *state) { - GfxFont *gfxFont = state->getFont(); + const std::shared_ptr<GfxFont> &gfxFont = state->getFont(); if (!gfxFont) { return; } @@ -436,7 +436,7 @@ void QPainterOutputDev::updateFont(GfxState *state) } else { - m_currentType3Font = new QPainterOutputDevType3Font(m_doc, (Gfx8BitFont *)gfxFont); + m_currentType3Font = new QPainterOutputDevType3Font(m_doc, std::static_pointer_cast<Gfx8BitFont>(gfxFont)); m_type3FontCache.insert(std::make_pair(fontID, std::unique_ptr<QPainterOutputDevType3Font>(m_currentType3Font))); } @@ -570,7 +570,7 @@ void QPainterOutputDev::updateFont(GfxState *state) int *codeToGID = (int *)gmallocn(256, sizeof(int)); for (int i = 0; i < 256; ++i) { codeToGID[i] = 0; - if ((name = ((const char **)((Gfx8BitFont *)gfxFont)->getEncoding())[i])) { + if ((name = ((const char **)((Gfx8BitFont *)gfxFont.get())->getEncoding())[i])) { codeToGID[i] = (int)FT_Get_Name_Index(freeTypeFace, (char *)name); if (codeToGID[i] == 0) { name = GfxFont::getAlternateName(name); @@ -591,7 +591,7 @@ void QPainterOutputDev::updateFont(GfxState *state) case fontTrueTypeOT: { auto ff = (fontLoc->locType != gfxFontLocEmbedded) ? FoFiTrueType::load(fontLoc->path.c_str()) : FoFiTrueType::make(tmpBuf.get(), tmpBufLen); - m_codeToGIDCache[id] = (ff) ? ((Gfx8BitFont *)gfxFont)->getCodeToGIDMap(ff.get()) : nullptr; + m_codeToGIDCache[id] = (ff) ? ((Gfx8BitFont *)gfxFont.get())->getCodeToGIDMap(ff.get()) : nullptr; break; } @@ -614,10 +614,10 @@ void QPainterOutputDev::updateFont(GfxState *state) case fontCIDType0COT: { int *codeToGID = nullptr; - if (((GfxCIDFont *)gfxFont)->getCIDToGID()) { - int codeToGIDLen = ((GfxCIDFont *)gfxFont)->getCIDToGIDLen(); + if (((GfxCIDFont *)gfxFont.get())->getCIDToGID()) { + int codeToGIDLen = ((GfxCIDFont *)gfxFont.get())->getCIDToGIDLen(); codeToGID = (int *)gmallocn(codeToGIDLen, sizeof(int)); - memcpy(codeToGID, ((GfxCIDFont *)gfxFont)->getCIDToGID(), codeToGIDLen * sizeof(int)); + memcpy(codeToGID, ((GfxCIDFont *)gfxFont.get())->getCIDToGID(), codeToGIDLen * sizeof(int)); } int *cidToGIDMap = nullptr; @@ -639,18 +639,18 @@ void QPainterOutputDev::updateFont(GfxState *state) case fontCIDType2OT: { int *codeToGID = nullptr; int codeToGIDLen = 0; - if (((GfxCIDFont *)gfxFont)->getCIDToGID()) { - codeToGIDLen = ((GfxCIDFont *)gfxFont)->getCIDToGIDLen(); + if (((GfxCIDFont *)gfxFont.get())->getCIDToGID()) { + codeToGIDLen = ((GfxCIDFont *)gfxFont.get())->getCIDToGIDLen(); if (codeToGIDLen) { codeToGID = (int *)gmallocn(codeToGIDLen, sizeof(int)); - memcpy(codeToGID, ((GfxCIDFont *)gfxFont)->getCIDToGID(), codeToGIDLen * sizeof(int)); + memcpy(codeToGID, ((GfxCIDFont *)gfxFont.get())->getCIDToGID(), codeToGIDLen * sizeof(int)); } } else { auto ff = (fontLoc->locType != gfxFontLocEmbedded) ? FoFiTrueType::load(fontLoc->path.c_str()) : FoFiTrueType::make(tmpBuf.get(), tmpBufLen); if (!ff) { return; } - codeToGID = ((GfxCIDFont *)gfxFont)->getCodeToGIDMap(ff.get(), &codeToGIDLen); + codeToGID = ((GfxCIDFont *)gfxFont.get())->getCodeToGIDMap(ff.get(), &codeToGIDLen); } m_codeToGIDCache[id] = codeToGID; @@ -867,7 +867,7 @@ void QPainterOutputDev::drawChar(GfxState *state, double x, double y, double dx, { // First handle type3 fonts - GfxFont *gfxFont = state->getFont(); + const std::shared_ptr<GfxFont> &gfxFont = state->getFont(); GfxFontType fontType = gfxFont->getType(); if (fontType == fontType3) { diff --git a/qt6/src/QPainterOutputDev.cc b/qt6/src/QPainterOutputDev.cc index e0cf87fe..98a3c407 100644 --- a/qt6/src/QPainterOutputDev.cc +++ b/qt6/src/QPainterOutputDev.cc @@ -64,13 +64,13 @@ class QPainterOutputDevType3Font { public: - QPainterOutputDevType3Font(PDFDoc *doc, Gfx8BitFont *font); + QPainterOutputDevType3Font(PDFDoc *doc, const std::shared_ptr<Gfx8BitFont> &font); const QPicture &getGlyph(int gid) const; private: PDFDoc *m_doc; - Gfx8BitFont *m_font; + std::shared_ptr<Gfx8BitFont> m_font; mutable std::vector<std::unique_ptr<QPicture>> glyphs; @@ -78,7 +78,7 @@ public: std::vector<int> codeToGID; }; -QPainterOutputDevType3Font::QPainterOutputDevType3Font(PDFDoc *doc, Gfx8BitFont *font) : m_doc(doc), m_font(font) +QPainterOutputDevType3Font::QPainterOutputDevType3Font(PDFDoc *doc, const std::shared_ptr<Gfx8BitFont> &font) : m_doc(doc), m_font(font) { char *name; const Dict *charProcs = font->getCharProcs(); @@ -417,7 +417,7 @@ void QPainterOutputDev::updateStrokeOpacity(GfxState *state) void QPainterOutputDev::updateFont(GfxState *state) { - GfxFont *gfxFont = state->getFont(); + const std::shared_ptr<GfxFont> &gfxFont = state->getFont(); if (!gfxFont) { return; } @@ -436,7 +436,7 @@ void QPainterOutputDev::updateFont(GfxState *state) } else { - m_currentType3Font = new QPainterOutputDevType3Font(m_doc, (Gfx8BitFont *)gfxFont); + m_currentType3Font = new QPainterOutputDevType3Font(m_doc, std::static_pointer_cast<Gfx8BitFont>(gfxFont)); m_type3FontCache.insert(std::make_pair(fontID, std::unique_ptr<QPainterOutputDevType3Font>(m_currentType3Font))); } @@ -570,7 +570,7 @@ void QPainterOutputDev::updateFont(GfxState *state) int *codeToGID = (int *)gmallocn(256, sizeof(int)); for (int i = 0; i < 256; ++i) { codeToGID[i] = 0; - if ((name = ((const char **)((Gfx8BitFont *)gfxFont)->getEncoding())[i])) { + if ((name = ((const char **)((Gfx8BitFont *)gfxFont.get())->getEncoding())[i])) { codeToGID[i] = (int)FT_Get_Name_Index(freeTypeFace, (char *)name); if (codeToGID[i] == 0) { name = GfxFont::getAlternateName(name); @@ -591,7 +591,7 @@ void QPainterOutputDev::updateFont(GfxState *state) case fontTrueTypeOT: { auto ff = (fontLoc->locType != gfxFontLocEmbedded) ? FoFiTrueType::load(fontLoc->path.c_str()) : FoFiTrueType::make(tmpBuf.get(), tmpBufLen); - m_codeToGIDCache[id] = (ff) ? ((Gfx8BitFont *)gfxFont)->getCodeToGIDMap(ff.get()) : nullptr; + m_codeToGIDCache[id] = (ff) ? ((Gfx8BitFont *)gfxFont.get())->getCodeToGIDMap(ff.get()) : nullptr; break; } @@ -614,10 +614,10 @@ void QPainterOutputDev::updateFont(GfxState *state) case fontCIDType0COT: { int *codeToGID = nullptr; - if (((GfxCIDFont *)gfxFont)->getCIDToGID()) { - int codeToGIDLen = ((GfxCIDFont *)gfxFont)->getCIDToGIDLen(); + if (((GfxCIDFont *)gfxFont.get())->getCIDToGID()) { + int codeToGIDLen = ((GfxCIDFont *)gfxFont.get())->getCIDToGIDLen(); codeToGID = (int *)gmallocn(codeToGIDLen, sizeof(int)); - memcpy(codeToGID, ((GfxCIDFont *)gfxFont)->getCIDToGID(), codeToGIDLen * sizeof(int)); + memcpy(codeToGID, ((GfxCIDFont *)gfxFont.get())->getCIDToGID(), codeToGIDLen * sizeof(int)); } int *cidToGIDMap = nullptr; @@ -639,18 +639,18 @@ void QPainterOutputDev::updateFont(GfxState *state) case fontCIDType2OT: { int *codeToGID = nullptr; int codeToGIDLen = 0; - if (((GfxCIDFont *)gfxFont)->getCIDToGID()) { - codeToGIDLen = ((GfxCIDFont *)gfxFont)->getCIDToGIDLen(); + if (((GfxCIDFont *)gfxFont.get())->getCIDToGID()) { + codeToGIDLen = ((GfxCIDFont *)gfxFont.get())->getCIDToGIDLen(); if (codeToGIDLen) { codeToGID = (int *)gmallocn(codeToGIDLen, sizeof(int)); - memcpy(codeToGID, ((GfxCIDFont *)gfxFont)->getCIDToGID(), codeToGIDLen * sizeof(int)); + memcpy(codeToGID, ((GfxCIDFont *)gfxFont.get())->getCIDToGID(), codeToGIDLen * sizeof(int)); } } else { auto ff = (fontLoc->locType != gfxFontLocEmbedded) ? FoFiTrueType::load(fontLoc->path.c_str()) : FoFiTrueType::make(tmpBuf.get(), tmpBufLen); if (!ff) { return; } - codeToGID = ((GfxCIDFont *)gfxFont)->getCodeToGIDMap(ff.get(), &codeToGIDLen); + codeToGID = ((GfxCIDFont *)gfxFont.get())->getCodeToGIDMap(ff.get(), &codeToGIDLen); } m_codeToGIDCache[id] = codeToGID; @@ -867,7 +867,7 @@ void QPainterOutputDev::drawChar(GfxState *state, double x, double y, double dx, { // First handle type3 fonts - GfxFont *gfxFont = state->getFont(); + const std::shared_ptr<GfxFont> &gfxFont = state->getFont(); GfxFontType fontType = gfxFont->getType(); if (fontType == fontType3) { diff --git a/utils/HtmlFonts.cc b/utils/HtmlFonts.cc index a536ee83..f17044ba 100644 --- a/utils/HtmlFonts.cc +++ b/utils/HtmlFonts.cc @@ -121,7 +121,7 @@ GooString *HtmlFontColor::toString() const return tmp; } -HtmlFont::HtmlFont(GfxFont *font, int _size, GfxRGB rgb, double opacity) +HtmlFont::HtmlFont(const GfxFont &font, int _size, GfxRGB rgb, double opacity) { color = HtmlFontColor(rgb, opacity); @@ -132,12 +132,12 @@ HtmlFont::HtmlFont(GfxFont *font, int _size, GfxRGB rgb, double opacity) bold = false; rotOrSkewed = false; - if (font->isBold() || font->getWeight() >= GfxFont::W700) + if (font.isBold() || font.getWeight() >= GfxFont::W700) bold = true; - if (font->isItalic()) + if (font.isItalic()) italic = true; - if (const GooString *fontname = font->getName()) { + if (const GooString *fontname = font.getName()) { FontName = new GooString(fontname); GooString fontnameLower(fontname); diff --git a/utils/HtmlFonts.h b/utils/HtmlFonts.h index cc5cc2f2..21fb6c35 100644 --- a/utils/HtmlFonts.h +++ b/utils/HtmlFonts.h @@ -84,7 +84,7 @@ private: HtmlFontColor color; double rotSkewMat[4]; // only four values needed for rotation and skew public: - HtmlFont(GfxFont *font, int _size, GfxRGB rgb, double opacity); + HtmlFont(const GfxFont &font, int _size, GfxRGB rgb, double opacity); HtmlFont(const HtmlFont &x); HtmlFont &operator=(const HtmlFont &x); HtmlFontColor getColor() const { return color; } diff --git a/utils/HtmlOutputDev.cc b/utils/HtmlOutputDev.cc index 668ec0ca..28ec64a8 100644 --- a/utils/HtmlOutputDev.cc +++ b/utils/HtmlOutputDev.cc @@ -172,11 +172,10 @@ static const char *print_uni_str(const Unicode *u, const unsigned uLen) HtmlString::HtmlString(GfxState *state, double fontSize, HtmlFontAccu *_fonts) : fonts(_fonts) { - GfxFont *font; double x, y; state->transform(state->getCurX(), state->getCurY(), &x, &y); - if ((font = state->getFont())) { + if (std::shared_ptr<const GfxFont> font = state->getFont()) { double ascent = font->getAscent(); double descent = font->getDescent(); if (ascent > 1.05) { @@ -191,7 +190,7 @@ HtmlString::HtmlString(GfxState *state, double fontSize, HtmlFontAccu *_fonts) : yMax = y - descent * fontSize; GfxRGB rgb; state->getFillRGB(&rgb); - HtmlFont hfont = HtmlFont(font, static_cast<int>(fontSize), rgb, state->getFillOpacity()); + HtmlFont hfont = HtmlFont(*font, static_cast<int>(fontSize), rgb, state->getFillOpacity()); if (isMatRotOrSkew(state->getTextMat())) { double normalizedMatrix[4]; memcpy(normalizedMatrix, state->getTextMat(), sizeof(normalizedMatrix)); @@ -306,14 +305,14 @@ HtmlPage::~HtmlPage() void HtmlPage::updateFont(GfxState *state) { - GfxFont *font; const char *name; int code; double w; // adjust the font size fontSize = state->getTransformedFontSize(); - if ((font = state->getFont()) && font->getType() == fontType3) { + const GfxFont *const font = state->getFont().get(); + if (font && font->getType() == fontType3) { // This is a hack which makes it possible to deal with some Type 3 // fonts. The problem is that it's impossible to know what the // base coordinate system used in the font is without actually