aboutsummaryrefslogtreecommitdiffhomepage
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/android/SkBitmapRegionDecoder.cpp5
-rw-r--r--src/codec/SkAndroidCodec.cpp16
-rw-r--r--src/codec/SkBmpBaseCodec.cpp5
-rw-r--r--src/codec/SkBmpBaseCodec.h2
-rw-r--r--src/codec/SkBmpCodec.cpp42
-rw-r--r--src/codec/SkBmpCodec.h9
-rw-r--r--src/codec/SkBmpMaskCodec.cpp5
-rw-r--r--src/codec/SkBmpMaskCodec.h4
-rw-r--r--src/codec/SkBmpRLECodec.cpp5
-rw-r--r--src/codec/SkBmpRLECodec.h4
-rw-r--r--src/codec/SkBmpStandardCodec.cpp6
-rw-r--r--src/codec/SkBmpStandardCodec.h10
-rw-r--r--src/codec/SkCodec.cpp48
-rw-r--r--src/codec/SkCodecImageGenerator.cpp8
-rw-r--r--src/codec/SkCodecImageGenerator.h2
-rw-r--r--src/codec/SkGifCodec.cpp8
-rw-r--r--src/codec/SkGifCodec.h2
-rw-r--r--src/codec/SkIcoCodec.cpp27
-rw-r--r--src/codec/SkIcoCodec.h2
-rw-r--r--src/codec/SkJpegCodec.cpp27
-rw-r--r--src/codec/SkJpegCodec.h7
-rw-r--r--src/codec/SkPngCodec.cpp39
-rw-r--r--src/codec/SkPngCodec.h8
-rw-r--r--src/codec/SkRawCodec.cpp43
-rw-r--r--src/codec/SkRawCodec.h2
-rw-r--r--src/codec/SkStreamBuffer.cpp6
-rw-r--r--src/codec/SkStreamBuffer.h4
-rw-r--r--src/codec/SkWbmpCodec.cpp14
-rw-r--r--src/codec/SkWbmpCodec.h4
-rw-r--r--src/codec/SkWebpCodec.cpp21
-rw-r--r--src/codec/SkWebpCodec.h6
31 files changed, 206 insertions, 185 deletions
diff --git a/src/android/SkBitmapRegionDecoder.cpp b/src/android/SkBitmapRegionDecoder.cpp
index 8298fb5298..a6e3ac6d94 100644
--- a/src/android/SkBitmapRegionDecoder.cpp
+++ b/src/android/SkBitmapRegionDecoder.cpp
@@ -22,11 +22,10 @@ SkBitmapRegionDecoder* SkBitmapRegionDecoder::Create(
std::unique_ptr<SkStreamRewindable> streamDeleter(stream);
switch (strategy) {
case kAndroidCodec_Strategy: {
- std::unique_ptr<SkAndroidCodec> codec(
- SkAndroidCodec::NewFromStream(streamDeleter.release()));
+ auto codec = SkAndroidCodec::MakeFromStream(std::move(streamDeleter));
if (nullptr == codec) {
SkCodecPrintf("Error: Failed to create codec.\n");
- return NULL;
+ return nullptr;
}
switch ((SkEncodedImageFormat)codec->getEncodedFormat()) {
diff --git a/src/codec/SkAndroidCodec.cpp b/src/codec/SkAndroidCodec.cpp
index 0245ea2f1e..3a23e06c8d 100644
--- a/src/codec/SkAndroidCodec.cpp
+++ b/src/codec/SkAndroidCodec.cpp
@@ -8,6 +8,7 @@
#include "SkAndroidCodec.h"
#include "SkCodec.h"
#include "SkCodecPriv.h"
+#include "SkMakeUnique.h"
#include "SkRawAdapterCodec.h"
#include "SkSampledCodec.h"
#include "SkWebpAdapterCodec.h"
@@ -65,8 +66,8 @@ SkAndroidCodec::SkAndroidCodec(SkCodec* codec)
, fCodec(codec)
{}
-SkAndroidCodec* SkAndroidCodec::NewFromStream(SkStream* stream, SkPngChunkReader* chunkReader) {
- std::unique_ptr<SkCodec> codec(SkCodec::NewFromStream(stream, nullptr, chunkReader));
+std::unique_ptr<SkAndroidCodec> SkAndroidCodec::MakeFromStream(std::unique_ptr<SkStream> stream, SkPngChunkReader* chunkReader) {
+ auto codec = SkCodec::MakeFromStream(std::move(stream), nullptr, chunkReader);
if (nullptr == codec) {
return nullptr;
}
@@ -82,26 +83,27 @@ SkAndroidCodec* SkAndroidCodec::NewFromStream(SkStream* stream, SkPngChunkReader
case SkEncodedImageFormat::kGIF:
case SkEncodedImageFormat::kBMP:
case SkEncodedImageFormat::kWBMP:
- return new SkSampledCodec(codec.release());
+ return skstd::make_unique<SkSampledCodec>(codec.release());
#ifdef SK_HAS_WEBP_LIBRARY
case SkEncodedImageFormat::kWEBP:
- return new SkWebpAdapterCodec((SkWebpCodec*) codec.release());
+ return skstd::make_unique<SkWebpAdapterCodec>((SkWebpCodec*) codec.release());
#endif
#ifdef SK_CODEC_DECODES_RAW
case SkEncodedImageFormat::kDNG:
- return new SkRawAdapterCodec((SkRawCodec*)codec.release());
+ return skstd::make_unique<SkRawAdapterCodec>((SkRawCodec*)codec.release());
#endif
default:
return nullptr;
}
}
-SkAndroidCodec* SkAndroidCodec::NewFromData(sk_sp<SkData> data, SkPngChunkReader* chunkReader) {
+std::unique_ptr<SkAndroidCodec> SkAndroidCodec::MakeFromData(sk_sp<SkData> data,
+ SkPngChunkReader* chunkReader) {
if (!data) {
return nullptr;
}
- return NewFromStream(new SkMemoryStream(data), chunkReader);
+ return MakeFromStream(skstd::make_unique<SkMemoryStream>(std::move(data)), chunkReader);
}
SkColorType SkAndroidCodec::computeOutputColorType(SkColorType requestedColorType) {
diff --git a/src/codec/SkBmpBaseCodec.cpp b/src/codec/SkBmpBaseCodec.cpp
index 0e744351f0..1071ff38e7 100644
--- a/src/codec/SkBmpBaseCodec.cpp
+++ b/src/codec/SkBmpBaseCodec.cpp
@@ -9,8 +9,9 @@
SkBmpBaseCodec::~SkBmpBaseCodec() {}
-SkBmpBaseCodec::SkBmpBaseCodec(int width, int height, const SkEncodedInfo& info, SkStream* stream,
+SkBmpBaseCodec::SkBmpBaseCodec(int width, int height, const SkEncodedInfo& info,
+ std::unique_ptr<SkStream> stream,
uint16_t bitsPerPixel, SkCodec::SkScanlineOrder rowOrder)
- : INHERITED(width, height, info, stream, bitsPerPixel, rowOrder)
+ : INHERITED(width, height, info, std::move(stream), bitsPerPixel, rowOrder)
, fSrcBuffer(sk_malloc_flags(this->srcRowBytes(), 0))
{}
diff --git a/src/codec/SkBmpBaseCodec.h b/src/codec/SkBmpBaseCodec.h
index 0b9f91977e..24277fc539 100644
--- a/src/codec/SkBmpBaseCodec.h
+++ b/src/codec/SkBmpBaseCodec.h
@@ -25,7 +25,7 @@ public:
bool didCreateSrcBuffer() const { return fSrcBuffer != nullptr; }
protected:
- SkBmpBaseCodec(int width, int height, const SkEncodedInfo& info, SkStream* stream,
+ SkBmpBaseCodec(int width, int height, const SkEncodedInfo& info, std::unique_ptr<SkStream>,
uint16_t bitsPerPixel, SkCodec::SkScanlineOrder rowOrder);
uint8_t* srcBuffer() { return reinterpret_cast<uint8_t*>(fSrcBuffer.get()); }
diff --git a/src/codec/SkBmpCodec.cpp b/src/codec/SkBmpCodec.cpp
index 70397f656f..18f8768e0d 100644
--- a/src/codec/SkBmpCodec.cpp
+++ b/src/codec/SkBmpCodec.cpp
@@ -67,16 +67,17 @@ bool SkBmpCodec::IsBmp(const void* buffer, size_t bytesRead) {
* Creates a bmp decoder
* Reads enough of the stream to determine the image format
*/
-SkCodec* SkBmpCodec::NewFromStream(SkStream* stream, Result* result) {
- return SkBmpCodec::NewFromStream(stream, result, false);
+std::unique_ptr<SkCodec> SkBmpCodec::MakeFromStream(std::unique_ptr<SkStream> stream,
+ Result* result) {
+ return SkBmpCodec::MakeFromStream(std::move(stream), result, false);
}
/*
* Creates a bmp decoder for a bmp embedded in ico
* Reads enough of the stream to determine the image format
*/
-SkCodec* SkBmpCodec::NewFromIco(SkStream* stream, Result* result) {
- return SkBmpCodec::NewFromStream(stream, result, true);
+std::unique_ptr<SkCodec> SkBmpCodec::MakeFromIco(std::unique_ptr<SkStream> stream, Result* result) {
+ return SkBmpCodec::MakeFromStream(std::move(stream), result, true);
}
// Header size constants
@@ -476,9 +477,11 @@ SkCodec::Result SkBmpCodec::ReadHeader(SkStream* stream, bool inIco,
// Set the image info and create a codec.
const SkEncodedInfo info = SkEncodedInfo::Make(color, alpha, bitsPerComponent);
- codecOut->reset(new SkBmpStandardCodec(width, height, info, stream, bitsPerPixel,
- numColors, bytesPerColor, offset - bytesRead,
- rowOrder, isOpaque, inIco));
+ codecOut->reset(new SkBmpStandardCodec(width, height, info,
+ std::unique_ptr<SkStream>(stream),
+ bitsPerPixel, numColors, bytesPerColor,
+ offset - bytesRead, rowOrder, isOpaque,
+ inIco));
return static_cast<SkBmpStandardCodec*>(codecOut->get())->didCreateSrcBuffer()
? kSuccess : kInvalidInput;
}
@@ -532,7 +535,8 @@ SkCodec::Result SkBmpCodec::ReadHeader(SkStream* stream, bool inIco,
alpha = SkEncodedInfo::kOpaque_Alpha;
}
const SkEncodedInfo info = SkEncodedInfo::Make(color, alpha, 8);
- codecOut->reset(new SkBmpMaskCodec(width, height, info, stream, bitsPerPixel,
+ codecOut->reset(new SkBmpMaskCodec(width, height, info,
+ std::unique_ptr<SkStream>(stream), bitsPerPixel,
masks.release(), rowOrder));
return static_cast<SkBmpMaskCodec*>(codecOut->get())->didCreateSrcBuffer()
? kSuccess : kInvalidInput;
@@ -563,7 +567,8 @@ SkCodec::Result SkBmpCodec::ReadHeader(SkStream* stream, bool inIco,
// For that reason, we always indicate that we are kBGRA.
const SkEncodedInfo info = SkEncodedInfo::Make(SkEncodedInfo::kBGRA_Color,
SkEncodedInfo::kBinary_Alpha, 8);
- codecOut->reset(new SkBmpRLECodec(width, height, info, stream, bitsPerPixel,
+ codecOut->reset(new SkBmpRLECodec(width, height, info,
+ std::unique_ptr<SkStream>(stream), bitsPerPixel,
numColors, bytesPerColor, offset - bytesRead,
rowOrder));
}
@@ -579,21 +584,22 @@ SkCodec::Result SkBmpCodec::ReadHeader(SkStream* stream, bool inIco,
* Creates a bmp decoder
* Reads enough of the stream to determine the image format
*/
-SkCodec* SkBmpCodec::NewFromStream(SkStream* stream, Result* result, bool inIco) {
- std::unique_ptr<SkStream> streamDeleter(stream);
+std::unique_ptr<SkCodec> SkBmpCodec::MakeFromStream(std::unique_ptr<SkStream> stream,
+ Result* result, bool inIco) {
std::unique_ptr<SkCodec> codec;
- *result = ReadHeader(stream, inIco, &codec);
+ *result = ReadHeader(stream.get(), inIco, &codec);
if (codec) {
- // codec has taken ownership of stream, so we do not need to
- // delete it.
- streamDeleter.release();
+ // codec has taken ownership of stream, so we do not need to delete it.
+ stream.release();
}
- return kSuccess == *result ? codec.release() : nullptr;
+ return kSuccess == *result ? std::move(codec) : nullptr;
}
-SkBmpCodec::SkBmpCodec(int width, int height, const SkEncodedInfo& info, SkStream* stream,
+SkBmpCodec::SkBmpCodec(int width, int height, const SkEncodedInfo& info,
+ std::unique_ptr<SkStream> stream,
uint16_t bitsPerPixel, SkCodec::SkScanlineOrder rowOrder)
- : INHERITED(width, height, info, kXformSrcColorFormat, stream, SkColorSpace::MakeSRGB())
+ : INHERITED(width, height, info, kXformSrcColorFormat, std::move(stream),
+ SkColorSpace::MakeSRGB())
, fBitsPerPixel(bitsPerPixel)
, fRowOrder(rowOrder)
, fSrcRowBytes(SkAlign4(compute_row_bytes(width, fBitsPerPixel)))
diff --git a/src/codec/SkBmpCodec.h b/src/codec/SkBmpCodec.h
index d5f5a32eae..651f1be248 100644
--- a/src/codec/SkBmpCodec.h
+++ b/src/codec/SkBmpCodec.h
@@ -28,17 +28,17 @@ public:
* Creates a bmp decoder
* Reads enough of the stream to determine the image format
*/
- static SkCodec* NewFromStream(SkStream*, Result*);
+ static std::unique_ptr<SkCodec> MakeFromStream(std::unique_ptr<SkStream>, Result*);
/*
* Creates a bmp decoder for a bmp embedded in ico
* Reads enough of the stream to determine the image format
*/
- static SkCodec* NewFromIco(SkStream*, Result*);
+ static std::unique_ptr<SkCodec> MakeFromIco(std::unique_ptr<SkStream>, Result*);
protected:
- SkBmpCodec(int width, int height, const SkEncodedInfo& info, SkStream* stream,
+ SkBmpCodec(int width, int height, const SkEncodedInfo& info, std::unique_ptr<SkStream>,
uint16_t bitsPerPixel, SkCodec::SkScanlineOrder rowOrder);
SkEncodedImageFormat onGetEncodedFormat() const override { return SkEncodedImageFormat::kBMP; }
@@ -46,7 +46,6 @@ protected:
/*
* Read enough of the stream to initialize the SkBmpCodec.
* On kSuccess, if codecOut is not nullptr, it will be set to a new SkBmpCodec.
- * If an SkCodec is created, it will take ownership of the SkStream.
*/
static Result ReadHeader(SkStream*, bool inIco, std::unique_ptr<SkCodec>* codecOut);
@@ -112,7 +111,7 @@ private:
* Creates a bmp decoder
* Reads enough of the stream to determine the image format
*/
- static SkCodec* NewFromStream(SkStream*, Result*, bool inIco);
+ static std::unique_ptr<SkCodec> MakeFromStream(std::unique_ptr<SkStream>, Result*, bool inIco);
/*
* Decodes the next dstInfo.height() lines.
diff --git a/src/codec/SkBmpMaskCodec.cpp b/src/codec/SkBmpMaskCodec.cpp
index 51060e5e99..aec56ee2fa 100644
--- a/src/codec/SkBmpMaskCodec.cpp
+++ b/src/codec/SkBmpMaskCodec.cpp
@@ -12,10 +12,11 @@
/*
* Creates an instance of the decoder
*/
-SkBmpMaskCodec::SkBmpMaskCodec(int width, int height, const SkEncodedInfo& info, SkStream* stream,
+SkBmpMaskCodec::SkBmpMaskCodec(int width, int height, const SkEncodedInfo& info,
+ std::unique_ptr<SkStream> stream,
uint16_t bitsPerPixel, SkMasks* masks,
SkCodec::SkScanlineOrder rowOrder)
- : INHERITED(width, height, info, stream, bitsPerPixel, rowOrder)
+ : INHERITED(width, height, info, std::move(stream), bitsPerPixel, rowOrder)
, fMasks(masks)
, fMaskSwizzler(nullptr)
{}
diff --git a/src/codec/SkBmpMaskCodec.h b/src/codec/SkBmpMaskCodec.h
index 8d8d64c168..4b0dbde026 100644
--- a/src/codec/SkBmpMaskCodec.h
+++ b/src/codec/SkBmpMaskCodec.h
@@ -22,7 +22,7 @@ public:
/*
* Creates an instance of the decoder
*
- * Called only by SkBmpCodec::NewFromStream
+ * Called only by SkBmpCodec::MakeFromStream
* There should be no other callers despite this being public
*
* @param info contains properties of the encoded data
@@ -31,7 +31,7 @@ public:
* @param masks color masks for certain bmp formats
* @param rowOrder indicates whether rows are ordered top-down or bottom-up
*/
- SkBmpMaskCodec(int width, int height, const SkEncodedInfo& info, SkStream* stream,
+ SkBmpMaskCodec(int width, int height, const SkEncodedInfo& info, std::unique_ptr<SkStream>,
uint16_t bitsPerPixel, SkMasks* masks,
SkCodec::SkScanlineOrder rowOrder);
diff --git a/src/codec/SkBmpRLECodec.cpp b/src/codec/SkBmpRLECodec.cpp
index 0fcd290add..23a2c98eb1 100644
--- a/src/codec/SkBmpRLECodec.cpp
+++ b/src/codec/SkBmpRLECodec.cpp
@@ -14,11 +14,12 @@
* Creates an instance of the decoder
* Called only by NewFromStream
*/
-SkBmpRLECodec::SkBmpRLECodec(int width, int height, const SkEncodedInfo& info, SkStream* stream,
+SkBmpRLECodec::SkBmpRLECodec(int width, int height, const SkEncodedInfo& info,
+ std::unique_ptr<SkStream> stream,
uint16_t bitsPerPixel, uint32_t numColors,
uint32_t bytesPerColor, uint32_t offset,
SkCodec::SkScanlineOrder rowOrder)
- : INHERITED(width, height, info, stream, bitsPerPixel, rowOrder)
+ : INHERITED(width, height, info, std::move(stream), bitsPerPixel, rowOrder)
, fColorTable(nullptr)
, fNumColors(numColors)
, fBytesPerColor(bytesPerColor)
diff --git a/src/codec/SkBmpRLECodec.h b/src/codec/SkBmpRLECodec.h
index d6c17c3c68..70e97a7833 100644
--- a/src/codec/SkBmpRLECodec.h
+++ b/src/codec/SkBmpRLECodec.h
@@ -22,7 +22,7 @@ public:
/*
* Creates an instance of the decoder
*
- * Called only by SkBmpCodec::NewFromStream
+ * Called only by SkBmpCodec::MakeFromStream
* There should be no other callers despite this being public
*
* @param info contains properties of the encoded data
@@ -35,7 +35,7 @@ public:
* headers
* @param rowOrder indicates whether rows are ordered top-down or bottom-up
*/
- SkBmpRLECodec(int width, int height, const SkEncodedInfo& info, SkStream* stream,
+ SkBmpRLECodec(int width, int height, const SkEncodedInfo& info, std::unique_ptr<SkStream>,
uint16_t bitsPerPixel, uint32_t numColors, uint32_t bytesPerColor,
uint32_t offset, SkCodec::SkScanlineOrder rowOrder);
diff --git a/src/codec/SkBmpStandardCodec.cpp b/src/codec/SkBmpStandardCodec.cpp
index 46a5715dc9..53aa91c6fa 100644
--- a/src/codec/SkBmpStandardCodec.cpp
+++ b/src/codec/SkBmpStandardCodec.cpp
@@ -15,11 +15,11 @@
* Called only by NewFromStream
*/
SkBmpStandardCodec::SkBmpStandardCodec(int width, int height, const SkEncodedInfo& info,
- SkStream* stream, uint16_t bitsPerPixel, uint32_t numColors,
- uint32_t bytesPerColor, uint32_t offset,
+ std::unique_ptr<SkStream> stream, uint16_t bitsPerPixel,
+ uint32_t numColors, uint32_t bytesPerColor, uint32_t offset,
SkCodec::SkScanlineOrder rowOrder,
bool isOpaque, bool inIco)
- : INHERITED(width, height, info, stream, bitsPerPixel, rowOrder)
+ : INHERITED(width, height, info, std::move(stream), bitsPerPixel, rowOrder)
, fColorTable(nullptr)
, fNumColors(numColors)
, fBytesPerColor(bytesPerColor)
diff --git a/src/codec/SkBmpStandardCodec.h b/src/codec/SkBmpStandardCodec.h
index f9ce5c6839..60587fb48d 100644
--- a/src/codec/SkBmpStandardCodec.h
+++ b/src/codec/SkBmpStandardCodec.h
@@ -23,7 +23,7 @@ public:
/*
* Creates an instance of the decoder
*
- * Called only by SkBmpCodec::NewFromStream
+ * Called only by SkBmpCodec::MakeFromStream
* There should be no other callers despite this being public
*
* @param info contains properties of the encoded data
@@ -39,10 +39,10 @@ public:
* the icp mask, if there is one)
* @param inIco indicates if the bmp is embedded in an ico file
*/
- SkBmpStandardCodec(int width, int height, const SkEncodedInfo& info, SkStream* stream,
- uint16_t bitsPerPixel, uint32_t numColors, uint32_t bytesPerColor,
- uint32_t offset, SkCodec::SkScanlineOrder rowOrder, bool isOpaque,
- bool inIco);
+ SkBmpStandardCodec(int width, int height, const SkEncodedInfo& info,
+ std::unique_ptr<SkStream> stream, uint16_t bitsPerPixel, uint32_t numColors,
+ uint32_t bytesPerColor, uint32_t offset, SkCodec::SkScanlineOrder rowOrder,
+ bool isOpaque, bool inIco);
protected:
diff --git a/src/codec/SkCodec.cpp b/src/codec/SkCodec.cpp
index 872fe2b689..4fb0ea9350 100644
--- a/src/codec/SkCodec.cpp
+++ b/src/codec/SkCodec.cpp
@@ -26,30 +26,30 @@
struct DecoderProc {
bool (*IsFormat)(const void*, size_t);
- SkCodec* (*NewFromStream)(SkStream*, SkCodec::Result*);
+ std::unique_ptr<SkCodec> (*MakeFromStream)(std::unique_ptr<SkStream>, SkCodec::Result*);
};
static const DecoderProc gDecoderProcs[] = {
#ifdef SK_HAS_JPEG_LIBRARY
- { SkJpegCodec::IsJpeg, SkJpegCodec::NewFromStream },
+ { SkJpegCodec::IsJpeg, SkJpegCodec::MakeFromStream },
#endif
#ifdef SK_HAS_WEBP_LIBRARY
- { SkWebpCodec::IsWebp, SkWebpCodec::NewFromStream },
+ { SkWebpCodec::IsWebp, SkWebpCodec::MakeFromStream },
#endif
- { SkGifCodec::IsGif, SkGifCodec::NewFromStream },
+ { SkGifCodec::IsGif, SkGifCodec::MakeFromStream },
#ifdef SK_HAS_PNG_LIBRARY
- { SkIcoCodec::IsIco, SkIcoCodec::NewFromStream },
+ { SkIcoCodec::IsIco, SkIcoCodec::MakeFromStream },
#endif
- { SkBmpCodec::IsBmp, SkBmpCodec::NewFromStream },
- { SkWbmpCodec::IsWbmp, SkWbmpCodec::NewFromStream }
+ { SkBmpCodec::IsBmp, SkBmpCodec::MakeFromStream },
+ { SkWbmpCodec::IsWbmp, SkWbmpCodec::MakeFromStream }
};
size_t SkCodec::MinBufferedBytesNeeded() {
return WEBP_VP8_HEADER_SIZE;
}
-SkCodec* SkCodec::NewFromStream(SkStream* stream,
- Result* outResult, SkPngChunkReader* chunkReader) {
+std::unique_ptr<SkCodec> SkCodec::MakeFromStream(std::unique_ptr<SkStream> stream,
+ Result* outResult, SkPngChunkReader* chunkReader) {
Result resultStorage;
if (!outResult) {
outResult = &resultStorage;
@@ -60,8 +60,6 @@ SkCodec* SkCodec::NewFromStream(SkStream* stream,
return nullptr;
}
- std::unique_ptr<SkStream> streamDeleter(stream);
-
// 14 is enough to read all of the supported types.
const size_t bytesToRead = 14;
SkASSERT(bytesToRead <= MinBufferedBytesNeeded());
@@ -96,19 +94,19 @@ SkCodec* SkCodec::NewFromStream(SkStream* stream,
// But this code follows the same pattern as the loop.
#ifdef SK_HAS_PNG_LIBRARY
if (SkPngCodec::IsPng(buffer, bytesRead)) {
- return SkPngCodec::NewFromStream(streamDeleter.release(), outResult, chunkReader);
+ return SkPngCodec::MakeFromStream(std::move(stream), outResult, chunkReader);
} else
#endif
{
for (DecoderProc proc : gDecoderProcs) {
if (proc.IsFormat(buffer, bytesRead)) {
- return proc.NewFromStream(streamDeleter.release(), outResult);
+ return proc.MakeFromStream(std::move(stream), outResult);
}
}
#ifdef SK_CODEC_DECODES_RAW
// Try to treat the input as RAW if all the other checks failed.
- return SkRawCodec::NewFromStream(streamDeleter.release(), outResult);
+ return SkRawCodec::MakeFromStream(std::move(stream), outResult);
#endif
}
@@ -121,20 +119,21 @@ SkCodec* SkCodec::NewFromStream(SkStream* stream,
return nullptr;
}
-SkCodec* SkCodec::NewFromData(sk_sp<SkData> data, SkPngChunkReader* reader) {
+std::unique_ptr<SkCodec> SkCodec::MakeFromData(sk_sp<SkData> data, SkPngChunkReader* reader) {
if (!data) {
return nullptr;
}
- return NewFromStream(new SkMemoryStream(data), nullptr, reader);
+ return MakeFromStream(std::unique_ptr<SkStream>(new SkMemoryStream(std::move(data))),
+ nullptr, reader);
}
SkCodec::SkCodec(int width, int height, const SkEncodedInfo& info,
- XformFormat srcFormat, SkStream* stream,
+ XformFormat srcFormat, std::unique_ptr<SkStream> stream,
sk_sp<SkColorSpace> colorSpace, Origin origin)
: fEncodedInfo(info)
, fSrcInfo(info.makeImageInfo(width, height, std::move(colorSpace)))
, fSrcXformFormat(srcFormat)
- , fStream(stream)
+ , fStream(std::move(stream))
, fNeedsRewind(false)
, fOrigin(origin)
, fDstInfo()
@@ -143,11 +142,11 @@ SkCodec::SkCodec(int width, int height, const SkEncodedInfo& info,
{}
SkCodec::SkCodec(const SkEncodedInfo& info, const SkImageInfo& imageInfo,
- XformFormat srcFormat, SkStream* stream, Origin origin)
+ XformFormat srcFormat, std::unique_ptr<SkStream> stream, Origin origin)
: fEncodedInfo(info)
, fSrcInfo(imageInfo)
, fSrcXformFormat(srcFormat)
- , fStream(stream)
+ , fStream(std::move(stream))
, fNeedsRewind(false)
, fOrigin(origin)
, fDstInfo()
@@ -619,3 +618,12 @@ std::vector<SkCodec::FrameInfo> SkCodec::getFrameInfo() {
}
return result;
}
+
+#ifdef SK_SUPPORT_LEGACY_CODEC_NEW
+SkCodec* SkCodec::NewFromStream(SkStream* str, Result* res, SkPngChunkReader* chunk) {
+ return MakeFromStream(std::unique_ptr<SkStream*>(str), res, chunk).release();
+}
+SkCodec* SkCodec::NewFromData(sk_sp<SkData> data, SkPngChunkReader* chunk) {
+ return MakeFromData(std::move(data), chunk).release();
+}
+#endif
diff --git a/src/codec/SkCodecImageGenerator.cpp b/src/codec/SkCodecImageGenerator.cpp
index 7be6277f56..e6ca2122ea 100644
--- a/src/codec/SkCodecImageGenerator.cpp
+++ b/src/codec/SkCodecImageGenerator.cpp
@@ -9,12 +9,12 @@
#include "SkMakeUnique.h"
std::unique_ptr<SkImageGenerator> SkCodecImageGenerator::MakeFromEncodedCodec(sk_sp<SkData> data) {
- SkCodec* codec = SkCodec::NewFromData(data);
+ auto codec = SkCodec::MakeFromData(data);
if (nullptr == codec) {
return nullptr;
}
- return std::unique_ptr<SkImageGenerator>(new SkCodecImageGenerator(codec, data));
+ return std::unique_ptr<SkImageGenerator>(new SkCodecImageGenerator(std::move(codec), data));
}
static SkImageInfo adjust_info(const SkImageInfo& info) {
@@ -25,9 +25,9 @@ static SkImageInfo adjust_info(const SkImageInfo& info) {
return newInfo;
}
-SkCodecImageGenerator::SkCodecImageGenerator(SkCodec* codec, sk_sp<SkData> data)
+SkCodecImageGenerator::SkCodecImageGenerator(std::unique_ptr<SkCodec> codec, sk_sp<SkData> data)
: INHERITED(adjust_info(codec->getInfo()))
- , fCodec(codec)
+ , fCodec(std::move(codec))
, fData(std::move(data))
{}
diff --git a/src/codec/SkCodecImageGenerator.h b/src/codec/SkCodecImageGenerator.h
index 4d0c0780a6..1b2cbc28b2 100644
--- a/src/codec/SkCodecImageGenerator.h
+++ b/src/codec/SkCodecImageGenerator.h
@@ -34,7 +34,7 @@ private:
/*
* Takes ownership of codec
*/
- SkCodecImageGenerator(SkCodec* codec, sk_sp<SkData>);
+ SkCodecImageGenerator(std::unique_ptr<SkCodec>, sk_sp<SkData>);
std::unique_ptr<SkCodec> fCodec;
sk_sp<SkData> fData;
diff --git a/src/codec/SkGifCodec.cpp b/src/codec/SkGifCodec.cpp
index 412b8ff1f7..d54cbd558e 100644
--- a/src/codec/SkGifCodec.cpp
+++ b/src/codec/SkGifCodec.cpp
@@ -35,6 +35,7 @@
#include "SkColorPriv.h"
#include "SkColorTable.h"
#include "SkGifCodec.h"
+#include "SkMakeUnique.h"
#include "SkRasterPipeline.h"
#include "SkStream.h"
#include "SkSwizzler.h"
@@ -68,8 +69,9 @@ static SkCodec::Result gif_error(const char* msg, SkCodec::Result result = SkCod
return result;
}
-SkCodec* SkGifCodec::NewFromStream(SkStream* stream, Result* result) {
- std::unique_ptr<SkGifImageReader> reader(new SkGifImageReader(stream));
+std::unique_ptr<SkCodec> SkGifCodec::MakeFromStream(std::unique_ptr<SkStream> stream,
+ Result* result) {
+ std::unique_ptr<SkGifImageReader> reader(new SkGifImageReader(std::move(stream)));
*result = reader->parse(SkGifImageReader::SkGIFSizeQuery);
if (*result != kSuccess) {
return nullptr;
@@ -102,7 +104,7 @@ SkCodec* SkGifCodec::NewFromStream(SkStream* stream, Result* result) {
const auto imageInfo = SkImageInfo::Make(reader->screenWidth(), reader->screenHeight(),
kN32_SkColorType, alphaType,
SkColorSpace::MakeSRGB());
- return new SkGifCodec(encodedInfo, imageInfo, reader.release());
+ return std::unique_ptr<SkCodec>(new SkGifCodec(encodedInfo, imageInfo, reader.release()));
}
bool SkGifCodec::onRewind() {
diff --git a/src/codec/SkGifCodec.h b/src/codec/SkGifCodec.h
index 6ecd419ea3..89c84bdda3 100644
--- a/src/codec/SkGifCodec.h
+++ b/src/codec/SkGifCodec.h
@@ -29,7 +29,7 @@ public:
* Assumes IsGif was called and returned true
* Reads enough of the stream to determine the image format
*/
- static SkCodec* NewFromStream(SkStream*, Result*);
+ static std::unique_ptr<SkCodec> MakeFromStream(std::unique_ptr<SkStream>, Result*);
// Callback for SkGifImageReader when a row is available.
bool haveDecodedRow(int frameIndex, const unsigned char* rowBegin,
diff --git a/src/codec/SkIcoCodec.cpp b/src/codec/SkIcoCodec.cpp
index 2e61bfe45d..fce14a2f35 100644
--- a/src/codec/SkIcoCodec.cpp
+++ b/src/codec/SkIcoCodec.cpp
@@ -26,18 +26,15 @@ bool SkIcoCodec::IsIco(const void* buffer, size_t bytesRead) {
!memcmp(buffer, curSig, sizeof(curSig)));
}
-SkCodec* SkIcoCodec::NewFromStream(SkStream* stream, Result* result) {
- // Ensure that we do not leak the input stream
- std::unique_ptr<SkStream> inputStream(stream);
-
+std::unique_ptr<SkCodec> SkIcoCodec::MakeFromStream(std::unique_ptr<SkStream> stream,
+ Result* result) {
// Header size constants
static const uint32_t kIcoDirectoryBytes = 6;
static const uint32_t kIcoDirEntryBytes = 16;
// Read the directory header
std::unique_ptr<uint8_t[]> dirBuffer(new uint8_t[kIcoDirectoryBytes]);
- if (inputStream.get()->read(dirBuffer.get(), kIcoDirectoryBytes) !=
- kIcoDirectoryBytes) {
+ if (stream->read(dirBuffer.get(), kIcoDirectoryBytes) != kIcoDirectoryBytes) {
SkCodecPrintf("Error: unable to read ico directory header.\n");
*result = kIncompleteInput;
return nullptr;
@@ -71,8 +68,7 @@ SkCodec* SkIcoCodec::NewFromStream(SkStream* stream, Result* result) {
// Iterate over directory entries
for (uint32_t i = 0; i < numImages; i++) {
uint8_t entryBuffer[kIcoDirEntryBytes];
- if (inputStream->read(entryBuffer, kIcoDirEntryBytes) !=
- kIcoDirEntryBytes) {
+ if (stream->read(entryBuffer, kIcoDirEntryBytes) != kIcoDirEntryBytes) {
SkCodecPrintf("Error: Dir entries truncated in ico.\n");
*result = kIncompleteInput;
return nullptr;
@@ -128,7 +124,7 @@ SkCodec* SkIcoCodec::NewFromStream(SkStream* stream, Result* result) {
// If we cannot skip, assume we have reached the end of the stream and
// stop trying to make codecs
- if (inputStream.get()->skip(offset - bytesRead) != offset - bytesRead) {
+ if (stream->skip(offset - bytesRead) != offset - bytesRead) {
SkCodecPrintf("Warning: could not skip to ico offset.\n");
break;
}
@@ -141,7 +137,7 @@ SkCodec* SkIcoCodec::NewFromStream(SkStream* stream, Result* result) {
break;
}
- if (inputStream->read(buffer.get(), size) != size) {
+ if (stream->read(buffer.get(), size) != size) {
SkCodecPrintf("Warning: could not create embedded stream.\n");
*result = kIncompleteInput;
break;
@@ -152,17 +148,17 @@ SkCodec* SkIcoCodec::NewFromStream(SkStream* stream, Result* result) {
bytesRead += size;
// Check if the embedded codec is bmp or png and create the codec
- SkCodec* codec = nullptr;
+ std::unique_ptr<SkCodec> codec;
Result dummyResult;
if (SkPngCodec::IsPng((const char*) data->bytes(), data->size())) {
- codec = SkPngCodec::NewFromStream(embeddedStream.release(), &dummyResult);
+ codec = SkPngCodec::MakeFromStream(std::move(embeddedStream), &dummyResult);
} else {
- codec = SkBmpCodec::NewFromIco(embeddedStream.release(), &dummyResult);
+ codec = SkBmpCodec::MakeFromIco(std::move(embeddedStream), &dummyResult);
}
// Save a valid codec
if (nullptr != codec) {
- codecs->push_back().reset(codec);
+ codecs->push_back().reset(codec.release());
}
}
@@ -192,7 +188,8 @@ SkCodec* SkIcoCodec::NewFromStream(SkStream* stream, Result* result) {
*result = kSuccess;
// The original stream is no longer needed, because the embedded codecs own their
// own streams.
- return new SkIcoCodec(width, height, info, codecs.release(), sk_ref_sp(colorSpace));
+ return std::unique_ptr<SkCodec>(new SkIcoCodec(width, height, info, codecs.release(),
+ sk_ref_sp(colorSpace)));
}
/*
diff --git a/src/codec/SkIcoCodec.h b/src/codec/SkIcoCodec.h
index 0c27934e0c..aa19c9b935 100644
--- a/src/codec/SkIcoCodec.h
+++ b/src/codec/SkIcoCodec.h
@@ -25,7 +25,7 @@ public:
* Creates an Ico decoder
* Reads enough of the stream to determine the image format
*/
- static SkCodec* NewFromStream(SkStream*, Result*);
+ static std::unique_ptr<SkCodec> MakeFromStream(std::unique_ptr<SkStream>, Result*);
protected:
diff --git a/src/codec/SkJpegCodec.cpp b/src/codec/SkJpegCodec.cpp
index f3dbdf199c..8f88138afb 100644
--- a/src/codec/SkJpegCodec.cpp
+++ b/src/codec/SkJpegCodec.cpp
@@ -252,8 +252,9 @@ SkCodec::Result SkJpegCodec::ReadHeader(SkStream* stream, SkCodec** codecOut,
const int width = decoderMgr->dinfo()->image_width;
const int height = decoderMgr->dinfo()->image_height;
- SkJpegCodec* codec = new SkJpegCodec(width, height, info, stream, decoderMgr.release(),
- std::move(colorSpace), orientation);
+ SkJpegCodec* codec = new SkJpegCodec(width, height, info, std::unique_ptr<SkStream>(stream),
+ decoderMgr.release(), std::move(colorSpace),
+ orientation);
*codecOut = codec;
} else {
SkASSERT(nullptr != decoderMgrOut);
@@ -262,27 +263,29 @@ SkCodec::Result SkJpegCodec::ReadHeader(SkStream* stream, SkCodec** codecOut,
return kSuccess;
}
-SkCodec* SkJpegCodec::NewFromStream(SkStream* stream, Result* result) {
- return SkJpegCodec::NewFromStream(stream, result, SkColorSpace::MakeSRGB());
+std::unique_ptr<SkCodec> SkJpegCodec::MakeFromStream(std::unique_ptr<SkStream> stream,
+ Result* result) {
+ return SkJpegCodec::MakeFromStream(std::move(stream), result, SkColorSpace::MakeSRGB());
}
-SkCodec* SkJpegCodec::NewFromStream(SkStream* stream, Result* result,
+std::unique_ptr<SkCodec> SkJpegCodec::MakeFromStream(std::unique_ptr<SkStream> stream,
+ Result* result,
sk_sp<SkColorSpace> defaultColorSpace) {
- std::unique_ptr<SkStream> streamDeleter(stream);
SkCodec* codec = nullptr;
- *result = ReadHeader(stream, &codec, nullptr, std::move(defaultColorSpace));
+ *result = ReadHeader(stream.get(), &codec, nullptr, std::move(defaultColorSpace));
if (kSuccess == *result) {
// Codec has taken ownership of the stream, we do not need to delete it
SkASSERT(codec);
- streamDeleter.release();
- return codec;
+ stream.release();
+ return std::unique_ptr<SkCodec>(codec);
}
return nullptr;
}
-SkJpegCodec::SkJpegCodec(int width, int height, const SkEncodedInfo& info, SkStream* stream,
- JpegDecoderMgr* decoderMgr, sk_sp<SkColorSpace> colorSpace, Origin origin)
- : INHERITED(width, height, info, SkColorSpaceXform::kRGBA_8888_ColorFormat, stream,
+SkJpegCodec::SkJpegCodec(int width, int height, const SkEncodedInfo& info,
+ std::unique_ptr<SkStream> stream, JpegDecoderMgr* decoderMgr,
+ sk_sp<SkColorSpace> colorSpace, Origin origin)
+ : INHERITED(width, height, info, SkColorSpaceXform::kRGBA_8888_ColorFormat, std::move(stream),
std::move(colorSpace), origin)
, fDecoderMgr(decoderMgr)
, fReadyState(decoderMgr->dinfo()->global_state)
diff --git a/src/codec/SkJpegCodec.h b/src/codec/SkJpegCodec.h
index 96228f305a..1409182a97 100644
--- a/src/codec/SkJpegCodec.h
+++ b/src/codec/SkJpegCodec.h
@@ -31,7 +31,7 @@ public:
* Assumes IsJpeg was called and returned true
* Takes ownership of the stream
*/
- static SkCodec* NewFromStream(SkStream*, Result*);
+ static std::unique_ptr<SkCodec> MakeFromStream(std::unique_ptr<SkStream>, Result*);
protected:
@@ -63,7 +63,8 @@ private:
/*
* Allows SkRawCodec to communicate the color space from the exif data.
*/
- static SkCodec* NewFromStream(SkStream*, Result*, sk_sp<SkColorSpace> defaultColorSpace);
+ static std::unique_ptr<SkCodec> MakeFromStream(std::unique_ptr<SkStream>, Result*,
+ sk_sp<SkColorSpace> defaultColorSpace);
/*
* Read enough of the stream to initialize the SkJpegCodec.
@@ -99,7 +100,7 @@ private:
* @param decoderMgr holds decompress struct, src manager, and error manager
* takes ownership
*/
- SkJpegCodec(int width, int height, const SkEncodedInfo& info, SkStream* stream,
+ SkJpegCodec(int width, int height, const SkEncodedInfo& info, std::unique_ptr<SkStream> stream,
JpegDecoderMgr* decoderMgr, sk_sp<SkColorSpace> colorSpace, Origin origin);
/*
diff --git a/src/codec/SkPngCodec.cpp b/src/codec/SkPngCodec.cpp
index 560b5bfe6b..13e45ab609 100644
--- a/src/codec/SkPngCodec.cpp
+++ b/src/codec/SkPngCodec.cpp
@@ -480,9 +480,10 @@ void SkPngCodec::applyXformRow(void* dst, const void* src) {
class SkPngNormalDecoder : public SkPngCodec {
public:
- SkPngNormalDecoder(const SkEncodedInfo& info, const SkImageInfo& imageInfo, SkStream* stream,
- SkPngChunkReader* reader, png_structp png_ptr, png_infop info_ptr, int bitDepth)
- : INHERITED(info, imageInfo, stream, reader, png_ptr, info_ptr, bitDepth)
+ SkPngNormalDecoder(const SkEncodedInfo& info, const SkImageInfo& imageInfo,
+ std::unique_ptr<SkStream> stream, SkPngChunkReader* reader,
+ png_structp png_ptr, png_infop info_ptr, int bitDepth)
+ : INHERITED(info, imageInfo, std::move(stream), reader, png_ptr, info_ptr, bitDepth)
, fRowsWrittenToOutput(0)
, fDst(nullptr)
, fRowBytes(0)
@@ -598,9 +599,9 @@ private:
class SkPngInterlacedDecoder : public SkPngCodec {
public:
SkPngInterlacedDecoder(const SkEncodedInfo& info, const SkImageInfo& imageInfo,
- SkStream* stream, SkPngChunkReader* reader, png_structp png_ptr, png_infop info_ptr,
- int bitDepth, int numberPasses)
- : INHERITED(info, imageInfo, stream, reader, png_ptr, info_ptr, bitDepth)
+ std::unique_ptr<SkStream> stream, SkPngChunkReader* reader, png_structp png_ptr,
+ png_infop info_ptr, int bitDepth, int numberPasses)
+ : INHERITED(info, imageInfo, std::move(stream), reader, png_ptr, info_ptr, bitDepth)
, fNumberPasses(numberPasses)
, fFirstRow(0)
, fLastRow(0)
@@ -922,11 +923,12 @@ void AutoCleanPng::infoCallback(size_t idatLength) {
}
if (1 == numberPasses) {
- *fOutCodec = new SkPngNormalDecoder(encodedInfo, imageInfo, fStream,
- fChunkReader, fPng_ptr, fInfo_ptr, bitDepth);
+ *fOutCodec = new SkPngNormalDecoder(encodedInfo, imageInfo,
+ std::unique_ptr<SkStream>(fStream), fChunkReader, fPng_ptr, fInfo_ptr, bitDepth);
} else {
- *fOutCodec = new SkPngInterlacedDecoder(encodedInfo, imageInfo, fStream,
- fChunkReader, fPng_ptr, fInfo_ptr, bitDepth, numberPasses);
+ *fOutCodec = new SkPngInterlacedDecoder(encodedInfo, imageInfo,
+ std::unique_ptr<SkStream>(fStream), fChunkReader, fPng_ptr, fInfo_ptr, bitDepth,
+ numberPasses);
}
static_cast<SkPngCodec*>(*fOutCodec)->setIdatLength(idatLength);
}
@@ -937,9 +939,9 @@ void AutoCleanPng::infoCallback(size_t idatLength) {
}
SkPngCodec::SkPngCodec(const SkEncodedInfo& encodedInfo, const SkImageInfo& imageInfo,
- SkStream* stream, SkPngChunkReader* chunkReader, void* png_ptr,
- void* info_ptr, int bitDepth)
- : INHERITED(encodedInfo, imageInfo, png_select_xform_format(encodedInfo), stream)
+ std::unique_ptr<SkStream> stream, SkPngChunkReader* chunkReader,
+ void* png_ptr, void* info_ptr, int bitDepth)
+ : INHERITED(encodedInfo, imageInfo, png_select_xform_format(encodedInfo), std::move(stream))
, fPngChunkReader(SkSafeRef(chunkReader))
, fPng_ptr(png_ptr)
, fInfo_ptr(info_ptr)
@@ -1145,15 +1147,14 @@ uint64_t SkPngCodec::onGetFillValue(const SkImageInfo& dstInfo) const {
return INHERITED::onGetFillValue(dstInfo);
}
-SkCodec* SkPngCodec::NewFromStream(SkStream* stream, Result* result, SkPngChunkReader* chunkReader) {
- std::unique_ptr<SkStream> streamDeleter(stream);
-
+std::unique_ptr<SkCodec> SkPngCodec::MakeFromStream(std::unique_ptr<SkStream> stream,
+ Result* result, SkPngChunkReader* chunkReader) {
SkCodec* outCodec = nullptr;
- *result = read_header(stream, chunkReader, &outCodec, nullptr, nullptr);
+ *result = read_header(stream.get(), chunkReader, &outCodec, nullptr, nullptr);
if (kSuccess == *result) {
// Codec has taken ownership of the stream.
SkASSERT(outCodec);
- streamDeleter.release();
+ stream.release();
}
- return outCodec;
+ return std::unique_ptr<SkCodec>(outCodec);
}
diff --git a/src/codec/SkPngCodec.h b/src/codec/SkPngCodec.h
index b5f9347705..8496705258 100644
--- a/src/codec/SkPngCodec.h
+++ b/src/codec/SkPngCodec.h
@@ -23,8 +23,8 @@ public:
static bool IsPng(const char*, size_t);
// Assume IsPng was called and returned true.
- static SkCodec* NewFromStream(SkStream*, Result*,
- SkPngChunkReader* = nullptr);
+ static std::unique_ptr<SkCodec> MakeFromStream(std::unique_ptr<SkStream>, Result*,
+ SkPngChunkReader* = nullptr);
// FIXME (scroggo): Temporarily needed by AutoCleanPng.
void setIdatLength(size_t len) { fIdatLength = len; }
@@ -45,8 +45,8 @@ protected:
void* fPtr;
};
- SkPngCodec(const SkEncodedInfo&, const SkImageInfo&, SkStream*, SkPngChunkReader*,
- void* png_ptr, void* info_ptr, int bitDepth);
+ SkPngCodec(const SkEncodedInfo&, const SkImageInfo&, std::unique_ptr<SkStream>,
+ SkPngChunkReader*, void* png_ptr, void* info_ptr, int bitDepth);
Result onGetPixels(const SkImageInfo&, void*, size_t, const Options&, int*)
override;
diff --git a/src/codec/SkRawCodec.cpp b/src/codec/SkRawCodec.cpp
index d23eec0de6..dbcbd28499 100644
--- a/src/codec/SkRawCodec.cpp
+++ b/src/codec/SkRawCodec.cpp
@@ -10,6 +10,7 @@
#include "SkColorPriv.h"
#include "SkData.h"
#include "SkJpegCodec.h"
+#include "SkMakeUnique.h"
#include "SkMutex.h"
#include "SkRawCodec.h"
#include "SkRefCnt.h"
@@ -196,7 +197,7 @@ public:
* Note: for performance reason, this function is destructive to the SkRawStream. One should
* abandon current object after the function call.
*/
- virtual SkMemoryStream* transferBuffer(size_t offset, size_t size) = 0;
+ virtual std::unique_ptr<SkMemoryStream> transferBuffer(size_t offset, size_t size) = 0;
};
class SkRawLimitedDynamicMemoryWStream : public SkDynamicMemoryWStream {
@@ -225,13 +226,12 @@ private:
// Note: the maximum buffer size is 100MB (limited by SkRawLimitedDynamicMemoryWStream).
class SkRawBufferedStream : public SkRawStream {
public:
- // Will take the ownership of the stream.
- explicit SkRawBufferedStream(SkStream* stream)
- : fStream(stream)
+ explicit SkRawBufferedStream(std::unique_ptr<SkStream> stream)
+ : fStream(std::move(stream))
, fWholeStreamRead(false)
{
// Only use SkRawBufferedStream when the stream is not an asset stream.
- SkASSERT(!is_asset_stream(*stream));
+ SkASSERT(!is_asset_stream(*fStream));
}
~SkRawBufferedStream() override {}
@@ -256,7 +256,7 @@ public:
return this->bufferMoreData(sum) && fStreamBuffer.read(data, offset, length);
}
- SkMemoryStream* transferBuffer(size_t offset, size_t size) override {
+ std::unique_ptr<SkMemoryStream> transferBuffer(size_t offset, size_t size) override {
sk_sp<SkData> data(SkData::MakeUninitialized(size));
if (offset > fStreamBuffer.bytesWritten()) {
// If the offset is not buffered, read from fStream directly and skip the buffering.
@@ -288,7 +288,7 @@ public:
}
}
}
- return new SkMemoryStream(data);
+ return skstd::make_unique<SkMemoryStream>(data);
}
private:
@@ -333,12 +333,11 @@ private:
class SkRawAssetStream : public SkRawStream {
public:
- // Will take the ownership of the stream.
- explicit SkRawAssetStream(SkStream* stream)
- : fStream(stream)
+ explicit SkRawAssetStream(std::unique_ptr<SkStream> stream)
+ : fStream(std::move(stream))
{
// Only use SkRawAssetStream when the stream is an asset stream.
- SkASSERT(is_asset_stream(*stream));
+ SkASSERT(is_asset_stream(*fStream));
}
~SkRawAssetStream() override {}
@@ -361,7 +360,7 @@ public:
return fStream->seek(offset) && (fStream->read(data, length) == length);
}
- SkMemoryStream* transferBuffer(size_t offset, size_t size) override {
+ std::unique_ptr<SkMemoryStream> transferBuffer(size_t offset, size_t size) override {
if (fStream->getLength() < offset) {
return nullptr;
}
@@ -382,7 +381,7 @@ public:
sk_sp<SkData> data(SkData::MakeWithCopy(
static_cast<const uint8_t*>(fStream->getMemoryBase()) + offset, bytesToRead));
fStream.reset();
- return new SkMemoryStream(data);
+ return skstd::make_unique<SkMemoryStream>(data);
} else {
sk_sp<SkData> data(SkData::MakeUninitialized(bytesToRead));
if (!fStream->seek(offset)) {
@@ -392,7 +391,7 @@ public:
if (bytesRead < bytesToRead) {
data = SkData::MakeSubset(data.get(), 0, bytesRead);
}
- return new SkMemoryStream(data);
+ return skstd::make_unique<SkMemoryStream>(data);
}
}
private:
@@ -630,12 +629,13 @@ private:
* SkJpegCodec. If PIEX returns kFail, then the file is invalid, return nullptr. In other cases,
* fallback to create SkRawCodec for DNG images.
*/
-SkCodec* SkRawCodec::NewFromStream(SkStream* stream, Result* result) {
+std::unique_ptr<SkCodec> SkRawCodec::MakeFromStream(std::unique_ptr<SkStream> stream,
+ Result* result) {
std::unique_ptr<SkRawStream> rawStream;
if (is_asset_stream(*stream)) {
- rawStream.reset(new SkRawAssetStream(stream));
+ rawStream.reset(new SkRawAssetStream(std::move(stream)));
} else {
- rawStream.reset(new SkRawBufferedStream(stream));
+ rawStream.reset(new SkRawBufferedStream(std::move(stream)));
}
// Does not take the ownership of rawStream.
@@ -666,13 +666,14 @@ SkCodec* SkRawCodec::NewFromStream(SkStream* stream, Result* result) {
// transferBuffer() is destructive to the rawStream. Abandon the rawStream after this
// function call.
// FIXME: one may avoid the copy of memoryStream and use the buffered rawStream.
- SkMemoryStream* memoryStream =
- rawStream->transferBuffer(imageData.preview.offset, imageData.preview.length);
+ auto memoryStream = rawStream->transferBuffer(imageData.preview.offset,
+ imageData.preview.length);
if (!memoryStream) {
*result = kInvalidInput;
return nullptr;
}
- return SkJpegCodec::NewFromStream(memoryStream, result, std::move(colorSpace));
+ return SkJpegCodec::MakeFromStream(std::move(memoryStream), result,
+ std::move(colorSpace));
}
}
@@ -689,7 +690,7 @@ SkCodec* SkRawCodec::NewFromStream(SkStream* stream, Result* result) {
}
*result = kSuccess;
- return new SkRawCodec(dngImage.release());
+ return std::unique_ptr<SkCodec>(new SkRawCodec(dngImage.release()));
}
SkCodec::Result SkRawCodec::onGetPixels(const SkImageInfo& dstInfo, void* dst,
diff --git a/src/codec/SkRawCodec.h b/src/codec/SkRawCodec.h
index 5ed721190f..c258ac1651 100644
--- a/src/codec/SkRawCodec.h
+++ b/src/codec/SkRawCodec.h
@@ -28,7 +28,7 @@ public:
* Creates a RAW decoder
* Takes ownership of the stream
*/
- static SkCodec* NewFromStream(SkStream*, Result*);
+ static std::unique_ptr<SkCodec> MakeFromStream(std::unique_ptr<SkStream>, Result*);
~SkRawCodec() override;
diff --git a/src/codec/SkStreamBuffer.cpp b/src/codec/SkStreamBuffer.cpp
index 754065d97a..00253fa751 100644
--- a/src/codec/SkStreamBuffer.cpp
+++ b/src/codec/SkStreamBuffer.cpp
@@ -7,11 +7,11 @@
#include "SkStreamBuffer.h"
-SkStreamBuffer::SkStreamBuffer(SkStream* stream)
- : fStream(stream)
+SkStreamBuffer::SkStreamBuffer(std::unique_ptr<SkStream> stream)
+ : fStream(std::move(stream))
, fPosition(0)
, fBytesBuffered(0)
- , fHasLengthAndPosition(stream->hasLength() && stream->hasPosition())
+ , fHasLengthAndPosition(fStream->hasLength() && fStream->hasPosition())
, fTrulyBuffered(0)
{}
diff --git a/src/codec/SkStreamBuffer.h b/src/codec/SkStreamBuffer.h
index 2b60775dd2..7543e32ff7 100644
--- a/src/codec/SkStreamBuffer.h
+++ b/src/codec/SkStreamBuffer.h
@@ -24,9 +24,7 @@
*/
class SkStreamBuffer : SkNoncopyable {
public:
- // Takes ownership of the SkStream.
- SkStreamBuffer(SkStream*);
-
+ SkStreamBuffer(std::unique_ptr<SkStream>);
~SkStreamBuffer();
/**
diff --git a/src/codec/SkWbmpCodec.cpp b/src/codec/SkWbmpCodec.cpp
index eea5e4babc..934d7d5b9a 100644
--- a/src/codec/SkWbmpCodec.cpp
+++ b/src/codec/SkWbmpCodec.cpp
@@ -95,10 +95,11 @@ bool SkWbmpCodec::readRow(uint8_t* row) {
return this->stream()->read(row, fSrcRowBytes) == fSrcRowBytes;
}
-SkWbmpCodec::SkWbmpCodec(int width, int height, const SkEncodedInfo& info, SkStream* stream)
+SkWbmpCodec::SkWbmpCodec(int width, int height, const SkEncodedInfo& info,
+ std::unique_ptr<SkStream> stream)
// Wbmp does not need a colorXform, so choose an arbitrary srcFormat.
: INHERITED(width, height, info, SkColorSpaceXform::ColorFormat(),
- stream, SkColorSpace::MakeSRGB())
+ std::move(stream), SkColorSpace::MakeSRGB())
, fSrcRowBytes(get_src_row_bytes(this->getInfo().width()))
, fSwizzler(nullptr)
{}
@@ -145,10 +146,10 @@ bool SkWbmpCodec::IsWbmp(const void* buffer, size_t bytesRead) {
return read_header(&stream, nullptr);
}
-SkCodec* SkWbmpCodec::NewFromStream(SkStream* stream, Result* result) {
- std::unique_ptr<SkStream> streamDeleter(stream);
+std::unique_ptr<SkCodec> SkWbmpCodec::MakeFromStream(std::unique_ptr<SkStream> stream,
+ Result* result) {
SkISize size;
- if (!read_header(stream, &size)) {
+ if (!read_header(stream.get(), &size)) {
// This already succeeded in IsWbmp, so this stream was corrupted in/
// after rewind.
*result = kCouldNotRewind;
@@ -157,7 +158,8 @@ SkCodec* SkWbmpCodec::NewFromStream(SkStream* stream, Result* result) {
*result = kSuccess;
SkEncodedInfo info = SkEncodedInfo::Make(SkEncodedInfo::kGray_Color,
SkEncodedInfo::kOpaque_Alpha, 1);
- return new SkWbmpCodec(size.width(), size.height(), info, streamDeleter.release());
+ return std::unique_ptr<SkCodec>(new SkWbmpCodec(size.width(), size.height(), info,
+ std::move(stream)));
}
int SkWbmpCodec::onGetScanlines(void* dst, int count, size_t dstRowBytes) {
diff --git a/src/codec/SkWbmpCodec.h b/src/codec/SkWbmpCodec.h
index f81b428e4f..03287710e0 100644
--- a/src/codec/SkWbmpCodec.h
+++ b/src/codec/SkWbmpCodec.h
@@ -21,7 +21,7 @@ public:
* Creates a wbmp codec
* Takes ownership of the stream
*/
- static SkCodec* NewFromStream(SkStream*, Result*);
+ static std::unique_ptr<SkCodec> MakeFromStream(std::unique_ptr<SkStream>, Result*);
protected:
SkEncodedImageFormat onGetEncodedFormat() const override;
@@ -44,7 +44,7 @@ private:
*/
bool readRow(uint8_t* row);
- SkWbmpCodec(int width, int height, const SkEncodedInfo&, SkStream*);
+ SkWbmpCodec(int width, int height, const SkEncodedInfo&, std::unique_ptr<SkStream>);
const size_t fSrcRowBytes;
diff --git a/src/codec/SkWebpCodec.cpp b/src/codec/SkWebpCodec.cpp
index 02e6ff2bf9..94fa175f82 100644
--- a/src/codec/SkWebpCodec.cpp
+++ b/src/codec/SkWebpCodec.cpp
@@ -11,6 +11,7 @@
#include "SkCodecAnimationPriv.h"
#include "SkCodecPriv.h"
#include "SkColorSpaceXform.h"
+#include "SkMakeUnique.h"
#include "SkRasterPipeline.h"
#include "SkSampler.h"
#include "SkStreamPriv.h"
@@ -44,19 +45,18 @@ static SkAlphaType alpha_type(bool hasAlpha) {
// Parse headers of RIFF container, and check for valid Webp (VP8) content.
// Returns an SkWebpCodec on success
-SkCodec* SkWebpCodec::NewFromStream(SkStream* stream, Result* result) {
- std::unique_ptr<SkStream> streamDeleter(stream);
-
+std::unique_ptr<SkCodec> SkWebpCodec::MakeFromStream(std::unique_ptr<SkStream> stream,
+ Result* result) {
// Webp demux needs a contiguous data buffer.
sk_sp<SkData> data = nullptr;
if (stream->getMemoryBase()) {
// It is safe to make without copy because we'll hold onto the stream.
data = SkData::MakeWithoutCopy(stream->getMemoryBase(), stream->getLength());
} else {
- data = SkCopyStreamToData(stream);
+ data = SkCopyStreamToData(stream.get());
// If we are forced to copy the stream to a data, we can go ahead and delete the stream.
- streamDeleter.reset(nullptr);
+ stream.reset(nullptr);
}
// It's a little strange that the |demux| will outlive |webpData|, though it needs the
@@ -162,9 +162,8 @@ SkCodec* SkWebpCodec::NewFromStream(SkStream* stream, Result* result) {
*result = kSuccess;
SkEncodedInfo info = SkEncodedInfo::Make(color, alpha, 8);
- return new SkWebpCodec(width, height, info, std::move(colorSpace),
- streamDeleter.release(), demux.release(),
- std::move(data));
+ return std::unique_ptr<SkCodec>(new SkWebpCodec(width, height, info, std::move(colorSpace),
+ std::move(stream), demux.release(), std::move(data)));
}
SkISize SkWebpCodec::onGetScaledDimensions(float desiredScale) const {
@@ -628,9 +627,9 @@ SkCodec::Result SkWebpCodec::onGetPixels(const SkImageInfo& dstInfo, void* dst,
}
SkWebpCodec::SkWebpCodec(int width, int height, const SkEncodedInfo& info,
- sk_sp<SkColorSpace> colorSpace, SkStream* stream, WebPDemuxer* demux,
- sk_sp<SkData> data)
- : INHERITED(width, height, info, SkColorSpaceXform::kBGRA_8888_ColorFormat, stream,
+ sk_sp<SkColorSpace> colorSpace, std::unique_ptr<SkStream> stream,
+ WebPDemuxer* demux, sk_sp<SkData> data)
+ : INHERITED(width, height, info, SkColorSpaceXform::kBGRA_8888_ColorFormat, std::move(stream),
std::move(colorSpace))
, fDemux(demux)
, fData(std::move(data))
diff --git a/src/codec/SkWebpCodec.h b/src/codec/SkWebpCodec.h
index e06d0972fe..60bff61220 100644
--- a/src/codec/SkWebpCodec.h
+++ b/src/codec/SkWebpCodec.h
@@ -28,7 +28,7 @@ static const size_t WEBP_VP8_HEADER_SIZE = 30;
class SkWebpCodec final : public SkCodec {
public:
// Assumes IsWebp was called and returned true.
- static SkCodec* NewFromStream(SkStream*, Result*);
+ static std::unique_ptr<SkCodec> MakeFromStream(std::unique_ptr<SkStream>, Result*);
static bool IsWebp(const void*, size_t);
protected:
Result onGetPixels(const SkImageInfo&, void*, size_t, const Options&, int*) override;
@@ -49,8 +49,8 @@ protected:
}
private:
- SkWebpCodec(int width, int height, const SkEncodedInfo&, sk_sp<SkColorSpace>, SkStream*,
- WebPDemuxer*, sk_sp<SkData>);
+ SkWebpCodec(int width, int height, const SkEncodedInfo&, sk_sp<SkColorSpace>,
+ std::unique_ptr<SkStream>, WebPDemuxer*, sk_sp<SkData>);
SkAutoTCallVProc<WebPDemuxer, WebPDemuxDelete> fDemux;