SkCodecImageGenerator.cpp revision 4d1061cff656fa82a5d6595eb903b45b9393b638
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" 94d1061cff656fa82a5d6595eb903b45b9393b638herb#include "SkPM4fPriv.h" 10edd2dcf08224fc6c313610bfc9f9f8257e0e85efmsarett 11edd2dcf08224fc6c313610bfc9f9f8257e0e85efmsarettSkImageGenerator* SkCodecImageGenerator::NewFromEncodedCodec(SkData* data) { 12edd2dcf08224fc6c313610bfc9f9f8257e0e85efmsarett SkCodec* codec = SkCodec::NewFromData(data); 13edd2dcf08224fc6c313610bfc9f9f8257e0e85efmsarett if (nullptr == codec) { 14edd2dcf08224fc6c313610bfc9f9f8257e0e85efmsarett return nullptr; 15edd2dcf08224fc6c313610bfc9f9f8257e0e85efmsarett } 16edd2dcf08224fc6c313610bfc9f9f8257e0e85efmsarett 17edd2dcf08224fc6c313610bfc9f9f8257e0e85efmsarett return new SkCodecImageGenerator(codec, data); 18edd2dcf08224fc6c313610bfc9f9f8257e0e85efmsarett} 19edd2dcf08224fc6c313610bfc9f9f8257e0e85efmsarett 203ec5db42cc145fb11e352eca6474f91d7a4957e3msarett// FIXME: We should expose information about the encoded format on the 213ec5db42cc145fb11e352eca6474f91d7a4957e3msarett// SkImageGenerator, so the client can interpret the encoded 223ec5db42cc145fb11e352eca6474f91d7a4957e3msarett// format and request an output format. For now, as a workaround, 233ec5db42cc145fb11e352eca6474f91d7a4957e3msarett// we guess what output format the client wants. 243ec5db42cc145fb11e352eca6474f91d7a4957e3msarettstatic SkImageInfo fix_info(const SkCodec& codec) { 253ec5db42cc145fb11e352eca6474f91d7a4957e3msarett const SkImageInfo& info = codec.getInfo(); 263ec5db42cc145fb11e352eca6474f91d7a4957e3msarett SkAlphaType alphaType = (kUnpremul_SkAlphaType == info.alphaType()) ? kPremul_SkAlphaType : 273ec5db42cc145fb11e352eca6474f91d7a4957e3msarett info.alphaType(); 283ec5db42cc145fb11e352eca6474f91d7a4957e3msarett 294d1061cff656fa82a5d6595eb903b45b9393b638herb SkColorProfileType profileType = kLinear_SkColorProfileType; 304d1061cff656fa82a5d6595eb903b45b9393b638herb // Crudely guess that the presence of a color space means sRGB, or obey the global sRGB 314d1061cff656fa82a5d6595eb903b45b9393b638herb // selector. 324d1061cff656fa82a5d6595eb903b45b9393b638herb if (gTreatSkColorAsSRGB || codec.getColorSpace()) { 334d1061cff656fa82a5d6595eb903b45b9393b638herb profileType = kSRGB_SkColorProfileType; 344d1061cff656fa82a5d6595eb903b45b9393b638herb } 35b714fb0199e8727ef2b6cddbee7eba6046f01554msarett 363ec5db42cc145fb11e352eca6474f91d7a4957e3msarett return SkImageInfo::Make(info.width(), info.height(), info.colorType(), alphaType, profileType); 37b714fb0199e8727ef2b6cddbee7eba6046f01554msarett} 38b714fb0199e8727ef2b6cddbee7eba6046f01554msarett 39edd2dcf08224fc6c313610bfc9f9f8257e0e85efmsarettSkCodecImageGenerator::SkCodecImageGenerator(SkCodec* codec, SkData* data) 403ec5db42cc145fb11e352eca6474f91d7a4957e3msarett : INHERITED(fix_info(*codec)) 41edd2dcf08224fc6c313610bfc9f9f8257e0e85efmsarett , fCodec(codec) 42edd2dcf08224fc6c313610bfc9f9f8257e0e85efmsarett , fData(SkRef(data)) 43edd2dcf08224fc6c313610bfc9f9f8257e0e85efmsarett{} 44edd2dcf08224fc6c313610bfc9f9f8257e0e85efmsarett 45edd2dcf08224fc6c313610bfc9f9f8257e0e85efmsarettSkData* SkCodecImageGenerator::onRefEncodedData(SK_REFENCODEDDATA_CTXPARAM) { 46edd2dcf08224fc6c313610bfc9f9f8257e0e85efmsarett return SkRef(fData.get()); 47edd2dcf08224fc6c313610bfc9f9f8257e0e85efmsarett} 48edd2dcf08224fc6c313610bfc9f9f8257e0e85efmsarett 49edd2dcf08224fc6c313610bfc9f9f8257e0e85efmsarettbool SkCodecImageGenerator::onGetPixels(const SkImageInfo& info, void* pixels, size_t rowBytes, 50edd2dcf08224fc6c313610bfc9f9f8257e0e85efmsarett SkPMColor ctable[], int* ctableCount) { 51edd2dcf08224fc6c313610bfc9f9f8257e0e85efmsarett 52edd2dcf08224fc6c313610bfc9f9f8257e0e85efmsarett SkCodec::Result result = fCodec->getPixels(info, pixels, rowBytes, nullptr, ctable, 53edd2dcf08224fc6c313610bfc9f9f8257e0e85efmsarett ctableCount); 54edd2dcf08224fc6c313610bfc9f9f8257e0e85efmsarett switch (result) { 55edd2dcf08224fc6c313610bfc9f9f8257e0e85efmsarett case SkCodec::kSuccess: 56edd2dcf08224fc6c313610bfc9f9f8257e0e85efmsarett case SkCodec::kIncompleteInput: 57edd2dcf08224fc6c313610bfc9f9f8257e0e85efmsarett return true; 58edd2dcf08224fc6c313610bfc9f9f8257e0e85efmsarett default: 59edd2dcf08224fc6c313610bfc9f9f8257e0e85efmsarett return false; 60edd2dcf08224fc6c313610bfc9f9f8257e0e85efmsarett } 61edd2dcf08224fc6c313610bfc9f9f8257e0e85efmsarett} 62edd2dcf08224fc6c313610bfc9f9f8257e0e85efmsarett 634984c3c95f18eda44492a2126c9958e447f2cca8msarettbool SkCodecImageGenerator::onQueryYUV8(SkYUVSizeInfo* sizeInfo, SkYUVColorSpace* colorSpace) const 644984c3c95f18eda44492a2126c9958e447f2cca8msarett{ 654984c3c95f18eda44492a2126c9958e447f2cca8msarett return fCodec->queryYUV8(sizeInfo, colorSpace); 664984c3c95f18eda44492a2126c9958e447f2cca8msarett} 67b714fb0199e8727ef2b6cddbee7eba6046f01554msarett 684984c3c95f18eda44492a2126c9958e447f2cca8msarettbool SkCodecImageGenerator::onGetYUV8Planes(const SkYUVSizeInfo& sizeInfo, void* planes[3]) { 69b714fb0199e8727ef2b6cddbee7eba6046f01554msarett SkCodec::Result result = fCodec->getYUV8Planes(sizeInfo, planes); 70b714fb0199e8727ef2b6cddbee7eba6046f01554msarett 71b714fb0199e8727ef2b6cddbee7eba6046f01554msarett switch (result) { 72b714fb0199e8727ef2b6cddbee7eba6046f01554msarett case SkCodec::kSuccess: 73b714fb0199e8727ef2b6cddbee7eba6046f01554msarett case SkCodec::kIncompleteInput: 74b714fb0199e8727ef2b6cddbee7eba6046f01554msarett return true; 75b714fb0199e8727ef2b6cddbee7eba6046f01554msarett default: 76b714fb0199e8727ef2b6cddbee7eba6046f01554msarett return false; 77b714fb0199e8727ef2b6cddbee7eba6046f01554msarett } 78edd2dcf08224fc6c313610bfc9f9f8257e0e85efmsarett} 79