blob: e6ca2122ea4bc1d1962cfedc7d9e46ea0859417f [file] [log] [blame]
msarettedd2dcf2016-01-14 13:12:26 -08001/*
2 * Copyright 2015 Google Inc.
3 *
4 * Use of this source code is governed by a BSD-style license that can be
5 * found in the LICENSE file.
6 */
7
8#include "SkCodecImageGenerator.h"
Mike Reed185130c2017-02-15 15:14:16 -05009#include "SkMakeUnique.h"
msarettedd2dcf2016-01-14 13:12:26 -080010
Mike Reed185130c2017-02-15 15:14:16 -050011std::unique_ptr<SkImageGenerator> SkCodecImageGenerator::MakeFromEncodedCodec(sk_sp<SkData> data) {
Mike Reedede7bac2017-07-23 15:30:02 -040012 auto codec = SkCodec::MakeFromData(data);
msarettedd2dcf2016-01-14 13:12:26 -080013 if (nullptr == codec) {
14 return nullptr;
15 }
16
Mike Reedede7bac2017-07-23 15:30:02 -040017 return std::unique_ptr<SkImageGenerator>(new SkCodecImageGenerator(std::move(codec), data));
msarettedd2dcf2016-01-14 13:12:26 -080018}
19
Matt Sarettebb1b5c2017-05-12 11:41:27 -040020static SkImageInfo adjust_info(const SkImageInfo& info) {
21 SkImageInfo newInfo = info;
brianosman03707122016-04-21 08:48:18 -070022 if (kUnpremul_SkAlphaType == info.alphaType()) {
Matt Sarettebb1b5c2017-05-12 11:41:27 -040023 newInfo = newInfo.makeAlphaType(kPremul_SkAlphaType);
herb4d1061c2016-04-15 12:57:42 -070024 }
Matt Sarettebb1b5c2017-05-12 11:41:27 -040025 return newInfo;
msarettb714fb02016-01-22 14:46:42 -080026}
27
Mike Reedede7bac2017-07-23 15:30:02 -040028SkCodecImageGenerator::SkCodecImageGenerator(std::unique_ptr<SkCodec> codec, sk_sp<SkData> data)
Matt Sarettebb1b5c2017-05-12 11:41:27 -040029 : INHERITED(adjust_info(codec->getInfo()))
Mike Reedede7bac2017-07-23 15:30:02 -040030 , fCodec(std::move(codec))
reed42943c82016-09-12 12:01:44 -070031 , fData(std::move(data))
msarettedd2dcf2016-01-14 13:12:26 -080032{}
33
Brian Osman2feb7962017-04-25 16:41:47 -040034SkData* SkCodecImageGenerator::onRefEncodedData() {
msarettedd2dcf2016-01-14 13:12:26 -080035 return SkRef(fData.get());
36}
37
38bool SkCodecImageGenerator::onGetPixels(const SkImageInfo& info, void* pixels, size_t rowBytes,
Matt Sarettd531ca02017-03-24 16:31:19 -040039 const Options& opts) {
40 SkCodec::Options codecOpts;
41 codecOpts.fPremulBehavior = opts.fBehavior;
Leon Scroggins571b30f2017-07-11 17:35:31 +000042 SkCodec::Result result = fCodec->getPixels(info, pixels, rowBytes, &codecOpts);
msarettedd2dcf2016-01-14 13:12:26 -080043 switch (result) {
44 case SkCodec::kSuccess:
45 case SkCodec::kIncompleteInput:
Leon Scroggins III674a1842017-07-06 12:26:09 -040046 case SkCodec::kErrorInInput:
msarettedd2dcf2016-01-14 13:12:26 -080047 return true;
48 default:
49 return false;
50 }
51}
52
msarett4984c3c2016-03-10 05:44:43 -080053bool SkCodecImageGenerator::onQueryYUV8(SkYUVSizeInfo* sizeInfo, SkYUVColorSpace* colorSpace) const
54{
55 return fCodec->queryYUV8(sizeInfo, colorSpace);
56}
msarettb714fb02016-01-22 14:46:42 -080057
msarett4984c3c2016-03-10 05:44:43 -080058bool SkCodecImageGenerator::onGetYUV8Planes(const SkYUVSizeInfo& sizeInfo, void* planes[3]) {
msarettb714fb02016-01-22 14:46:42 -080059 SkCodec::Result result = fCodec->getYUV8Planes(sizeInfo, planes);
msarettb714fb02016-01-22 14:46:42 -080060
61 switch (result) {
62 case SkCodec::kSuccess:
63 case SkCodec::kIncompleteInput:
Leon Scroggins III674a1842017-07-06 12:26:09 -040064 case SkCodec::kErrorInInput:
msarettb714fb02016-01-22 14:46:42 -080065 return true;
66 default:
67 return false;
68 }
msarettedd2dcf2016-01-14 13:12:26 -080069}