blob: 4cd0120e4704bc02d19f0203294bbce0e25743fe [file]
/*
* Copyright 2026 Google LLC
*
* Use of this source code is governed by a BSD-style license that can be
* found in the LICENSE file.
*/
#ifndef skgpu_GradientBitmap_DEFINED
#define skgpu_GradientBitmap_DEFINED
#include "include/core/SkBitmap.h"
#include "src/core/SkColorData.h"
namespace skgpu {
// Gradient stop offsets / interval thresholds live in [0, 1] but lose too much
// precision when rounded to half floats directly. Encoding them as the
// (mantissa, exponent) pair returned by frexp preserves the value across an F16
// texture; the shader recovers it with ldexp(mantissa, exponent).
//
// On success, writes the mantissa and exponent and returns true. Returns false
// if the exponent does not round-trip through F16, in which case the caller must
// not use the texture encoding.
bool EncodeGradientStopToHalf(float offset, float* mantissa, float* exponent);
// Builds the F16 texture both Ganesh and Graphite upload for many-stop
// gradients. The bitmap is `numStops` wide and 2 tall: row 0 holds the premul
// colors and row 1 holds each stop offset encoded as (mantissa, exponent, 0, 1)
// via EncodeGradientStopToHalf. The shader binary-searches the offset row and
// mixes the two adjacent colors. If `offsets` is null the stops are assumed to
// be evenly spaced. Returns an empty bitmap if allocation or offset encoding
// fails.
SkBitmap CreateGradientColorAndOffsetBitmap(int numStops,
const SkPMColor4f* colors,
const float* offsets);
} // namespace skgpu
#endif // skgpu_GradientBitmap_DEFINED