blob: 8341df8d7b2febde8dcba6e70f0b1d813b3c7da0 [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 Verth8f11e432018-10-18 14:36: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
Florin Malitaf8776c22018-11-06 19:16:28 -050022std::unique_ptr<SkImageGenerator>
23SkCodecImageGenerator::MakeFromCodec(std::unique_ptr<SkCodec> codec) {
24 return codec
25 ? std::unique_ptr<SkImageGenerator>(new SkCodecImageGenerator(std::move(codec), nullptr))
26 : nullptr;
27}
28
Mike Reed43798692017-10-17 18:04:32 +000029static SkImageInfo adjust_info(SkCodec* codec) {
30 SkImageInfo info = codec->getInfo();
brianosman03707122016-04-21 08:48:18 -070031 if (kUnpremul_SkAlphaType == info.alphaType()) {
Mike Reed43798692017-10-17 18:04:32 +000032 info = info.makeAlphaType(kPremul_SkAlphaType);
herb4d1061c2016-04-15 12:57:42 -070033 }
Leon Scroggins III0cbc10f2017-10-30 09:07:53 -040034 if (SkPixmapPriv::ShouldSwapWidthHeight(codec->getOrigin())) {
35 info = SkPixmapPriv::SwapWidthHeight(info);
Mike Reed43798692017-10-17 18:04:32 +000036 }
37 return info;
msarettb714fb02016-01-22 14:46:42 -080038}
39
Mike Reedede7bac2017-07-23 15:30:02 -040040SkCodecImageGenerator::SkCodecImageGenerator(std::unique_ptr<SkCodec> codec, sk_sp<SkData> data)
Mike Reed43798692017-10-17 18:04:32 +000041 : INHERITED(adjust_info(codec.get()))
Mike Reedede7bac2017-07-23 15:30:02 -040042 , fCodec(std::move(codec))
reed42943c82016-09-12 12:01:44 -070043 , fData(std::move(data))
msarettedd2dcf2016-01-14 13:12:26 -080044{}
45
Ben Wagnerbdf54332018-05-15 14:12:14 -040046sk_sp<SkData> SkCodecImageGenerator::onRefEncodedData() {
47 return fData;
48}
msarettedd2dcf2016-01-14 13:12:26 -080049
Mike Reed43798692017-10-17 18:04:32 +000050bool SkCodecImageGenerator::onGetPixels(const SkImageInfo& requestInfo, void* requestPixels,
Brian Osmanc87cfb62018-07-11 09:08:46 -040051 size_t requestRowBytes, const Options&) {
Leon Scroggins III0cbc10f2017-10-30 09:07:53 -040052 SkPixmap dst(requestInfo, requestPixels, requestRowBytes);
Mike Reed43798692017-10-17 18:04:32 +000053
Brian Osmanc87cfb62018-07-11 09:08:46 -040054 auto decode = [this](const SkPixmap& pm) {
Brian Osmanb62f50c2018-07-12 14:44:27 -040055 SkCodec::Result result = fCodec->getPixels(pm);
Leon Scroggins III0cbc10f2017-10-30 09:07:53 -040056 switch (result) {
57 case SkCodec::kSuccess:
58 case SkCodec::kIncompleteInput:
59 case SkCodec::kErrorInInput:
60 return true;
61 default:
62 return false;
Mike Reed43798692017-10-17 18:04:32 +000063 }
Leon Scroggins III0cbc10f2017-10-30 09:07:53 -040064 };
Mike Reed43798692017-10-17 18:04:32 +000065
Leon Scroggins III0cbc10f2017-10-30 09:07:53 -040066 return SkPixmapPriv::Orient(dst, fCodec->getOrigin(), decode);
msarettedd2dcf2016-01-14 13:12:26 -080067}
68
Jim Van Verthe24b5872018-10-29 16:26:02 -040069bool SkCodecImageGenerator::onQueryYUVA8(SkYUVASizeInfo* sizeInfo,
Jim Van Verth8f11e432018-10-18 14:36:59 -040070 SkYUVAIndex yuvaIndices[SkYUVAIndex::kIndexCount],
71 SkYUVColorSpace* colorSpace) const {
72 // This image generator always returns 3 separate non-interleaved planes
73 yuvaIndices[SkYUVAIndex::kY_Index].fIndex = 0;
74 yuvaIndices[SkYUVAIndex::kY_Index].fChannel = SkColorChannel::kR;
75 yuvaIndices[SkYUVAIndex::kU_Index].fIndex = 1;
76 yuvaIndices[SkYUVAIndex::kU_Index].fChannel = SkColorChannel::kR;
77 yuvaIndices[SkYUVAIndex::kV_Index].fIndex = 2;
78 yuvaIndices[SkYUVAIndex::kV_Index].fChannel = SkColorChannel::kR;
79 yuvaIndices[SkYUVAIndex::kA_Index].fIndex = -1;
80 yuvaIndices[SkYUVAIndex::kA_Index].fChannel = SkColorChannel::kR;
81
msarett4984c3c2016-03-10 05:44:43 -080082 return fCodec->queryYUV8(sizeInfo, colorSpace);
83}
msarettb714fb02016-01-22 14:46:42 -080084
Jim Van Verthe24b5872018-10-29 16:26:02 -040085bool SkCodecImageGenerator::onGetYUVA8Planes(const SkYUVASizeInfo& sizeInfo,
Jim Van Verth8f11e432018-10-18 14:36:59 -040086 const SkYUVAIndex indices[SkYUVAIndex::kIndexCount],
87 void* planes[]) {
msarettb714fb02016-01-22 14:46:42 -080088 SkCodec::Result result = fCodec->getYUV8Planes(sizeInfo, planes);
Jim Van Verth8f11e432018-10-18 14:36:59 -040089 // TODO: check indices
msarettb714fb02016-01-22 14:46:42 -080090
91 switch (result) {
92 case SkCodec::kSuccess:
93 case SkCodec::kIncompleteInput:
Leon Scroggins III674a1842017-07-06 12:26:09 -040094 case SkCodec::kErrorInInput:
msarettb714fb02016-01-22 14:46:42 -080095 return true;
96 default:
97 return false;
98 }
msarettedd2dcf2016-01-14 13:12:26 -080099}