1cb93a386Sopenharmony_ci/* 2cb93a386Sopenharmony_ci * Copyright 2015 Google Inc. 3cb93a386Sopenharmony_ci * 4cb93a386Sopenharmony_ci * Use of this source code is governed by a BSD-style license that can be 5cb93a386Sopenharmony_ci * found in the LICENSE file. 6cb93a386Sopenharmony_ci */ 7cb93a386Sopenharmony_ci 8cb93a386Sopenharmony_ci#include "src/codec/SkCodecImageGenerator.h" 9cb93a386Sopenharmony_ci 10cb93a386Sopenharmony_ci#include "src/core/SkPixmapPriv.h" 11cb93a386Sopenharmony_ci 12cb93a386Sopenharmony_cistd::unique_ptr<SkImageGenerator> SkCodecImageGenerator::MakeFromEncodedCodec(sk_sp<SkData> data) { 13cb93a386Sopenharmony_ci auto codec = SkCodec::MakeFromData(data); 14cb93a386Sopenharmony_ci if (nullptr == codec) { 15cb93a386Sopenharmony_ci return nullptr; 16cb93a386Sopenharmony_ci } 17cb93a386Sopenharmony_ci 18cb93a386Sopenharmony_ci return std::unique_ptr<SkImageGenerator>(new SkCodecImageGenerator(std::move(codec), data)); 19cb93a386Sopenharmony_ci} 20cb93a386Sopenharmony_ci 21cb93a386Sopenharmony_cistd::unique_ptr<SkImageGenerator> 22cb93a386Sopenharmony_ciSkCodecImageGenerator::MakeFromCodec(std::unique_ptr<SkCodec> codec) { 23cb93a386Sopenharmony_ci return codec 24cb93a386Sopenharmony_ci ? std::unique_ptr<SkImageGenerator>(new SkCodecImageGenerator(std::move(codec), nullptr)) 25cb93a386Sopenharmony_ci : nullptr; 26cb93a386Sopenharmony_ci} 27cb93a386Sopenharmony_ci 28cb93a386Sopenharmony_cistatic SkImageInfo adjust_info(SkCodec* codec) { 29cb93a386Sopenharmony_ci SkImageInfo info = codec->getInfo(); 30cb93a386Sopenharmony_ci if (kUnpremul_SkAlphaType == info.alphaType()) { 31cb93a386Sopenharmony_ci info = info.makeAlphaType(kPremul_SkAlphaType); 32cb93a386Sopenharmony_ci } 33cb93a386Sopenharmony_ci if (SkEncodedOriginSwapsWidthHeight(codec->getOrigin())) { 34cb93a386Sopenharmony_ci info = SkPixmapPriv::SwapWidthHeight(info); 35cb93a386Sopenharmony_ci } 36cb93a386Sopenharmony_ci return info; 37cb93a386Sopenharmony_ci} 38cb93a386Sopenharmony_ci 39cb93a386Sopenharmony_ciSkCodecImageGenerator::SkCodecImageGenerator(std::unique_ptr<SkCodec> codec, sk_sp<SkData> data) 40cb93a386Sopenharmony_ci : INHERITED(adjust_info(codec.get())) 41cb93a386Sopenharmony_ci , fCodec(std::move(codec)) 42cb93a386Sopenharmony_ci , fData(std::move(data)) 43cb93a386Sopenharmony_ci{} 44cb93a386Sopenharmony_ci 45cb93a386Sopenharmony_cisk_sp<SkData> SkCodecImageGenerator::onRefEncodedData() { 46cb93a386Sopenharmony_ci return fData; 47cb93a386Sopenharmony_ci} 48cb93a386Sopenharmony_ci 49cb93a386Sopenharmony_cibool SkCodecImageGenerator::getPixels(const SkImageInfo& info, void* pixels, size_t rowBytes, const SkCodec::Options* options) { 50cb93a386Sopenharmony_ci SkPixmap dst(info, pixels, rowBytes); 51cb93a386Sopenharmony_ci 52cb93a386Sopenharmony_ci auto decode = [this, options](const SkPixmap& pm) { 53cb93a386Sopenharmony_ci SkCodec::Result result = fCodec->getPixels(pm, options); 54cb93a386Sopenharmony_ci switch (result) { 55cb93a386Sopenharmony_ci case SkCodec::kSuccess: 56cb93a386Sopenharmony_ci case SkCodec::kIncompleteInput: 57cb93a386Sopenharmony_ci case SkCodec::kErrorInInput: 58cb93a386Sopenharmony_ci return true; 59cb93a386Sopenharmony_ci default: 60cb93a386Sopenharmony_ci return false; 61cb93a386Sopenharmony_ci } 62cb93a386Sopenharmony_ci }; 63cb93a386Sopenharmony_ci 64cb93a386Sopenharmony_ci return SkPixmapPriv::Orient(dst, fCodec->getOrigin(), decode); 65cb93a386Sopenharmony_ci} 66cb93a386Sopenharmony_ci 67cb93a386Sopenharmony_cibool SkCodecImageGenerator::onGetPixels(const SkImageInfo& requestInfo, void* requestPixels, 68cb93a386Sopenharmony_ci size_t requestRowBytes, const Options& options) { 69cb93a386Sopenharmony_ci return this->getPixels(requestInfo, requestPixels, requestRowBytes, nullptr); 70cb93a386Sopenharmony_ci} 71cb93a386Sopenharmony_ci 72cb93a386Sopenharmony_cibool SkCodecImageGenerator::onQueryYUVAInfo( 73cb93a386Sopenharmony_ci const SkYUVAPixmapInfo::SupportedDataTypes& supportedDataTypes, 74cb93a386Sopenharmony_ci SkYUVAPixmapInfo* yuvaPixmapInfo) const { 75cb93a386Sopenharmony_ci return fCodec->queryYUVAInfo(supportedDataTypes, yuvaPixmapInfo); 76cb93a386Sopenharmony_ci} 77cb93a386Sopenharmony_ci 78cb93a386Sopenharmony_cibool SkCodecImageGenerator::onGetYUVAPlanes(const SkYUVAPixmaps& yuvaPixmaps) { 79cb93a386Sopenharmony_ci switch (fCodec->getYUVAPlanes(yuvaPixmaps)) { 80cb93a386Sopenharmony_ci case SkCodec::kSuccess: 81cb93a386Sopenharmony_ci case SkCodec::kIncompleteInput: 82cb93a386Sopenharmony_ci case SkCodec::kErrorInInput: 83cb93a386Sopenharmony_ci return true; 84cb93a386Sopenharmony_ci default: 85cb93a386Sopenharmony_ci return false; 86cb93a386Sopenharmony_ci } 87cb93a386Sopenharmony_ci} 88cb93a386Sopenharmony_ci 89cb93a386Sopenharmony_ciSkISize SkCodecImageGenerator::getScaledDimensions(float desiredScale) const { 90cb93a386Sopenharmony_ci SkISize size = fCodec->getScaledDimensions(desiredScale); 91cb93a386Sopenharmony_ci if (SkEncodedOriginSwapsWidthHeight(fCodec->getOrigin())) { 92cb93a386Sopenharmony_ci std::swap(size.fWidth, size.fHeight); 93cb93a386Sopenharmony_ci } 94cb93a386Sopenharmony_ci return size; 95cb93a386Sopenharmony_ci} 96