1 /*
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"
9 #include "SkMakeUnique.h"
10 
MakeFromEncodedCodec(sk_sp<SkData> data)11 std::unique_ptr<SkImageGenerator> SkCodecImageGenerator::MakeFromEncodedCodec(sk_sp<SkData> data) {
12     SkCodec* codec = SkCodec::NewFromData(data);
13     if (nullptr == codec) {
14         return nullptr;
15     }
16 
17     return std::unique_ptr<SkImageGenerator>(new SkCodecImageGenerator(codec, data));
18 }
19 
make_premul(const SkImageInfo & info)20 static SkImageInfo make_premul(const SkImageInfo& info) {
21     if (kUnpremul_SkAlphaType == info.alphaType()) {
22         return info.makeAlphaType(kPremul_SkAlphaType);
23     }
24 
25     return info;
26 }
27 
SkCodecImageGenerator(SkCodec * codec,sk_sp<SkData> data)28 SkCodecImageGenerator::SkCodecImageGenerator(SkCodec* codec, sk_sp<SkData> data)
29     : INHERITED(make_premul(codec->getInfo()))
30     , fCodec(codec)
31     , fData(std::move(data))
32 {}
33 
onRefEncodedData(GrContext * ctx)34 SkData* SkCodecImageGenerator::onRefEncodedData(GrContext* ctx) {
35     return SkRef(fData.get());
36 }
37 
onGetPixels(const SkImageInfo & info,void * pixels,size_t rowBytes,SkPMColor ctable[],int * ctableCount)38 bool SkCodecImageGenerator::onGetPixels(const SkImageInfo& info, void* pixels, size_t rowBytes,
39         SkPMColor ctable[], int* ctableCount) {
40     SkCodec::Result result = fCodec->getPixels(info, pixels, rowBytes, nullptr, ctable,
41             ctableCount);
42     switch (result) {
43         case SkCodec::kSuccess:
44         case SkCodec::kIncompleteInput:
45             return true;
46         default:
47             return false;
48     }
49 }
50 
onQueryYUV8(SkYUVSizeInfo * sizeInfo,SkYUVColorSpace * colorSpace) const51 bool SkCodecImageGenerator::onQueryYUV8(SkYUVSizeInfo* sizeInfo, SkYUVColorSpace* colorSpace) const
52 {
53     return fCodec->queryYUV8(sizeInfo, colorSpace);
54 }
55 
onGetYUV8Planes(const SkYUVSizeInfo & sizeInfo,void * planes[3])56 bool SkCodecImageGenerator::onGetYUV8Planes(const SkYUVSizeInfo& sizeInfo, void* planes[3]) {
57     SkCodec::Result result = fCodec->getYUV8Planes(sizeInfo, planes);
58 
59     switch (result) {
60         case SkCodec::kSuccess:
61         case SkCodec::kIncompleteInput:
62             return true;
63         default:
64             return false;
65     }
66 }
67