1*c8dee2aaSAndroid Build Coastguard Worker /* 2*c8dee2aaSAndroid Build Coastguard Worker * Copyright 2023 Google Inc. 3*c8dee2aaSAndroid Build Coastguard Worker * 4*c8dee2aaSAndroid Build Coastguard Worker * Use of this source code is governed by a BSD-style license that can be 5*c8dee2aaSAndroid Build Coastguard Worker * found in the LICENSE file. 6*c8dee2aaSAndroid Build Coastguard Worker */ 7*c8dee2aaSAndroid Build Coastguard Worker 8*c8dee2aaSAndroid Build Coastguard Worker #ifndef SkJpegSourceMgr_codec_DEFINED 9*c8dee2aaSAndroid Build Coastguard Worker #define SkJpegSourceMgr_codec_DEFINED 10*c8dee2aaSAndroid Build Coastguard Worker 11*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkTypes.h" 12*c8dee2aaSAndroid Build Coastguard Worker 13*c8dee2aaSAndroid Build Coastguard Worker #ifdef SK_CODEC_DECODES_JPEG_GAINMAPS 14*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkRefCnt.h" 15*c8dee2aaSAndroid Build Coastguard Worker #endif // SK_CODEC_DECODES_JPEG_GAINMAPS 16*c8dee2aaSAndroid Build Coastguard Worker 17*c8dee2aaSAndroid Build Coastguard Worker #include <cstddef> 18*c8dee2aaSAndroid Build Coastguard Worker #include <cstdint> 19*c8dee2aaSAndroid Build Coastguard Worker #include <memory> 20*c8dee2aaSAndroid Build Coastguard Worker 21*c8dee2aaSAndroid Build Coastguard Worker #ifdef SK_CODEC_DECODES_JPEG_GAINMAPS 22*c8dee2aaSAndroid Build Coastguard Worker #include <vector> 23*c8dee2aaSAndroid Build Coastguard Worker #endif // SK_CODEC_DECODES_JPEG_GAINMAPS 24*c8dee2aaSAndroid Build Coastguard Worker 25*c8dee2aaSAndroid Build Coastguard Worker class SkStream; 26*c8dee2aaSAndroid Build Coastguard Worker 27*c8dee2aaSAndroid Build Coastguard Worker #ifdef SK_CODEC_DECODES_JPEG_GAINMAPS 28*c8dee2aaSAndroid Build Coastguard Worker class SkData; 29*c8dee2aaSAndroid Build Coastguard Worker class SkJpegSegmentScanner; 30*c8dee2aaSAndroid Build Coastguard Worker struct SkJpegSegment; 31*c8dee2aaSAndroid Build Coastguard Worker #endif // SK_CODEC_DECODES_JPEG_GAINMAPS 32*c8dee2aaSAndroid Build Coastguard Worker 33*c8dee2aaSAndroid Build Coastguard Worker /* 34*c8dee2aaSAndroid Build Coastguard Worker * Interface to adapt an SkStream to the jpeg_source_mgr interface. This interface has different 35*c8dee2aaSAndroid Build Coastguard Worker * implementations for SkStreams with different capabilities. 36*c8dee2aaSAndroid Build Coastguard Worker */ 37*c8dee2aaSAndroid Build Coastguard Worker class SkJpegSourceMgr { 38*c8dee2aaSAndroid Build Coastguard Worker public: 39*c8dee2aaSAndroid Build Coastguard Worker // Create a source manager. If the source manager will buffer data, |bufferSize| specifies 40*c8dee2aaSAndroid Build Coastguard Worker // the size of that buffer. 41*c8dee2aaSAndroid Build Coastguard Worker static std::unique_ptr<SkJpegSourceMgr> Make(SkStream* stream, size_t bufferSize = 1024); 42*c8dee2aaSAndroid Build Coastguard Worker virtual ~SkJpegSourceMgr(); 43*c8dee2aaSAndroid Build Coastguard Worker 44*c8dee2aaSAndroid Build Coastguard Worker // Interface called by libjpeg via its jpeg_source_mgr interface. 45*c8dee2aaSAndroid Build Coastguard Worker virtual void initSource(const uint8_t*& nextInputByte, size_t& bytesInBuffer) = 0; 46*c8dee2aaSAndroid Build Coastguard Worker virtual bool fillInputBuffer(const uint8_t*& nextInputByte, size_t& bytesInBuffer) = 0; 47*c8dee2aaSAndroid Build Coastguard Worker virtual bool skipInputBytes(size_t bytes, 48*c8dee2aaSAndroid Build Coastguard Worker const uint8_t*& nextInputByte, 49*c8dee2aaSAndroid Build Coastguard Worker size_t& bytesInBuffer) = 0; 50*c8dee2aaSAndroid Build Coastguard Worker 51*c8dee2aaSAndroid Build Coastguard Worker #ifdef SK_CODEC_DECODES_JPEG_GAINMAPS 52*c8dee2aaSAndroid Build Coastguard Worker // Parse this stream all the way through its EndOfImage marker and return the list of segments. 53*c8dee2aaSAndroid Build Coastguard Worker // Return false if there is an error or if no EndOfImage marker is found. 54*c8dee2aaSAndroid Build Coastguard Worker virtual const std::vector<SkJpegSegment>& getAllSegments() = 0; 55*c8dee2aaSAndroid Build Coastguard Worker 56*c8dee2aaSAndroid Build Coastguard Worker // Return an the data for a subset of this source's stream, with the specified offset and size. 57*c8dee2aaSAndroid Build Coastguard Worker // If the returned SkData is a copy (it does not refer directly to memory owned by |fStream|), 58*c8dee2aaSAndroid Build Coastguard Worker // then |wasCopied| is set to true. 59*c8dee2aaSAndroid Build Coastguard Worker virtual sk_sp<SkData> getSubsetData(size_t offset, size_t size, bool* wasCopied = nullptr) = 0; 60*c8dee2aaSAndroid Build Coastguard Worker 61*c8dee2aaSAndroid Build Coastguard Worker // Segments start with a 2 byte marker, followed by a 2 byte parameter length (which includes 62*c8dee2aaSAndroid Build Coastguard Worker // those two bytes, followed by parameters. Return the parameters portion of the specified 63*c8dee2aaSAndroid Build Coastguard Worker // segment. If possible, the returned SkData will refer to memory owned by |fStream|. 64*c8dee2aaSAndroid Build Coastguard Worker virtual sk_sp<SkData> getSegmentParameters(const SkJpegSegment& segment) = 0; 65*c8dee2aaSAndroid Build Coastguard Worker #endif // SK_CODEC_DECODES_JPEG_GAINMAPS 66*c8dee2aaSAndroid Build Coastguard Worker 67*c8dee2aaSAndroid Build Coastguard Worker protected: 68*c8dee2aaSAndroid Build Coastguard Worker SkJpegSourceMgr(SkStream* stream); 69*c8dee2aaSAndroid Build Coastguard Worker SkStream* const fStream; // unowned 70*c8dee2aaSAndroid Build Coastguard Worker 71*c8dee2aaSAndroid Build Coastguard Worker #ifdef SK_CODEC_DECODES_JPEG_GAINMAPS 72*c8dee2aaSAndroid Build Coastguard Worker // The segment scanner is lazily creatd only when needed. 73*c8dee2aaSAndroid Build Coastguard Worker std::unique_ptr<SkJpegSegmentScanner> fScanner; 74*c8dee2aaSAndroid Build Coastguard Worker #endif // SK_CODEC_DECODES_JPEG_GAINMAPS 75*c8dee2aaSAndroid Build Coastguard Worker }; 76*c8dee2aaSAndroid Build Coastguard Worker 77*c8dee2aaSAndroid Build Coastguard Worker #endif 78