Table of Contents

Enum InterpolationSpace

Namespace
Egami.Drawing
Assembly
Egami.Drawing.dll

The color space a gradient's stops are mixed in.

public enum InterpolationSpace

Fields

Encoded = 0

The stored sRGB-encoded values, as most libraries, browsers' legacy colors and both of Egami's references do.

GdiPlusGamma = 4

As GDI+'s gamma-corrected gradients (LinearGradientBrush.GammaCorrection), measured on Windows in 2.7.6: each pair of stops is cut into 16 equal parts, the 17 colors where they meet are mixed in light of gamma 2.2 and rounded to 8 bits, and the gradient runs straight through them in the stored encoded values. Alpha mixes straight.

LinearSrgb = 1

Linear-light sRGB: physically even mixing, brighter midpoints.

Oklab = 2

Oklab: perceptually even mixing without the gray midpoints of opposite colors' encoded mixes.

Oklch = 3

Oklch, Oklab's polar form: lightness, chroma and hue mix separately, the hue around the circle by a HueMethod.

Examples

using (RasterCanvas<Rgba8> canvas = raster.CreateCanvas())
{
    // Two colors along a line; past the ends the end colors repeat (TileMode.Clamp).
    canvas.FillRect(new RectF(0, 0, 200, 100), new LinearGradient(new Vector2(0, 0), new Vector2(200, 0), new RgbaF32(0.1f, 0.3f, 0.9f, 1), new RgbaF32(1, 0.8f, 0.2f, 1)));

    // Several stops, mixed in Oklab for even midpoints, repeating every 40 pixels.
    canvas.FillRect(new RectF(200, 0, 200, 100), new LinearGradient(
        new Vector2(200, 0),
        new Vector2(240, 0),
        new GradientStop(0, new Rgba8(230, 40, 60, 255)),
        new GradientStop(0.5f, new Rgba8(250, 210, 60, 255)),
        new GradientStop(1, new Rgba8(230, 40, 60, 255)))
    {
        Tile = TileMode.Repeat,
        Interpolation = GradientInterpolation.Oklab,
    });

    // A radial gradient stretched into an ellipse by its local matrix, and a sweep around a center.
    canvas.FillOval(new RectF(10, 110, 180, 80), new RadialGradient(Vector2.Zero, 1, new RgbaF32(1, 1, 1, 1), new RgbaF32(0, 0.4f, 0.2f, 1))
    {
        LocalMatrix = Matrix3x2.CreateScale(90, 40) * Matrix3x2.CreateTranslation(100, 150),
    });
    canvas.FillCircle(new Vector2(300, 150), 45, new SweepGradient(
        new Vector2(300, 150),
        new GradientStop(0, new Rgba8(255, 0, 0, 255)),
        new GradientStop(0.5f, new Rgba8(0, 0, 255, 255)),
        new GradientStop(1, new Rgba8(255, 0, 0, 255))));
}