ladybird/Libraries/LibGfx/FilterImpl.h
Aliaksandr Kalenik 3c9df3fccd LibWeb: Inline serialized filters in display list commands
Prep work for serializing display lists across the IPC boundary. Replace
Gfx::Filter's Skia-specific backing with a portable Variant-based
representation, add serialize_filter/deserialize_filter, and store
filter data inline in ApplyEffects/ApplyBackdropFilter command payloads
instead of in DisplayListResourceStorage. FilterResourceId is removed
along with the per-storage filter map.
2026-05-11 15:49:12 +02:00

188 lines
4 KiB
C++

/*
* Copyright (c) 2024-2025, Lucien Fiorini <lucienfiorini@gmail.com>
*
* SPDX-License-Identifier: BSD-2-Clause
*/
#pragma once
#include <AK/Array.h>
#include <AK/ByteBuffer.h>
#include <AK/NonnullOwnPtr.h>
#include <AK/Optional.h>
#include <AK/Variant.h>
#include <AK/Vector.h>
#include <LibGfx/Filter.h>
namespace Gfx {
struct FilterImpl {
struct Arithmetic {
Optional<Filter> background;
Optional<Filter> 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<Filter> background;
Optional<Filter> foreground;
Gfx::CompositingAndBlendingOperator mode { Gfx::CompositingAndBlendingOperator::Normal };
};
struct Flood {
Gfx::Color color;
float opacity { 1.0f };
};
struct DisplacementMap {
Optional<Filter> color;
Optional<Filter> 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<Filter> input;
};
struct Blur {
float radius_x { 0.0f };
float radius_y { 0.0f };
Optional<Filter> input;
};
struct ColorFilter {
ColorFilterType type { ColorFilterType::Brightness };
float amount { 0.0f };
Optional<Filter> input;
};
struct ColorMatrix {
Array<float, 20> matrix;
Optional<Filter> input;
};
struct ColorTable {
Optional<ByteBuffer> a;
Optional<ByteBuffer> r;
Optional<ByteBuffer> g;
Optional<ByteBuffer> b;
Optional<Filter> input;
};
struct Saturate {
float value { 0.0f };
Optional<Filter> input;
};
struct HueRotate {
float angle_degrees { 0.0f };
Optional<Filter> input;
};
struct Image {
Gfx::DecodedImageFrame frame;
Gfx::IntRect src_rect;
Gfx::IntRect dest_rect;
Gfx::ScalingMode scaling_mode { Gfx::ScalingMode::NearestNeighbor };
};
struct Merge {
Vector<Optional<Filter>> inputs;
};
struct Offset {
float dx { 0.0f };
float dy { 0.0f };
Optional<Filter> input;
};
struct Erode {
float radius_x { 0.0f };
float radius_y { 0.0f };
Optional<Filter> input;
};
struct Dilate {
float radius_x { 0.0f };
float radius_y { 0.0f };
Optional<Filter> 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<FilterImpl> create(Operation operation)
{
return adopt_own(*new FilterImpl(move(operation)));
}
NonnullOwnPtr<FilterImpl> clone() const
{
return adopt_own(*new FilterImpl(operation));
}
};
}