1edd2dcf08224fc6c313610bfc9f9f8257e0e85efmsarett/* 2edd2dcf08224fc6c313610bfc9f9f8257e0e85efmsarett * Copyright 2015 Google Inc. 3edd2dcf08224fc6c313610bfc9f9f8257e0e85efmsarett * 4edd2dcf08224fc6c313610bfc9f9f8257e0e85efmsarett * Use of this source code is governed by a BSD-style license that can be 5edd2dcf08224fc6c313610bfc9f9f8257e0e85efmsarett * found in the LICENSE file. 6edd2dcf08224fc6c313610bfc9f9f8257e0e85efmsarett */ 7edd2dcf08224fc6c313610bfc9f9f8257e0e85efmsarett 8edd2dcf08224fc6c313610bfc9f9f8257e0e85efmsarett#include "SkCodecImageGenerator.h" 9185130c643f0f6b20dcf14c200074748be282a7eMike Reed#include "SkMakeUnique.h" 10edd2dcf08224fc6c313610bfc9f9f8257e0e85efmsarett 11185130c643f0f6b20dcf14c200074748be282a7eMike Reedstd::unique_ptr<SkImageGenerator> SkCodecImageGenerator::MakeFromEncodedCodec(sk_sp<SkData> data) { 12edd2dcf08224fc6c313610bfc9f9f8257e0e85efmsarett SkCodec* codec = SkCodec::NewFromData(data); 13edd2dcf08224fc6c313610bfc9f9f8257e0e85efmsarett if (nullptr == codec) { 14edd2dcf08224fc6c313610bfc9f9f8257e0e85efmsarett return nullptr; 15edd2dcf08224fc6c313610bfc9f9f8257e0e85efmsarett } 16edd2dcf08224fc6c313610bfc9f9f8257e0e85efmsarett 17185130c643f0f6b20dcf14c200074748be282a7eMike Reed return std::unique_ptr<SkImageGenerator>(new SkCodecImageGenerator(codec, data)); 18edd2dcf08224fc6c313610bfc9f9f8257e0e85efmsarett} 19edd2dcf08224fc6c313610bfc9f9f8257e0e85efmsarett 20ebb1b5c297e394ab19f99d807095672b7f5d8aefMatt Sarettstatic SkImageInfo adjust_info(const SkImageInfo& info) { 21ebb1b5c297e394ab19f99d807095672b7f5d8aefMatt Sarett SkImageInfo newInfo = info; 220370712fd50d7187277cfe42d8564aa1f6cfedcabrianosman if (kUnpremul_SkAlphaType == info.alphaType()) { 23ebb1b5c297e394ab19f99d807095672b7f5d8aefMatt Sarett newInfo = newInfo.makeAlphaType(kPremul_SkAlphaType); 244d1061cff656fa82a5d6595eb903b45b9393b638herb } 25ebb1b5c297e394ab19f99d807095672b7f5d8aefMatt Sarett return newInfo; 26b714fb0199e8727ef2b6cddbee7eba6046f01554msarett} 27b714fb0199e8727ef2b6cddbee7eba6046f01554msarett 2842943c8aa9c611c18ad0f1a30a27669f3d82239creedSkCodecImageGenerator::SkCodecImageGenerator(SkCodec* codec, sk_sp<SkData> data) 29ebb1b5c297e394ab19f99d807095672b7f5d8aefMatt Sarett : INHERITED(adjust_info(codec->getInfo())) 30edd2dcf08224fc6c313610bfc9f9f8257e0e85efmsarett , fCodec(codec) 3142943c8aa9c611c18ad0f1a30a27669f3d82239creed , fData(std::move(data)) 32edd2dcf08224fc6c313610bfc9f9f8257e0e85efmsarett{} 33edd2dcf08224fc6c313610bfc9f9f8257e0e85efmsarett 342feb7969299d3420a5bd4a7a94171a85ac9ecc9bBrian OsmanSkData* SkCodecImageGenerator::onRefEncodedData() { 35edd2dcf08224fc6c313610bfc9f9f8257e0e85efmsarett return SkRef(fData.get()); 36edd2dcf08224fc6c313610bfc9f9f8257e0e85efmsarett} 37edd2dcf08224fc6c313610bfc9f9f8257e0e85efmsarett 38edd2dcf08224fc6c313610bfc9f9f8257e0e85efmsarettbool SkCodecImageGenerator::onGetPixels(const SkImageInfo& info, void* pixels, size_t rowBytes, 39d531ca038fac8acb3320a78c393c002ca59768feMatt Sarett const Options& opts) { 40d531ca038fac8acb3320a78c393c002ca59768feMatt Sarett SkCodec::Options codecOpts; 41d531ca038fac8acb3320a78c393c002ca59768feMatt Sarett codecOpts.fPremulBehavior = opts.fBehavior; 42571b30f6117eede6d64cd2b924dc1f6aaa59e70eLeon Scroggins SkCodec::Result result = fCodec->getPixels(info, pixels, rowBytes, &codecOpts); 43edd2dcf08224fc6c313610bfc9f9f8257e0e85efmsarett switch (result) { 44edd2dcf08224fc6c313610bfc9f9f8257e0e85efmsarett case SkCodec::kSuccess: 45edd2dcf08224fc6c313610bfc9f9f8257e0e85efmsarett case SkCodec::kIncompleteInput: 46674a1848ae62277ea9a2d022b60aa1f17d306f17Leon Scroggins III case SkCodec::kErrorInInput: 47edd2dcf08224fc6c313610bfc9f9f8257e0e85efmsarett return true; 48edd2dcf08224fc6c313610bfc9f9f8257e0e85efmsarett default: 49edd2dcf08224fc6c313610bfc9f9f8257e0e85efmsarett return false; 50edd2dcf08224fc6c313610bfc9f9f8257e0e85efmsarett } 51edd2dcf08224fc6c313610bfc9f9f8257e0e85efmsarett} 52edd2dcf08224fc6c313610bfc9f9f8257e0e85efmsarett 534984c3c95f18eda44492a2126c9958e447f2cca8msarettbool SkCodecImageGenerator::onQueryYUV8(SkYUVSizeInfo* sizeInfo, SkYUVColorSpace* colorSpace) const 544984c3c95f18eda44492a2126c9958e447f2cca8msarett{ 554984c3c95f18eda44492a2126c9958e447f2cca8msarett return fCodec->queryYUV8(sizeInfo, colorSpace); 564984c3c95f18eda44492a2126c9958e447f2cca8msarett} 57b714fb0199e8727ef2b6cddbee7eba6046f01554msarett 584984c3c95f18eda44492a2126c9958e447f2cca8msarettbool SkCodecImageGenerator::onGetYUV8Planes(const SkYUVSizeInfo& sizeInfo, void* planes[3]) { 59b714fb0199e8727ef2b6cddbee7eba6046f01554msarett SkCodec::Result result = fCodec->getYUV8Planes(sizeInfo, planes); 60b714fb0199e8727ef2b6cddbee7eba6046f01554msarett 61b714fb0199e8727ef2b6cddbee7eba6046f01554msarett switch (result) { 62b714fb0199e8727ef2b6cddbee7eba6046f01554msarett case SkCodec::kSuccess: 63b714fb0199e8727ef2b6cddbee7eba6046f01554msarett case SkCodec::kIncompleteInput: 64674a1848ae62277ea9a2d022b60aa1f17d306f17Leon Scroggins III case SkCodec::kErrorInInput: 65b714fb0199e8727ef2b6cddbee7eba6046f01554msarett return true; 66b714fb0199e8727ef2b6cddbee7eba6046f01554msarett default: 67b714fb0199e8727ef2b6cddbee7eba6046f01554msarett return false; 68b714fb0199e8727ef2b6cddbee7eba6046f01554msarett } 69edd2dcf08224fc6c313610bfc9f9f8257e0e85efmsarett} 70