blob: c9e0b3406dc45eb204bea9310ddc819d62a1daab [file] [log] [blame]
/*
* Copyright 2013 Google Inc.
*
* Use of this source code is governed by a BSD-style license that can be
* found in the LICENSE file.
*/
#ifndef SkJpegMetadataDecoder_DEFINED
#define SkJpegMetadataDecoder_DEFINED
#include "include/core/SkData.h"
#include "include/core/SkRefCnt.h"
#include "include/core/SkTypes.h"
#include <memory>
#include <vector>
struct SkGainmapInfo;
/**
* An interface that can be used to extract metadata from an encoded JPEG file.
*/
class SK_API SkJpegMetadataDecoder {
public:
SkJpegMetadataDecoder() {}
virtual ~SkJpegMetadataDecoder() {}
SkJpegMetadataDecoder(const SkJpegMetadataDecoder&) = delete;
SkJpegMetadataDecoder& operator=(const SkJpegMetadataDecoder&) = delete;
/**
* A segment from a JPEG file. This is usually populated from a jpeg_marker_struct.
*/
struct SK_API Segment {
Segment(uint8_t marker, sk_sp<SkData> data) : fMarker(marker), fData(std::move(data)) {}
// The segment's marker.
uint8_t fMarker = 0;
// The segment's parameters (not including the marker and parameter length).
sk_sp<SkData> fData;
};
/**
* Create metadata for the specified segments from a JPEG file's header (defined as all segments
* before the first StartOfScan). This may return nullptr.
*/
static std::unique_ptr<SkJpegMetadataDecoder> Make(std::vector<Segment> headerSegments);
/**
* Return the Exif data attached to the image (if any) and nullptr otherwise. If |copyData| is
* false, then the returned SkData may directly reference the data provided when this object was
* created.
*/
virtual sk_sp<SkData> getExifMetadata(bool copyData) const = 0;
/**
* Return the ICC profile of the image if any, and nullptr otherwise. If |copyData| is false,
* then the returned SkData may directly reference the data provided when this object was
* created.
*/
virtual sk_sp<SkData> getICCProfileData(bool copyData) const = 0;
/**
* Return the ISO 21496-1 metadata, if any, and nullptr otherwise. If |copyData| is false,
* then the returned SkData may directly reference the data provided when this object was
* created.
*/
virtual sk_sp<SkData> getISOGainmapMetadata(bool copyData) const = 0;
/**
* Return true if there is a possibility that this image contains a gainmap image.
*/
virtual bool mightHaveGainmapImage() const = 0;
/**
* Given a JPEG encoded image |baseImageData|, return in |outGainmapImageData| the JPEG encoded
* gainmap image and return in |outGainmapInfo| its gainmap rendering parameters. Return true if
* both output variables were successfully populated, otherwise return false.
*/
virtual bool findGainmapImage(sk_sp<SkData> baseImageData,
sk_sp<SkData>& outGainmapImagedata,
SkGainmapInfo& outGainmapInfo) = 0;
};
#endif