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