fofi/FoFiTrueType.cc | 47 +++--------------- fofi/FoFiType1C.cc | 103 +++------------------------------------- glib/poppler-document.cc | 6 +- goo/GooString.cc | 8 +-- goo/GooString.h | 5 + poppler/Annot.cc | 6 -- poppler/CurlCachedFile.cc | 6 -- poppler/Error.cc | 4 - poppler/PSOutputDev.cc | 48 +++++++----------- qt5/tests/check_annotations.cpp | 3 - qt5/tests/check_goostring.cpp | 28 +++++----- qt6/tests/check_annotations.cpp | 3 - qt6/tests/check_goostring.cpp | 28 +++++----- utils/HtmlOutputDev.cc | 75 +++++++++++------------------ utils/HtmlOutputDev.h | 6 +- utils/pdfsig.cc | 6 -- utils/pdftohtml.cc | 5 - 17 files changed, 118 insertions(+), 269 deletions(-)
New commits: commit 022b361d431185f384456451c4bebe04a9fd1140 Author: Albert Astals Cid <aa...@kde.org> Date: Wed Mar 30 13:48:43 2022 +0200 Make GooString::format[v] return an unique_ptr diff --git a/fofi/FoFiTrueType.cc b/fofi/FoFiTrueType.cc index ed37741b..020a374c 100644 --- a/fofi/FoFiTrueType.cc +++ b/fofi/FoFiTrueType.cc @@ -731,7 +731,6 @@ void FoFiTrueType::getFontMatrix(double *mat) const void FoFiTrueType::convertToType42(const char *psName, char **encoding, int *codeToGID, FoFiOutputFunc outputFunc, void *outputStream) const { - GooString *buf; int maxUsedGlyph; bool ok; @@ -741,9 +740,8 @@ void FoFiTrueType::convertToType42(const char *psName, char **encoding, int *cod // write the header ok = true; - buf = GooString::format("%!PS-TrueTypeFont-{0:2g}\n", (double)getS32BE(0, &ok) / 65536.0); + std::unique_ptr<GooString> buf = GooString::format("%!PS-TrueTypeFont-{0:2g}\n", (double)getS32BE(0, &ok) / 65536.0); (*outputFunc)(outputStream, buf->c_str(), buf->getLength()); - delete buf; // begin the font dictionary (*outputFunc)(outputStream, "10 dict begin\n", 14); @@ -754,7 +752,6 @@ void FoFiTrueType::convertToType42(const char *psName, char **encoding, int *cod (*outputFunc)(outputStream, "/FontMatrix [1 0 0 1 0 0] def\n", 30); buf = GooString::format("/FontBBox [{0:d} {1:d} {2:d} {3:d}] def\n", bbox[0], bbox[1], bbox[2], bbox[3]); (*outputFunc)(outputStream, buf->c_str(), buf->getLength()); - delete buf; (*outputFunc)(outputStream, "/PaintType 0 def\n", 17); // write the guts of the dictionary @@ -784,7 +781,6 @@ void FoFiTrueType::convertToType1(const char *psName, const char **newEncoding, void FoFiTrueType::convertToCIDType2(const char *psName, const int *cidMap, int nCIDs, bool needVerticalMetrics, FoFiOutputFunc outputFunc, void *outputStream) const { - GooString *buf; int cid, maxUsedGlyph; bool ok; int i, j, k; @@ -795,9 +791,8 @@ void FoFiTrueType::convertToCIDType2(const char *psName, const int *cidMap, int // write the header ok = true; - buf = GooString::format("%!PS-TrueTypeFont-{0:2g}\n", (double)getS32BE(0, &ok) / 65536.0); + std::unique_ptr<GooString> buf = GooString::format("%!PS-TrueTypeFont-{0:2g}\n", (double)getS32BE(0, &ok) / 65536.0); (*outputFunc)(outputStream, buf->c_str(), buf->getLength()); - delete buf; // begin the font dictionary (*outputFunc)(outputStream, "20 dict begin\n", 14); @@ -815,7 +810,6 @@ void FoFiTrueType::convertToCIDType2(const char *psName, const int *cidMap, int if (cidMap) { buf = GooString::format("/CIDCount {0:d} def\n", nCIDs); (*outputFunc)(outputStream, buf->c_str(), buf->getLength()); - delete buf; if (nCIDs > 32767) { (*outputFunc)(outputStream, "/CIDMap [", 9); for (i = 0; i < nCIDs; i += 32768 - 16) { @@ -826,7 +820,6 @@ void FoFiTrueType::convertToCIDType2(const char *psName, const int *cidMap, int cid = cidMap[i + j + k]; buf = GooString::format("{0:02x}{1:02x}", (cid >> 8) & 0xff, cid & 0xff); (*outputFunc)(outputStream, buf->c_str(), buf->getLength()); - delete buf; } (*outputFunc)(outputStream, "\n", 1); } @@ -842,7 +835,6 @@ void FoFiTrueType::convertToCIDType2(const char *psName, const int *cidMap, int cid = cidMap[i + j]; buf = GooString::format("{0:02x}{1:02x}", (cid >> 8) & 0xff, cid & 0xff); (*outputFunc)(outputStream, buf->c_str(), buf->getLength()); - delete buf; } (*outputFunc)(outputStream, "\n", 1); } @@ -852,32 +844,26 @@ void FoFiTrueType::convertToCIDType2(const char *psName, const int *cidMap, int // direct mapping - just fill the string(s) with s[i]=i buf = GooString::format("/CIDCount {0:d} def\n", nGlyphs); (*outputFunc)(outputStream, buf->c_str(), buf->getLength()); - delete buf; if (nGlyphs > 32767) { (*outputFunc)(outputStream, "/CIDMap [\n", 10); for (i = 0; i < nGlyphs; i += 32767) { j = nGlyphs - i < 32767 ? nGlyphs - i : 32767; buf = GooString::format(" {0:d} string 0 1 {1:d} {{\n", 2 * j, j - 1); (*outputFunc)(outputStream, buf->c_str(), buf->getLength()); - delete buf; buf = GooString::format(" 2 copy dup 2 mul exch {0:d} add -8 bitshift put\n", i); (*outputFunc)(outputStream, buf->c_str(), buf->getLength()); - delete buf; buf = GooString::format(" 1 index exch dup 2 mul 1 add exch {0:d} add" " 255 and put\n", i); (*outputFunc)(outputStream, buf->c_str(), buf->getLength()); - delete buf; (*outputFunc)(outputStream, " } for\n", 8); } (*outputFunc)(outputStream, "] def\n", 6); } else { buf = GooString::format("/CIDMap {0:d} string\n", 2 * nGlyphs); (*outputFunc)(outputStream, buf->c_str(), buf->getLength()); - delete buf; buf = GooString::format(" 0 1 {0:d} {{\n", nGlyphs - 1); (*outputFunc)(outputStream, buf->c_str(), buf->getLength()); - delete buf; (*outputFunc)(outputStream, " 2 copy dup 2 mul exch -8 bitshift put\n", 42); (*outputFunc)(outputStream, " 1 index exch dup 2 mul 1 add exch 255 and put\n", 50); (*outputFunc)(outputStream, " } for\n", 8); @@ -887,7 +873,6 @@ void FoFiTrueType::convertToCIDType2(const char *psName, const int *cidMap, int (*outputFunc)(outputStream, "/FontMatrix [1 0 0 1 0 0] def\n", 30); buf = GooString::format("/FontBBox [{0:d} {1:d} {2:d} {3:d}] def\n", bbox[0], bbox[1], bbox[2], bbox[3]); (*outputFunc)(outputStream, buf->c_str(), buf->getLength()); - delete buf; (*outputFunc)(outputStream, "/PaintType 0 def\n", 17); (*outputFunc)(outputStream, "/Encoding [] readonly def\n", 26); (*outputFunc)(outputStream, "/CharStrings 1 dict dup begin\n", 30); @@ -919,7 +904,6 @@ void FoFiTrueType::convertToCIDType0(const char *psName, int *cidMap, int nCIDs, void FoFiTrueType::convertToType0(const char *psName, int *cidMap, int nCIDs, bool needVerticalMetrics, int *maxValidGlyph, FoFiOutputFunc outputFunc, void *outputStream) const { - GooString *buf; GooString *sfntsName; int maxUsedGlyph, n, i, j; @@ -968,14 +952,12 @@ void FoFiTrueType::convertToType0(const char *psName, int *cidMap, int nCIDs, bo (*outputFunc)(outputStream, "10 dict begin\n", 14); (*outputFunc)(outputStream, "/FontName /", 11); (*outputFunc)(outputStream, psName, strlen(psName)); - buf = GooString::format("_{0:02x} def\n", i >> 8); + std::unique_ptr<GooString> buf = GooString::format("_{0:02x} def\n", i >> 8); (*outputFunc)(outputStream, buf->c_str(), buf->getLength()); - delete buf; (*outputFunc)(outputStream, "/FontType 42 def\n", 17); (*outputFunc)(outputStream, "/FontMatrix [1 0 0 1 0 0] def\n", 30); buf = GooString::format("/FontBBox [{0:d} {1:d} {2:d} {3:d}] def\n", bbox[0], bbox[1], bbox[2], bbox[3]); (*outputFunc)(outputStream, buf->c_str(), buf->getLength()); - delete buf; (*outputFunc)(outputStream, "/PaintType 0 def\n", 17); (*outputFunc)(outputStream, "/sfnts ", 7); (*outputFunc)(outputStream, psName, strlen(psName)); @@ -984,7 +966,6 @@ void FoFiTrueType::convertToType0(const char *psName, int *cidMap, int nCIDs, bo for (j = 0; j < 256 && i + j < n; ++j) { buf = GooString::format("dup {0:d} /c{1:02x} put\n", j, j); (*outputFunc)(outputStream, buf->c_str(), buf->getLength()); - delete buf; } (*outputFunc)(outputStream, "readonly def\n", 13); (*outputFunc)(outputStream, "/CharStrings 257 dict dup begin\n", 32); @@ -992,7 +973,6 @@ void FoFiTrueType::convertToType0(const char *psName, int *cidMap, int nCIDs, bo for (j = 0; j < 256 && i + j < n; ++j) { buf = GooString::format("/c{0:02x} {1:d} def\n", j, cidMap ? cidMap[i + j] : i + j); (*outputFunc)(outputStream, buf->c_str(), buf->getLength()); - delete buf; } (*outputFunc)(outputStream, "end readonly def\n", 17); (*outputFunc)(outputStream, "FontName currentdict end definefont pop\n", 40); @@ -1008,18 +988,16 @@ void FoFiTrueType::convertToType0(const char *psName, int *cidMap, int nCIDs, bo (*outputFunc)(outputStream, "/FMapType 2 def\n", 16); (*outputFunc)(outputStream, "/Encoding [\n", 12); for (i = 0; i < n; i += 256) { - buf = GooString::format("{0:d}\n", i >> 8); + const std::unique_ptr<GooString> buf = GooString::format("{0:d}\n", i >> 8); (*outputFunc)(outputStream, buf->c_str(), buf->getLength()); - delete buf; } (*outputFunc)(outputStream, "] def\n", 6); (*outputFunc)(outputStream, "/FDepVector [\n", 14); for (i = 0; i < n; i += 256) { (*outputFunc)(outputStream, "/", 1); (*outputFunc)(outputStream, psName, strlen(psName)); - buf = GooString::format("_{0:02x} findfont\n", i >> 8); + const std::unique_ptr<GooString> buf = GooString::format("_{0:02x} findfont\n", i >> 8); (*outputFunc)(outputStream, buf->c_str(), buf->getLength()); - delete buf; } (*outputFunc)(outputStream, "] def\n", 6); (*outputFunc)(outputStream, "FontName currentdict end definefont pop\n", 40); @@ -1044,7 +1022,6 @@ void FoFiTrueType::convertToType0(const char *psName, int *cidMap, int nCIDs, Fo void FoFiTrueType::cvtEncoding(char **encoding, FoFiOutputFunc outputFunc, void *outputStream) const { const char *name; - GooString *buf; int i; (*outputFunc)(outputStream, "/Encoding 256 array\n", 20); @@ -1053,17 +1030,15 @@ void FoFiTrueType::cvtEncoding(char **encoding, FoFiOutputFunc outputFunc, void if (!(name = encoding[i])) { name = ".notdef"; } - buf = GooString::format("dup {0:d} /", i); + const std::unique_ptr<GooString> buf = GooString::format("dup {0:d} /", i); (*outputFunc)(outputStream, buf->c_str(), buf->getLength()); - delete buf; (*outputFunc)(outputStream, name, strlen(name)); (*outputFunc)(outputStream, " put\n", 5); } } else { for (i = 0; i < 256; ++i) { - buf = GooString::format("dup {0:d} /c{1:02x} put\n", i, i); + const std::unique_ptr<GooString> buf = GooString::format("dup {0:d} /c{1:02x} put\n", i, i); (*outputFunc)(outputStream, buf->c_str(), buf->getLength()); - delete buf; } } (*outputFunc)(outputStream, "readonly def\n", 13); @@ -1072,7 +1047,6 @@ void FoFiTrueType::cvtEncoding(char **encoding, FoFiOutputFunc outputFunc, void void FoFiTrueType::cvtCharStrings(char **encoding, const int *codeToGID, FoFiOutputFunc outputFunc, void *outputStream) const { const char *name; - GooString *buf; char buf2[16]; int i, k; @@ -1108,9 +1082,8 @@ void FoFiTrueType::cvtCharStrings(char **encoding, const int *codeToGID, FoFiOut if (k > 0 && k < nGlyphs) { (*outputFunc)(outputStream, "/", 1); (*outputFunc)(outputStream, name, strlen(name)); - buf = GooString::format(" {0:d} def\n", k); + const std::unique_ptr<GooString> buf = GooString::format(" {0:d} def\n", k); (*outputFunc)(outputStream, buf->c_str(), buf->getLength()); - delete buf; } } } @@ -1446,15 +1419,13 @@ void FoFiTrueType::cvtSfnts(FoFiOutputFunc outputFunc, void *outputStream, const void FoFiTrueType::dumpString(const unsigned char *s, int length, FoFiOutputFunc outputFunc, void *outputStream) const { - GooString *buf; int pad, i, j; (*outputFunc)(outputStream, "<", 1); for (i = 0; i < length; i += 32) { for (j = 0; j < 32 && i + j < length; ++j) { - buf = GooString::format("{0:02x}", s[i + j] & 0xff); + const std::unique_ptr<GooString> buf = GooString::format("{0:02x}", s[i + j] & 0xff); (*outputFunc)(outputStream, buf->c_str(), buf->getLength()); - delete buf; } if (i % (65536 - 32) == 65536 - 64) { (*outputFunc)(outputStream, ">\n<", 3); diff --git a/fofi/FoFiType1C.cc b/fofi/FoFiType1C.cc index 50a52247..a1511f1b 100644 --- a/fofi/FoFiType1C.cc +++ b/fofi/FoFiType1C.cc @@ -13,7 +13,7 @@ // All changes made under the Poppler project to this file are licensed // under GPL version 2 or later // -// Copyright (C) 2009, 2010, 2017-2021 Albert Astals Cid <aa...@kde.org> +// Copyright (C) 2009, 2010, 2017-2022 Albert Astals Cid <aa...@kde.org> // Copyright (C) 2012 Thomas Freitag <thomas.frei...@alfa.de> // Copyright (C) 2018 Adam Reichold <adam.reich...@t-online.de> // Copyright (C) 2019 Tomoyuki Kubota <himajin100...@gmail.com> @@ -192,7 +192,6 @@ void FoFiType1C::convertToType1(const char *psName, const char **newEncoding, bo Type1CEexecBuf eb; Type1CIndex subrIdx; Type1CIndexVal val; - GooString *buf; char buf2[256]; bool ok; int i; @@ -258,37 +257,29 @@ void FoFiType1C::convertToType1(const char *psName, const char **newEncoding, bo } else { (*outputFunc)(outputStream, "/isFixedPitch false def\n", 24); } - buf = GooString::format("/ItalicAngle {0:.4g} def\n", topDict.italicAngle); + std::unique_ptr<GooString> buf = GooString::format("/ItalicAngle {0:.4g} def\n", topDict.italicAngle); (*outputFunc)(outputStream, buf->c_str(), buf->getLength()); - delete buf; buf = GooString::format("/UnderlinePosition {0:.4g} def\n", topDict.underlinePosition); (*outputFunc)(outputStream, buf->c_str(), buf->getLength()); - delete buf; buf = GooString::format("/UnderlineThickness {0:.4g} def\n", topDict.underlineThickness); (*outputFunc)(outputStream, buf->c_str(), buf->getLength()); - delete buf; (*outputFunc)(outputStream, "end readonly def\n", 17); (*outputFunc)(outputStream, "/FontName /", 11); (*outputFunc)(outputStream, psName, psNameLen); (*outputFunc)(outputStream, " def\n", 5); buf = GooString::format("/PaintType {0:d} def\n", topDict.paintType); (*outputFunc)(outputStream, buf->c_str(), buf->getLength()); - delete buf; (*outputFunc)(outputStream, "/FontType 1 def\n", 16); buf = GooString::format("/FontMatrix [{0:.8g} {1:.8g} {2:.8g} {3:.8g} {4:.8g} {5:.8g}] readonly def\n", topDict.fontMatrix[0], topDict.fontMatrix[1], topDict.fontMatrix[2], topDict.fontMatrix[3], topDict.fontMatrix[4], topDict.fontMatrix[5]); (*outputFunc)(outputStream, buf->c_str(), buf->getLength()); - delete buf; buf = GooString::format("/FontBBox [{0:.4g} {1:.4g} {2:.4g} {3:.4g}] readonly def\n", topDict.fontBBox[0], topDict.fontBBox[1], topDict.fontBBox[2], topDict.fontBBox[3]); (*outputFunc)(outputStream, buf->c_str(), buf->getLength()); - delete buf; buf = GooString::format("/StrokeWidth {0:.4g} def\n", topDict.strokeWidth); (*outputFunc)(outputStream, buf->c_str(), buf->getLength()); - delete buf; if (topDict.uniqueID != 0) { buf = GooString::format("/UniqueID {0:d} def\n", topDict.uniqueID); (*outputFunc)(outputStream, buf->c_str(), buf->getLength()); - delete buf; } // write the encoding @@ -303,7 +294,6 @@ void FoFiType1C::convertToType1(const char *psName, const char **newEncoding, bo if (enc && enc[i]) { buf = GooString::format("dup {0:d} /{1:s} put\n", i, enc[i]); (*outputFunc)(outputStream, buf->c_str(), buf->getLength()); - delete buf; } } (*outputFunc)(outputStream, "readonly def\n", 13); @@ -333,7 +323,6 @@ void FoFiType1C::convertToType1(const char *psName, const char **newEncoding, bo for (i = 0; i < privateDicts[0].nBlueValues; ++i) { buf = GooString::format("{0:s}{1:d}", i > 0 ? " " : "", privateDicts[0].blueValues[i]); eexecWrite(&eb, buf->c_str()); - delete buf; } eexecWrite(&eb, "] def\n"); } @@ -342,7 +331,6 @@ void FoFiType1C::convertToType1(const char *psName, const char **newEncoding, bo for (i = 0; i < privateDicts[0].nOtherBlues; ++i) { buf = GooString::format("{0:s}{1:d}", i > 0 ? " " : "", privateDicts[0].otherBlues[i]); eexecWrite(&eb, buf->c_str()); - delete buf; } eexecWrite(&eb, "] def\n"); } @@ -351,7 +339,6 @@ void FoFiType1C::convertToType1(const char *psName, const char **newEncoding, bo for (i = 0; i < privateDicts[0].nFamilyBlues; ++i) { buf = GooString::format("{0:s}{1:d}", i > 0 ? " " : "", privateDicts[0].familyBlues[i]); eexecWrite(&eb, buf->c_str()); - delete buf; } eexecWrite(&eb, "] def\n"); } @@ -360,41 +347,34 @@ void FoFiType1C::convertToType1(const char *psName, const char **newEncoding, bo for (i = 0; i < privateDicts[0].nFamilyOtherBlues; ++i) { buf = GooString::format("{0:s}{1:d}", i > 0 ? " " : "", privateDicts[0].familyOtherBlues[i]); eexecWrite(&eb, buf->c_str()); - delete buf; } eexecWrite(&eb, "] def\n"); } if (privateDicts[0].blueScale != 0.039625) { buf = GooString::format("/BlueScale {0:.4g} def\n", privateDicts[0].blueScale); eexecWrite(&eb, buf->c_str()); - delete buf; } if (privateDicts[0].blueShift != 7) { buf = GooString::format("/BlueShift {0:d} def\n", privateDicts[0].blueShift); eexecWrite(&eb, buf->c_str()); - delete buf; } if (privateDicts[0].blueFuzz != 1) { buf = GooString::format("/BlueFuzz {0:d} def\n", privateDicts[0].blueFuzz); eexecWrite(&eb, buf->c_str()); - delete buf; } if (privateDicts[0].hasStdHW) { buf = GooString::format("/StdHW [{0:.4g}] def\n", privateDicts[0].stdHW); eexecWrite(&eb, buf->c_str()); - delete buf; } if (privateDicts[0].hasStdVW) { buf = GooString::format("/StdVW [{0:.4g}] def\n", privateDicts[0].stdVW); eexecWrite(&eb, buf->c_str()); - delete buf; } if (privateDicts[0].nStemSnapH) { eexecWrite(&eb, "/StemSnapH ["); for (i = 0; i < privateDicts[0].nStemSnapH; ++i) { buf = GooString::format("{0:s}{1:.4g}", i > 0 ? " " : "", privateDicts[0].stemSnapH[i]); eexecWrite(&eb, buf->c_str()); - delete buf; } eexecWrite(&eb, "] def\n"); } @@ -403,29 +383,24 @@ void FoFiType1C::convertToType1(const char *psName, const char **newEncoding, bo for (i = 0; i < privateDicts[0].nStemSnapV; ++i) { buf = GooString::format("{0:s}{1:.4g}", i > 0 ? " " : "", privateDicts[0].stemSnapV[i]); eexecWrite(&eb, buf->c_str()); - delete buf; } eexecWrite(&eb, "] def\n"); } if (privateDicts[0].hasForceBold) { buf = GooString::format("/ForceBold {0:s} def\n", privateDicts[0].forceBold ? "true" : "false"); eexecWrite(&eb, buf->c_str()); - delete buf; } if (privateDicts[0].forceBoldThreshold != 0) { buf = GooString::format("/ForceBoldThreshold {0:.4g} def\n", privateDicts[0].forceBoldThreshold); eexecWrite(&eb, buf->c_str()); - delete buf; } if (privateDicts[0].languageGroup != 0) { buf = GooString::format("/LanguageGroup {0:d} def\n", privateDicts[0].languageGroup); eexecWrite(&eb, buf->c_str()); - delete buf; } if (privateDicts[0].expansionFactor != 0.06) { buf = GooString::format("/ExpansionFactor {0:.4g} def\n", privateDicts[0].expansionFactor); eexecWrite(&eb, buf->c_str()); - delete buf; } // set up subroutines @@ -438,7 +413,6 @@ void FoFiType1C::convertToType1(const char *psName, const char **newEncoding, bo // write the CharStrings buf = GooString::format("2 index /CharStrings {0:d} dict dup begin\n", nGlyphs); eexecWrite(&eb, buf->c_str()); - delete buf; for (i = 0; i < nGlyphs; ++i) { ok = true; getIndexVal(&charStringsIdx, i, &val, &ok); @@ -474,7 +448,6 @@ void FoFiType1C::convertToCIDType0(const char *psName, const int *codeMap, int n Type1CIndex subrIdx; Type1CIndexVal val; int nCIDs, gdBytes; - GooString *buf; char buf2[256]; bool ok; int gid, offset, n, i, j, k; @@ -574,15 +547,13 @@ void FoFiType1C::convertToCIDType0(const char *psName, const int *codeMap, int n (*outputFunc)(outputStream, " /Registry (Adobe) def\n", 24); (*outputFunc)(outputStream, " /Ordering (Identity) def\n", 27); } - buf = GooString::format(" /Supplement {0:d} def\n", topDict.supplement); + std::unique_ptr<GooString> buf = GooString::format(" /Supplement {0:d} def\n", topDict.supplement); (*outputFunc)(outputStream, buf->c_str(), buf->getLength()); - delete buf; (*outputFunc)(outputStream, "end def\n", 8); if (topDict.hasFontMatrix) { buf = GooString::format("/FontMatrix [{0:.8g} {1:.8g} {2:.8g} {3:.8g} {4:.8g} {5:.8g}] def\n", topDict.fontMatrix[0], topDict.fontMatrix[1], topDict.fontMatrix[2], topDict.fontMatrix[3], topDict.fontMatrix[4], topDict.fontMatrix[5]); (*outputFunc)(outputStream, buf->c_str(), buf->getLength()); - delete buf; } else if (privateDicts[0].hasFontMatrix) { (*outputFunc)(outputStream, "/FontMatrix [1 0 0 1 0 0] def\n", 30); } else { @@ -590,7 +561,6 @@ void FoFiType1C::convertToCIDType0(const char *psName, const int *codeMap, int n } buf = GooString::format("/FontBBox [{0:.4g} {1:.4g} {2:.4g} {3:.4g}] def\n", topDict.fontBBox[0], topDict.fontBBox[1], topDict.fontBBox[2], topDict.fontBBox[3]); (*outputFunc)(outputStream, buf->c_str(), buf->getLength()); - delete buf; (*outputFunc)(outputStream, "/FontInfo 1 dict dup begin\n", 27); (*outputFunc)(outputStream, " /FSType 8 def\n", 16); (*outputFunc)(outputStream, "end def\n", 8); @@ -598,48 +568,39 @@ void FoFiType1C::convertToCIDType0(const char *psName, const int *codeMap, int n // CIDFont-specific entries buf = GooString::format("/CIDCount {0:d} def\n", nCIDs); (*outputFunc)(outputStream, buf->c_str(), buf->getLength()); - delete buf; (*outputFunc)(outputStream, "/FDBytes 1 def\n", 15); buf = GooString::format("/GDBytes {0:d} def\n", gdBytes); (*outputFunc)(outputStream, buf->c_str(), buf->getLength()); - delete buf; (*outputFunc)(outputStream, "/CIDMapOffset 0 def\n", 20); if (topDict.paintType != 0) { buf = GooString::format("/PaintType {0:d} def\n", topDict.paintType); (*outputFunc)(outputStream, buf->c_str(), buf->getLength()); - delete buf; buf = GooString::format("/StrokeWidth {0:.4g} def\n", topDict.strokeWidth); (*outputFunc)(outputStream, buf->c_str(), buf->getLength()); - delete buf; } // FDArray entry buf = GooString::format("/FDArray {0:d} array\n", nFDs); (*outputFunc)(outputStream, buf->c_str(), buf->getLength()); - delete buf; for (i = 0; i < nFDs; ++i) { buf = GooString::format("dup {0:d} 10 dict begin\n", i); (*outputFunc)(outputStream, buf->c_str(), buf->getLength()); - delete buf; (*outputFunc)(outputStream, "/FontType 1 def\n", 16); if (privateDicts[i].hasFontMatrix) { buf = GooString::format("/FontMatrix [{0:.8g} {1:.8g} {2:.8g} {3:.8g} {4:.8g} {5:.8g}] def\n", privateDicts[i].fontMatrix[0], privateDicts[i].fontMatrix[1], privateDicts[i].fontMatrix[2], privateDicts[i].fontMatrix[3], privateDicts[i].fontMatrix[4], privateDicts[i].fontMatrix[5]); (*outputFunc)(outputStream, buf->c_str(), buf->getLength()); - delete buf; } else { (*outputFunc)(outputStream, "/FontMatrix [1 0 0 1 0 0] def\n", 30); } buf = GooString::format("/PaintType {0:d} def\n", topDict.paintType); (*outputFunc)(outputStream, buf->c_str(), buf->getLength()); - delete buf; (*outputFunc)(outputStream, "/Private 32 dict begin\n", 23); if (privateDicts[i].nBlueValues) { (*outputFunc)(outputStream, "/BlueValues [", 13); for (j = 0; j < privateDicts[i].nBlueValues; ++j) { buf = GooString::format("{0:s}{1:d}", j > 0 ? " " : "", privateDicts[i].blueValues[j]); (*outputFunc)(outputStream, buf->c_str(), buf->getLength()); - delete buf; } (*outputFunc)(outputStream, "] def\n", 6); } @@ -648,7 +609,6 @@ void FoFiType1C::convertToCIDType0(const char *psName, const int *codeMap, int n for (j = 0; j < privateDicts[i].nOtherBlues; ++j) { buf = GooString::format("{0:s}{1:d}", j > 0 ? " " : "", privateDicts[i].otherBlues[j]); (*outputFunc)(outputStream, buf->c_str(), buf->getLength()); - delete buf; } (*outputFunc)(outputStream, "] def\n", 6); } @@ -657,7 +617,6 @@ void FoFiType1C::convertToCIDType0(const char *psName, const int *codeMap, int n for (j = 0; j < privateDicts[i].nFamilyBlues; ++j) { buf = GooString::format("{0:s}{1:d}", j > 0 ? " " : "", privateDicts[i].familyBlues[j]); (*outputFunc)(outputStream, buf->c_str(), buf->getLength()); - delete buf; } (*outputFunc)(outputStream, "] def\n", 6); } @@ -666,41 +625,34 @@ void FoFiType1C::convertToCIDType0(const char *psName, const int *codeMap, int n for (j = 0; j < privateDicts[i].nFamilyOtherBlues; ++j) { buf = GooString::format("{0:s}{1:d}", j > 0 ? " " : "", privateDicts[i].familyOtherBlues[j]); (*outputFunc)(outputStream, buf->c_str(), buf->getLength()); - delete buf; } (*outputFunc)(outputStream, "] def\n", 6); } if (privateDicts[i].blueScale != 0.039625) { buf = GooString::format("/BlueScale {0:.4g} def\n", privateDicts[i].blueScale); (*outputFunc)(outputStream, buf->c_str(), buf->getLength()); - delete buf; } if (privateDicts[i].blueShift != 7) { buf = GooString::format("/BlueShift {0:d} def\n", privateDicts[i].blueShift); (*outputFunc)(outputStream, buf->c_str(), buf->getLength()); - delete buf; } if (privateDicts[i].blueFuzz != 1) { buf = GooString::format("/BlueFuzz {0:d} def\n", privateDicts[i].blueFuzz); (*outputFunc)(outputStream, buf->c_str(), buf->getLength()); - delete buf; } if (privateDicts[i].hasStdHW) { buf = GooString::format("/StdHW [{0:.4g}] def\n", privateDicts[i].stdHW); (*outputFunc)(outputStream, buf->c_str(), buf->getLength()); - delete buf; } if (privateDicts[i].hasStdVW) { buf = GooString::format("/StdVW [{0:.4g}] def\n", privateDicts[i].stdVW); (*outputFunc)(outputStream, buf->c_str(), buf->getLength()); - delete buf; } if (privateDicts[i].nStemSnapH) { (*outputFunc)(outputStream, "/StemSnapH [", 12); for (j = 0; j < privateDicts[i].nStemSnapH; ++j) { buf = GooString::format("{0:s}{1:.4g}", j > 0 ? " " : "", privateDicts[i].stemSnapH[j]); (*outputFunc)(outputStream, buf->c_str(), buf->getLength()); - delete buf; } (*outputFunc)(outputStream, "] def\n", 6); } @@ -709,29 +661,24 @@ void FoFiType1C::convertToCIDType0(const char *psName, const int *codeMap, int n for (j = 0; j < privateDicts[i].nStemSnapV; ++j) { buf = GooString::format("{0:s}{1:.4g}", j > 0 ? " " : "", privateDicts[i].stemSnapV[j]); (*outputFunc)(outputStream, buf->c_str(), buf->getLength()); - delete buf; } (*outputFunc)(outputStream, "] def\n", 6); } if (privateDicts[i].hasForceBold) { buf = GooString::format("/ForceBold {0:s} def\n", privateDicts[i].forceBold ? "true" : "false"); (*outputFunc)(outputStream, buf->c_str(), buf->getLength()); - delete buf; } if (privateDicts[i].forceBoldThreshold != 0) { buf = GooString::format("/ForceBoldThreshold {0:.4g} def\n", privateDicts[i].forceBoldThreshold); (*outputFunc)(outputStream, buf->c_str(), buf->getLength()); - delete buf; } if (privateDicts[i].languageGroup != 0) { buf = GooString::format("/LanguageGroup {0:d} def\n", privateDicts[i].languageGroup); (*outputFunc)(outputStream, buf->c_str(), buf->getLength()); - delete buf; } if (privateDicts[i].expansionFactor != 0.06) { buf = GooString::format("/ExpansionFactor {0:.4g} def\n", privateDicts[i].expansionFactor); (*outputFunc)(outputStream, buf->c_str(), buf->getLength()); - delete buf; } (*outputFunc)(outputStream, "currentdict end def\n", 20); (*outputFunc)(outputStream, "currentdict end put\n", 20); @@ -742,7 +689,6 @@ void FoFiType1C::convertToCIDType0(const char *psName, const int *codeMap, int n offset = (nCIDs + 1) * (1 + gdBytes); buf = GooString::format("(Hex) {0:d} StartData\n", offset + charStrings->getLength()); (*outputFunc)(outputStream, buf->c_str(), buf->getLength()); - delete buf; // write the charstring offset (CIDMap) table for (i = 0; i <= nCIDs; i += 6) { @@ -760,7 +706,6 @@ void FoFiType1C::convertToCIDType0(const char *psName, const int *codeMap, int n for (k = 0; k <= gdBytes; ++k) { buf = GooString::format("{0:02x}", buf2[k] & 0xff); (*outputFunc)(outputStream, buf->c_str(), buf->getLength()); - delete buf; } } (*outputFunc)(outputStream, "\n", 1); @@ -772,7 +717,6 @@ void FoFiType1C::convertToCIDType0(const char *psName, const int *codeMap, int n for (j = 0; j < 32 && i + j < n; ++j) { buf = GooString::format("{0:02x}", charStrings->getChar(i + j) & 0xff); (*outputFunc)(outputStream, buf->c_str(), buf->getLength()); - delete buf; } if (i + 32 >= n) { (*outputFunc)(outputStream, ">", 1); @@ -791,7 +735,6 @@ void FoFiType1C::convertToType0(const char *psName, const int *codeMap, int nCod Type1CIndex subrIdx; Type1CIndexVal val; int nCIDs; - GooString *buf; Type1CEexecBuf eb; bool ok; int fd, i, j, k; @@ -855,15 +798,13 @@ void FoFiType1C::convertToType0(const char *psName, const int *codeMap, int nCod (*outputFunc)(outputStream, "16 dict begin\n", 14); (*outputFunc)(outputStream, "/FontName /", 11); (*outputFunc)(outputStream, psName, strlen(psName)); - buf = GooString::format("_{0:02x} def\n", i >> 8); + std::unique_ptr<GooString> buf = GooString::format("_{0:02x} def\n", i >> 8); (*outputFunc)(outputStream, buf->c_str(), buf->getLength()); - delete buf; (*outputFunc)(outputStream, "/FontType 1 def\n", 16); if (privateDicts[fd].hasFontMatrix) { buf = GooString::format("/FontMatrix [{0:.8g} {1:.8g} {2:.8g} {3:.8g} {4:.8g} {5:.8g}] def\n", privateDicts[fd].fontMatrix[0], privateDicts[fd].fontMatrix[1], privateDicts[fd].fontMatrix[2], privateDicts[fd].fontMatrix[3], privateDicts[fd].fontMatrix[4], privateDicts[fd].fontMatrix[5]); (*outputFunc)(outputStream, buf->c_str(), buf->getLength()); - delete buf; } else if (topDict.hasFontMatrix) { (*outputFunc)(outputStream, "/FontMatrix [1 0 0 1 0 0] def\n", 30); } else { @@ -871,25 +812,20 @@ void FoFiType1C::convertToType0(const char *psName, const int *codeMap, int nCod } buf = GooString::format("/FontBBox [{0:.4g} {1:.4g} {2:.4g} {3:.4g}] def\n", topDict.fontBBox[0], topDict.fontBBox[1], topDict.fontBBox[2], topDict.fontBBox[3]); (*outputFunc)(outputStream, buf->c_str(), buf->getLength()); - delete buf; buf = GooString::format("/PaintType {0:d} def\n", topDict.paintType); (*outputFunc)(outputStream, buf->c_str(), buf->getLength()); - delete buf; if (topDict.paintType != 0) { buf = GooString::format("/StrokeWidth {0:.4g} def\n", topDict.strokeWidth); (*outputFunc)(outputStream, buf->c_str(), buf->getLength()); - delete buf; } (*outputFunc)(outputStream, "/Encoding 256 array\n", 20); for (j = 0; j < 256 && i + j < nCIDs; ++j) { buf = GooString::format("dup {0:d} /c{1:02x} put\n", j, j); (*outputFunc)(outputStream, buf->c_str(), buf->getLength()); - delete buf; } if (j < 256) { buf = GooString::format("{0:d} 1 255 {{ 1 index exch /.notdef put }} for\n", j); (*outputFunc)(outputStream, buf->c_str(), buf->getLength()); - delete buf; } (*outputFunc)(outputStream, "readonly def\n", 13); (*outputFunc)(outputStream, "currentdict end\n", 16); @@ -917,7 +853,6 @@ void FoFiType1C::convertToType0(const char *psName, const int *codeMap, int nCod for (k = 0; k < privateDicts[fd].nBlueValues; ++k) { buf = GooString::format("{0:s}{1:d}", k > 0 ? " " : "", privateDicts[fd].blueValues[k]); eexecWrite(&eb, buf->c_str()); - delete buf; } eexecWrite(&eb, "] def\n"); } @@ -926,7 +861,6 @@ void FoFiType1C::convertToType0(const char *psName, const int *codeMap, int nCod for (k = 0; k < privateDicts[fd].nOtherBlues; ++k) { buf = GooString::format("{0:s}{1:d}", k > 0 ? " " : "", privateDicts[fd].otherBlues[k]); eexecWrite(&eb, buf->c_str()); - delete buf; } eexecWrite(&eb, "] def\n"); } @@ -935,7 +869,6 @@ void FoFiType1C::convertToType0(const char *psName, const int *codeMap, int nCod for (k = 0; k < privateDicts[fd].nFamilyBlues; ++k) { buf = GooString::format("{0:s}{1:d}", k > 0 ? " " : "", privateDicts[fd].familyBlues[k]); eexecWrite(&eb, buf->c_str()); - delete buf; } eexecWrite(&eb, "] def\n"); } @@ -944,41 +877,34 @@ void FoFiType1C::convertToType0(const char *psName, const int *codeMap, int nCod for (k = 0; k < privateDicts[fd].nFamilyOtherBlues; ++k) { buf = GooString::format("{0:s}{1:d}", k > 0 ? " " : "", privateDicts[fd].familyOtherBlues[k]); eexecWrite(&eb, buf->c_str()); - delete buf; } eexecWrite(&eb, "] def\n"); } if (privateDicts[fd].blueScale != 0.039625) { buf = GooString::format("/BlueScale {0:.4g} def\n", privateDicts[fd].blueScale); eexecWrite(&eb, buf->c_str()); - delete buf; } if (privateDicts[fd].blueShift != 7) { buf = GooString::format("/BlueShift {0:d} def\n", privateDicts[fd].blueShift); eexecWrite(&eb, buf->c_str()); - delete buf; } if (privateDicts[fd].blueFuzz != 1) { buf = GooString::format("/BlueFuzz {0:d} def\n", privateDicts[fd].blueFuzz); eexecWrite(&eb, buf->c_str()); - delete buf; } if (privateDicts[fd].hasStdHW) { buf = GooString::format("/StdHW [{0:.4g}] def\n", privateDicts[fd].stdHW); eexecWrite(&eb, buf->c_str()); - delete buf; } if (privateDicts[fd].hasStdVW) { buf = GooString::format("/StdVW [{0:.4g}] def\n", privateDicts[fd].stdVW); eexecWrite(&eb, buf->c_str()); - delete buf; } if (privateDicts[fd].nStemSnapH) { eexecWrite(&eb, "/StemSnapH ["); for (k = 0; k < privateDicts[fd].nStemSnapH; ++k) { buf = GooString::format("{0:s}{1:.4g}", k > 0 ? " " : "", privateDicts[fd].stemSnapH[k]); eexecWrite(&eb, buf->c_str()); - delete buf; } eexecWrite(&eb, "] def\n"); } @@ -987,29 +913,24 @@ void FoFiType1C::convertToType0(const char *psName, const int *codeMap, int nCod for (k = 0; k < privateDicts[fd].nStemSnapV; ++k) { buf = GooString::format("{0:s}{1:.4g}", k > 0 ? " " : "", privateDicts[fd].stemSnapV[k]); eexecWrite(&eb, buf->c_str()); - delete buf; } eexecWrite(&eb, "] def\n"); } if (privateDicts[fd].hasForceBold) { buf = GooString::format("/ForceBold {0:s} def\n", privateDicts[fd].forceBold ? "true" : "false"); eexecWrite(&eb, buf->c_str()); - delete buf; } if (privateDicts[fd].forceBoldThreshold != 0) { buf = GooString::format("/ForceBoldThreshold {0:.4g} def\n", privateDicts[fd].forceBoldThreshold); eexecWrite(&eb, buf->c_str()); - delete buf; } if (privateDicts[fd].languageGroup != 0) { buf = GooString::format("/LanguageGroup {0:d} def\n", privateDicts[fd].languageGroup); eexecWrite(&eb, buf->c_str()); - delete buf; } if (privateDicts[fd].expansionFactor != 0.06) { buf = GooString::format("/ExpansionFactor {0:.4g} def\n", privateDicts[fd].expansionFactor); eexecWrite(&eb, buf->c_str()); - delete buf; } // set up the subroutines @@ -1037,7 +958,6 @@ void FoFiType1C::convertToType0(const char *psName, const int *codeMap, int nCod if (ok) { buf = GooString::format("c{0:02x}", j); eexecCvtGlyph(&eb, buf->c_str(), val.pos, val.len, &subrIdx, &privateDicts[fd]); - delete buf; } } } @@ -1068,28 +988,25 @@ void FoFiType1C::convertToType0(const char *psName, const int *codeMap, int nCod (*outputFunc)(outputStream, " def\n", 5); (*outputFunc)(outputStream, "/FontType 0 def\n", 16); if (topDict.hasFontMatrix) { - buf = GooString::format("/FontMatrix [{0:.8g} {1:.8g} {2:.8g} {3:.8g} {4:.8g} {5:.8g}] def\n", topDict.fontMatrix[0], topDict.fontMatrix[1], topDict.fontMatrix[2], topDict.fontMatrix[3], topDict.fontMatrix[4], - topDict.fontMatrix[5]); + const std::unique_ptr<GooString> buf = GooString::format("/FontMatrix [{0:.8g} {1:.8g} {2:.8g} {3:.8g} {4:.8g} {5:.8g}] def\n", topDict.fontMatrix[0], topDict.fontMatrix[1], topDict.fontMatrix[2], topDict.fontMatrix[3], + topDict.fontMatrix[4], topDict.fontMatrix[5]); (*outputFunc)(outputStream, buf->c_str(), buf->getLength()); - delete buf; } else { (*outputFunc)(outputStream, "/FontMatrix [1 0 0 1 0 0] def\n", 30); } (*outputFunc)(outputStream, "/FMapType 2 def\n", 16); (*outputFunc)(outputStream, "/Encoding [\n", 12); for (i = 0; i < nCIDs; i += 256) { - buf = GooString::format("{0:d}\n", i >> 8); + const std::unique_ptr<GooString> buf = GooString::format("{0:d}\n", i >> 8); (*outputFunc)(outputStream, buf->c_str(), buf->getLength()); - delete buf; } (*outputFunc)(outputStream, "] def\n", 6); (*outputFunc)(outputStream, "/FDepVector [\n", 14); for (i = 0; i < nCIDs; i += 256) { (*outputFunc)(outputStream, "/", 1); (*outputFunc)(outputStream, psName, strlen(psName)); - buf = GooString::format("_{0:02x} findfont\n", i >> 8); + const std::unique_ptr<GooString> buf = GooString::format("_{0:02x} findfont\n", i >> 8); (*outputFunc)(outputStream, buf->c_str(), buf->getLength()); - delete buf; } (*outputFunc)(outputStream, "] def\n", 6); (*outputFunc)(outputStream, "FontName currentdict end definefont pop\n", 40); @@ -1099,7 +1016,6 @@ void FoFiType1C::convertToType0(const char *psName, const int *codeMap, int nCod void FoFiType1C::eexecCvtGlyph(Type1CEexecBuf *eb, const char *glyphName, int offset, int nBytes, const Type1CIndex *subrIdx, const Type1CPrivateDict *pDict) { - GooString *buf; GooString *charBuf; // generate the charstring @@ -1107,9 +1023,8 @@ void FoFiType1C::eexecCvtGlyph(Type1CEexecBuf *eb, const char *glyphName, int of std::set<int> offsetBeingParsed; cvtGlyph(offset, nBytes, charBuf, subrIdx, pDict, true, offsetBeingParsed); - buf = GooString::format("/{0:s} {1:d} RD ", glyphName, charBuf->getLength()); + const std::unique_ptr<GooString> buf = GooString::format("/{0:s} {1:d} RD ", glyphName, charBuf->getLength()); eexecWrite(eb, buf->c_str()); - delete buf; eexecWriteCharstring(eb, (unsigned char *)charBuf->c_str(), charBuf->getLength()); eexecWrite(eb, " ND\n"); diff --git a/glib/poppler-document.cc b/glib/poppler-document.cc index a74312ff..5de08108 100644 --- a/glib/poppler-document.cc +++ b/glib/poppler-document.cc @@ -5,7 +5,7 @@ * Copyright (C) 2018, 2019, 2021, 2022 Marek Kasik <mka...@redhat.com> * Copyright (C) 2019 Masamichi Hosoda <truer...@trueroad.jp> * Copyright (C) 2019, 2021 Oliver Sander <oliver.san...@tu-dresden.de> - * Copyright (C) 2020 Albert Astals Cid <aa...@kde.org> + * Copyright (C) 2020, 2022 Albert Astals Cid <aa...@kde.org> * Copyright (C) 2021 André Guerreiro <aguerreiro1...@gmail.com> * * This program is free software; you can redistribute it and/or modify @@ -3799,7 +3799,7 @@ GooString *_poppler_convert_date_time_to_pdf_date(GDateTime *datetime) { int offset_min; gchar *date_str; - GooString *out_str; + std::unique_ptr<GooString> out_str; offset_min = g_date_time_get_utc_offset(datetime) / 1000000 / 60; date_str = g_date_time_format(datetime, "D:%Y%m%d%H%M%S"); @@ -3813,5 +3813,5 @@ GooString *_poppler_convert_date_time_to_pdf_date(GDateTime *datetime) } g_free(date_str); - return out_str; + return out_str.release(); } diff --git a/goo/GooString.cc b/goo/GooString.cc index 470b79f5..f2fb3031 100644 --- a/goo/GooString.cc +++ b/goo/GooString.cc @@ -121,9 +121,9 @@ void formatDoubleSmallAware(double x, char *buf, int bufSize, int prec, bool tri //------------------------------------------------------------------------ -GooString *GooString::format(const char *fmt, ...) +std::unique_ptr<GooString> GooString::format(const char *fmt, ...) { - auto *s = new GooString(); + auto s = std::make_unique<GooString>(); va_list argList; va_start(argList, fmt); @@ -133,9 +133,9 @@ GooString *GooString::format(const char *fmt, ...) return s; } -GooString *GooString::formatv(const char *fmt, va_list argList) +std::unique_ptr<GooString> GooString::formatv(const char *fmt, va_list argList) { - auto *s = new GooString(); + auto s = std::make_unique<GooString>(); s->appendfv(fmt, argList); diff --git a/goo/GooString.h b/goo/GooString.h index 6613e10f..2b93915f 100644 --- a/goo/GooString.h +++ b/goo/GooString.h @@ -42,6 +42,7 @@ #include "poppler_private_export.h" #include <cstdarg> +#include <memory> #include <string> #ifdef __clang__ @@ -139,8 +140,8 @@ public: // t -- GooString * // w -- blank space; arg determines width // To get literal curly braces, use {{ or }}. - POPPLER_PRIVATE_EXPORT static GooString *format(const char *fmt, ...) GOOSTRING_FORMAT; - POPPLER_PRIVATE_EXPORT static GooString *formatv(const char *fmt, va_list argList); + POPPLER_PRIVATE_EXPORT static std::unique_ptr<GooString> format(const char *fmt, ...) GOOSTRING_FORMAT; + POPPLER_PRIVATE_EXPORT static std::unique_ptr<GooString> formatv(const char *fmt, va_list argList); // Get length. int getLength() const { return size(); } diff --git a/poppler/Annot.cc b/poppler/Annot.cc index 5b7a4173..60c023d4 100644 --- a/poppler/Annot.cc +++ b/poppler/Annot.cc @@ -5051,9 +5051,8 @@ bool AnnotAppearanceBuilder::drawSignatureFieldText(const FormFieldSignature *fi Matrix matrix = { 1.0, 0.0, 0.0, 1.0, 0.0, 0.0 }; matrix.scale(width, height); static const char *IMG_TMPL = "\nq {0:.1g} {1:.1g} {2:.1g} {3:.1g} {4:.1g} {5:.1g} cm /{6:s} Do Q\n"; - const GooString *imgBuffer = GooString::format(IMG_TMPL, matrix.m[0], matrix.m[1], matrix.m[2], matrix.m[3], matrix.m[4], matrix.m[5], imageResourceId); + const std::unique_ptr<GooString> imgBuffer = GooString::format(IMG_TMPL, matrix.m[0], matrix.m[1], matrix.m[2], matrix.m[3], matrix.m[4], matrix.m[5], imageResourceId); append(imgBuffer->c_str()); - delete imgBuffer; } const GooString &leftText = field->getCustomAppearanceLeftContent(); @@ -5639,11 +5638,10 @@ void AnnotStamp::generateStampDefaultAppearance() } const double bboxArray[4] = { 0, 0, rect->x2 - rect->x1, rect->y2 - rect->y1 }; - const GooString *scale = GooString::format("{0:.6g} 0 0 {1:.6g} 0 0 cm\nq\n", bboxArray[2] / stampUnscaledWidth, bboxArray[3] / stampUnscaledHeight); + const std::unique_ptr<GooString> scale = GooString::format("{0:.6g} 0 0 {1:.6g} 0 0 cm\nq\n", bboxArray[2] / stampUnscaledWidth, bboxArray[3] / stampUnscaledHeight); defaultAppearanceBuilder.append(scale->c_str()); defaultAppearanceBuilder.append(stampCode); defaultAppearanceBuilder.append("Q\n"); - delete scale; Dict *resDict = new Dict(doc->getXRef()); resDict->add("ExtGState", Object(extGStateDict)); diff --git a/poppler/CurlCachedFile.cc b/poppler/CurlCachedFile.cc index aa7a33c0..1ff17220 100644 --- a/poppler/CurlCachedFile.cc +++ b/poppler/CurlCachedFile.cc @@ -6,7 +6,7 @@ // // Copyright 2009 Stefan Thomas <tho...@eload24.com> // Copyright 2010, 2011 Hib Eris <h...@hiberis.nl> -// Copyright 2010, 2019, 2021 Albert Astals Cid <aa...@kde.org> +// Copyright 2010, 2019, 2021, 2022 Albert Astals Cid <aa...@kde.org> // //======================================================================== @@ -77,7 +77,7 @@ int CurlCachedFileLoader::load(const std::vector<ByteRange> &ranges, CachedFileW fromByte = bRange.offset; toByte = fromByte + bRange.length - 1; - GooString *range = GooString::format("{0:ulld}-{1:ulld}", fromByte, toByte); + const std::unique_ptr<GooString> range = GooString::format("{0:ulld}-{1:ulld}", fromByte, toByte); curl_easy_setopt(curl, CURLOPT_URL, url->c_str()); curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, load_cb); @@ -86,8 +86,6 @@ int CurlCachedFileLoader::load(const std::vector<ByteRange> &ranges, CachedFileW r = curl_easy_perform(curl); curl_easy_reset(curl); - delete range; - if (r != CURLE_OK) { break; } diff --git a/poppler/Error.cc b/poppler/Error.cc index 7edfe240..f821bba9 100644 --- a/poppler/Error.cc +++ b/poppler/Error.cc @@ -47,14 +47,13 @@ void setErrorCallback(ErrorCallback cbk) void CDECL error(ErrorCategory category, Goffset pos, const char *msg, ...) { va_list args; - GooString *s; // NB: this can be called before the globalParams object is created if (!errorCbk && globalParams && globalParams->getErrQuiet()) { return; } va_start(args, msg); - s = GooString::formatv(msg, args); + const std::unique_ptr<GooString> s = GooString::formatv(msg, args); va_end(args); GooString sanitized; @@ -77,5 +76,4 @@ void CDECL error(ErrorCategory category, Goffset pos, const char *msg, ...) } fflush(stderr); } - delete s; } diff --git a/poppler/PSOutputDev.cc b/poppler/PSOutputDev.cc index 47bd0827..effba6b1 100644 --- a/poppler/PSOutputDev.cc +++ b/poppler/PSOutputDev.cc @@ -976,16 +976,11 @@ struct PSOutImgClipRect struct PSOutPaperSize { - PSOutPaperSize(GooString *nameA, int wA, int hA) - { - name = nameA; - w = wA; - h = hA; - } - ~PSOutPaperSize() { delete name; } + PSOutPaperSize(std::unique_ptr<GooString> &&nameA, int wA, int hA) : name(std::move(nameA)), w(wA), h(hA) { } + ~PSOutPaperSize() = default; PSOutPaperSize(const PSOutPaperSize &) = delete; PSOutPaperSize &operator=(const PSOutPaperSize &) = delete; - GooString *name; + std::unique_ptr<GooString> name; int w, h; }; @@ -1379,10 +1374,10 @@ void PSOutputDev::postInit() } if (i == (int)paperSizes->size()) { const StandardMedia *media = standardMedia; - GooString *name = nullptr; + std::unique_ptr<GooString> name; while (media->name) { if (pageDimensionEqual(w, media->width) && pageDimensionEqual(h, media->height)) { - name = new GooString(media->name); + name = std::make_unique<GooString>(media->name); w = media->width; h = media->height; break; @@ -1392,7 +1387,7 @@ void PSOutputDev::postInit() if (!name) { name = GooString::format("{0:d}x{1:d}mm", int(w * 25.4 / 72), int(h * 25.4 / 72)); } - paperSizes->push_back(new PSOutPaperSize(name, w, h)); + paperSizes->push_back(new PSOutPaperSize(std::move(name), w, h)); } pagePaperSize.insert(std::pair<int, int>(pg, i)); if (!paperMatch) { @@ -1638,7 +1633,7 @@ void PSOutputDev::writeHeader(int nPages, const PDFRectangle *mediaBox, const PD case psModePS: for (std::size_t i = 0; i < paperSizes->size(); ++i) { size = (*paperSizes)[i]; - writePSFmt("%%{0:s} {1:t} {2:d} {3:d} 0 () ()\n", i == 0 ? "DocumentMedia:" : "+", size->name, size->w, size->h); + writePSFmt("%%{0:s} {1:t} {2:d} {3:d} 0 () ()\n", i == 0 ? "DocumentMedia:" : "+", size->name.get(), size->w, size->h); } writePSFmt("%%BoundingBox: 0 0 {0:d} {1:d}\n", paperWidth, paperHeight); writePSFmt("%%Pages: {0:d}\n", nPages); @@ -1646,7 +1641,7 @@ void PSOutputDev::writeHeader(int nPages, const PDFRectangle *mediaBox, const PD if (!paperMatch) { size = (*paperSizes)[0]; writePS("%%BeginDefaults\n"); - writePSFmt("%%PageMedia: {0:t}\n", size->name); + writePSFmt("%%PageMedia: {0:t}\n", size->name.get()); writePS("%%EndDefaults\n"); } break; @@ -1981,7 +1976,7 @@ void PSOutputDev::setupFont(GfxFont *font, Dict *parentResDict) subst = false; if (font->getType() == fontType3) { - psName = GooString::format("T3_{0:d}_{1:d}", font->getID()->num, font->getID()->gen); + psName = GooString::format("T3_{0:d}_{1:d}", font->getID()->num, font->getID()->gen).release(); setupType3Font(font, psName, parentResDict); } else { std::optional<GfxFontLoc> fontLoc = font->locateFont(xref, this); @@ -2699,7 +2694,6 @@ void PSOutputDev::setupType3Font(GfxFont *font, GooString *psName, Dict *parentR Gfx *gfx; PDFRectangle box; const double *m; - GooString *buf; int i; // set up resources used by font @@ -2754,13 +2748,13 @@ void PSOutputDev::setupType3Font(GfxFont *font, GooString *psName, Dict *parentR Object charProc = charProcs->getVal(i); gfx->display(&charProc); if (t3String) { + std::unique_ptr<GooString> buf; if (t3Cacheable) { buf = GooString::format("{0:.6g} {1:.6g} {2:.6g} {3:.6g} {4:.6g} {5:.6g} setcachedevice\n", t3WX, t3WY, t3LLX, t3LLY, t3URX, t3URY); } else { buf = GooString::format("{0:.6g} {1:.6g} setcharwidth\n", t3WX, t3WY); } (*outputFunc)(outputStream, buf->c_str(), buf->getLength()); - delete buf; (*outputFunc)(outputStream, t3String->c_str(), t3String->getLength()); delete t3String; t3String = nullptr; @@ -2802,7 +2796,7 @@ GooString *PSOutputDev::makePSFontName(GfxFont *font, const Ref *id) } delete psName; } - psName = GooString::format("FF{0:d}_{1:d}", id->num, id->gen); + psName = GooString::format("FF{0:d}_{1:d}", id->num, id->gen).release(); if ((s = font->getEmbeddedFontName())) { s = filterPSName(s->toStr()); psName->append('_')->append(s); @@ -3785,7 +3779,7 @@ void PSOutputDev::startPage(int pageNum, GfxState *state, XRef *xrefA) if (paperMatch) { paperSize = (*paperSizes)[pagePaperSize[pageNum]]; - writePSFmt("%%PageMedia: {0:t}\n", paperSize->name); + writePSFmt("%%PageMedia: {0:t}\n", paperSize->name.get()); } // Create a matrix with the same transform that will be output to PS @@ -6659,7 +6653,7 @@ void PSOutputDev::dumpColorSpaceL2(GfxState *state, GfxColorSpace *colorSpace, b Ref ref = iccBasedCS->getRef(); const bool validref = ref != Ref::INVALID(); int intent = state->getCmsRenderingIntent(); - GooString *name; + std::unique_ptr<GooString> name; if (validref) { name = GooString::format("ICCBased-{0:d}-{1:d}-{2:d}", ref.num, ref.gen, intent); } else { @@ -6668,16 +6662,16 @@ void PSOutputDev::dumpColorSpaceL2(GfxState *state, GfxColorSpace *colorSpace, b } const auto &it = iccEmitted.find(name->toStr()); if (it != iccEmitted.end()) { - writePSFmt("{0:t}", name); + writePSFmt("{0:t}", name.get()); if (genXform) { writePS(" {}"); } } else { char *csa = iccBasedCS->getPostScriptCSA(); if (csa) { - writePSFmt("userdict /{0:t} {1:s} put\n", name, csa); + writePSFmt("userdict /{0:t} {1:s} put\n", name.get(), csa); iccEmitted.emplace(name->toStr()); - writePSFmt("{0:t}", name); + writePSFmt("{0:t}", name.get()); if (genXform) { writePS(" {}"); } @@ -6685,7 +6679,6 @@ void PSOutputDev::dumpColorSpaceL2(GfxState *state, GfxColorSpace *colorSpace, b dumpColorSpaceL2(state, ((GfxICCBasedColorSpace *)colorSpace)->getAlt(), genXform, updateColors, false); } } - delete name; } #else // there is no transform function to the alternate color space, so @@ -7375,15 +7368,13 @@ void PSOutputDev::writePSBuf(const char *s, int len) void PSOutputDev::writePSFmt(const char *fmt, ...) { va_list args; - GooString *buf; va_start(args, fmt); if (t3String) { t3String->appendfv((char *)fmt, args); } else { - buf = GooString::formatv((char *)fmt, args); + const std::unique_ptr<GooString> buf = GooString::formatv((char *)fmt, args); (*outputFunc)(outputStream, buf->c_str(), buf->getLength()); - delete buf; } va_end(args); } @@ -7510,10 +7501,9 @@ GooString *PSOutputDev::filterPSLabel(GooString *label, bool *needParens) } else if (c == '(') { label2->append("\\("); } else if (c < 0x20 || c > 0x7e) { - GooString *aux = GooString::format("\\{0:03o}", c); - label2->append(aux); + std::unique_ptr<GooString> aux = GooString::format("\\{0:03o}", c); + label2->append(aux.get()); j += 4; - delete aux; } else { label2->append(c); ++j; diff --git a/qt5/tests/check_annotations.cpp b/qt5/tests/check_annotations.cpp index ed3501f2..0e8e88e4 100644 --- a/qt5/tests/check_annotations.cpp +++ b/qt5/tests/check_annotations.cpp @@ -35,9 +35,8 @@ void TestAnnotations::checkQColorPrecision() bool precisionOk = true; for (int i = std::numeric_limits<uint16_t>::min(); i <= std::numeric_limits<uint16_t>::max(); i++) { double normalized = static_cast<uint16_t>(i) / static_cast<double>(std::numeric_limits<uint16_t>::max()); - GooString *serialized = GooString::format("{0:.5f}", normalized); + const std::unique_ptr<GooString> serialized = GooString::format("{0:.5f}", normalized); double deserialized = gatof(serialized->c_str()); - delete serialized; uint16_t denormalized = std::round(deserialized * std::numeric_limits<uint16_t>::max()); if (static_cast<uint16_t>(i) != denormalized) { precisionOk = false; diff --git a/qt5/tests/check_goostring.cpp b/qt5/tests/check_goostring.cpp index 4a07cc6d..cfb14c2a 100644 --- a/qt5/tests/check_goostring.cpp +++ b/qt5/tests/check_goostring.cpp @@ -64,59 +64,59 @@ void TestGooString::testInsert() void TestGooString::testFormat() { { - const QScopedPointer<GooString> goo(GooString::format("{0:d},{1:x}", 1, 0xF)); + const std::unique_ptr<GooString> goo(GooString::format("{0:d},{1:x}", 1, 0xF)); QCOMPARE(goo->c_str(), "1,f"); } { - const QScopedPointer<GooString> goo(GooString::format("{0:d},{0:x},{0:X},{0:o},{0:b},{0:w}", 0xA)); + const std::unique_ptr<GooString> goo(GooString::format("{0:d},{0:x},{0:X},{0:o},{0:b},{0:w}", 0xA)); QCOMPARE(goo->c_str(), "10,a,A,12,1010, "); } { - const QScopedPointer<GooString> goo(GooString::format("{0:d},{0:x},{0:X},{0:o},{0:b}", -0xA)); + const std::unique_ptr<GooString> goo(GooString::format("{0:d},{0:x},{0:X},{0:o},{0:b}", -0xA)); QCOMPARE(goo->c_str(), "-10,-a,-A,-12,-1010"); } { - const QScopedPointer<GooString> goo(GooString::format("{0:c}{1:c}{2:c}{3:c}", 'T', (char)'E', (short)'S', (int)'T')); + const std::unique_ptr<GooString> goo(GooString::format("{0:c}{1:c}{2:c}{3:c}", 'T', (char)'E', (short)'S', (int)'T')); QCOMPARE(goo->c_str(), "TEST"); - const QScopedPointer<GooString> goo2(GooString::format("{0:s} {1:t}", "TEST", goo.data())); + const std::unique_ptr<GooString> goo2(GooString::format("{0:s} {1:t}", "TEST", goo.get())); QCOMPARE(goo2->c_str(), "TEST TEST"); } { - const QScopedPointer<GooString> goo(GooString::format("{0:ud} {1:d} {2:d}", UINT_MAX, INT_MAX, INT_MIN)); + const std::unique_ptr<GooString> goo(GooString::format("{0:ud} {1:d} {2:d}", UINT_MAX, INT_MAX, INT_MIN)); const QByteArray expected = QStringLiteral("%1 %2 %3").arg(UINT_MAX).arg(INT_MAX).arg(INT_MIN).toLatin1(); QCOMPARE(goo->c_str(), expected.constData()); } { - const QScopedPointer<GooString> goo(GooString::format("{0:uld} {1:ld} {2:ld}", ULONG_MAX, LONG_MAX, LONG_MIN)); + const std::unique_ptr<GooString> goo(GooString::format("{0:uld} {1:ld} {2:ld}", ULONG_MAX, LONG_MAX, LONG_MIN)); const QByteArray expected = QStringLiteral("%1 %2 %3").arg(ULONG_MAX).arg(LONG_MAX).arg(LONG_MIN).toLatin1(); QCOMPARE(goo->c_str(), expected.constData()); } { - const QScopedPointer<GooString> goo(GooString::format("{0:ulld} {1:lld} {2:lld}", ULLONG_MAX, LLONG_MAX, LLONG_MIN)); + const std::unique_ptr<GooString> goo(GooString::format("{0:ulld} {1:lld} {2:lld}", ULLONG_MAX, LLONG_MAX, LLONG_MIN)); const QByteArray expected = QStringLiteral("%1 %2 %3").arg(ULLONG_MAX).arg(LLONG_MAX).arg(LLONG_MIN).toLatin1(); QCOMPARE(goo->c_str(), expected.constData()); } { - const QScopedPointer<GooString> gooD(GooString::format("{0:.1f} {0:.1g} {0:.1gs} | {1:.1f} {1:.1g} {1:.1gs}", 1., .012)); - const QScopedPointer<GooString> gooF(GooString::format("{0:.1f} {0:.1g} {0:.1gs} | {1:.1f} {1:.1g} {1:.1gs}", 1.f, .012f)); + const std::unique_ptr<GooString> gooD(GooString::format("{0:.1f} {0:.1g} {0:.1gs} | {1:.1f} {1:.1g} {1:.1gs}", 1., .012)); + const std::unique_ptr<GooString> gooF(GooString::format("{0:.1f} {0:.1g} {0:.1gs} | {1:.1f} {1:.1g} {1:.1gs}", 1.f, .012f)); QCOMPARE(gooD->c_str(), "1.0 1 1 | 0.0 0 0.01"); QCOMPARE(gooF->c_str(), "1.0 1 1 | 0.0 0 0.01"); } { - const QScopedPointer<GooString> goo(GooString::format("{0:.4f} {0:.4g} {0:.4gs}", .012)); + const std::unique_ptr<GooString> goo(GooString::format("{0:.4f} {0:.4g} {0:.4gs}", .012)); QCOMPARE(goo->c_str(), "0.0120 0.012 0.012"); } { - const QScopedPointer<GooString> goo(GooString::format("{{ SomeText {0:d} }}", 1)); + const std::unique_ptr<GooString> goo(GooString::format("{{ SomeText {0:d} }}", 1)); QCOMPARE(goo->c_str(), "{ SomeText 1 }"); } { - const QScopedPointer<GooString> goo(GooString::format("{{{{ {{ SomeText {0:d}", 2)); + const std::unique_ptr<GooString> goo(GooString::format("{{{{ {{ SomeText {0:d}", 2)); QCOMPARE(goo->c_str(), "{{ { SomeText 2"); } { - const QScopedPointer<GooString> goo(GooString::format("SomeText {0:d} }} }}}}", 3)); + const std::unique_ptr<GooString> goo(GooString::format("SomeText {0:d} }} }}}}", 3)); QCOMPARE(goo->c_str(), "SomeText 3 } }}"); } } diff --git a/qt6/tests/check_annotations.cpp b/qt6/tests/check_annotations.cpp index 478c2a9b..ca00d472 100644 --- a/qt6/tests/check_annotations.cpp +++ b/qt6/tests/check_annotations.cpp @@ -35,9 +35,8 @@ void TestAnnotations::checkQColorPrecision() bool precisionOk = true; for (int i = std::numeric_limits<uint16_t>::min(); i <= std::numeric_limits<uint16_t>::max(); i++) { double normalized = static_cast<uint16_t>(i) / static_cast<double>(std::numeric_limits<uint16_t>::max()); - GooString *serialized = GooString::format("{0:.5f}", normalized); + const std::unique_ptr<GooString> serialized = GooString::format("{0:.5f}", normalized); double deserialized = gatof(serialized->c_str()); - delete serialized; uint16_t denormalized = std::round(deserialized * std::numeric_limits<uint16_t>::max()); if (static_cast<uint16_t>(i) != denormalized) { precisionOk = false; diff --git a/qt6/tests/check_goostring.cpp b/qt6/tests/check_goostring.cpp index 4a07cc6d..cfb14c2a 100644 --- a/qt6/tests/check_goostring.cpp +++ b/qt6/tests/check_goostring.cpp @@ -64,59 +64,59 @@ void TestGooString::testInsert() void TestGooString::testFormat() { { - const QScopedPointer<GooString> goo(GooString::format("{0:d},{1:x}", 1, 0xF)); + const std::unique_ptr<GooString> goo(GooString::format("{0:d},{1:x}", 1, 0xF)); QCOMPARE(goo->c_str(), "1,f"); } { - const QScopedPointer<GooString> goo(GooString::format("{0:d},{0:x},{0:X},{0:o},{0:b},{0:w}", 0xA)); + const std::unique_ptr<GooString> goo(GooString::format("{0:d},{0:x},{0:X},{0:o},{0:b},{0:w}", 0xA)); QCOMPARE(goo->c_str(), "10,a,A,12,1010, "); } { - const QScopedPointer<GooString> goo(GooString::format("{0:d},{0:x},{0:X},{0:o},{0:b}", -0xA)); + const std::unique_ptr<GooString> goo(GooString::format("{0:d},{0:x},{0:X},{0:o},{0:b}", -0xA)); QCOMPARE(goo->c_str(), "-10,-a,-A,-12,-1010"); } { - const QScopedPointer<GooString> goo(GooString::format("{0:c}{1:c}{2:c}{3:c}", 'T', (char)'E', (short)'S', (int)'T')); + const std::unique_ptr<GooString> goo(GooString::format("{0:c}{1:c}{2:c}{3:c}", 'T', (char)'E', (short)'S', (int)'T')); QCOMPARE(goo->c_str(), "TEST"); - const QScopedPointer<GooString> goo2(GooString::format("{0:s} {1:t}", "TEST", goo.data())); + const std::unique_ptr<GooString> goo2(GooString::format("{0:s} {1:t}", "TEST", goo.get())); QCOMPARE(goo2->c_str(), "TEST TEST"); } { - const QScopedPointer<GooString> goo(GooString::format("{0:ud} {1:d} {2:d}", UINT_MAX, INT_MAX, INT_MIN)); + const std::unique_ptr<GooString> goo(GooString::format("{0:ud} {1:d} {2:d}", UINT_MAX, INT_MAX, INT_MIN)); const QByteArray expected = QStringLiteral("%1 %2 %3").arg(UINT_MAX).arg(INT_MAX).arg(INT_MIN).toLatin1(); QCOMPARE(goo->c_str(), expected.constData()); } { - const QScopedPointer<GooString> goo(GooString::format("{0:uld} {1:ld} {2:ld}", ULONG_MAX, LONG_MAX, LONG_MIN)); + const std::unique_ptr<GooString> goo(GooString::format("{0:uld} {1:ld} {2:ld}", ULONG_MAX, LONG_MAX, LONG_MIN)); const QByteArray expected = QStringLiteral("%1 %2 %3").arg(ULONG_MAX).arg(LONG_MAX).arg(LONG_MIN).toLatin1(); QCOMPARE(goo->c_str(), expected.constData()); } { - const QScopedPointer<GooString> goo(GooString::format("{0:ulld} {1:lld} {2:lld}", ULLONG_MAX, LLONG_MAX, LLONG_MIN)); + const std::unique_ptr<GooString> goo(GooString::format("{0:ulld} {1:lld} {2:lld}", ULLONG_MAX, LLONG_MAX, LLONG_MIN)); const QByteArray expected = QStringLiteral("%1 %2 %3").arg(ULLONG_MAX).arg(LLONG_MAX).arg(LLONG_MIN).toLatin1(); QCOMPARE(goo->c_str(), expected.constData()); } { - const QScopedPointer<GooString> gooD(GooString::format("{0:.1f} {0:.1g} {0:.1gs} | {1:.1f} {1:.1g} {1:.1gs}", 1., .012)); - const QScopedPointer<GooString> gooF(GooString::format("{0:.1f} {0:.1g} {0:.1gs} | {1:.1f} {1:.1g} {1:.1gs}", 1.f, .012f)); + const std::unique_ptr<GooString> gooD(GooString::format("{0:.1f} {0:.1g} {0:.1gs} | {1:.1f} {1:.1g} {1:.1gs}", 1., .012)); + const std::unique_ptr<GooString> gooF(GooString::format("{0:.1f} {0:.1g} {0:.1gs} | {1:.1f} {1:.1g} {1:.1gs}", 1.f, .012f)); QCOMPARE(gooD->c_str(), "1.0 1 1 | 0.0 0 0.01"); QCOMPARE(gooF->c_str(), "1.0 1 1 | 0.0 0 0.01"); } { - const QScopedPointer<GooString> goo(GooString::format("{0:.4f} {0:.4g} {0:.4gs}", .012)); + const std::unique_ptr<GooString> goo(GooString::format("{0:.4f} {0:.4g} {0:.4gs}", .012)); QCOMPARE(goo->c_str(), "0.0120 0.012 0.012"); } { - const QScopedPointer<GooString> goo(GooString::format("{{ SomeText {0:d} }}", 1)); + const std::unique_ptr<GooString> goo(GooString::format("{{ SomeText {0:d} }}", 1)); QCOMPARE(goo->c_str(), "{ SomeText 1 }"); } { - const QScopedPointer<GooString> goo(GooString::format("{{{{ {{ SomeText {0:d}", 2)); + const std::unique_ptr<GooString> goo(GooString::format("{{{{ {{ SomeText {0:d}", 2)); QCOMPARE(goo->c_str(), "{{ { SomeText 2"); } { - const QScopedPointer<GooString> goo(GooString::format("SomeText {0:d} }} }}}}", 3)); + const std::unique_ptr<GooString> goo(GooString::format("SomeText {0:d} }} }}}}", 3)); QCOMPARE(goo->c_str(), "SomeText 3 } }}"); } } diff --git a/utils/HtmlOutputDev.cc b/utils/HtmlOutputDev.cc index 23ceec57..8a16e008 100644 --- a/utils/HtmlOutputDev.cc +++ b/utils/HtmlOutputDev.cc @@ -88,18 +88,18 @@ class HtmlImage { public: - HtmlImage(GooString *_fName, GfxState *state) : fName(_fName) + HtmlImage(std::unique_ptr<GooString> &&_fName, GfxState *state) : fName(std::move(_fName)) { state->transform(0, 0, &xMin, &yMax); state->transform(1, 1, &xMax, &yMin); } - ~HtmlImage() { delete fName; } + ~HtmlImage() = default; HtmlImage(const HtmlImage &) = delete; HtmlImage &operator=(const HtmlImage &) = delete; double xMin, xMax; // image x coordinates double yMin, yMax; // image y coordinates - GooString *fName; // image file name + std::unique_ptr<GooString> fName; // image file name }; // returns true if x is closer to y than x is to z @@ -124,7 +124,6 @@ extern bool noMerge; extern double wordBreakThreshold; static bool debug = false; -static GooString *gstr_buff0 = nullptr; // a workspace in which I format strings #if 0 static GooString* Dirname(GooString* str){ @@ -138,33 +137,24 @@ static GooString* Dirname(GooString* str){ } #endif -static const char *print_matrix(const double *mat) +static std::unique_ptr<GooString> print_matrix(const double *mat) { - delete gstr_buff0; - - gstr_buff0 = GooString::format("[{0:g} {1:g} {2:g} {3:g} {4:g} {5:g}]", *mat, mat[1], mat[2], mat[3], mat[4], mat[5]); - return gstr_buff0->c_str(); + return GooString::format("[{0:g} {1:g} {2:g} {3:g} {4:g} {5:g}]", *mat, mat[1], mat[2], mat[3], mat[4], mat[5]); } -static const char *print_uni_str(const Unicode *u, const unsigned uLen) +static std::unique_ptr<GooString> print_uni_str(const Unicode *u, const unsigned uLen) { - GooString *gstr_buff1 = nullptr; - - delete gstr_buff0; - if (!uLen) { - return ""; + return std::make_unique<GooString>(""); } - gstr_buff0 = GooString::format("{0:c}", (*u < 0x7F ? *u & 0xFF : '?')); + std::unique_ptr<GooString> gstr_buff0 = GooString::format("{0:c}", (*u < 0x7F ? *u & 0xFF : '?')); for (unsigned i = 1; i < uLen; i++) { if (u[i] < 0x7F) { - gstr_buff1 = gstr_buff0->append(u[i] < 0x7F ? static_cast<char>(u[i]) & 0xFF : '?'); - delete gstr_buff0; - gstr_buff0 = gstr_buff1; + gstr_buff0->append(u[i] < 0x7F ? static_cast<char>(u[i]) & 0xFF : '?'); } } - return gstr_buff0->c_str(); + return gstr_buff0; } //------------------------------------------------------------------------ @@ -198,16 +188,16 @@ HtmlString::HtmlString(GfxState *state, double fontSize, HtmlFontAccu *_fonts) : // browser rotates the opposite way // so flip the sign of the angle -> sin() components change sign if (debug) { - std::cerr << DEBUG << "before transform: " << print_matrix(normalizedMatrix) << std::endl; + std::cerr << DEBUG << "before transform: " << print_matrix(normalizedMatrix)->c_str() << std::endl; } normalizedMatrix[1] *= -1; normalizedMatrix[2] *= -1; if (debug) { - std::cerr << DEBUG << "after reflecting angle: " << print_matrix(normalizedMatrix) << std::endl; + std::cerr << DEBUG << "after reflecting angle: " << print_matrix(normalizedMatrix)->c_str() << std::endl; } normalizeRotMat(normalizedMatrix); if (debug) { - std::cerr << DEBUG << "after norm: " << print_matrix(normalizedMatrix) << std::endl; + std::cerr << DEBUG << "after norm: " << print_matrix(normalizedMatrix)->c_str() << std::endl; } hfont.setRotMat(normalizedMatrix); } @@ -377,8 +367,8 @@ void HtmlPage::addChar(GfxState *state, double x, double y, double dx, double dy // sin q is zero iff there is no rotation, or 180 deg. rotation; // for 180 rotation, cos q will be negative if (text_mat[0] < 0 || !is_within(text_mat[1], .1, 0)) { - std::cerr << DEBUG << "rotation matrix for \"" << print_uni_str(u, uLen) << '"' << std::endl; - std::cerr << "text " << print_matrix(state->getTextMat()); + std::cerr << DEBUG << "rotation matrix for \"" << print_uni_str(u, uLen)->c_str() << '"' << std::endl; + std::cerr << "text " << print_matrix(state->getTextMat())->c_str(); } } if (n > 0 && // don't start a new string, unless there is already a string @@ -991,9 +981,9 @@ void HtmlPage::setDocName(const char *fname) DocName = new GooString(fname); } -void HtmlPage::addImage(GooString *fname, GfxState *state) +void HtmlPage::addImage(std::unique_ptr<GooString> &&fname, GfxState *state) { - HtmlImage *img = new HtmlImage(fname, state); + HtmlImage *img = new HtmlImage(std::move(fname), state); imgList.push_back(img); } @@ -1314,11 +1304,10 @@ void HtmlOutputDev::drawJpegImage(GfxState *state, Stream *str) int c; // open the image file - GooString *fName = createImageFileName("jpg"); + std::unique_ptr<GooString> fName = createImageFileName("jpg"); f1 = dataUrls ? ims.open("wb") : fopen(fName->c_str(), "wb"); if (!f1) { - error(errIO, -1, "Couldn't open image file '{0:t}'", fName); - delete fName; + error(errIO, -1, "Couldn't open image file '{0:t}'", fName.get()); return; } @@ -1334,10 +1323,9 @@ void HtmlOutputDev::drawJpegImage(GfxState *state, Stream *str) fclose(f1); if (dataUrls) { - delete fName; - fName = new GooString(std::string("data:image/jpeg;base64,") + gbase64Encode(ims.getBuffer())); + fName = std::make_unique<GooString>(std::string("data:image/jpeg;base64,") + gbase64Encode(ims.getBuffer())); } - pages->addImage(fName, state); + pages->addImage(std::move(fName), state); } void HtmlOutputDev::drawPngImage(GfxState *state, Stream *str, int width, int height, GfxImageColorMap *colorMap, bool isMask) @@ -1352,18 +1340,17 @@ void HtmlOutputDev::drawPngImage(GfxState *state, Stream *str, int width, int he } // open the image file - GooString *fName = createImageFileName("png"); + std::unique_ptr<GooString> fName = createImageFileName("png"); f1 = dataUrls ? ims.open("wb") : fopen(fName->c_str(), "wb"); if (!f1) { - error(errIO, -1, "Couldn't open image file '{0:t}'", fName); - delete fName; + error(errIO, -1, "Couldn't open image file '{0:t}'", fName.get()); return; } PNGWriter *writer = new PNGWriter(isMask ? PNGWriter::MONOCHROME : PNGWriter::RGB); // TODO can we calculate the resolution of the image? if (!writer->init(f1, width, height, 72, 72)) { - error(errInternal, -1, "Can't init PNG for image '{0:t}'", fName); + error(errInternal, -1, "Can't init PNG for image '{0:t}'", fName.get()); delete writer; fclose(f1); return; @@ -1385,8 +1372,7 @@ void HtmlOutputDev::drawPngImage(GfxState *state, Stream *str, int width, int he // Convert into a PNG row p = imgStr->getLine(); if (!p) { - error(errIO, -1, "Failed to read PNG. '{0:t}' will be incorrect", fName); - delete fName; + error(errIO, -1, "Failed to read PNG. '{0:t}' will be incorrect", fName.get()); gfree(row); delete writer; delete imgStr; @@ -1403,7 +1389,7 @@ void HtmlOutputDev::drawPngImage(GfxState *state, Stream *str, int width, int he } if (!writer->writeRow(row_pointer)) { - error(errIO, -1, "Failed to write into PNG '{0:t}'", fName); + error(errIO, -1, "Failed to write into PNG '{0:t}'", fName.get()); delete writer; delete imgStr; fclose(f1); @@ -1440,7 +1426,7 @@ void HtmlOutputDev::drawPngImage(GfxState *state, Stream *str, int width, int he } if (!writer->writeRow(&png_row)) { - error(errIO, -1, "Failed to write into PNG '{0:t}'", fName); + error(errIO, -1, "Failed to write into PNG '{0:t}'", fName.get()); delete writer; fclose(f1); gfree(png_row); @@ -1458,16 +1444,15 @@ void HtmlOutputDev::drawPngImage(GfxState *state, Stream *str, int width, int he fclose(f1); if (dataUrls) { - delete fName; - fName = new GooString(std::string("data:image/png;base64,") + gbase64Encode(ims.getBuffer())); + fName = std::make_unique<GooString>(std::string("data:image/png;base64,") + gbase64Encode(ims.getBuffer())); } - pages->addImage(fName, state); + pages->addImage(std::move(fName), state); #else return; #endif } -GooString *HtmlOutputDev::createImageFileName(const char *ext) +std::unique_ptr<GooString> HtmlOutputDev::createImageFileName(const char *ext) { return GooString::format("{0:s}-{1:d}_{2:d}.{3:s}", Docname->c_str(), pageNum, pages->getNumImages() + 1, ext); } diff --git a/utils/HtmlOutputDev.h b/utils/HtmlOutputDev.h index c95a05f4..c7b08d15 100644 --- a/utils/HtmlOutputDev.h +++ b/utils/HtmlOutputDev.h @@ -14,7 +14,7 @@ // All changes made under the Poppler project to this file are licensed // under GPL version 2 or later // -// Copyright (C) 2006, 2007, 2009, 2012, 2018-2021 Albert Astals Cid <aa...@kde.org> +// Copyright (C) 2006, 2007, 2009, 2012, 2018-2022 Albert Astals Cid <aa...@kde.org> // Copyright (C) 2008, 2009 Warren Toomey <w...@tuhs.org> // Copyright (C) 2009, 2011 Carlos Garcia Campos <carlo...@gnome.org> // Copyright (C) 2009 Kovid Goyal <ko...@kovidgoyal.net> @@ -144,7 +144,7 @@ public: void AddLink(const HtmlLink &x) { links->AddLink(x); } // add an image to the current page - void addImage(GooString *fname, GfxState *state); + void addImage(std::unique_ptr<GooString> &&fname, GfxState *state); // number of images on the current page int getNumImages() { return imgList.size(); } @@ -294,7 +294,7 @@ private: int getOutlinePageNum(OutlineItem *item); void drawJpegImage(GfxState *state, Stream *str); void drawPngImage(GfxState *state, Stream *str, int width, int height, GfxImageColorMap *colorMap, bool isMask = false); - GooString *createImageFileName(const char *ext); + std::unique_ptr<GooString> createImageFileName(const char *ext); FILE *fContentsFrame; FILE *page; // html file diff --git a/utils/pdfsig.cc b/utils/pdfsig.cc index d496592a..6effd9d4 100644 --- a/utils/pdfsig.cc +++ b/utils/pdfsig.cc @@ -116,14 +116,12 @@ static bool dumpSignature(int sig_num, int sigCount, FormFieldSignature *s, cons // We want format to be {0:s}.sig{1:Xd} where X is sigCountLength // since { is the magic character to replace things we need to put it twice where // we don't want it to be replaced - GooString *format = GooString::format("{{0:s}}.sig{{1:{0:d}d}}", sigCountLength); - GooString *path = GooString::format(format->c_str(), gbasename(filename).c_str(), sig_num); + const std::unique_ptr<GooString> format = GooString::format("{{0:s}}.sig{{1:{0:d}d}}", sigCountLength); + const std::unique_ptr<GooString> path = GooString::format(format->c_str(), gbasename(filename).c_str(), sig_num); printf("Signature #%d (%u bytes) => %s\n", sig_num, signature->getLength(), path->c_str()); std::ofstream outfile(path->c_str(), std::ofstream::binary); outfile.write(signature->c_str(), signature->getLength()); outfile.close(); - delete format; - delete path; return true; } diff --git a/utils/pdftohtml.cc b/utils/pdftohtml.cc index 88a2a0b0..97b141a2 100644 --- a/utils/pdftohtml.cc +++ b/utils/pdftohtml.cc @@ -345,7 +345,6 @@ int main(int argc, char *argv[]) } if ((complexMode || singleHtml) && !xml && !ignore) { - GooString *imgFileName = nullptr; // White paper color SplashColor color; color[0] = color[1] = color[2] = 255; @@ -360,11 +359,10 @@ int main(int argc, char *argv[]) doc->displayPage(splashOut, pg, 72 * scale, 72 * scale, 0, true, false, false); SplashBitmap *bitmap = splashOut->getBitmap(); - imgFileName = GooString::format("{0:s}{1:03d}.{2:s}", htmlFileName->c_str(), pg, extension); + const std::unique_ptr<GooString> imgFileName = GooString::format("{0:s}{1:03d}.{2:s}", htmlFileName->c_str(), pg, extension); auto f1 = dataUrls ? imf.open("wb") : fopen(imgFileName->c_str(), "wb"); if (!f1) { fprintf(stderr, "Could not open %s\n", imgFileName->c_str()); - delete imgFileName; continue; } bitmap->writeImgFile(format, f1, 72 * scale, 72 * scale); @@ -374,7 +372,6 @@ int main(int argc, char *argv[]) } else { htmlOut->addBackgroundImage(gbasename(imgFileName->c_str())); } - delete imgFileName; } delete splashOut;