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