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