blob: 6edbffaa59a9639e50517f3c9a8b91a1f940d85b [file] [log] [blame]
/*
* Copyright 2023 Google Inc.
*
* Use of this source code is governed by a BSD-style license that can be
* found in the LICENSE file.
*/
#ifndef SkGainmapInfo_DEFINED
#define SkGainmapInfo_DEFINED
#include "include/core/SkColor.h"
/**
* Gainmap rendering parameters. Suppose our display has HDR to SDR ratio of H, and we wish to
* display an image with gainmap on this display. Let B be the pixel value from the base image
* in a color space that has the primaries of the base image and a linear transfer function. Let
* G be the pixel value from the gainmap. Let D be the output pixel in the same color space as B.
* The value of D is computed as follows:
*
* First, let W be a weight parameter determing how much the gainmap will be applied.
* W = clamp((log(H) - log(fHdrRatioMax)) / (log(fHdrRatioMax) - log(fHdrRatioMin), 0, 1)
*
* Next, let L be the gainmap value in log space. We compute this from the value G that was
* sampled from the texture as follows:
* L = mix(fLogRatioMin, fLogRatioMax, pow(G, fGainmapGamma))
*
* Finally, apply the gainmap to compute D, the displayed pixel. If the base image is SDR then
* compute:
* D = (B + fEpsilonSdr) * exp(L * W) - fEpsilonHdr
* If the base image is HDR then compute:
* D = (B + fEpsilonHdr) * exp(L * (W - 1)) - fEpsilonSdr
*
* In the above math, log() is a natural logarithm and exp() is natural exponentiation.
*/
struct SkGainmapInfo {
/**
* Parameters for converting the gainmap from its image encoding to log space. These are
* specified per color channel. The alpha value is unused.
*/
SkColor4f fLogRatioMin = {0.f, 0.f, 0.f, 1.0};
SkColor4f fLogRatioMax = {1.f, 1.f, 1.f, 1.0};
SkColor4f fGainmapGamma = {1.f, 1.f, 1.f, 1.f};
/**
* Parameters selected to avoid divide by zero errors.
*/
float fEpsilonSdr = 0.01f;
float fEpsilonHdr = 0.01f;
/**
* Parameters that indicate the minimum HDR capability below which the gainmap is not
* applied at all, and the maximum HDR capacity above which the gainmap is fully applied.
*/
float fHdrRatioMin = 1.f;
float fHdrRatioMax = 50.f;
/**
* Whether the base image is the SDR image or the HDR image.
*/
enum class BaseImageType {
kSDR,
kHDR,
};
BaseImageType fBaseImageType = BaseImageType::kSDR;
/**
* The type of file that created this gainmap.
*/
enum class Type {
kUnknown,
kMultiPicture,
kJpegR_Linear,
kJpegR_HLG,
kJpegR_PQ,
kHDRGM,
};
Type fType = Type::kUnknown;
};
#endif