poppler/Annot.cc | 16 ++---- poppler/SplashOutputDev.cc | 3 - poppler/Stream.cc | 83 -------------------------------- poppler/Stream.h | 116 ++++++++++++++++++++++++++++++++++++++------- 4 files changed, 105 insertions(+), 113 deletions(-)
New commits: commit f3551055dab57eb0bc544070b15c6a7435585003 Author: Albert Astals Cid <[email protected]> Date: Fri Apr 6 12:19:54 2018 +0200 Introduce AutoFreeMemStream This is done by turning the old MemStream implementation to a new template implementation in BaseMemStream and inheriting from it MemStream for const char * and AutoFreeMemStream for char *. This way we make clear one frees the data and the other does not, while also removing the ugly setNeedsFree in MemStream diff --git a/poppler/Annot.cc b/poppler/Annot.cc index c66096e7..2752bc7e 100644 --- a/poppler/Annot.cc +++ b/poppler/Annot.cc @@ -1747,10 +1747,9 @@ Object Annot::createForm(const GooString *appearBuf, double *bbox, GBool transpa if (resDict) appearDict->set("Resources", Object(resDict)); - MemStream *mStream = new MemStream(copyString(appearBuf->getCString()), 0, + Stream *mStream = new AutoFreeMemStream(copyString(appearBuf->getCString()), 0, appearBuf->getLength(), Object(appearDict)); - mStream->setNeedFree(gTrue); - return Object(static_cast<Stream*>(mStream)); + return Object(mStream); } Dict *Annot::createResourcesDict(const char *formName, Object &&formStream, @@ -4898,11 +4897,9 @@ void AnnotWidget::generateFieldAppearance(bool *addedDingbatsResource) { } // build the appearance stream - MemStream *appearStream = new MemStream(copyString(appearBuf->getCString()), 0, + Stream *appearStream = new AutoFreeMemStream(copyString(appearBuf->getCString()), 0, appearBuf->getLength(), Object(appearDict)); - appearance = Object(static_cast<Stream*>(appearStream)); - - appearStream->setNeedFree(gTrue); + appearance = Object(appearStream); } void AnnotWidget::updateAppearanceStream() @@ -5085,13 +5082,12 @@ void AnnotMovie::draw(Gfx *gfx, GBool printing) { formDict->set("Matrix", Object(matrix)); formDict->set("Resources", Object(resDict)); - MemStream *mStream = new MemStream(copyString(appearBuf->getCString()), 0, + Stream *mStream = new AutoFreeMemStream(copyString(appearBuf->getCString()), 0, appearBuf->getLength(), Object(formDict)); - mStream->setNeedFree(gTrue); delete appearBuf; Dict *dict = new Dict(gfx->getXRef()); - dict->set("FRM", Object(static_cast<Stream*>(mStream))); + dict->set("FRM", Object(mStream)); Dict *resDict2 = new Dict(gfx->getXRef()); resDict2->set("XObject", Object(dict)); diff --git a/poppler/SplashOutputDev.cc b/poppler/SplashOutputDev.cc index 253df7f0..73963302 100644 --- a/poppler/SplashOutputDev.cc +++ b/poppler/SplashOutputDev.cc @@ -3979,8 +3979,7 @@ void SplashOutputDev::drawSoftMaskedImage(GfxState *state, Object *ref, maskStr->reset(); maskStr->doGetChars(maskWidth * maskHeight, data); maskStr->close(); - maskStr = new MemStream((char *)data, 0, maskWidth * maskHeight, maskStr->getDictObject()->copy()); - ((MemStream *) maskStr)->setNeedFree(gTrue); + maskStr = new AutoFreeMemStream((char *)data, 0, maskWidth * maskHeight, maskStr->getDictObject()->copy()); } imgMaskData.imgStr = new ImageStream(maskStr, maskWidth, maskColorMap->getNumPixelComps(), diff --git a/poppler/Stream.h b/poppler/Stream.h index 8d98ef75..3eca7452 100644 --- a/poppler/Stream.h +++ b/poppler/Stream.h @@ -567,30 +567,23 @@ private: // MemStream //------------------------------------------------------------------------ -class MemStream: public BaseStream { +template<typename T> +class BaseMemStream: public BaseStream { public: - MemStream(char *bufA, Goffset startA, Goffset lengthA, Object &&dictA) : BaseStream(std::move(dictA), lengthA) { + BaseMemStream(T *bufA, Goffset startA, Goffset lengthA, Object &&dictA) : BaseStream(std::move(dictA), lengthA) { buf = bufA; start = startA; length = lengthA; bufEnd = buf + start + length; bufPtr = buf + start; - needFree = gFalse; - } - - ~MemStream() { - if (needFree) { - gfree(buf); - } } BaseStream *copy() override { - return new MemStream(buf, start, length, dict.copy()); + return new BaseMemStream(buf, start, length, dict.copy()); } Stream *makeSubStream(Goffset startA, GBool limited, Goffset lengthA, Object &&dictA) override { - MemStream *subStr; Goffset newLength; if (!limited || startA + lengthA > start + length) { @@ -598,8 +591,7 @@ public: } else { newLength = lengthA; } - subStr = new MemStream(buf, startA, newLength, std::move(dictA)); - return subStr; + return new BaseMemStream(buf, startA, newLength, std::move(dictA)); } StreamKind getKind() override { return strWeird; } @@ -642,14 +634,13 @@ public: bufPtr = buf + start; } - //if needFree = true, the stream will delete buf when it is destroyed - //otherwise it will not touch it. Default value is false - virtual void setNeedFree (GBool val) { needFree = val; } - int getUnfilteredChar () override { return getChar(); } void unfilteredReset () override { reset (); } +protected: + T *buf; + private: GBool hasGetChars() override { return true; } @@ -670,13 +661,31 @@ private: return n; } - char *buf; Goffset start; - char *bufEnd; - char *bufPtr; - GBool needFree; + T *bufEnd; + T *bufPtr; }; +class MemStream : public BaseMemStream<const char> +{ +public: + MemStream(const char *bufA, Goffset startA, Goffset lengthA, Object &&dictA) + : BaseMemStream(bufA, startA, lengthA, std::move(dictA)) + { } +}; + +class AutoFreeMemStream : public BaseMemStream<char> +{ +public: + AutoFreeMemStream(char *bufA, Goffset startA, Goffset lengthA, Object &&dictA) + : BaseMemStream(bufA, startA, lengthA, std::move(dictA)) + { } + + ~AutoFreeMemStream() + { gfree(buf); } +}; + + //------------------------------------------------------------------------ // EmbedStream // commit 4cc89c79f58cb416aae8396190a788e1398113ff Author: Albert Astals Cid <[email protected]> Date: Fri Apr 6 12:11:55 2018 +0200 Move MemStream implementation to header Will be useful in next step where we turn it into a template diff --git a/poppler/Stream.cc b/poppler/Stream.cc index 0602c7bb..dd8bfc1a 100644 --- a/poppler/Stream.cc +++ b/poppler/Stream.cc @@ -951,89 +951,6 @@ void CachedFileStream::moveStart(Goffset delta) } //------------------------------------------------------------------------ -// MemStream -//------------------------------------------------------------------------ - -MemStream::MemStream(char *bufA, Goffset startA, Goffset lengthA, Object &&dictA): - BaseStream(std::move(dictA), lengthA) { - buf = bufA; - start = startA; - length = lengthA; - bufEnd = buf + start + length; - bufPtr = buf + start; - needFree = gFalse; -} - -MemStream::~MemStream() { - if (needFree) { - gfree(buf); - } -} - -BaseStream *MemStream::copy() { - return new MemStream(buf, start, length, dict.copy()); -} - -Stream *MemStream::makeSubStream(Goffset startA, GBool limited, - Goffset lengthA, Object &&dictA) { - MemStream *subStr; - Goffset newLength; - - if (!limited || startA + lengthA > start + length) { - newLength = start + length - startA; - } else { - newLength = lengthA; - } - subStr = new MemStream(buf, startA, newLength, std::move(dictA)); - return subStr; -} - -void MemStream::reset() { - bufPtr = buf + start; -} - -void MemStream::close() { -} - -int MemStream::getChars(int nChars, Guchar *buffer) { - int n; - - if (nChars <= 0) { - return 0; - } - if (bufEnd - bufPtr < nChars) { - n = (int)(bufEnd - bufPtr); - } else { - n = nChars; - } - memcpy(buffer, bufPtr, n); - bufPtr += n; - return n; -} - -void MemStream::setPos(Goffset pos, int dir) { - Guint i; - - if (dir >= 0) { - i = pos; - } else { - i = start + length - pos; - } - if (i < start) { - i = start; - } else if (i > start + length) { - i = start + length; - } - bufPtr = buf + i; -} - -void MemStream::moveStart(Goffset delta) { - start += delta; - length -= delta; - bufPtr = buf + start; -} - -//------------------------------------------------------------------------ // EmbedStream //------------------------------------------------------------------------ diff --git a/poppler/Stream.h b/poppler/Stream.h index b58da825..8d98ef75 100644 --- a/poppler/Stream.h +++ b/poppler/Stream.h @@ -570,34 +570,105 @@ private: class MemStream: public BaseStream { public: - MemStream(char *bufA, Goffset startA, Goffset lengthA, Object &&dictA); - ~MemStream(); - BaseStream *copy() override; - Stream *makeSubStream(Goffset start, GBool limited, - Goffset lengthA, Object &&dictA) override; + MemStream(char *bufA, Goffset startA, Goffset lengthA, Object &&dictA) : BaseStream(std::move(dictA), lengthA) { + buf = bufA; + start = startA; + length = lengthA; + bufEnd = buf + start + length; + bufPtr = buf + start; + needFree = gFalse; + } + + ~MemStream() { + if (needFree) { + gfree(buf); + } + } + + BaseStream *copy() override { + return new MemStream(buf, start, length, dict.copy()); + } + + Stream *makeSubStream(Goffset startA, GBool limited, Goffset lengthA, Object &&dictA) override { + MemStream *subStr; + Goffset newLength; + + if (!limited || startA + lengthA > start + length) { + newLength = start + length - startA; + } else { + newLength = lengthA; + } + subStr = new MemStream(buf, startA, newLength, std::move(dictA)); + return subStr; + } + StreamKind getKind() override { return strWeird; } - void reset() override; - void close() override; + + void reset() override { + bufPtr = buf + start; + } + + void close() override { } + int getChar() override { return (bufPtr < bufEnd) ? (*bufPtr++ & 0xff) : EOF; } + int lookChar() override { return (bufPtr < bufEnd) ? (*bufPtr & 0xff) : EOF; } + Goffset getPos() override { return (int)(bufPtr - buf); } - void setPos(Goffset pos, int dir = 0) override; + + void setPos(Goffset pos, int dir = 0) override { + Guint i; + + if (dir >= 0) { + i = pos; + } else { + i = start + length - pos; + } + if (i < start) { + i = start; + } else if (i > start + length) { + i = start + length; + } + bufPtr = buf + i; + } + Goffset getStart() override { return start; } - void moveStart(Goffset delta) override; + + void moveStart(Goffset delta) override { + start += delta; + length -= delta; + bufPtr = buf + start; + } //if needFree = true, the stream will delete buf when it is destroyed //otherwise it will not touch it. Default value is false virtual void setNeedFree (GBool val) { needFree = val; } int getUnfilteredChar () override { return getChar(); } + void unfilteredReset () override { reset (); } private: GBool hasGetChars() override { return true; } - int getChars(int nChars, Guchar *buffer) override; + + int getChars(int nChars, Guchar *buffer) override { + int n; + + if (nChars <= 0) { + return 0; + } + if (bufEnd - bufPtr < nChars) { + n = (int)(bufEnd - bufPtr); + } else { + n = nChars; + } + memcpy(buffer, bufPtr, n); + bufPtr += n; + return n; + } char *buf; Goffset start; _______________________________________________ poppler mailing list [email protected] https://lists.freedesktop.org/mailman/listinfo/poppler
