diff options
author | Mike Reed <reed@google.com> | 2017-07-23 15:30:02 -0400 |
---|---|---|
committer | Skia Commit-Bot <skia-commit-bot@chromium.org> | 2017-07-25 15:35:23 +0000 |
commit | ede7bac43fbc69b9fdf1c178890ba6353f5bb140 (patch) | |
tree | dccdba46e7abf125e2f90e6dc08eca00ad9cb09b /src/codec/SkCodec.cpp | |
parent | fa3ed03720b5083afd3620c9239863f05f2eedbd (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.cpp | 48 |
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 |