blob: da901455d5426571ee29c04204e554b8ac3c7cf2 [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
Mike Kleinc0bd9f92019-04-23 12:05:21 -05008#include "include/core/SkYUVAIndex.h"
9#include "src/codec/SkCodecImageGenerator.h"
Mike Kleinc0bd9f92019-04-23 12:05:21 -050010#include "src/core/SkPixmapPriv.h"
Mike Reed43798692017-10-17 18:04:32 +000011
Mike Reed185130c2017-02-15 15:14:16 -050012std::unique_ptr<SkImageGenerator> SkCodecImageGenerator::MakeFromEncodedCodec(sk_sp<SkData> data) {
Mike Reedede7bac2017-07-23 15:30:02 -040013 auto codec = SkCodec::MakeFromData(data);
msarettedd2dcf2016-01-14 13:12:26 -080014 if (nullptr == codec) {
15 return nullptr;
16 }
17
Mike Reedede7bac2017-07-23 15:30:02 -040018 return std::unique_ptr<SkImageGenerator>(new SkCodecImageGenerator(std::move(codec), data));
msarettedd2dcf2016-01-14 13:12:26 -080019}
20
Florin Malitaf8776c22018-11-06 19:16:28 -050021std::unique_ptr<SkImageGenerator>
22SkCodecImageGenerator::MakeFromCodec(std::unique_ptr<SkCodec> codec) {
23 return codec
24 ? std::unique_ptr<SkImageGenerator>(new SkCodecImageGenerator(std::move(codec), nullptr))
25 : nullptr;
26}
27
Mike Reed43798692017-10-17 18:04:32 +000028static SkImageInfo adjust_info(SkCodec* codec) {
29 SkImageInfo info = codec->getInfo();
brianosman03707122016-04-21 08:48:18 -070030 if (kUnpremul_SkAlphaType == info.alphaType()) {
Mike Reed43798692017-10-17 18:04:32 +000031 info = info.makeAlphaType(kPremul_SkAlphaType);
herb4d1061c2016-04-15 12:57:42 -070032 }
Leon Scroggins III0cbc10f2017-10-30 09:07:53 -040033 if (SkPixmapPriv::ShouldSwapWidthHeight(codec->getOrigin())) {
34 info = SkPixmapPriv::SwapWidthHeight(info);
Mike Reed43798692017-10-17 18:04:32 +000035 }
36 return info;
msarettb714fb02016-01-22 14:46:42 -080037}
38
Mike Reedede7bac2017-07-23 15:30:02 -040039SkCodecImageGenerator::SkCodecImageGenerator(std::unique_ptr<SkCodec> codec, sk_sp<SkData> data)
Mike Reed43798692017-10-17 18:04:32 +000040 : INHERITED(adjust_info(codec.get()))
Mike Reedede7bac2017-07-23 15:30:02 -040041 , fCodec(std::move(codec))
reed42943c82016-09-12 12:01:44 -070042 , fData(std::move(data))
msarettedd2dcf2016-01-14 13:12:26 -080043{}
44
Ben Wagnerbdf54332018-05-15 14:12:14 -040045sk_sp<SkData> SkCodecImageGenerator::onRefEncodedData() {
46 return fData;
47}
msarettedd2dcf2016-01-14 13:12:26 -080048
Mike Reed43798692017-10-17 18:04:32 +000049bool SkCodecImageGenerator::onGetPixels(const SkImageInfo& requestInfo, void* requestPixels,
Brian Osmanc87cfb62018-07-11 09:08:46 -040050 size_t requestRowBytes, const Options&) {
Leon Scroggins III0cbc10f2017-10-30 09:07:53 -040051 SkPixmap dst(requestInfo, requestPixels, requestRowBytes);
Mike Reed43798692017-10-17 18:04:32 +000052
Brian Osmanc87cfb62018-07-11 09:08:46 -040053 auto decode = [this](const SkPixmap& pm) {
Brian Osmanb62f50c2018-07-12 14:44:27 -040054 SkCodec::Result result = fCodec->getPixels(pm);
Leon Scroggins III0cbc10f2017-10-30 09:07:53 -040055 switch (result) {
56 case SkCodec::kSuccess:
57 case SkCodec::kIncompleteInput:
58 case SkCodec::kErrorInInput:
59 return true;
60 default:
61 return false;
Mike Reed43798692017-10-17 18:04:32 +000062 }
Leon Scroggins III0cbc10f2017-10-30 09:07:53 -040063 };
Mike Reed43798692017-10-17 18:04:32 +000064
Leon Scroggins III0cbc10f2017-10-30 09:07:53 -040065 return SkPixmapPriv::Orient(dst, fCodec->getOrigin(), decode);
msarettedd2dcf2016-01-14 13:12:26 -080066}
67
Jim Van Verthe24b5872018-10-29 16:26:02 -040068bool SkCodecImageGenerator::onQueryYUVA8(SkYUVASizeInfo* sizeInfo,
Jim Van Verth8f11e432018-10-18 14:36:59 -040069 SkYUVAIndex yuvaIndices[SkYUVAIndex::kIndexCount],
70 SkYUVColorSpace* colorSpace) const {
71 // This image generator always returns 3 separate non-interleaved planes
72 yuvaIndices[SkYUVAIndex::kY_Index].fIndex = 0;
73 yuvaIndices[SkYUVAIndex::kY_Index].fChannel = SkColorChannel::kR;
74 yuvaIndices[SkYUVAIndex::kU_Index].fIndex = 1;
75 yuvaIndices[SkYUVAIndex::kU_Index].fChannel = SkColorChannel::kR;
76 yuvaIndices[SkYUVAIndex::kV_Index].fIndex = 2;
77 yuvaIndices[SkYUVAIndex::kV_Index].fChannel = SkColorChannel::kR;
78 yuvaIndices[SkYUVAIndex::kA_Index].fIndex = -1;
79 yuvaIndices[SkYUVAIndex::kA_Index].fChannel = SkColorChannel::kR;
80
msarett4984c3c2016-03-10 05:44:43 -080081 return fCodec->queryYUV8(sizeInfo, colorSpace);
82}
msarettb714fb02016-01-22 14:46:42 -080083
Jim Van Verthe24b5872018-10-29 16:26:02 -040084bool SkCodecImageGenerator::onGetYUVA8Planes(const SkYUVASizeInfo& sizeInfo,
Jim Van Verth8f11e432018-10-18 14:36:59 -040085 const SkYUVAIndex indices[SkYUVAIndex::kIndexCount],
86 void* planes[]) {
msarettb714fb02016-01-22 14:46:42 -080087 SkCodec::Result result = fCodec->getYUV8Planes(sizeInfo, planes);
Jim Van Verth8f11e432018-10-18 14:36:59 -040088 // TODO: check indices
msarettb714fb02016-01-22 14:46:42 -080089
90 switch (result) {
91 case SkCodec::kSuccess:
92 case SkCodec::kIncompleteInput:
Leon Scroggins III674a1842017-07-06 12:26:09 -040093 case SkCodec::kErrorInInput:
msarettb714fb02016-01-22 14:46:42 -080094 return true;
95 default:
96 return false;
97 }
msarettedd2dcf2016-01-14 13:12:26 -080098}