• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 #include "SkPixmapPriv.h"
11 
MakeFromEncodedCodec(sk_sp<SkData> data)12 std::unique_ptr<SkImageGenerator> SkCodecImageGenerator::MakeFromEncodedCodec(sk_sp<SkData> data) {
13     auto codec = SkCodec::MakeFromData(data);
14     if (nullptr == codec) {
15         return nullptr;
16     }
17 
18     return std::unique_ptr<SkImageGenerator>(new SkCodecImageGenerator(std::move(codec), data));
19 }
20 
adjust_info(SkCodec * codec)21 static SkImageInfo adjust_info(SkCodec* codec) {
22     SkImageInfo info = codec->getInfo();
23     if (kUnpremul_SkAlphaType == info.alphaType()) {
24         info = info.makeAlphaType(kPremul_SkAlphaType);
25     }
26     if (SkPixmapPriv::ShouldSwapWidthHeight(codec->getOrigin())) {
27         info = SkPixmapPriv::SwapWidthHeight(info);
28     }
29     return info;
30 }
31 
SkCodecImageGenerator(std::unique_ptr<SkCodec> codec,sk_sp<SkData> data)32 SkCodecImageGenerator::SkCodecImageGenerator(std::unique_ptr<SkCodec> codec, sk_sp<SkData> data)
33     : INHERITED(adjust_info(codec.get()))
34     , fCodec(std::move(codec))
35     , fData(std::move(data))
36 {}
37 
onRefEncodedData()38 SkData* SkCodecImageGenerator::onRefEncodedData() {
39     return SkRef(fData.get());
40 }
41 
onGetPixels(const SkImageInfo & requestInfo,void * requestPixels,size_t requestRowBytes,const Options & opts)42 bool SkCodecImageGenerator::onGetPixels(const SkImageInfo& requestInfo, void* requestPixels,
43                                         size_t requestRowBytes, const Options& opts) {
44     SkPixmap dst(requestInfo, requestPixels, requestRowBytes);
45 
46     auto decode = [this, &opts](const SkPixmap& pm) {
47         SkCodec::Options codecOpts;
48         codecOpts.fPremulBehavior = opts.fBehavior;
49         SkCodec::Result result = fCodec->getPixels(pm, &codecOpts);
50         switch (result) {
51             case SkCodec::kSuccess:
52             case SkCodec::kIncompleteInput:
53             case SkCodec::kErrorInInput:
54                 return true;
55             default:
56                 return false;
57         }
58     };
59 
60     return SkPixmapPriv::Orient(dst, fCodec->getOrigin(), decode);
61 }
62 
onQueryYUV8(SkYUVSizeInfo * sizeInfo,SkYUVColorSpace * colorSpace) const63 bool SkCodecImageGenerator::onQueryYUV8(SkYUVSizeInfo* sizeInfo, SkYUVColorSpace* colorSpace) const
64 {
65     return fCodec->queryYUV8(sizeInfo, colorSpace);
66 }
67 
onGetYUV8Planes(const SkYUVSizeInfo & sizeInfo,void * planes[3])68 bool SkCodecImageGenerator::onGetYUV8Planes(const SkYUVSizeInfo& sizeInfo, void* planes[3]) {
69     SkCodec::Result result = fCodec->getYUV8Planes(sizeInfo, planes);
70 
71     switch (result) {
72         case SkCodec::kSuccess:
73         case SkCodec::kIncompleteInput:
74         case SkCodec::kErrorInInput:
75             return true;
76         default:
77             return false;
78     }
79 }
80