poppler/TextOutputDev.cc | 87 +++++++++++------------------------------------ poppler/TextOutputDev.h | 10 ++--- 2 files changed, 27 insertions(+), 70 deletions(-)
New commits: commit 6b6eb10938115394f81ab737fee65749a42a2d10 Author: Albert Astals Cid <[email protected]> Date: Sat Oct 30 02:02:39 2021 +0200 TextOutputDev improvements Vectors don't need to be a pointer and they can contain unique_ptr too Make pools be an array of unique_ptr too Makes for easier memory management diff --git a/poppler/TextOutputDev.cc b/poppler/TextOutputDev.cc index 26751e63..5dc37c93 100644 --- a/poppler/TextOutputDev.cc +++ b/poppler/TextOutputDev.cc @@ -2331,11 +2331,9 @@ TextWordList::TextWordList(const TextPage *text, bool physLayout) TextWord **wordArray; int nWords, i; - words = new std::vector<TextWord *>(); - if (text->rawOrder) { for (word = text->rawWords; word; word = word->next) { - words->push_back(word); + words.push_back(word); } } else if (physLayout) { @@ -2364,7 +2362,7 @@ TextWordList::TextWordList(const TextPage *text, bool physLayout) } qsort(wordArray, nWords, sizeof(TextWord *), &TextWord::cmpYX); for (i = 0; i < nWords; ++i) { - words->push_back(wordArray[i]); + words.push_back(wordArray[i]); } gfree(wordArray); @@ -2373,7 +2371,7 @@ TextWordList::TextWordList(const TextPage *text, bool physLayout) for (blk = flow->blocks; blk; blk = blk->next) { for (line = blk->lines; line; line = line->next) { for (word = line->words; word; word = word->next) { - words->push_back(word); + words.push_back(word); } } } @@ -2381,22 +2379,19 @@ TextWordList::TextWordList(const TextPage *text, bool physLayout) } } -TextWordList::~TextWordList() -{ - delete words; -} +TextWordList::~TextWordList() { } int TextWordList::getLength() const { - return words->size(); + return words.size(); } TextWord *TextWordList::get(int idx) { - if (idx < 0 || idx >= (int)words->size()) { + if (idx < 0 || idx >= (int)words.size()) { return nullptr; } - return (*words)[idx]; + return words[idx]; } #endif // TEXTOUT_WORD_LIST @@ -2421,41 +2416,22 @@ TextPage::TextPage(bool rawOrderA, bool discardDiagA) lastCharOverlap = false; if (!rawOrder) { for (rot = 0; rot < 4; ++rot) { - pools[rot] = new TextPool(); + pools[rot] = std::make_unique<TextPool>(); } } flows = nullptr; blocks = nullptr; rawWords = nullptr; rawLastWord = nullptr; - fonts = new std::vector<TextFontInfo *>(); lastFindXMin = lastFindYMin = 0; haveLastFind = false; - underlines = new std::vector<TextUnderline *>(); - links = new std::vector<TextLink *>(); mergeCombining = true; diagonal = false; } TextPage::~TextPage() { - int rot; - clear(); - if (!rawOrder) { - for (rot = 0; rot < 4; ++rot) { - delete pools[rot]; - } - } - delete fonts; - for (auto entry : *underlines) { - delete entry; - } - delete underlines; - for (auto entry : *links) { - delete entry; - } - delete links; } void TextPage::incRefCnt() @@ -2505,7 +2481,7 @@ void TextPage::clear() } } else { for (rot = 0; rot < 4; ++rot) { - delete pools[rot]; + pools[rot] = std::make_unique<TextPool>(); } while (flows) { flow = flows; @@ -2514,18 +2490,9 @@ void TextPage::clear() } gfree(blocks); } - for (auto entry : *fonts) { - delete entry; - } - delete fonts; - for (auto entry : *underlines) { - delete entry; - } - delete underlines; - for (auto entry : *links) { - delete entry; - } - delete links; + fonts.clear(); + underlines.clear(); + links.clear(); diagonal = false; curWord = nullptr; @@ -2534,18 +2501,10 @@ void TextPage::clear() curFontSize = 0; nest = 0; nTinyChars = 0; - if (!rawOrder) { - for (rot = 0; rot < 4; ++rot) { - pools[rot] = new TextPool(); - } - } flows = nullptr; blocks = nullptr; rawWords = nullptr; rawLastWord = nullptr; - fonts = new std::vector<TextFontInfo *>(); - underlines = new std::vector<TextUnderline *>(); - links = new std::vector<TextLink *>(); } void TextPage::updateFont(const GfxState *state) @@ -2558,16 +2517,15 @@ void TextPage::updateFont(const GfxState *state) // get the font info object curFont = nullptr; - for (TextFontInfo *f : *fonts) { - curFont = f; - if (curFont->matches(state)) { + for (const std::unique_ptr<TextFontInfo> &f : fonts) { + if (f->matches(state)) { + curFont = f.get(); break; } - curFont = nullptr; } if (!curFont) { - curFont = new TextFontInfo(state); - fonts->push_back(curFont); + fonts.emplace_back(std::make_unique<TextFontInfo>(state)); + curFont = fonts.back().get(); } // adjust the font size @@ -2847,17 +2805,16 @@ void TextPage::addWord(TextWord *word) void TextPage::addUnderline(double x0, double y0, double x1, double y1) { - underlines->push_back(new TextUnderline(x0, y0, x1, y1)); + underlines.emplace_back(std::make_unique<TextUnderline>(x0, y0, x1, y1)); } void TextPage::addLink(int xMin, int yMin, int xMax, int yMax, AnnotLink *link) { - links->push_back(new TextLink(xMin, yMin, xMax, yMax, link)); + links.emplace_back(std::make_unique<TextLink>(xMin, yMin, xMax, yMax, link)); } void TextPage::coalesce(bool physLayout, double fixedPitch, bool doHTML) { - TextPool *pool; TextWord *word0, *word1, *word2; TextLine *line; TextBlock *blkList, *blk, *lastBlk, *blk0, *blk1, *blk2; @@ -2914,7 +2871,7 @@ void TextPage::coalesce(bool physLayout, double fixedPitch, bool doHTML) if (doHTML) { //----- handle underlining - for (const TextUnderline *underline : *underlines) { + for (const std::unique_ptr<TextUnderline> &underline : underlines) { if (underline->horiz) { // rot = 0 if (pools[0]->minBaseIdx <= pools[0]->maxBaseIdx) { @@ -2972,7 +2929,7 @@ void TextPage::coalesce(bool physLayout, double fixedPitch, bool doHTML) } //----- handle links - for (const TextLink *link : *links) { + for (const std::unique_ptr<TextLink> &link : links) { // rot = 0 if (pools[0]->minBaseIdx <= pools[0]->maxBaseIdx) { startBaseIdx = pools[0]->getBaseIdx(link->yMin); @@ -3033,7 +2990,7 @@ void TextPage::coalesce(bool physLayout, double fixedPitch, bool doHTML) // build blocks for each rotation value for (rot = 0; rot < 4; ++rot) { - pool = pools[rot]; + std::unique_ptr<TextPool> &pool = pools[rot]; poolMinBaseIdx = pool->minBaseIdx; count[rot] = 0; diff --git a/poppler/TextOutputDev.h b/poppler/TextOutputDev.h index 0d05b948..984507ba 100644 --- a/poppler/TextOutputDev.h +++ b/poppler/TextOutputDev.h @@ -525,7 +525,7 @@ public: TextWord *get(int idx); private: - std::vector<TextWord *> *words; + std::vector<TextWord *> words; }; #endif // TEXTOUT_WORD_LIST @@ -689,7 +689,7 @@ private: // previous char bool diagonal; // whether the current text is diagonal - TextPool *pools[4]; // a "pool" of TextWords for each rotation + std::unique_ptr<TextPool> pools[4]; // a "pool" of TextWords for each rotation TextFlow *flows; // linked list of flows TextBlock **blocks; // array of blocks, in yx order int nBlocks; // number of blocks @@ -700,14 +700,14 @@ private: // rawOrder is set) TextWord *rawLastWord; // last word on rawWords list - std::vector<TextFontInfo *> *fonts; // all font info objects used on this page + std::vector<std::unique_ptr<TextFontInfo>> fonts; // all font info objects used on this page double lastFindXMin, // coordinates of the last "find" result lastFindYMin; bool haveLastFind; - std::vector<TextUnderline *> *underlines; - std::vector<TextLink *> *links; + std::vector<std::unique_ptr<TextUnderline>> underlines; + std::vector<std::unique_ptr<TextLink>> links; int refCnt;
