xref: /aosp_15_r20/external/skia/include/private/SkJpegMetadataDecoder.h (revision c8dee2aa9b3f27cf6c858bd81872bdeb2c07ed17)
1*c8dee2aaSAndroid Build Coastguard Worker /*
2*c8dee2aaSAndroid Build Coastguard Worker  * Copyright 2013 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 SkJpegMetadataDecoder_DEFINED
9*c8dee2aaSAndroid Build Coastguard Worker #define SkJpegMetadataDecoder_DEFINED
10*c8dee2aaSAndroid Build Coastguard Worker 
11*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkData.h"
12*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkRefCnt.h"
13*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkTypes.h"
14*c8dee2aaSAndroid Build Coastguard Worker 
15*c8dee2aaSAndroid Build Coastguard Worker #include <memory>
16*c8dee2aaSAndroid Build Coastguard Worker #include <vector>
17*c8dee2aaSAndroid Build Coastguard Worker 
18*c8dee2aaSAndroid Build Coastguard Worker struct SkGainmapInfo;
19*c8dee2aaSAndroid Build Coastguard Worker 
20*c8dee2aaSAndroid Build Coastguard Worker /**
21*c8dee2aaSAndroid Build Coastguard Worker  * An interface that can be used to extract metadata from an encoded JPEG file.
22*c8dee2aaSAndroid Build Coastguard Worker  */
23*c8dee2aaSAndroid Build Coastguard Worker class SK_API SkJpegMetadataDecoder {
24*c8dee2aaSAndroid Build Coastguard Worker public:
SkJpegMetadataDecoder()25*c8dee2aaSAndroid Build Coastguard Worker     SkJpegMetadataDecoder() {}
~SkJpegMetadataDecoder()26*c8dee2aaSAndroid Build Coastguard Worker     virtual ~SkJpegMetadataDecoder() {}
27*c8dee2aaSAndroid Build Coastguard Worker 
28*c8dee2aaSAndroid Build Coastguard Worker     SkJpegMetadataDecoder(const SkJpegMetadataDecoder&) = delete;
29*c8dee2aaSAndroid Build Coastguard Worker     SkJpegMetadataDecoder& operator=(const SkJpegMetadataDecoder&) = delete;
30*c8dee2aaSAndroid Build Coastguard Worker 
31*c8dee2aaSAndroid Build Coastguard Worker     /**
32*c8dee2aaSAndroid Build Coastguard Worker      * A segment from a JPEG file. This is usually populated from a jpeg_marker_struct.
33*c8dee2aaSAndroid Build Coastguard Worker      */
34*c8dee2aaSAndroid Build Coastguard Worker     struct SK_API Segment {
SegmentSegment35*c8dee2aaSAndroid Build Coastguard Worker         Segment(uint8_t marker, sk_sp<SkData> data) : fMarker(marker), fData(std::move(data)) {}
36*c8dee2aaSAndroid Build Coastguard Worker 
37*c8dee2aaSAndroid Build Coastguard Worker         // The segment's marker.
38*c8dee2aaSAndroid Build Coastguard Worker         uint8_t fMarker = 0;
39*c8dee2aaSAndroid Build Coastguard Worker 
40*c8dee2aaSAndroid Build Coastguard Worker         // The segment's parameters (not including the marker and parameter length).
41*c8dee2aaSAndroid Build Coastguard Worker         sk_sp<SkData> fData;
42*c8dee2aaSAndroid Build Coastguard Worker     };
43*c8dee2aaSAndroid Build Coastguard Worker 
44*c8dee2aaSAndroid Build Coastguard Worker     /**
45*c8dee2aaSAndroid Build Coastguard Worker      * Create metadata for the specified segments from a JPEG file's header (defined as all segments
46*c8dee2aaSAndroid Build Coastguard Worker      * before the first StartOfScan). This may return nullptr.
47*c8dee2aaSAndroid Build Coastguard Worker      */
48*c8dee2aaSAndroid Build Coastguard Worker     static std::unique_ptr<SkJpegMetadataDecoder> Make(std::vector<Segment> headerSegments);
49*c8dee2aaSAndroid Build Coastguard Worker 
50*c8dee2aaSAndroid Build Coastguard Worker     /**
51*c8dee2aaSAndroid Build Coastguard Worker      * Create metadata for the specified encoded JPEG file. This may return nullptr.
52*c8dee2aaSAndroid Build Coastguard Worker      */
53*c8dee2aaSAndroid Build Coastguard Worker     static std::unique_ptr<SkJpegMetadataDecoder> Make(sk_sp<SkData> data);
54*c8dee2aaSAndroid Build Coastguard Worker 
55*c8dee2aaSAndroid Build Coastguard Worker     /**
56*c8dee2aaSAndroid Build Coastguard Worker      * Return the Exif data attached to the image (if any) and nullptr otherwise. If |copyData| is
57*c8dee2aaSAndroid Build Coastguard Worker      * false, then the returned SkData may directly reference the data provided when this object was
58*c8dee2aaSAndroid Build Coastguard Worker      * created.
59*c8dee2aaSAndroid Build Coastguard Worker      */
60*c8dee2aaSAndroid Build Coastguard Worker     virtual sk_sp<SkData> getExifMetadata(bool copyData) const = 0;
61*c8dee2aaSAndroid Build Coastguard Worker 
62*c8dee2aaSAndroid Build Coastguard Worker     /**
63*c8dee2aaSAndroid Build Coastguard Worker      * Return the ICC profile of the image if any, and nullptr otherwise. If |copyData| is false,
64*c8dee2aaSAndroid Build Coastguard Worker      * then the returned SkData may directly reference the data provided when this object was
65*c8dee2aaSAndroid Build Coastguard Worker      * created.
66*c8dee2aaSAndroid Build Coastguard Worker      */
67*c8dee2aaSAndroid Build Coastguard Worker     virtual sk_sp<SkData> getICCProfileData(bool copyData) const = 0;
68*c8dee2aaSAndroid Build Coastguard Worker 
69*c8dee2aaSAndroid Build Coastguard Worker     /**
70*c8dee2aaSAndroid Build Coastguard Worker      * Return the ISO 21496-1 metadata, if any, and nullptr otherwise. If |copyData| is false,
71*c8dee2aaSAndroid Build Coastguard Worker      * then the returned SkData may directly reference the data provided when this object was
72*c8dee2aaSAndroid Build Coastguard Worker      * created.
73*c8dee2aaSAndroid Build Coastguard Worker      */
74*c8dee2aaSAndroid Build Coastguard Worker     virtual sk_sp<SkData> getISOGainmapMetadata(bool copyData) const = 0;
75*c8dee2aaSAndroid Build Coastguard Worker 
76*c8dee2aaSAndroid Build Coastguard Worker     /**
77*c8dee2aaSAndroid Build Coastguard Worker      * Return true if there is a possibility that this image contains a gainmap image.
78*c8dee2aaSAndroid Build Coastguard Worker      */
79*c8dee2aaSAndroid Build Coastguard Worker     virtual bool mightHaveGainmapImage() const = 0;
80*c8dee2aaSAndroid Build Coastguard Worker 
81*c8dee2aaSAndroid Build Coastguard Worker     /**
82*c8dee2aaSAndroid Build Coastguard Worker      * Given a JPEG encoded image |baseImageData|, return in |outGainmapImageData| the JPEG encoded
83*c8dee2aaSAndroid Build Coastguard Worker      * gainmap image and return in |outGainmapInfo| its gainmap rendering parameters. Return true if
84*c8dee2aaSAndroid Build Coastguard Worker      * both output variables were successfully populated, otherwise return false.
85*c8dee2aaSAndroid Build Coastguard Worker      */
86*c8dee2aaSAndroid Build Coastguard Worker     virtual bool findGainmapImage(sk_sp<SkData> baseImageData,
87*c8dee2aaSAndroid Build Coastguard Worker                                   sk_sp<SkData>& outGainmapImagedata,
88*c8dee2aaSAndroid Build Coastguard Worker                                   SkGainmapInfo& outGainmapInfo) = 0;
89*c8dee2aaSAndroid Build Coastguard Worker };
90*c8dee2aaSAndroid Build Coastguard Worker 
91*c8dee2aaSAndroid Build Coastguard Worker #endif
92