blob: 55a65750514f9ce692bb01c71ebd515e53222714 [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"
11
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
Mike Reed43798692017-10-17 18:04:32 +000021static SkImageInfo adjust_info(SkCodec* codec) {
22 SkImageInfo info = codec->getInfo();
brianosman03707122016-04-21 08:48:18 -070023 if (kUnpremul_SkAlphaType == info.alphaType()) {
Mike Reed43798692017-10-17 18:04:32 +000024 info = info.makeAlphaType(kPremul_SkAlphaType);
herb4d1061c2016-04-15 12:57:42 -070025 }
Leon Scroggins III0cbc10f2017-10-30 09:07:53 -040026 if (SkPixmapPriv::ShouldSwapWidthHeight(codec->getOrigin())) {
27 info = SkPixmapPriv::SwapWidthHeight(info);
Mike Reed43798692017-10-17 18:04:32 +000028 }
29 return info;
msarettb714fb02016-01-22 14:46:42 -080030}
31
Mike Reedede7bac2017-07-23 15:30:02 -040032SkCodecImageGenerator::SkCodecImageGenerator(std::unique_ptr<SkCodec> codec, sk_sp<SkData> data)
Mike Reed43798692017-10-17 18:04:32 +000033 : INHERITED(adjust_info(codec.get()))
Mike Reedede7bac2017-07-23 15:30:02 -040034 , fCodec(std::move(codec))
reed42943c82016-09-12 12:01:44 -070035 , fData(std::move(data))
msarettedd2dcf2016-01-14 13:12:26 -080036{}
37
Ben Wagnerbdf54332018-05-15 14:12:14 -040038sk_sp<SkData> SkCodecImageGenerator::onRefEncodedData() {
39 return fData;
40}
msarettedd2dcf2016-01-14 13:12:26 -080041
Mike Reed43798692017-10-17 18:04:32 +000042bool SkCodecImageGenerator::onGetPixels(const SkImageInfo& requestInfo, void* requestPixels,
Brian Osmanc87cfb62018-07-11 09:08:46 -040043 size_t requestRowBytes, const Options&) {
Leon Scroggins III0cbc10f2017-10-30 09:07:53 -040044 SkPixmap dst(requestInfo, requestPixels, requestRowBytes);
Mike Reed43798692017-10-17 18:04:32 +000045
Brian Osmanc87cfb62018-07-11 09:08:46 -040046 auto decode = [this](const SkPixmap& pm) {
Brian Osmanb62f50c2018-07-12 14:44:27 -040047 SkCodec::Result result = fCodec->getPixels(pm);
Leon Scroggins III0cbc10f2017-10-30 09:07:53 -040048 switch (result) {
49 case SkCodec::kSuccess:
50 case SkCodec::kIncompleteInput:
51 case SkCodec::kErrorInInput:
52 return true;
53 default:
54 return false;
Mike Reed43798692017-10-17 18:04:32 +000055 }
Leon Scroggins III0cbc10f2017-10-30 09:07:53 -040056 };
Mike Reed43798692017-10-17 18:04:32 +000057
Leon Scroggins III0cbc10f2017-10-30 09:07:53 -040058 return SkPixmapPriv::Orient(dst, fCodec->getOrigin(), decode);
msarettedd2dcf2016-01-14 13:12:26 -080059}
60
msarett4984c3c2016-03-10 05:44:43 -080061bool SkCodecImageGenerator::onQueryYUV8(SkYUVSizeInfo* sizeInfo, SkYUVColorSpace* colorSpace) const
62{
63 return fCodec->queryYUV8(sizeInfo, colorSpace);
64}
msarettb714fb02016-01-22 14:46:42 -080065
msarett4984c3c2016-03-10 05:44:43 -080066bool SkCodecImageGenerator::onGetYUV8Planes(const SkYUVSizeInfo& sizeInfo, void* planes[3]) {
msarettb714fb02016-01-22 14:46:42 -080067 SkCodec::Result result = fCodec->getYUV8Planes(sizeInfo, planes);
msarettb714fb02016-01-22 14:46:42 -080068
69 switch (result) {
70 case SkCodec::kSuccess:
71 case SkCodec::kIncompleteInput:
Leon Scroggins III674a1842017-07-06 12:26:09 -040072 case SkCodec::kErrorInInput:
msarettb714fb02016-01-22 14:46:42 -080073 return true;
74 default:
75 return false;
76 }
msarettedd2dcf2016-01-14 13:12:26 -080077}