xref: /aosp_15_r20/external/skia/src/codec/SkJpegSourceMgr.h (revision c8dee2aa9b3f27cf6c858bd81872bdeb2c07ed17)
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