/*
 * Copyright 2023 Google LLC
 *
 * Use of this source code is governed by a BSD-style license that can be
 * found in the LICENSE file.
 */

#ifndef SkXmp_DEFINED
#define SkXmp_DEFINED

#include "include/core/SkRefCnt.h"
#include "include/private/SkAPI.h"

class SkData;
struct SkGainmapInfo;

#include <cstddef>
#include <memory>

/*
 * An interface to extract information from XMP metadata.
 */
class SK_API SkXmp {
public:
    SkXmp() = default;
    virtual ~SkXmp() = default;
    // Make noncopyable
    SkXmp(const SkXmp&) = delete;
    SkXmp& operator= (const SkXmp&) = delete;

    // Create from XMP data.
    static std::unique_ptr<SkXmp> Make(sk_sp<SkData> xmpData);
    // Create from standard XMP + extended XMP data, see XMP Specification Part 3: Storage in files,
    // Section 1.1.3.1: Extended XMP in JPEG
    static std::unique_ptr<SkXmp> Make(sk_sp<SkData> xmpStandard, sk_sp<SkData> xmpExtended);

    // Extract HDRGM gainmap parameters.
    // TODO(b/338342146): Remove this once all callers are removed.
    bool getGainmapInfoHDRGM(SkGainmapInfo* info) const { return getGainmapInfoAdobe(info); }

    // Extract gainmap parameters from http://ns.adobe.com/hdr-gain-map/1.0/.
    virtual bool getGainmapInfoAdobe(SkGainmapInfo* info) const = 0;

    // If the image specifies http://ns.apple.com/pixeldatainfo/1.0/ AuxiliaryImageType of
    // urn:com:apple:photo:2020:aux:hdrgainmap, and includes a http://ns.apple.com/HDRGainMap/1.0/
    // HDRGainMapVersion, then populate |info| with gainmap parameters that will approximate the
    // math specified at [0] and return true.
    // [0] https://developer.apple.com/documentation/appkit/images_and_pdf/
    //     applying_apple_hdr_effect_to_your_photos
    virtual bool getGainmapInfoApple(float exifHdrHeadroom, SkGainmapInfo* info) const = 0;

    // If this includes GContainer metadata and the GContainer contains an item with semantic
    // GainMap and Mime of image/jpeg, then return true, and populate |offset| and |size| with
    // that item's offset (from the end of the primary JPEG image's EndOfImage), and the size of
    // the gainmap.
    virtual bool getContainerGainmapLocation(size_t* offset, size_t* size) const = 0;

    // Return the GUID of an Extended XMP if present, or null otherwise.
    virtual const char* getExtendedXmpGuid() const = 0;
};

#endif
