1fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot/*
2fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * Copyright 2017 Google Inc.
3fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot *
4fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * Use of this source code is governed by a BSD-style license that can be
5fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * found in the LICENSE file.
6fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot */
7fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
8fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#ifndef SkHeifCodec_DEFINED
9fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#define SkHeifCodec_DEFINED
10fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
11fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#include "SkCodec.h"
12fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#include "SkColorSpace.h"
13fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#include "SkColorSpaceXform.h"
14fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#include "SkEncodedOrigin.h"
15fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#include "SkImageInfo.h"
16fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#include "SkSwizzler.h"
17fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#include "SkStream.h"
18fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
19fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#if !defined(__has_include)
20fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    #define __has_include(x) 0
21fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#endif
22fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
23fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#if __has_include("HeifDecoderAPI.h")
24fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    #include "HeifDecoderAPI.h"
25fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#else
26fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    #include "SkStubHeifDecoderAPI.h"
27fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#endif
28fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
29fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotclass SkHeifCodec : public SkCodec {
30fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotpublic:
31fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    static bool IsHeif(const void*, size_t);
32fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
33fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    /*
34fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot     * Assumes IsHeif was called and returned true.
35fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot     */
36fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    static std::unique_ptr<SkCodec> MakeFromStream(std::unique_ptr<SkStream>, Result*);
37fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
38fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotprotected:
39fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
40fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    Result onGetPixels(
41fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            const SkImageInfo& dstInfo,
42fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            void* dst, size_t dstRowBytes,
43fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            const Options& options,
44fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            int* rowsDecoded) override;
45fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
46fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    SkEncodedImageFormat onGetEncodedFormat() const override {
47fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        return SkEncodedImageFormat::kHEIF;
48fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    }
49fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
50fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    bool conversionSupported(const SkImageInfo&, SkColorType, bool,
51fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                             const SkColorSpace*) const override {
52fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        // This class checks for conversion after creating colorXform.
53fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        return true;
54fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    }
55fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
56fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotprivate:
57fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    /*
58fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot     * Creates an instance of the decoder
59fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot     * Called only by NewFromStream
60fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot     */
61fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    SkHeifCodec(int width, int height, const SkEncodedInfo&,
62fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            HeifDecoder*, sk_sp<SkColorSpace>, SkEncodedOrigin);
63fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
64fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    /*
65fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot     * Checks if the conversion between the input image and the requested output
66fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot     * image has been implemented.
67fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot     *
68fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot     * Sets the output color format.
69fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot     */
70fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    bool setOutputColorFormat(const SkImageInfo& dst);
71fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
72fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    void initializeSwizzler(const SkImageInfo& dstInfo, const Options& options);
73fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    void allocateStorage(const SkImageInfo& dstInfo);
74fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    int readRows(const SkImageInfo& dstInfo, void* dst,
75fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            size_t rowBytes, int count, const Options&);
76fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
77fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    /*
78fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot     * Scanline decoding.
79fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot     */
80fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    SkSampler* getSampler(bool createIfNecessary) override;
81fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    Result onStartScanlineDecode(const SkImageInfo& dstInfo,
82fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            const Options& options) override;
83fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    int onGetScanlines(void* dst, int count, size_t rowBytes) override;
84fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    bool onSkipScanlines(int count) override;
85fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
86fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    std::unique_ptr<HeifDecoder>       fHeifDecoder;
87fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    HeifFrameInfo                      fFrameInfo;
88fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    SkAutoTMalloc<uint8_t>             fStorage;
89fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    uint8_t*                           fSwizzleSrcRow;
90fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    uint32_t*                          fColorXformSrcRow;
91fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
92fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    std::unique_ptr<SkSwizzler>        fSwizzler;
93fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
94fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    typedef SkCodec INHERITED;
95fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot};
96fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
97fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#endif // SkHeifCodec_DEFINED
98