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