blob: 3005ee360c8c7704b75c247cadca91983c58fd2b [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"
Mike Reed43798692017-10-17 18:04:32 +000010#include "SkPixmapPriv.h"
Jim Van Verth0c583af2018-10-18 10:31:59 -040011#include "SkYUVAIndex.h"
Mike Reed43798692017-10-17 18:04:32 +000012
Mike Reed185130c2017-02-15 15:14:16 -050013std::unique_ptr<SkImageGenerator> SkCodecImageGenerator::MakeFromEncodedCodec(sk_sp<SkData> data) {
Mike Reedede7bac2017-07-23 15:30:02 -040014 auto codec = SkCodec::MakeFromData(data);
msarettedd2dcf2016-01-14 13:12:26 -080015 if (nullptr == codec) {
16 return nullptr;
17 }
18
Mike Reedede7bac2017-07-23 15:30:02 -040019 return std::unique_ptr<SkImageGenerator>(new SkCodecImageGenerator(std::move(codec), data));
msarettedd2dcf2016-01-14 13:12:26 -080020}
21
Mike Reed43798692017-10-17 18:04:32 +000022static SkImageInfo adjust_info(SkCodec* codec) {
23 SkImageInfo info = codec->getInfo();
brianosman03707122016-04-21 08:48:18 -070024 if (kUnpremul_SkAlphaType == info.alphaType()) {
Mike Reed43798692017-10-17 18:04:32 +000025 info = info.makeAlphaType(kPremul_SkAlphaType);
herb4d1061c2016-04-15 12:57:42 -070026 }
Leon Scroggins III0cbc10f2017-10-30 09:07:53 -040027 if (SkPixmapPriv::ShouldSwapWidthHeight(codec->getOrigin())) {
28 info = SkPixmapPriv::SwapWidthHeight(info);
Mike Reed43798692017-10-17 18:04:32 +000029 }
30 return info;
msarettb714fb02016-01-22 14:46:42 -080031}
32
Mike Reedede7bac2017-07-23 15:30:02 -040033SkCodecImageGenerator::SkCodecImageGenerator(std::unique_ptr<SkCodec> codec, sk_sp<SkData> data)
Mike Reed43798692017-10-17 18:04:32 +000034 : INHERITED(adjust_info(codec.get()))
Mike Reedede7bac2017-07-23 15:30:02 -040035 , fCodec(std::move(codec))
reed42943c82016-09-12 12:01:44 -070036 , fData(std::move(data))
msarettedd2dcf2016-01-14 13:12:26 -080037{}
38
Ben Wagnerbdf54332018-05-15 14:12:14 -040039sk_sp<SkData> SkCodecImageGenerator::onRefEncodedData() {
40 return fData;
41}
msarettedd2dcf2016-01-14 13:12:26 -080042
Mike Reed43798692017-10-17 18:04:32 +000043bool SkCodecImageGenerator::onGetPixels(const SkImageInfo& requestInfo, void* requestPixels,
Brian Osmanc87cfb62018-07-11 09:08:46 -040044 size_t requestRowBytes, const Options&) {
Leon Scroggins III0cbc10f2017-10-30 09:07:53 -040045 SkPixmap dst(requestInfo, requestPixels, requestRowBytes);
Mike Reed43798692017-10-17 18:04:32 +000046
Brian Osmanc87cfb62018-07-11 09:08:46 -040047 auto decode = [this](const SkPixmap& pm) {
Brian Osmanb62f50c2018-07-12 14:44:27 -040048 SkCodec::Result result = fCodec->getPixels(pm);
Leon Scroggins III0cbc10f2017-10-30 09:07:53 -040049 switch (result) {
50 case SkCodec::kSuccess:
51 case SkCodec::kIncompleteInput:
52 case SkCodec::kErrorInInput:
53 return true;
54 default:
55 return false;
Mike Reed43798692017-10-17 18:04:32 +000056 }
Leon Scroggins III0cbc10f2017-10-30 09:07:53 -040057 };
Mike Reed43798692017-10-17 18:04:32 +000058
Leon Scroggins III0cbc10f2017-10-30 09:07:53 -040059 return SkPixmapPriv::Orient(dst, fCodec->getOrigin(), decode);
msarettedd2dcf2016-01-14 13:12:26 -080060}
61
Jim Van Verth0c583af2018-10-18 10:31:59 -040062bool SkCodecImageGenerator::onQueryYUVA8(SkYUVSizeInfo* sizeInfo,
63 SkYUVAIndex yuvaIndices[SkYUVAIndex::kIndexCount],
64 SkYUVColorSpace* colorSpace) const {
65 // This image generator always returns 3 separate non-interleaved planes
66 yuvaIndices[SkYUVAIndex::kY_Index].fIndex = 0;
67 yuvaIndices[SkYUVAIndex::kY_Index].fChannel = SkColorChannel::kR;
68 yuvaIndices[SkYUVAIndex::kU_Index].fIndex = 1;
69 yuvaIndices[SkYUVAIndex::kU_Index].fChannel = SkColorChannel::kR;
70 yuvaIndices[SkYUVAIndex::kV_Index].fIndex = 2;
71 yuvaIndices[SkYUVAIndex::kV_Index].fChannel = SkColorChannel::kR;
72 yuvaIndices[SkYUVAIndex::kA_Index].fIndex = -1;
73 yuvaIndices[SkYUVAIndex::kA_Index].fChannel = SkColorChannel::kR;
74
msarett4984c3c2016-03-10 05:44:43 -080075 return fCodec->queryYUV8(sizeInfo, colorSpace);
76}
msarettb714fb02016-01-22 14:46:42 -080077
Jim Van Verth0c583af2018-10-18 10:31:59 -040078bool SkCodecImageGenerator::onGetYUVA8Planes(const SkYUVSizeInfo& sizeInfo,
79 const SkYUVAIndex indices[SkYUVAIndex::kIndexCount],
80 void* planes[]) {
msarettb714fb02016-01-22 14:46:42 -080081 SkCodec::Result result = fCodec->getYUV8Planes(sizeInfo, planes);
Jim Van Verth0c583af2018-10-18 10:31:59 -040082 // TODO: check indices
msarettb714fb02016-01-22 14:46:42 -080083
84 switch (result) {
85 case SkCodec::kSuccess:
86 case SkCodec::kIncompleteInput:
Leon Scroggins III674a1842017-07-06 12:26:09 -040087 case SkCodec::kErrorInInput:
msarettb714fb02016-01-22 14:46:42 -080088 return true;
89 default:
90 return false;
91 }
msarettedd2dcf2016-01-14 13:12:26 -080092}