blob: 20d547ad363711ab6790a03dd852b4b9c2758d8b [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) {
msarettedd2dcf2016-01-14 13:12:26 -080012 SkCodec* codec = SkCodec::NewFromData(data);
13 if (nullptr == codec) {
14 return nullptr;
15 }
16
Mike Reed185130c2017-02-15 15:14:16 -050017 return std::unique_ptr<SkImageGenerator>(new SkCodecImageGenerator(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 }
msarett3ec5db42016-03-23 06:50:59 -070025
Matt Sarettebb1b5c2017-05-12 11:41:27 -040026 if (kIndex_8_SkColorType == info.colorType()) {
27 newInfo = newInfo.makeColorType(kN32_SkColorType);
28 }
29
30 return newInfo;
msarettb714fb02016-01-22 14:46:42 -080031}
32
reed42943c82016-09-12 12:01:44 -070033SkCodecImageGenerator::SkCodecImageGenerator(SkCodec* codec, sk_sp<SkData> data)
Matt Sarettebb1b5c2017-05-12 11:41:27 -040034 : INHERITED(adjust_info(codec->getInfo()))
msarettedd2dcf2016-01-14 13:12:26 -080035 , fCodec(codec)
reed42943c82016-09-12 12:01:44 -070036 , fData(std::move(data))
msarettedd2dcf2016-01-14 13:12:26 -080037{}
38
Brian Osman2feb7962017-04-25 16:41:47 -040039SkData* SkCodecImageGenerator::onRefEncodedData() {
msarettedd2dcf2016-01-14 13:12:26 -080040 return SkRef(fData.get());
41}
42
43bool SkCodecImageGenerator::onGetPixels(const SkImageInfo& info, void* pixels, size_t rowBytes,
Matt Sarettd531ca02017-03-24 16:31:19 -040044 const Options& opts) {
45 SkCodec::Options codecOpts;
46 codecOpts.fPremulBehavior = opts.fBehavior;
Matt Sarettebb1b5c2017-05-12 11:41:27 -040047 SkCodec::Result result = fCodec->getPixels(info, pixels, rowBytes, &codecOpts, nullptr,
48 nullptr);
msarettedd2dcf2016-01-14 13:12:26 -080049 switch (result) {
50 case SkCodec::kSuccess:
51 case SkCodec::kIncompleteInput:
Leon Scroggins III674a1842017-07-06 12:26:09 -040052 case SkCodec::kErrorInInput:
msarettedd2dcf2016-01-14 13:12:26 -080053 return true;
54 default:
55 return false;
56 }
57}
58
msarett4984c3c2016-03-10 05:44:43 -080059bool SkCodecImageGenerator::onQueryYUV8(SkYUVSizeInfo* sizeInfo, SkYUVColorSpace* colorSpace) const
60{
61 return fCodec->queryYUV8(sizeInfo, colorSpace);
62}
msarettb714fb02016-01-22 14:46:42 -080063
msarett4984c3c2016-03-10 05:44:43 -080064bool SkCodecImageGenerator::onGetYUV8Planes(const SkYUVSizeInfo& sizeInfo, void* planes[3]) {
msarettb714fb02016-01-22 14:46:42 -080065 SkCodec::Result result = fCodec->getYUV8Planes(sizeInfo, planes);
msarettb714fb02016-01-22 14:46:42 -080066
67 switch (result) {
68 case SkCodec::kSuccess:
69 case SkCodec::kIncompleteInput:
Leon Scroggins III674a1842017-07-06 12:26:09 -040070 case SkCodec::kErrorInInput:
msarettb714fb02016-01-22 14:46:42 -080071 return true;
72 default:
73 return false;
74 }
msarettedd2dcf2016-01-14 13:12:26 -080075}