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