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