aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/codec/SkCodec.cpp
diff options
context:
space:
mode:
authorGravatar Mike Reed <reed@google.com>2017-07-23 15:30:02 -0400
committerGravatar Skia Commit-Bot <skia-commit-bot@chromium.org>2017-07-25 15:35:23 +0000
commitede7bac43fbc69b9fdf1c178890ba6353f5bb140 (patch)
treedccdba46e7abf125e2f90e6dc08eca00ad9cb09b /src/codec/SkCodec.cpp
parentfa3ed03720b5083afd3620c9239863f05f2eedbd (diff)
use unique_ptr for codec factories
Will need guards for android (at least) Bug: skia: Change-Id: I2bb8e656997984489ef1f2e41cd3d301c4e7b947 Reviewed-on: https://skia-review.googlesource.com/26040 Reviewed-by: Mike Klein <mtklein@chromium.org> Commit-Queue: Mike Reed <reed@google.com>
Diffstat (limited to 'src/codec/SkCodec.cpp')
-rw-r--r--src/codec/SkCodec.cpp48
1 files changed, 28 insertions, 20 deletions
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