poppler/JBIG2Stream.cc | 125 ++++++++++++++++++------------------------------- poppler/JBIG2Stream.h | 18 +++---- 2 files changed, 56 insertions(+), 87 deletions(-)
New commits: commit 8f599d8caf35911f168fd9dbc99a68dc1ac12a1c Author: Oliver Sander <[email protected]> Date: Sun Jan 3 08:56:17 2021 +0100 JBIG2Stream: Store segments as std::unique_ptrs This makes the memory handling more error-proof, because all necessary calls to 'delete' happen automatically. This patch introduces several calls to std::unique_ptr::release, and hence break the explicit ownership chain established by using std::unique_ptr. Not all of the calls are strictly necessary, but without them the patch would get a lot bigger than it is. Better keep that for another day. diff --git a/poppler/JBIG2Stream.cc b/poppler/JBIG2Stream.cc index a2e4169b..308bf772 100644 --- a/poppler/JBIG2Stream.cc +++ b/poppler/JBIG2Stream.cc @@ -1146,7 +1146,8 @@ JBIG2Stream::~JBIG2Stream() void JBIG2Stream::reset() { - freeSegments(); + segments.resize(0); + globalSegments.resize(0); // read the globals stream if (globalsStream.isStream()) { @@ -1177,26 +1178,14 @@ void JBIG2Stream::reset() } } -void JBIG2Stream::freeSegments() -{ - for (auto entry : segments) { - delete entry; - } - segments.resize(0); - - for (auto entry : globalSegments) { - delete entry; - } - globalSegments.resize(0); -} - void JBIG2Stream::close() { if (pageBitmap) { delete pageBitmap; pageBitmap = nullptr; } - freeSegments(); + segments.resize(0); + globalSegments.resize(0); dataPtr = dataEnd = nullptr; FilterStream::close(); } @@ -1462,7 +1451,7 @@ eofError1: bool JBIG2Stream::readSymbolDictSeg(unsigned int segNum, unsigned int length, unsigned int *refSegs, unsigned int nRefSegs) { - JBIG2SymbolDict *symbolDict; + std::unique_ptr<JBIG2SymbolDict> symbolDict; const JBIG2HuffmanTable *huffDHTable, *huffDWTable; const JBIG2HuffmanTable *huffBMSizeTable, *huffAggInstTable; JBIG2Segment *seg; @@ -1752,11 +1741,12 @@ bool JBIG2Stream::readSymbolDictSeg(unsigned int segNum, unsigned int length, un error(errSyntaxError, curStr->getPos(), "Invalid ref bitmap for symbol ID {0:ud} in JBIG2 symbol dictionary", symID); goto syntaxError; } - bitmaps[numInputSyms + i] = readGenericRefinementRegion(symWidth, symHeight, sdrTemplate, false, refBitmap, refDX, refDY, sdrATX, sdrATY); + bitmaps[numInputSyms + i] = readGenericRefinementRegion(symWidth, symHeight, sdrTemplate, false, refBitmap, refDX, refDY, sdrATX, sdrATY).release(); //~ do we need to use the bmSize value here (in Huffman mode)? } else { bitmaps[numInputSyms + i] = readTextRegion(huff, true, symWidth, symHeight, refAggNum, 0, numInputSyms + i, nullptr, symCodeLen, bitmaps, 0, 0, 0, 1, 0, huffTableF, huffTableH, huffTableK, huffTableO, huffTableO, - huffTableO, huffTableO, huffTableA, sdrTemplate, sdrATX, sdrATY); + huffTableO, huffTableO, huffTableA, sdrTemplate, sdrATX, sdrATY) + .release(); if (unlikely(!bitmaps[numInputSyms + i])) { error(errSyntaxError, curStr->getPos(), "NULL bitmap in readTextRegion"); goto syntaxError; @@ -1765,7 +1755,7 @@ bool JBIG2Stream::readSymbolDictSeg(unsigned int segNum, unsigned int length, un // non-ref/agg coding } else { - bitmaps[numInputSyms + i] = readGenericBitmap(false, symWidth, symHeight, sdTemplate, false, false, nullptr, sdATX, sdATY, 0); + bitmaps[numInputSyms + i] = readGenericBitmap(false, symWidth, symHeight, sdTemplate, false, false, nullptr, sdATX, sdATY, 0).release(); } ++i; @@ -1791,7 +1781,7 @@ bool JBIG2Stream::readSymbolDictSeg(unsigned int segNum, unsigned int length, un *p++ = (unsigned char)c; } } else { - collBitmap = readGenericBitmap(true, totalWidth, symHeight, 0, false, false, nullptr, nullptr, nullptr, bmSize); + collBitmap = readGenericBitmap(true, totalWidth, symHeight, 0, false, false, nullptr, nullptr, nullptr, bmSize).release(); } if (likely(collBitmap != nullptr)) { x = 0; @@ -1808,9 +1798,8 @@ bool JBIG2Stream::readSymbolDictSeg(unsigned int segNum, unsigned int length, un } // create the symbol dict object - symbolDict = new JBIG2SymbolDict(segNum, numExSyms); + symbolDict = std::make_unique<JBIG2SymbolDict>(segNum, numExSyms); if (!symbolDict->isOk()) { - delete symbolDict; goto syntaxError; } @@ -1829,7 +1818,6 @@ bool JBIG2Stream::readSymbolDictSeg(unsigned int segNum, unsigned int length, un error(errSyntaxError, curStr->getPos(), "Too many exported symbols in JBIG2 symbol dictionary"); for (; j < numExSyms; ++j) symbolDict->setBitmap(j, nullptr); - delete symbolDict; goto syntaxError; } if (ex) { @@ -1845,7 +1833,6 @@ bool JBIG2Stream::readSymbolDictSeg(unsigned int segNum, unsigned int length, un error(errSyntaxError, curStr->getPos(), "Too few symbols in JBIG2 symbol dictionary"); for (; j < numExSyms; ++j) symbolDict->setBitmap(j, nullptr); - delete symbolDict; goto syntaxError; } @@ -1866,7 +1853,7 @@ bool JBIG2Stream::readSymbolDictSeg(unsigned int segNum, unsigned int length, un } // store the new symbol dict - segments.push_back(symbolDict); + segments.push_back(std::move(symbolDict)); return true; @@ -1892,7 +1879,7 @@ eofError: void JBIG2Stream::readTextRegionSeg(unsigned int segNum, bool imm, bool lossless, unsigned int length, unsigned int *refSegs, unsigned int nRefSegs) { - JBIG2Bitmap *bitmap; + std::unique_ptr<JBIG2Bitmap> bitmap; JBIG2HuffmanTable runLengthTab[36]; JBIG2HuffmanTable *symCodeTab = nullptr; const JBIG2HuffmanTable *huffFSTable, *huffDSTable, *huffDTTable; @@ -2174,13 +2161,12 @@ void JBIG2Stream::readTextRegionSeg(unsigned int segNum, bool imm, bool lossless if (pageH == 0xffffffff && y + h > curPageH) { pageBitmap->expand(y + h, pageDefPixel); } - pageBitmap->combine(bitmap, x, y, extCombOp); - delete bitmap; + pageBitmap->combine(bitmap.get(), x, y, extCombOp); // store the region bitmap } else { bitmap->setSegNum(segNum); - segments.push_back(bitmap); + segments.push_back(std::move(bitmap)); } } @@ -2201,10 +2187,10 @@ eofError: return; } -JBIG2Bitmap *JBIG2Stream::readTextRegion(bool huff, bool refine, int w, int h, unsigned int numInstances, unsigned int logStrips, int numSyms, const JBIG2HuffmanTable *symCodeTab, unsigned int symCodeLen, JBIG2Bitmap **syms, - unsigned int defPixel, unsigned int combOp, unsigned int transposed, unsigned int refCorner, int sOffset, const JBIG2HuffmanTable *huffFSTable, const JBIG2HuffmanTable *huffDSTable, - const JBIG2HuffmanTable *huffDTTable, const JBIG2HuffmanTable *huffRDWTable, const JBIG2HuffmanTable *huffRDHTable, const JBIG2HuffmanTable *huffRDXTable, const JBIG2HuffmanTable *huffRDYTable, - const JBIG2HuffmanTable *huffRSizeTable, unsigned int templ, int *atx, int *aty) +std::unique_ptr<JBIG2Bitmap> JBIG2Stream::readTextRegion(bool huff, bool refine, int w, int h, unsigned int numInstances, unsigned int logStrips, int numSyms, const JBIG2HuffmanTable *symCodeTab, unsigned int symCodeLen, JBIG2Bitmap **syms, + unsigned int defPixel, unsigned int combOp, unsigned int transposed, unsigned int refCorner, int sOffset, const JBIG2HuffmanTable *huffFSTable, const JBIG2HuffmanTable *huffDSTable, + const JBIG2HuffmanTable *huffDTTable, const JBIG2HuffmanTable *huffRDWTable, const JBIG2HuffmanTable *huffRDHTable, const JBIG2HuffmanTable *huffRDXTable, + const JBIG2HuffmanTable *huffRDYTable, const JBIG2HuffmanTable *huffRSizeTable, unsigned int templ, int *atx, int *aty) { JBIG2Bitmap *symbolBitmap; unsigned int strips; @@ -2328,7 +2314,7 @@ JBIG2Bitmap *JBIG2Stream::readTextRegion(bool huff, bool refine, int w, int h, u refDX = ((rdw >= 0) ? rdw : rdw - 1) / 2 + rdx; refDY = ((rdh >= 0) ? rdh : rdh - 1) / 2 + rdy; - symbolBitmap = readGenericRefinementRegion(rdw + syms[symID]->getWidth(), rdh + syms[symID]->getHeight(), templ, false, syms[symID], refDX, refDY, atx, aty); + symbolBitmap = readGenericRefinementRegion(rdw + syms[symID]->getWidth(), rdh + syms[symID]->getHeight(), templ, false, syms[symID], refDX, refDY, atx, aty).release(); } //~ do we need to use the bmSize value here (in Huffman mode)? } else { @@ -2444,13 +2430,13 @@ JBIG2Bitmap *JBIG2Stream::readTextRegion(bool huff, bool refine, int w, int h, u } } - return bitmap.release(); + return bitmap; } void JBIG2Stream::readPatternDictSeg(unsigned int segNum, unsigned int length) { - JBIG2PatternDict *patternDict; - JBIG2Bitmap *bitmap; + std::unique_ptr<JBIG2PatternDict> patternDict; + std::unique_ptr<JBIG2Bitmap> bitmap; unsigned int flags, patternW, patternH, grayMax, templ, mmr; int atx[4], aty[4]; unsigned int i, x; @@ -2483,7 +2469,7 @@ void JBIG2Stream::readPatternDictSeg(unsigned int segNum, unsigned int length) return; // create the pattern dict object - patternDict = new JBIG2PatternDict(segNum, grayMax + 1); + patternDict = std::make_unique<JBIG2PatternDict>(segNum, grayMax + 1); // split up the bitmap x = 0; @@ -2492,11 +2478,8 @@ void JBIG2Stream::readPatternDictSeg(unsigned int segNum, unsigned int length) x += patternW; } - // free memory - delete bitmap; - // store the new pattern dict - segments.push_back(patternDict); + segments.push_back(std::move(patternDict)); return; @@ -2506,12 +2489,11 @@ eofError: void JBIG2Stream::readHalftoneRegionSeg(unsigned int segNum, bool imm, bool lossless, unsigned int length, unsigned int *refSegs, unsigned int nRefSegs) { - JBIG2Bitmap *bitmap; + std::unique_ptr<JBIG2Bitmap> bitmap; JBIG2Segment *seg; JBIG2PatternDict *patternDict; JBIG2Bitmap *skipBitmap; unsigned int *grayImg; - JBIG2Bitmap *grayBitmap; JBIG2Bitmap *patternBitmap; unsigned int w, h, x, y, segInfoFlags, extCombOp; unsigned int flags, mmr, templ, enableSkip, combOp; @@ -2585,7 +2567,7 @@ void JBIG2Stream::readHalftoneRegionSeg(unsigned int segNum, bool imm, bool loss } // allocate the bitmap - bitmap = new JBIG2Bitmap(segNum, w, h); + bitmap = std::make_unique<JBIG2Bitmap>(segNum, w, h); if (flags & 0x80) { // HDEFPIXEL bitmap->clearToOne(); } else { @@ -2620,7 +2602,7 @@ void JBIG2Stream::readHalftoneRegionSeg(unsigned int segNum, bool imm, bool loss atx[3] = -2; aty[3] = -2; for (j = bpp - 1; j >= 0; --j) { - grayBitmap = readGenericBitmap(mmr, gridW, gridH, templ, false, enableSkip, skipBitmap, atx, aty, -1); + std::unique_ptr<JBIG2Bitmap> grayBitmap = readGenericBitmap(mmr, gridW, gridH, templ, false, enableSkip, skipBitmap, atx, aty, -1); i = 0; for (m = 0; m < gridH; ++m) { for (n = 0; n < gridW; ++n) { @@ -2629,7 +2611,6 @@ void JBIG2Stream::readHalftoneRegionSeg(unsigned int segNum, bool imm, bool loss ++i; } } - delete grayBitmap; } // decode the image @@ -2642,7 +2623,6 @@ void JBIG2Stream::readHalftoneRegionSeg(unsigned int segNum, bool imm, bool loss patternBitmap = patternDict->getBitmap(grayImg[i]); if (unlikely(patternBitmap == nullptr)) { delete skipBitmap; - delete bitmap; gfree(grayImg); error(errSyntaxError, curStr->getPos(), "Bad pattern bitmap"); return; @@ -2665,12 +2645,11 @@ void JBIG2Stream::readHalftoneRegionSeg(unsigned int segNum, bool imm, bool loss if (pageH == 0xffffffff && y + h > curPageH) { pageBitmap->expand(y + h, pageDefPixel); } - pageBitmap->combine(bitmap, x, y, extCombOp); - delete bitmap; + pageBitmap->combine(bitmap.get(), x, y, extCombOp); // store the region bitmap } else { - segments.push_back(bitmap); + segments.push_back(std::move(bitmap)); } return; @@ -2681,7 +2660,7 @@ eofError: void JBIG2Stream::readGenericRegionSeg(unsigned int segNum, bool imm, bool lossless, unsigned int length) { - JBIG2Bitmap *bitmap; + std::unique_ptr<JBIG2Bitmap> bitmap; unsigned int w, h, x, y, segInfoFlags, extCombOp, rowCount; unsigned int flags, mmr, templ, tpgdOn; int atx[4], aty[4]; @@ -2729,13 +2708,12 @@ void JBIG2Stream::readGenericRegionSeg(unsigned int segNum, bool imm, bool lossl if (pageH == 0xffffffff && y + h > curPageH) { pageBitmap->expand(y + h, pageDefPixel); } - pageBitmap->combine(bitmap, x, y, extCombOp); - delete bitmap; + pageBitmap->combine(bitmap.get(), x, y, extCombOp); // store the region bitmap } else { bitmap->setSegNum(segNum); - segments.push_back(bitmap); + segments.push_back(std::move(bitmap)); } // immediate generic segments can have an unspecified length, in @@ -2787,9 +2765,8 @@ inline void JBIG2Stream::mmrAddPixelsNeg(int a1, int blackPixels, int *codingLin } } -JBIG2Bitmap *JBIG2Stream::readGenericBitmap(bool mmr, int w, int h, int templ, bool tpgdOn, bool useSkip, JBIG2Bitmap *skip, int *atx, int *aty, int mmrDataLength) +std::unique_ptr<JBIG2Bitmap> JBIG2Stream::readGenericBitmap(bool mmr, int w, int h, int templ, bool tpgdOn, bool useSkip, JBIG2Bitmap *skip, int *atx, int *aty, int mmrDataLength) { - JBIG2Bitmap *bitmap; bool ltp; unsigned int ltpCX, cx, cx0, cx1, cx2; int *refLine, *codingLine; @@ -2802,9 +2779,8 @@ JBIG2Bitmap *JBIG2Stream::readGenericBitmap(bool mmr, int w, int h, int templ, b unsigned char mask; int x, y, x0, x1, a0i, b1i, blackPixels, pix, i; - bitmap = new JBIG2Bitmap(0, w, h); + auto bitmap = std::make_unique<JBIG2Bitmap>(0, w, h); if (!bitmap->isOk()) { - delete bitmap; return nullptr; } bitmap->clearToZero(); @@ -2823,7 +2799,6 @@ JBIG2Bitmap *JBIG2Stream::readGenericBitmap(bool mmr, int w, int h, int templ, b if (unlikely(!codingLine || !refLine)) { error(errSyntaxError, curStr->getPos(), "Bad width in JBIG2 generic bitmap"); - delete bitmap; return nullptr; } @@ -3557,7 +3532,8 @@ JBIG2Bitmap *JBIG2Stream::readGenericBitmap(bool mmr, int w, int h, int templ, b void JBIG2Stream::readGenericRefinementRegionSeg(unsigned int segNum, bool imm, bool lossless, unsigned int length, unsigned int *refSegs, unsigned int nRefSegs) { - JBIG2Bitmap *bitmap, *refBitmap; + std::unique_ptr<JBIG2Bitmap> bitmap; + JBIG2Bitmap *refBitmap; unsigned int w, h, x, y, segInfoFlags, extCombOp; unsigned int flags, templ, tpgrOn; int atx[2], aty[2]; @@ -3615,14 +3591,13 @@ void JBIG2Stream::readGenericRefinementRegionSeg(unsigned int segNum, bool imm, // combine the region bitmap into the page bitmap if (imm && bitmap) { - pageBitmap->combine(bitmap, x, y, extCombOp); - delete bitmap; + pageBitmap->combine(bitmap.get(), x, y, extCombOp); // store the region bitmap } else { if (bitmap) { bitmap->setSegNum(segNum); - segments.push_back(bitmap); + segments.push_back(std::move(bitmap)); } else { error(errSyntaxError, curStr->getPos(), "readGenericRefinementRegionSeg with null bitmap"); } @@ -3641,9 +3616,8 @@ eofError: error(errSyntaxError, curStr->getPos(), "Unexpected EOF in JBIG2 stream"); } -JBIG2Bitmap *JBIG2Stream::readGenericRefinementRegion(int w, int h, int templ, bool tpgrOn, JBIG2Bitmap *refBitmap, int refDX, int refDY, int *atx, int *aty) +std::unique_ptr<JBIG2Bitmap> JBIG2Stream::readGenericRefinementRegion(int w, int h, int templ, bool tpgrOn, JBIG2Bitmap *refBitmap, int refDX, int refDY, int *atx, int *aty) { - JBIG2Bitmap *bitmap; bool ltp; unsigned int ltpCX, cx, cx0, cx2, cx3, cx4, tpgrCX0, tpgrCX1, tpgrCX2; JBIG2BitmapPtr cxPtr0 = { nullptr, 0, 0 }; @@ -3662,9 +3636,8 @@ JBIG2Bitmap *JBIG2Stream::readGenericRefinementRegion(int w, int h, int templ, b return nullptr; } - bitmap = new JBIG2Bitmap(0, w, h); + auto bitmap = std::make_unique<JBIG2Bitmap>(0, w, h); if (!bitmap->isOk()) { - delete bitmap; return nullptr; } bitmap->clearToZero(); @@ -3943,7 +3916,7 @@ void JBIG2Stream::readCodeTableSeg(unsigned int segNum, unsigned int length) huffTab[i].rangeLen = jbig2HuffmanEOT; if (JBIG2HuffmanDecoder::buildTable(huffTab, i)) { // create and store the new table segment - segments.push_back(new JBIG2CodeTable(segNum, huffTab)); + segments.push_back(std::make_unique<JBIG2CodeTable>(segNum, huffTab)); } else { free(huffTab); } @@ -3964,14 +3937,14 @@ void JBIG2Stream::readExtensionSeg(unsigned int length) JBIG2Segment *JBIG2Stream::findSegment(unsigned int segNum) { - for (JBIG2Segment *seg : globalSegments) { + for (std::unique_ptr<JBIG2Segment> &seg : globalSegments) { if (seg->getSegNum() == segNum) { - return seg; + return seg.get(); } } - for (JBIG2Segment *seg : segments) { + for (std::unique_ptr<JBIG2Segment> &seg : segments) { if (seg->getSegNum() == segNum) { - return seg; + return seg.get(); } } return nullptr; @@ -3980,15 +3953,13 @@ JBIG2Segment *JBIG2Stream::findSegment(unsigned int segNum) void JBIG2Stream::discardSegment(unsigned int segNum) { for (auto it = globalSegments.begin(); it != globalSegments.end(); ++it) { - auto seg = static_cast<JBIG2Segment *>(*it); - if (seg->getSegNum() == segNum) { + if ((*it)->getSegNum() == segNum) { globalSegments.erase(it); return; } } for (auto it = segments.begin(); it != segments.end(); ++it) { - auto seg = static_cast<JBIG2Segment *>(*it); - if (seg->getSegNum() == segNum) { + if ((*it)->getSegNum() == segNum) { segments.erase(it); return; } diff --git a/poppler/JBIG2Stream.h b/poppler/JBIG2Stream.h index abc94ccd..f3da7586 100644 --- a/poppler/JBIG2Stream.h +++ b/poppler/JBIG2Stream.h @@ -62,23 +62,21 @@ private: bool hasGetChars() override { return true; } int getChars(int nChars, unsigned char *buffer) override; - void freeSegments(); - void readSegments(); bool readSymbolDictSeg(unsigned int segNum, unsigned int length, unsigned int *refSegs, unsigned int nRefSegs); void readTextRegionSeg(unsigned int segNum, bool imm, bool lossless, unsigned int length, unsigned int *refSegs, unsigned int nRefSegs); - JBIG2Bitmap *readTextRegion(bool huff, bool refine, int w, int h, unsigned int numInstances, unsigned int logStrips, int numSyms, const JBIG2HuffmanTable *symCodeTab, unsigned int symCodeLen, JBIG2Bitmap **syms, unsigned int defPixel, - unsigned int combOp, unsigned int transposed, unsigned int refCorner, int sOffset, const JBIG2HuffmanTable *huffFSTable, const JBIG2HuffmanTable *huffDSTable, const JBIG2HuffmanTable *huffDTTable, - const JBIG2HuffmanTable *huffRDWTable, const JBIG2HuffmanTable *huffRDHTable, const JBIG2HuffmanTable *huffRDXTable, const JBIG2HuffmanTable *huffRDYTable, const JBIG2HuffmanTable *huffRSizeTable, - unsigned int templ, int *atx, int *aty); + std::unique_ptr<JBIG2Bitmap> readTextRegion(bool huff, bool refine, int w, int h, unsigned int numInstances, unsigned int logStrips, int numSyms, const JBIG2HuffmanTable *symCodeTab, unsigned int symCodeLen, JBIG2Bitmap **syms, + unsigned int defPixel, unsigned int combOp, unsigned int transposed, unsigned int refCorner, int sOffset, const JBIG2HuffmanTable *huffFSTable, const JBIG2HuffmanTable *huffDSTable, + const JBIG2HuffmanTable *huffDTTable, const JBIG2HuffmanTable *huffRDWTable, const JBIG2HuffmanTable *huffRDHTable, const JBIG2HuffmanTable *huffRDXTable, + const JBIG2HuffmanTable *huffRDYTable, const JBIG2HuffmanTable *huffRSizeTable, unsigned int templ, int *atx, int *aty); void readPatternDictSeg(unsigned int segNum, unsigned int length); void readHalftoneRegionSeg(unsigned int segNum, bool imm, bool lossless, unsigned int length, unsigned int *refSegs, unsigned int nRefSegs); void readGenericRegionSeg(unsigned int segNum, bool imm, bool lossless, unsigned int length); void mmrAddPixels(int a1, int blackPixels, int *codingLine, int *a0i, int w); void mmrAddPixelsNeg(int a1, int blackPixels, int *codingLine, int *a0i, int w); - JBIG2Bitmap *readGenericBitmap(bool mmr, int w, int h, int templ, bool tpgdOn, bool useSkip, JBIG2Bitmap *skip, int *atx, int *aty, int mmrDataLength); + std::unique_ptr<JBIG2Bitmap> readGenericBitmap(bool mmr, int w, int h, int templ, bool tpgdOn, bool useSkip, JBIG2Bitmap *skip, int *atx, int *aty, int mmrDataLength); void readGenericRefinementRegionSeg(unsigned int segNum, bool imm, bool lossless, unsigned int length, unsigned int *refSegs, unsigned int nRefSegs); - JBIG2Bitmap *readGenericRefinementRegion(int w, int h, int templ, bool tpgrOn, JBIG2Bitmap *refBitmap, int refDX, int refDY, int *atx, int *aty); + std::unique_ptr<JBIG2Bitmap> readGenericRefinementRegion(int w, int h, int templ, bool tpgrOn, JBIG2Bitmap *refBitmap, int refDX, int refDY, int *atx, int *aty); void readPageInfoSeg(unsigned int length); void readEndOfStripeSeg(unsigned int length); void readProfilesSeg(unsigned int length); @@ -101,8 +99,8 @@ private: unsigned int pageDefPixel; JBIG2Bitmap *pageBitmap; unsigned int defCombOp; - std::vector<JBIG2Segment *> segments; - std::vector<JBIG2Segment *> globalSegments; + std::vector<std::unique_ptr<JBIG2Segment>> segments; + std::vector<std::unique_ptr<JBIG2Segment>> globalSegments; Stream *curStr; unsigned char *dataPtr; unsigned char *dataEnd; _______________________________________________ poppler mailing list [email protected] https://lists.freedesktop.org/mailman/listinfo/poppler
