/* * Copyright (c) 2024-2025, Lucien Fiorini * * SPDX-License-Identifier: BSD-2-Clause */ #pragma once #include #include #include #include #include #include #include namespace Gfx { struct FilterImpl { struct Arithmetic { Optional background; Optional foreground; float k1 { 0.0f }; float k2 { 0.0f }; float k3 { 0.0f }; float k4 { 0.0f }; }; struct Compose { Filter outer; Filter inner; }; struct Blend { Optional background; Optional foreground; Gfx::CompositingAndBlendingOperator mode { Gfx::CompositingAndBlendingOperator::Normal }; }; struct Flood { Gfx::Color color; float opacity { 1.0f }; }; struct DisplacementMap { Optional color; Optional displacement; float scale { 0.0f }; ChannelSelector x_channel_selector { ChannelSelector::Alpha }; ChannelSelector y_channel_selector { ChannelSelector::Alpha }; }; struct DropShadow { float offset_x { 0.0f }; float offset_y { 0.0f }; float radius { 0.0f }; Gfx::Color color; Optional input; }; struct Blur { float radius_x { 0.0f }; float radius_y { 0.0f }; Optional input; }; struct ColorFilter { ColorFilterType type { ColorFilterType::Brightness }; float amount { 0.0f }; Optional input; }; struct ColorMatrix { Array matrix; Optional input; }; struct ColorTable { Optional a; Optional r; Optional g; Optional b; Optional input; }; struct Saturate { float value { 0.0f }; Optional input; }; struct HueRotate { float angle_degrees { 0.0f }; Optional input; }; struct Image { Gfx::DecodedImageFrame frame; Gfx::IntRect src_rect; Gfx::IntRect dest_rect; Gfx::ScalingMode scaling_mode { Gfx::ScalingMode::NearestNeighbor }; }; struct Merge { Vector> inputs; }; struct Offset { float dx { 0.0f }; float dy { 0.0f }; Optional input; }; struct Erode { float radius_x { 0.0f }; float radius_y { 0.0f }; Optional input; }; struct Dilate { float radius_x { 0.0f }; float radius_y { 0.0f }; Optional input; }; struct Turbulence { TurbulenceType turbulence_type { TurbulenceType::Turbulence }; float base_frequency_x { 0.0f }; float base_frequency_y { 0.0f }; i32 num_octaves { 0 }; float seed { 0.0f }; Gfx::IntSize tile_stitch_size; }; using Operation = Variant< Arithmetic, Compose, Blend, Flood, DisplacementMap, DropShadow, Blur, ColorFilter, ColorMatrix, ColorTable, Saturate, HueRotate, Image, Merge, Offset, Erode, Dilate, Turbulence>; enum class OperationType : u8 { Arithmetic, Compose, Blend, Flood, DisplacementMap, DropShadow, Blur, ColorFilter, ColorMatrix, ColorTable, Saturate, HueRotate, Image, Merge, Offset, Erode, Dilate, Turbulence, }; Operation operation; static NonnullOwnPtr create(Operation operation) { return adopt_own(*new FilterImpl(move(operation))); } NonnullOwnPtr clone() const { return adopt_own(*new FilterImpl(operation)); } }; }