tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

commit 8b0792e54c1ad81505b1a230bfe750407dc606f3
parent 6131977899274b17f4819e5d96ea24d65701d8f2
Author: Nicolas Silva <nical@fastmail.com>
Date:   Mon, 15 Dec 2025 10:53:22 +0000

Bug 1998913 - Part 10 - Move SVG filter code from prim_store/picture.rs to svg_filter.rs. r=gfx-reviewers,jnicol

Differential Revision: https://phabricator.services.mozilla.com/D276246

Diffstat:
Mgfx/wr/webrender/src/prim_store/picture.rs | 752+------------------------------------------------------------------------------
Mgfx/wr/webrender/src/svg_filter.rs | 752++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++-
2 files changed, 753 insertions(+), 751 deletions(-)

diff --git a/gfx/wr/webrender/src/prim_store/picture.rs b/gfx/wr/webrender/src/prim_store/picture.rs @@ -4,7 +4,7 @@ use api::{ ColorU, MixBlendMode, PropertyBinding, PropertyBindingId, - RasterSpace, FilterOpGraphPictureBufferId, + RasterSpace, }; use api::units::Au; use crate::scene_building::IsVisible; @@ -12,761 +12,13 @@ use crate::gpu_types::BlurEdgeMode; use crate::intern::ItemUid; use crate::intern::{Internable, InternDebug, Handle as InternHandle}; use crate::internal_types::{LayoutPrimitiveInfo, Filter}; -use crate::svg_filter::{FilterGraphPictureReference, FilterGraphOp, FilterGraphNode, SVGFE_CONVOLVE_VALUES_LIMIT}; +use crate::svg_filter::{FilterGraphNodeKey, FilterGraphOpKey}; use crate::picture::PictureCompositeMode; use crate::prim_store::{ PrimitiveInstanceKind, PrimitiveStore, VectorKey, InternablePrimitive, }; -#[cfg_attr(feature = "capture", derive(Serialize))] -#[cfg_attr(feature = "replay", derive(Deserialize))] -#[derive(Debug, Clone, Copy, Default, MallocSizeOf, PartialEq, Hash, Eq)] -pub enum FilterGraphPictureBufferIdKey { - #[default] - /// empty slot in feMerge inputs - None, - /// reference to another (earlier) node in filter graph - BufferId(i16), -} - -#[cfg_attr(feature = "capture", derive(Serialize))] -#[cfg_attr(feature = "replay", derive(Deserialize))] -#[derive(Debug, Clone, Copy, Default, MallocSizeOf, PartialEq, Hash, Eq)] -pub struct FilterGraphPictureReferenceKey { - /// Id of the picture in question in a namespace unique to this filter DAG, - /// some are special values like - /// FilterPrimitiveDescription::kPrimitiveIndexSourceGraphic. - pub buffer_id: FilterGraphPictureBufferIdKey, - /// Place the input image here in Layout space (like node.subregion) - pub subregion: [Au; 4], - /// Translate the subregion by this amount - pub offset: [Au; 2], -} - -impl From<FilterGraphPictureReference> for FilterGraphPictureReferenceKey { - fn from(pic: FilterGraphPictureReference) -> Self { - FilterGraphPictureReferenceKey{ - buffer_id: match pic.buffer_id { - FilterOpGraphPictureBufferId::None => FilterGraphPictureBufferIdKey::None, - FilterOpGraphPictureBufferId::BufferId(id) => FilterGraphPictureBufferIdKey::BufferId(id), - }, - subregion: [ - Au::from_f32_px(pic.subregion.min.x), - Au::from_f32_px(pic.subregion.min.y), - Au::from_f32_px(pic.subregion.max.x), - Au::from_f32_px(pic.subregion.max.y), - ], - offset: [ - Au::from_f32_px(pic.offset.x), - Au::from_f32_px(pic.offset.y), - ], - } - } -} - -#[cfg_attr(feature = "capture", derive(Serialize))] -#[cfg_attr(feature = "replay", derive(Deserialize))] -#[derive(Debug, Clone, MallocSizeOf, PartialEq, Hash, Eq)] -pub enum FilterGraphOpKey { - /// combine 2 images with SVG_FEBLEND_MODE_DARKEN - /// parameters: FilterOpGraphNode - /// SVG filter semantics - selectable input(s), selectable between linear - /// (default) and sRGB color space for calculations - /// Spec: https://www.w3.org/TR/filter-effects-1/#feBlendElement - SVGFEBlendDarken, - /// combine 2 images with SVG_FEBLEND_MODE_LIGHTEN - /// parameters: FilterOpGraphNode - /// SVG filter semantics - selectable input(s), selectable between linear - /// (default) and sRGB color space for calculations - /// Spec: https://www.w3.org/TR/filter-effects-1/#feBlendElement - SVGFEBlendLighten, - /// combine 2 images with SVG_FEBLEND_MODE_MULTIPLY - /// parameters: FilterOpGraphNode - /// SVG filter semantics - selectable input(s), selectable between linear - /// (default) and sRGB color space for calculations - /// Spec: https://www.w3.org/TR/filter-effects-1/#feBlendElement - SVGFEBlendMultiply, - /// combine 2 images with SVG_FEBLEND_MODE_NORMAL - /// parameters: FilterOpGraphNode - /// SVG filter semantics - selectable input(s), selectable between linear - /// (default) and sRGB color space for calculations - /// Spec: https://www.w3.org/TR/filter-effects-1/#feBlendElement - SVGFEBlendNormal, - /// combine 2 images with SVG_FEBLEND_MODE_SCREEN - /// parameters: FilterOpGraphNode - /// SVG filter semantics - selectable input(s), selectable between linear - /// (default) and sRGB color space for calculations - /// Spec: https://www.w3.org/TR/filter-effects-1/#feBlendElement - SVGFEBlendScreen, - /// combine 2 images with SVG_FEBLEND_MODE_OVERLAY - /// parameters: FilterOpGraphNode - /// SVG filter semantics - selectable input(s), selectable between linear - /// (default) and sRGB color space for calculations - /// Source: https://developer.mozilla.org/en-US/docs/Web/CSS/mix-blend-mode - SVGFEBlendOverlay, - /// combine 2 images with SVG_FEBLEND_MODE_COLOR_DODGE - /// parameters: FilterOpGraphNode - /// SVG filter semantics - selectable input(s), selectable between linear - /// (default) and sRGB color space for calculations - /// Source: https://developer.mozilla.org/en-US/docs/Web/CSS/mix-blend-mode - SVGFEBlendColorDodge, - /// combine 2 images with SVG_FEBLEND_MODE_COLOR_BURN - /// parameters: FilterOpGraphNode - /// SVG filter semantics - selectable input(s), selectable between linear - /// (default) and sRGB color space for calculations - /// Source: https://developer.mozilla.org/en-US/docs/Web/CSS/mix-blend-mode - SVGFEBlendColorBurn, - /// combine 2 images with SVG_FEBLEND_MODE_HARD_LIGHT - /// parameters: FilterOpGraphNode - /// SVG filter semantics - selectable input(s), selectable between linear - /// (default) and sRGB color space for calculations - /// Source: https://developer.mozilla.org/en-US/docs/Web/CSS/mix-blend-mode - SVGFEBlendHardLight, - /// combine 2 images with SVG_FEBLEND_MODE_SOFT_LIGHT - /// parameters: FilterOpGraphNode - /// SVG filter semantics - selectable input(s), selectable between linear - /// (default) and sRGB color space for calculations - /// Source: https://developer.mozilla.org/en-US/docs/Web/CSS/mix-blend-mode - SVGFEBlendSoftLight, - /// combine 2 images with SVG_FEBLEND_MODE_DIFFERENCE - /// parameters: FilterOpGraphNode - /// SVG filter semantics - selectable input(s), selectable between linear - /// (default) and sRGB color space for calculations - /// Source: https://developer.mozilla.org/en-US/docs/Web/CSS/mix-blend-mode - SVGFEBlendDifference, - /// combine 2 images with SVG_FEBLEND_MODE_EXCLUSION - /// parameters: FilterOpGraphNode - /// SVG filter semantics - selectable input(s), selectable between linear - /// (default) and sRGB color space for calculations - /// Source: https://developer.mozilla.org/en-US/docs/Web/CSS/mix-blend-mode - SVGFEBlendExclusion, - /// combine 2 images with SVG_FEBLEND_MODE_HUE - /// parameters: FilterOpGraphNode - /// SVG filter semantics - selectable input(s), selectable between linear - /// (default) and sRGB color space for calculations - /// Source: https://developer.mozilla.org/en-US/docs/Web/CSS/mix-blend-mode - SVGFEBlendHue, - /// combine 2 images with SVG_FEBLEND_MODE_SATURATION - /// parameters: FilterOpGraphNode - /// SVG filter semantics - selectable input(s), selectable between linear - /// (default) and sRGB color space for calculations - /// Source: https://developer.mozilla.org/en-US/docs/Web/CSS/mix-blend-mode - SVGFEBlendSaturation, - /// combine 2 images with SVG_FEBLEND_MODE_COLOR - /// parameters: FilterOpGraphNode - /// SVG filter semantics - selectable input(s), selectable between linear - /// (default) and sRGB color space for calculations - /// Source: https://developer.mozilla.org/en-US/docs/Web/CSS/mix-blend-mode - SVGFEBlendColor, - /// combine 2 images with SVG_FEBLEND_MODE_LUMINOSITY - /// parameters: FilterOpGraphNode - /// SVG filter semantics - selectable input(s), selectable between linear - /// (default) and sRGB color space for calculations - /// Source: https://developer.mozilla.org/en-US/docs/Web/CSS/mix-blend-mode - SVGFEBlendLuminosity, - /// transform colors of image through 5x4 color matrix (transposed for - /// efficiency) - /// parameters: FilterOpGraphNode, matrix[5][4] - /// SVG filter semantics - selectable input(s), selectable between linear - /// (default) and sRGB color space for calculations - /// Spec: https://www.w3.org/TR/filter-effects-1/#feColorMatrixElement - SVGFEColorMatrix{values: [Au; 20]}, - /// transform colors of image through configurable gradients with component - /// swizzle - /// parameters: FilterOpGraphNode, FilterData - /// SVG filter semantics - selectable input(s), selectable between linear - /// (default) and sRGB color space for calculations - /// Spec: https://www.w3.org/TR/filter-effects-1/#feComponentTransferElement - SVGFEComponentTransferInterned{handle: ItemUid, creates_pixels: bool}, - /// composite 2 images with chosen composite mode with parameters for that - /// mode - /// parameters: FilterOpGraphNode, k1, k2, k3, k4 - /// SVG filter semantics - selectable input(s), selectable between linear - /// (default) and sRGB color space for calculations - /// Spec: https://www.w3.org/TR/filter-effects-1/#feCompositeElement - SVGFECompositeArithmetic{k1: Au, k2: Au, k3: Au, k4: Au}, - /// composite 2 images with chosen composite mode with parameters for that - /// mode - /// parameters: FilterOpGraphNode - /// SVG filter semantics - selectable input(s), selectable between linear - /// (default) and sRGB color space for calculations - /// Spec: https://www.w3.org/TR/filter-effects-1/#feCompositeElement - SVGFECompositeATop, - /// composite 2 images with chosen composite mode with parameters for that - /// mode - /// parameters: FilterOpGraphNode - /// SVG filter semantics - selectable input(s), selectable between linear - /// (default) and sRGB color space for calculations - /// Spec: https://www.w3.org/TR/filter-effects-1/#feCompositeElement - SVGFECompositeIn, - /// composite 2 images with chosen composite mode with parameters for that - /// mode - /// parameters: FilterOpGraphNode - /// SVG filter semantics - selectable input(s), selectable between linear - /// (default) and sRGB color space for calculations - /// Docs: https://developer.mozilla.org/en-US/docs/Web/SVG/Element/feComposite - SVGFECompositeLighter, - /// composite 2 images with chosen composite mode with parameters for that - /// mode - /// parameters: FilterOpGraphNode - /// SVG filter semantics - selectable input(s), selectable between linear - /// (default) and sRGB color space for calculations - /// Spec: https://www.w3.org/TR/filter-effects-1/#feCompositeElement - SVGFECompositeOut, - /// composite 2 images with chosen composite mode with parameters for that - /// mode - /// parameters: FilterOpGraphNode - /// SVG filter semantics - selectable input(s), selectable between linear - /// (default) and sRGB color space for calculations - /// Spec: https://www.w3.org/TR/filter-effects-1/#feCompositeElement - SVGFECompositeOver, - /// composite 2 images with chosen composite mode with parameters for that - /// mode - /// parameters: FilterOpGraphNode - /// SVG filter semantics - selectable input(s), selectable between linear - /// (default) and sRGB color space for calculations - /// Spec: https://www.w3.org/TR/filter-effects-1/#feCompositeElement - SVGFECompositeXOR, - /// transform image through convolution matrix of up to 25 values (spec - /// allows more but for performance reasons we do not) - /// parameters: FilterOpGraphNode, orderX, orderY, kernelValues[25], - /// divisor, bias, targetX, targetY, kernelUnitLengthX, kernelUnitLengthY, - /// preserveAlpha - /// SVG filter semantics - selectable input(s), selectable between linear - /// (default) and sRGB color space for calculations - /// Spec: https://www.w3.org/TR/filter-effects-1/#feConvolveMatrixElement - SVGFEConvolveMatrixEdgeModeDuplicate{order_x: i32, order_y: i32, - kernel: [Au; SVGFE_CONVOLVE_VALUES_LIMIT], divisor: Au, bias: Au, - target_x: i32, target_y: i32, kernel_unit_length_x: Au, - kernel_unit_length_y: Au, preserve_alpha: i32}, - /// transform image through convolution matrix of up to 25 values (spec - /// allows more but for performance reasons we do not) - /// parameters: FilterOpGraphNode, orderX, orderY, kernelValues[25], - /// divisor, bias, targetX, targetY, kernelUnitLengthX, kernelUnitLengthY, - /// preserveAlpha - /// SVG filter semantics - selectable input(s), selectable between linear - /// (default) and sRGB color space for calculations - /// Spec: https://www.w3.org/TR/filter-effects-1/#feConvolveMatrixElement - SVGFEConvolveMatrixEdgeModeNone{order_x: i32, order_y: i32, - kernel: [Au; SVGFE_CONVOLVE_VALUES_LIMIT], divisor: Au, bias: Au, - target_x: i32, target_y: i32, kernel_unit_length_x: Au, - kernel_unit_length_y: Au, preserve_alpha: i32}, - /// transform image through convolution matrix of up to 25 values (spec - /// allows more but for performance reasons we do not) - /// parameters: FilterOpGraphNode, orderX, orderY, kernelValues[25], - /// divisor, bias, targetX, targetY, kernelUnitLengthX, kernelUnitLengthY, - /// preserveAlpha - /// SVG filter semantics - selectable input(s), selectable between linear - /// (default) and sRGB color space for calculations - /// Spec: https://www.w3.org/TR/filter-effects-1/#feConvolveMatrixElement - SVGFEConvolveMatrixEdgeModeWrap{order_x: i32, order_y: i32, - kernel: [Au; SVGFE_CONVOLVE_VALUES_LIMIT], divisor: Au, bias: Au, - target_x: i32, target_y: i32, kernel_unit_length_x: Au, - kernel_unit_length_y: Au, preserve_alpha: i32}, - /// calculate lighting based on heightmap image with provided values for a - /// distant light source with specified direction - /// parameters: FilterOpGraphNode, surfaceScale, diffuseConstant, - /// kernelUnitLengthX, kernelUnitLengthY, azimuth, elevation - /// SVG filter semantics - selectable input(s), selectable between linear - /// (default) and sRGB color space for calculations - /// Spec: https://www.w3.org/TR/filter-effects-1/#InterfaceSVGFEDiffuseLightingElement - /// https://www.w3.org/TR/filter-effects-1/#InterfaceSVGFEDistantLightElement - SVGFEDiffuseLightingDistant{surface_scale: Au, diffuse_constant: Au, - kernel_unit_length_x: Au, kernel_unit_length_y: Au, azimuth: Au, - elevation: Au}, - /// calculate lighting based on heightmap image with provided values for a - /// point light source at specified location - /// parameters: FilterOpGraphNode, surfaceScale, diffuseConstant, - /// kernelUnitLengthX, kernelUnitLengthY, x, y, z - /// SVG filter semantics - selectable input(s), selectable between linear - /// (default) and sRGB color space for calculations - /// Spec: https://www.w3.org/TR/filter-effects-1/#InterfaceSVGFEDiffuseLightingElement - /// https://www.w3.org/TR/filter-effects-1/#InterfaceSVGFEPointLightElement - SVGFEDiffuseLightingPoint{surface_scale: Au, diffuse_constant: Au, - kernel_unit_length_x: Au, kernel_unit_length_y: Au, x: Au, y: Au, - z: Au}, - /// calculate lighting based on heightmap image with provided values for a - /// spot light source at specified location pointing at specified target - /// location with specified hotspot sharpness and cone angle - /// parameters: FilterOpGraphNode, surfaceScale, diffuseConstant, - /// kernelUnitLengthX, kernelUnitLengthY, x, y, z, pointsAtX, pointsAtY, - /// pointsAtZ, specularExponent, limitingConeAngle - /// SVG filter semantics - selectable input(s), selectable between linear - /// (default) and sRGB color space for calculations - /// Spec: https://www.w3.org/TR/filter-effects-1/#InterfaceSVGFEDiffuseLightingElement - /// https://www.w3.org/TR/filter-effects-1/#InterfaceSVGFESpotLightElement - SVGFEDiffuseLightingSpot{surface_scale: Au, diffuse_constant: Au, - kernel_unit_length_x: Au, kernel_unit_length_y: Au, x: Au, y: Au, z: Au, - points_at_x: Au, points_at_y: Au, points_at_z: Au, cone_exponent: Au, - limiting_cone_angle: Au}, - /// calculate a distorted version of first input image using offset values - /// from second input image at specified intensity - /// parameters: FilterOpGraphNode, scale, xChannelSelector, yChannelSelector - /// SVG filter semantics - selectable input(s), selectable between linear - /// (default) and sRGB color space for calculations - /// Spec: https://www.w3.org/TR/filter-effects-1/#InterfaceSVGFEDisplacementMapElement - SVGFEDisplacementMap{scale: Au, x_channel_selector: u32, - y_channel_selector: u32}, - /// create and merge a dropshadow version of the specified image's alpha - /// channel with specified offset and blur radius - /// parameters: FilterOpGraphNode, flood_color, flood_opacity, dx, dy, - /// stdDeviationX, stdDeviationY - /// SVG filter semantics - selectable input(s), selectable between linear - /// (default) and sRGB color space for calculations - /// Spec: https://www.w3.org/TR/filter-effects-1/#InterfaceSVGFEDropShadowElement - SVGFEDropShadow{color: ColorU, dx: Au, dy: Au, std_deviation_x: Au, - std_deviation_y: Au}, - /// synthesize a new image of specified size containing a solid color - /// parameters: FilterOpGraphNode, color - /// SVG filter semantics - selectable input(s), selectable between linear - /// (default) and sRGB color space for calculations - /// Spec: https://www.w3.org/TR/filter-effects-1/#InterfaceSVGFEFloodElement - SVGFEFlood{color: ColorU}, - /// create a blurred version of the input image - /// parameters: FilterOpGraphNode, stdDeviationX, stdDeviationY - /// SVG filter semantics - selectable input(s), selectable between linear - /// (default) and sRGB color space for calculations - /// Spec: https://www.w3.org/TR/filter-effects-1/#InterfaceSVGFEGaussianBlurElement - SVGFEGaussianBlur{std_deviation_x: Au, std_deviation_y: Au}, - /// Filter that does no transformation of the colors, needed for - /// debug purposes, and is the default value in impl_default_for_enums. - SVGFEIdentity, - /// synthesize a new image based on a url (i.e. blob image source) - /// parameters: FilterOpGraphNode, sampling_filter (see SamplingFilter in - /// Types.h), transform - /// SVG filter semantics - selectable input(s), selectable between linear - /// (default) and sRGB color space for calculations - /// Spec: https://www.w3.org/TR/filter-effects-1/#InterfaceSVGFEImageElement - SVGFEImage{sampling_filter: u32, matrix: [Au; 6]}, - /// create a new image based on the input image with the contour stretched - /// outward (dilate operator) - /// parameters: FilterOpGraphNode, radiusX, radiusY - /// SVG filter semantics - selectable input(s), selectable between linear - /// (default) and sRGB color space for calculations - /// Spec: https://www.w3.org/TR/filter-effects-1/#InterfaceSVGFEMorphologyElement - SVGFEMorphologyDilate{radius_x: Au, radius_y: Au}, - /// create a new image based on the input image with the contour shrunken - /// inward (erode operator) - /// parameters: FilterOpGraphNode, radiusX, radiusY - /// SVG filter semantics - selectable input(s), selectable between linear - /// (default) and sRGB color space for calculations - /// Spec: https://www.w3.org/TR/filter-effects-1/#InterfaceSVGFEMorphologyElement - SVGFEMorphologyErode{radius_x: Au, radius_y: Au}, - /// represents CSS opacity property as a graph node like the rest of the - /// SVGFE* filters - /// parameters: FilterOpGraphNode - /// SVG filter semantics - selectable input(s), selectable between linear - /// (default) and sRGB color space for calculations - SVGFEOpacity{value: Au}, - /// represents CSS opacity property as a graph node like the rest of the - /// SVGFE* filters - /// parameters: FilterOpGraphNode - /// SVG filter semantics - selectable input(s), selectable between linear - /// (default) and sRGB color space for calculations - SVGFEOpacityBinding{valuebindingid: PropertyBindingId, value: Au}, - /// Filter that copies the SourceGraphic image into the specified subregion, - /// This is intentionally the only way to get SourceGraphic into the graph, - /// as the filter region must be applied before it is used. - /// parameters: FilterOpGraphNode - /// SVG filter semantics - no inputs, no linear - SVGFESourceGraphic, - /// Filter that copies the SourceAlpha image into the specified subregion, - /// This is intentionally the only way to get SourceAlpha into the graph, - /// as the filter region must be applied before it is used. - /// parameters: FilterOpGraphNode - /// SVG filter semantics - no inputs, no linear - SVGFESourceAlpha, - /// calculate lighting based on heightmap image with provided values for a - /// distant light source with specified direction - /// parameters: FilerData, surfaceScale, specularConstant, specularExponent, - /// kernelUnitLengthX, kernelUnitLengthY, azimuth, elevation - /// SVG filter semantics - selectable input(s), selectable between linear - /// (default) and sRGB color space for calculations - /// Spec: https://www.w3.org/TR/filter-effects-1/#InterfaceSVGFESpecularLightingElement - /// https://www.w3.org/TR/filter-effects-1/#InterfaceSVGFEDistantLightElement - SVGFESpecularLightingDistant{surface_scale: Au, specular_constant: Au, - specular_exponent: Au, kernel_unit_length_x: Au, - kernel_unit_length_y: Au, azimuth: Au, elevation: Au}, - /// calculate lighting based on heightmap image with provided values for a - /// point light source at specified location - /// parameters: FilterOpGraphNode, surfaceScale, specularConstant, - /// specularExponent, kernelUnitLengthX, kernelUnitLengthY, x, y, z - /// SVG filter semantics - selectable input(s), selectable between linear - /// (default) and sRGB color space for calculations - /// Spec: https://www.w3.org/TR/filter-effects-1/#InterfaceSVGFESpecularLightingElement - /// https://www.w3.org/TR/filter-effects-1/#InterfaceSVGFEPointLightElement - SVGFESpecularLightingPoint{surface_scale: Au, specular_constant: Au, - specular_exponent: Au, kernel_unit_length_x: Au, - kernel_unit_length_y: Au, x: Au, y: Au, z: Au}, - /// calculate lighting based on heightmap image with provided values for a - /// spot light source at specified location pointing at specified target - /// location with specified hotspot sharpness and cone angle - /// parameters: FilterOpGraphNode, surfaceScale, specularConstant, - /// specularExponent, kernelUnitLengthX, kernelUnitLengthY, x, y, z, - /// pointsAtX, pointsAtY, pointsAtZ, specularExponent, limitingConeAngle - /// SVG filter semantics - selectable input(s), selectable between linear - /// (default) and sRGB color space for calculations - /// Spec: https://www.w3.org/TR/filter-effects-1/#InterfaceSVGFESpecularLightingElement - /// https://www.w3.org/TR/filter-effects-1/#InterfaceSVGFESpotLightElement - SVGFESpecularLightingSpot{surface_scale: Au, specular_constant: Au, - specular_exponent: Au, kernel_unit_length_x: Au, - kernel_unit_length_y: Au, x: Au, y: Au, z: Au, points_at_x: Au, - points_at_y: Au, points_at_z: Au, cone_exponent: Au, - limiting_cone_angle: Au}, - /// create a new image based on the input image, repeated throughout the - /// output rectangle - /// parameters: FilterOpGraphNode - /// SVG filter semantics - selectable input(s), selectable between linear - /// (default) and sRGB color space for calculations - /// Spec: https://www.w3.org/TR/filter-effects-1/#InterfaceSVGFETileElement - SVGFETile, - /// convert a color image to an alpha channel - internal use; generated by - /// SVGFilterInstance::GetOrCreateSourceAlphaIndex(). - SVGFEToAlpha, - /// synthesize a new image based on Fractal Noise (Perlin) with the chosen - /// stitching mode - /// parameters: FilterOpGraphNode, baseFrequencyX, baseFrequencyY, - /// numOctaves, seed - /// SVG filter semantics - selectable input(s), selectable between linear - /// (default) and sRGB color space for calculations - /// Spec: https://www.w3.org/TR/filter-effects-1/#InterfaceSVGFETurbulenceElement - SVGFETurbulenceWithFractalNoiseWithNoStitching{base_frequency_x: Au, - base_frequency_y: Au, num_octaves: u32, seed: u32}, - /// synthesize a new image based on Fractal Noise (Perlin) with the chosen - /// stitching mode - /// parameters: FilterOpGraphNode, baseFrequencyX, baseFrequencyY, - /// numOctaves, seed - /// SVG filter semantics - selectable input(s), selectable between linear - /// (default) and sRGB color space for calculations - /// Spec: https://www.w3.org/TR/filter-effects-1/#InterfaceSVGFETurbulenceElement - SVGFETurbulenceWithFractalNoiseWithStitching{base_frequency_x: Au, - base_frequency_y: Au, num_octaves: u32, seed: u32}, - /// synthesize a new image based on Turbulence Noise (offset vectors) - /// parameters: FilterOpGraphNode, baseFrequencyX, baseFrequencyY, - /// numOctaves, seed - /// SVG filter semantics - selectable input(s), selectable between linear - /// (default) and sRGB color space for calculations - /// Spec: https://www.w3.org/TR/filter-effects-1/#InterfaceSVGFETurbulenceElement - SVGFETurbulenceWithTurbulenceNoiseWithNoStitching{base_frequency_x: Au, - base_frequency_y: Au, num_octaves: u32, seed: u32}, - /// synthesize a new image based on Turbulence Noise (offset vectors) - /// parameters: FilterOpGraphNode, baseFrequencyX, baseFrequencyY, - /// numOctaves, seed - /// SVG filter semantics - selectable input(s), selectable between linear - /// (default) and sRGB color space for calculations - /// Spec: https://www.w3.org/TR/filter-effects-1/#InterfaceSVGFETurbulenceElement - SVGFETurbulenceWithTurbulenceNoiseWithStitching{base_frequency_x: Au, - base_frequency_y: Au, num_octaves: u32, seed: u32}, -} - -impl From<FilterGraphOp> for FilterGraphOpKey { - fn from(op: FilterGraphOp) -> Self { - match op { - FilterGraphOp::SVGFEBlendDarken => FilterGraphOpKey::SVGFEBlendDarken, - FilterGraphOp::SVGFEBlendLighten => FilterGraphOpKey::SVGFEBlendLighten, - FilterGraphOp::SVGFEBlendMultiply => FilterGraphOpKey::SVGFEBlendMultiply, - FilterGraphOp::SVGFEBlendNormal => FilterGraphOpKey::SVGFEBlendNormal, - FilterGraphOp::SVGFEBlendScreen => FilterGraphOpKey::SVGFEBlendScreen, - FilterGraphOp::SVGFEBlendOverlay => FilterGraphOpKey::SVGFEBlendOverlay, - FilterGraphOp::SVGFEBlendColorDodge => FilterGraphOpKey::SVGFEBlendColorDodge, - FilterGraphOp::SVGFEBlendColorBurn => FilterGraphOpKey::SVGFEBlendColorBurn, - FilterGraphOp::SVGFEBlendHardLight => FilterGraphOpKey::SVGFEBlendHardLight, - FilterGraphOp::SVGFEBlendSoftLight => FilterGraphOpKey::SVGFEBlendSoftLight, - FilterGraphOp::SVGFEBlendDifference => FilterGraphOpKey::SVGFEBlendDifference, - FilterGraphOp::SVGFEBlendExclusion => FilterGraphOpKey::SVGFEBlendExclusion, - FilterGraphOp::SVGFEBlendHue => FilterGraphOpKey::SVGFEBlendHue, - FilterGraphOp::SVGFEBlendSaturation => FilterGraphOpKey::SVGFEBlendSaturation, - FilterGraphOp::SVGFEBlendColor => FilterGraphOpKey::SVGFEBlendColor, - FilterGraphOp::SVGFEBlendLuminosity => FilterGraphOpKey::SVGFEBlendLuminosity, - FilterGraphOp::SVGFEColorMatrix { values: color_matrix } => { - let mut quantized_values: [Au; 20] = [Au(0); 20]; - for (value, result) in color_matrix.iter().zip(quantized_values.iter_mut()) { - *result = Au::from_f32_px(*value); - } - FilterGraphOpKey::SVGFEColorMatrix{values: quantized_values} - } - FilterGraphOp::SVGFEComponentTransfer => unreachable!(), - FilterGraphOp::SVGFEComponentTransferInterned { handle, creates_pixels } => FilterGraphOpKey::SVGFEComponentTransferInterned{ - handle: handle.uid(), - creates_pixels, - }, - FilterGraphOp::SVGFECompositeArithmetic { k1, k2, k3, k4 } => { - FilterGraphOpKey::SVGFECompositeArithmetic{ - k1: Au::from_f32_px(k1), - k2: Au::from_f32_px(k2), - k3: Au::from_f32_px(k3), - k4: Au::from_f32_px(k4), - } - } - FilterGraphOp::SVGFECompositeATop => FilterGraphOpKey::SVGFECompositeATop, - FilterGraphOp::SVGFECompositeIn => FilterGraphOpKey::SVGFECompositeIn, - FilterGraphOp::SVGFECompositeLighter => FilterGraphOpKey::SVGFECompositeLighter, - FilterGraphOp::SVGFECompositeOut => FilterGraphOpKey::SVGFECompositeOut, - FilterGraphOp::SVGFECompositeOver => FilterGraphOpKey::SVGFECompositeOver, - FilterGraphOp::SVGFECompositeXOR => FilterGraphOpKey::SVGFECompositeXOR, - FilterGraphOp::SVGFEConvolveMatrixEdgeModeDuplicate { order_x, order_y, kernel, divisor, bias, target_x, target_y, kernel_unit_length_x, kernel_unit_length_y, preserve_alpha } => { - let mut values: [Au; SVGFE_CONVOLVE_VALUES_LIMIT] = [Au(0); SVGFE_CONVOLVE_VALUES_LIMIT]; - for (value, result) in kernel.iter().zip(values.iter_mut()) { - *result = Au::from_f32_px(*value) - } - FilterGraphOpKey::SVGFEConvolveMatrixEdgeModeDuplicate{ - order_x, - order_y, - kernel: values, - divisor: Au::from_f32_px(divisor), - bias: Au::from_f32_px(bias), - target_x, - target_y, - kernel_unit_length_x: Au::from_f32_px(kernel_unit_length_x), - kernel_unit_length_y: Au::from_f32_px(kernel_unit_length_y), - preserve_alpha, - } - } - FilterGraphOp::SVGFEConvolveMatrixEdgeModeNone { order_x, order_y, kernel, divisor, bias, target_x, target_y, kernel_unit_length_x, kernel_unit_length_y, preserve_alpha } => { - let mut values: [Au; SVGFE_CONVOLVE_VALUES_LIMIT] = [Au(0); SVGFE_CONVOLVE_VALUES_LIMIT]; - for (value, result) in kernel.iter().zip(values.iter_mut()) { - *result = Au::from_f32_px(*value) - } - FilterGraphOpKey::SVGFEConvolveMatrixEdgeModeNone{ - order_x, - order_y, - kernel: values, - divisor: Au::from_f32_px(divisor), - bias: Au::from_f32_px(bias), - target_x, - target_y, - kernel_unit_length_x: Au::from_f32_px(kernel_unit_length_x), - kernel_unit_length_y: Au::from_f32_px(kernel_unit_length_y), - preserve_alpha, - } - } - FilterGraphOp::SVGFEConvolveMatrixEdgeModeWrap { order_x, order_y, kernel, divisor, bias, target_x, target_y, kernel_unit_length_x, kernel_unit_length_y, preserve_alpha } => { - let mut values: [Au; SVGFE_CONVOLVE_VALUES_LIMIT] = [Au(0); SVGFE_CONVOLVE_VALUES_LIMIT]; - for (value, result) in kernel.iter().zip(values.iter_mut()) { - *result = Au::from_f32_px(*value) - } - FilterGraphOpKey::SVGFEConvolveMatrixEdgeModeWrap{ - order_x, - order_y, - kernel: values, - divisor: Au::from_f32_px(divisor), - bias: Au::from_f32_px(bias), - target_x, - target_y, - kernel_unit_length_x: Au::from_f32_px(kernel_unit_length_x), - kernel_unit_length_y: Au::from_f32_px(kernel_unit_length_y), - preserve_alpha, - } - } - FilterGraphOp::SVGFEDiffuseLightingDistant { surface_scale, diffuse_constant, kernel_unit_length_x, kernel_unit_length_y, azimuth, elevation } => { - FilterGraphOpKey::SVGFEDiffuseLightingDistant{ - surface_scale: Au::from_f32_px(surface_scale), - diffuse_constant: Au::from_f32_px(diffuse_constant), - kernel_unit_length_x: Au::from_f32_px(kernel_unit_length_x), - kernel_unit_length_y: Au::from_f32_px(kernel_unit_length_y), - azimuth: Au::from_f32_px(azimuth), - elevation: Au::from_f32_px(elevation), - } - } - FilterGraphOp::SVGFEDiffuseLightingPoint { surface_scale, diffuse_constant, kernel_unit_length_x, kernel_unit_length_y, x, y, z } => { - FilterGraphOpKey::SVGFEDiffuseLightingPoint{ - surface_scale: Au::from_f32_px(surface_scale), - diffuse_constant: Au::from_f32_px(diffuse_constant), - kernel_unit_length_x: Au::from_f32_px(kernel_unit_length_x), - kernel_unit_length_y: Au::from_f32_px(kernel_unit_length_y), - x: Au::from_f32_px(x), - y: Au::from_f32_px(y), - z: Au::from_f32_px(z), - } - } - FilterGraphOp::SVGFEDiffuseLightingSpot { surface_scale, diffuse_constant, kernel_unit_length_x, kernel_unit_length_y, x, y, z, points_at_x, points_at_y, points_at_z, cone_exponent, limiting_cone_angle } => { - FilterGraphOpKey::SVGFEDiffuseLightingSpot{ - surface_scale: Au::from_f32_px(surface_scale), - diffuse_constant: Au::from_f32_px(diffuse_constant), - kernel_unit_length_x: Au::from_f32_px(kernel_unit_length_x), - kernel_unit_length_y: Au::from_f32_px(kernel_unit_length_y), - x: Au::from_f32_px(x), - y: Au::from_f32_px(y), - z: Au::from_f32_px(z), - points_at_x: Au::from_f32_px(points_at_x), - points_at_y: Au::from_f32_px(points_at_y), - points_at_z: Au::from_f32_px(points_at_z), - cone_exponent: Au::from_f32_px(cone_exponent), - limiting_cone_angle: Au::from_f32_px(limiting_cone_angle), - } - } - FilterGraphOp::SVGFEDisplacementMap { scale, x_channel_selector, y_channel_selector } => { - FilterGraphOpKey::SVGFEDisplacementMap{ - scale: Au::from_f32_px(scale), - x_channel_selector, - y_channel_selector, - } - } - FilterGraphOp::SVGFEDropShadow { color, dx, dy, std_deviation_x, std_deviation_y } => { - FilterGraphOpKey::SVGFEDropShadow{ - color: color.into(), - dx: Au::from_f32_px(dx), - dy: Au::from_f32_px(dy), - std_deviation_x: Au::from_f32_px(std_deviation_x), - std_deviation_y: Au::from_f32_px(std_deviation_y), - } - } - FilterGraphOp::SVGFEFlood { color } => FilterGraphOpKey::SVGFEFlood{color: color.into()}, - FilterGraphOp::SVGFEGaussianBlur { std_deviation_x, std_deviation_y } => { - FilterGraphOpKey::SVGFEGaussianBlur{ - std_deviation_x: Au::from_f32_px(std_deviation_x), - std_deviation_y: Au::from_f32_px(std_deviation_y), - } - } - FilterGraphOp::SVGFEIdentity => FilterGraphOpKey::SVGFEIdentity, - FilterGraphOp::SVGFEImage { sampling_filter, matrix } => { - let mut values: [Au; 6] = [Au(0); 6]; - for (value, result) in matrix.iter().zip(values.iter_mut()) { - *result = Au::from_f32_px(*value) - } - FilterGraphOpKey::SVGFEImage{ - sampling_filter, - matrix: values, - } - } - FilterGraphOp::SVGFEMorphologyDilate { radius_x, radius_y } => { - FilterGraphOpKey::SVGFEMorphologyDilate{ - radius_x: Au::from_f32_px(radius_x), - radius_y: Au::from_f32_px(radius_y), - } - } - FilterGraphOp::SVGFEMorphologyErode { radius_x, radius_y } => { - FilterGraphOpKey::SVGFEMorphologyErode{ - radius_x: Au::from_f32_px(radius_x), - radius_y: Au::from_f32_px(radius_y), - } - } - FilterGraphOp::SVGFEOpacity{valuebinding: binding, value: _} => { - match binding { - PropertyBinding::Value(value) => { - FilterGraphOpKey::SVGFEOpacity{value: Au::from_f32_px(value)} - } - PropertyBinding::Binding(key, default) => { - FilterGraphOpKey::SVGFEOpacityBinding{valuebindingid: key.id, value: Au::from_f32_px(default)} - } - } - } - FilterGraphOp::SVGFESourceAlpha => FilterGraphOpKey::SVGFESourceAlpha, - FilterGraphOp::SVGFESourceGraphic => FilterGraphOpKey::SVGFESourceGraphic, - FilterGraphOp::SVGFESpecularLightingDistant { surface_scale, specular_constant, specular_exponent, kernel_unit_length_x, kernel_unit_length_y, azimuth, elevation } => { - FilterGraphOpKey::SVGFESpecularLightingDistant{ - surface_scale: Au::from_f32_px(surface_scale), - specular_constant: Au::from_f32_px(specular_constant), - specular_exponent: Au::from_f32_px(specular_exponent), - kernel_unit_length_x: Au::from_f32_px(kernel_unit_length_x), - kernel_unit_length_y: Au::from_f32_px(kernel_unit_length_y), - azimuth: Au::from_f32_px(azimuth), - elevation: Au::from_f32_px(elevation), - } - } - FilterGraphOp::SVGFESpecularLightingPoint { surface_scale, specular_constant, specular_exponent, kernel_unit_length_x, kernel_unit_length_y, x, y, z } => { - FilterGraphOpKey::SVGFESpecularLightingPoint{ - surface_scale: Au::from_f32_px(surface_scale), - specular_constant: Au::from_f32_px(specular_constant), - specular_exponent: Au::from_f32_px(specular_exponent), - kernel_unit_length_x: Au::from_f32_px(kernel_unit_length_x), - kernel_unit_length_y: Au::from_f32_px(kernel_unit_length_y), - x: Au::from_f32_px(x), - y: Au::from_f32_px(y), - z: Au::from_f32_px(z), - } - } - FilterGraphOp::SVGFESpecularLightingSpot { surface_scale, specular_constant, specular_exponent, kernel_unit_length_x, kernel_unit_length_y, x, y, z, points_at_x, points_at_y, points_at_z, cone_exponent, limiting_cone_angle } => { - FilterGraphOpKey::SVGFESpecularLightingSpot{ - surface_scale: Au::from_f32_px(surface_scale), - specular_constant: Au::from_f32_px(specular_constant), - specular_exponent: Au::from_f32_px(specular_exponent), - kernel_unit_length_x: Au::from_f32_px(kernel_unit_length_x), - kernel_unit_length_y: Au::from_f32_px(kernel_unit_length_y), - x: Au::from_f32_px(x), - y: Au::from_f32_px(y), - z: Au::from_f32_px(z), - points_at_x: Au::from_f32_px(points_at_x), - points_at_y: Au::from_f32_px(points_at_y), - points_at_z: Au::from_f32_px(points_at_z), - cone_exponent: Au::from_f32_px(cone_exponent), - limiting_cone_angle: Au::from_f32_px(limiting_cone_angle), - } - } - FilterGraphOp::SVGFETile => FilterGraphOpKey::SVGFETile, - FilterGraphOp::SVGFEToAlpha => FilterGraphOpKey::SVGFEToAlpha, - FilterGraphOp::SVGFETurbulenceWithFractalNoiseWithNoStitching { base_frequency_x, base_frequency_y, num_octaves, seed } => { - FilterGraphOpKey::SVGFETurbulenceWithFractalNoiseWithNoStitching { - base_frequency_x: Au::from_f32_px(base_frequency_x), - base_frequency_y: Au::from_f32_px(base_frequency_y), - num_octaves, - seed, - } - } - FilterGraphOp::SVGFETurbulenceWithFractalNoiseWithStitching { base_frequency_x, base_frequency_y, num_octaves, seed } => { - FilterGraphOpKey::SVGFETurbulenceWithFractalNoiseWithStitching { - base_frequency_x: Au::from_f32_px(base_frequency_x), - base_frequency_y: Au::from_f32_px(base_frequency_y), - num_octaves, - seed, - } - } - FilterGraphOp::SVGFETurbulenceWithTurbulenceNoiseWithNoStitching { base_frequency_x, base_frequency_y, num_octaves, seed } => { - FilterGraphOpKey::SVGFETurbulenceWithTurbulenceNoiseWithNoStitching { - base_frequency_x: Au::from_f32_px(base_frequency_x), - base_frequency_y: Au::from_f32_px(base_frequency_y), - num_octaves, - seed, - } - } - FilterGraphOp::SVGFETurbulenceWithTurbulenceNoiseWithStitching { base_frequency_x, base_frequency_y, num_octaves, seed } => { - FilterGraphOpKey::SVGFETurbulenceWithTurbulenceNoiseWithStitching { - base_frequency_x: Au::from_f32_px(base_frequency_x), - base_frequency_y: Au::from_f32_px(base_frequency_y), - num_octaves, - seed, - } - } - } - } -} - -#[cfg_attr(feature = "capture", derive(Serialize))] -#[cfg_attr(feature = "replay", derive(Deserialize))] -#[derive(Debug, Clone, MallocSizeOf, PartialEq, Hash, Eq)] -pub struct FilterGraphNodeKey { - /// Indicates this graph node was marked as unnecessary by the DAG optimizer - /// (for example SVGFEOffset can often be folded into downstream nodes) - pub kept_by_optimizer: bool, - /// True if color_interpolation_filter == LinearRgb; shader will convert - /// sRGB texture pixel colors on load and convert back on store, for correct - /// interpolation - pub linear: bool, - /// virtualized picture input binding 1 (i.e. texture source), typically - /// this is used, but certain filters do not use it - pub inputs: Vec<FilterGraphPictureReferenceKey>, - /// rect this node will render into, in filter space, does not account for - /// inflate or device_pixel_scale - pub subregion: [Au; 4], -} - -impl From<FilterGraphNode> for FilterGraphNodeKey { - fn from(node: FilterGraphNode) -> Self { - FilterGraphNodeKey{ - kept_by_optimizer: node.kept_by_optimizer, - linear: node.linear, - inputs: node.inputs.into_iter().map(|node| {node.into()}).collect(), - subregion: [ - Au::from_f32_px(node.subregion.min.x), - Au::from_f32_px(node.subregion.min.y), - Au::from_f32_px(node.subregion.max.x), - Au::from_f32_px(node.subregion.max.y), - ], - } - } -} - /// Represents a hashable description of how a picture primitive /// will be composited into its parent. #[cfg_attr(feature = "capture", derive(Serialize))] diff --git a/gfx/wr/webrender/src/svg_filter.rs b/gfx/wr/webrender/src/svg_filter.rs @@ -2,14 +2,764 @@ * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ -use api::{FilterOpGraphPictureReference, FilterOpGraphNode, ColorF}; +use api::{FilterOpGraphPictureReference, FilterOpGraphNode, ColorF, ColorU, PropertyBinding, PropertyBindingId}; use api::SVGFE_GRAPH_MAX; use api::units::*; use api::FilterOpGraphPictureBufferId; use crate::profiler::add_text_marker; use crate::filterdata::FilterDataHandle; +use crate::intern::ItemUid; use core::time::Duration; + +#[cfg_attr(feature = "capture", derive(Serialize))] +#[cfg_attr(feature = "replay", derive(Deserialize))] +#[derive(Debug, Clone, Copy, Default, MallocSizeOf, PartialEq, Hash, Eq)] +pub enum FilterGraphPictureBufferIdKey { + #[default] + /// empty slot in feMerge inputs + None, + /// reference to another (earlier) node in filter graph + BufferId(i16), +} + +#[cfg_attr(feature = "capture", derive(Serialize))] +#[cfg_attr(feature = "replay", derive(Deserialize))] +#[derive(Debug, Clone, Copy, Default, MallocSizeOf, PartialEq, Hash, Eq)] +pub struct FilterGraphPictureReferenceKey { + /// Id of the picture in question in a namespace unique to this filter DAG, + /// some are special values like + /// FilterPrimitiveDescription::kPrimitiveIndexSourceGraphic. + pub buffer_id: FilterGraphPictureBufferIdKey, + /// Place the input image here in Layout space (like node.subregion) + pub subregion: [Au; 4], + /// Translate the subregion by this amount + pub offset: [Au; 2], +} + +impl From<FilterGraphPictureReference> for FilterGraphPictureReferenceKey { + fn from(pic: FilterGraphPictureReference) -> Self { + FilterGraphPictureReferenceKey{ + buffer_id: match pic.buffer_id { + FilterOpGraphPictureBufferId::None => FilterGraphPictureBufferIdKey::None, + FilterOpGraphPictureBufferId::BufferId(id) => FilterGraphPictureBufferIdKey::BufferId(id), + }, + subregion: [ + Au::from_f32_px(pic.subregion.min.x), + Au::from_f32_px(pic.subregion.min.y), + Au::from_f32_px(pic.subregion.max.x), + Au::from_f32_px(pic.subregion.max.y), + ], + offset: [ + Au::from_f32_px(pic.offset.x), + Au::from_f32_px(pic.offset.y), + ], + } + } +} + +#[cfg_attr(feature = "capture", derive(Serialize))] +#[cfg_attr(feature = "replay", derive(Deserialize))] +#[derive(Debug, Clone, MallocSizeOf, PartialEq, Hash, Eq)] +pub enum FilterGraphOpKey { + /// combine 2 images with SVG_FEBLEND_MODE_DARKEN + /// parameters: FilterOpGraphNode + /// SVG filter semantics - selectable input(s), selectable between linear + /// (default) and sRGB color space for calculations + /// Spec: https://www.w3.org/TR/filter-effects-1/#feBlendElement + SVGFEBlendDarken, + /// combine 2 images with SVG_FEBLEND_MODE_LIGHTEN + /// parameters: FilterOpGraphNode + /// SVG filter semantics - selectable input(s), selectable between linear + /// (default) and sRGB color space for calculations + /// Spec: https://www.w3.org/TR/filter-effects-1/#feBlendElement + SVGFEBlendLighten, + /// combine 2 images with SVG_FEBLEND_MODE_MULTIPLY + /// parameters: FilterOpGraphNode + /// SVG filter semantics - selectable input(s), selectable between linear + /// (default) and sRGB color space for calculations + /// Spec: https://www.w3.org/TR/filter-effects-1/#feBlendElement + SVGFEBlendMultiply, + /// combine 2 images with SVG_FEBLEND_MODE_NORMAL + /// parameters: FilterOpGraphNode + /// SVG filter semantics - selectable input(s), selectable between linear + /// (default) and sRGB color space for calculations + /// Spec: https://www.w3.org/TR/filter-effects-1/#feBlendElement + SVGFEBlendNormal, + /// combine 2 images with SVG_FEBLEND_MODE_SCREEN + /// parameters: FilterOpGraphNode + /// SVG filter semantics - selectable input(s), selectable between linear + /// (default) and sRGB color space for calculations + /// Spec: https://www.w3.org/TR/filter-effects-1/#feBlendElement + SVGFEBlendScreen, + /// combine 2 images with SVG_FEBLEND_MODE_OVERLAY + /// parameters: FilterOpGraphNode + /// SVG filter semantics - selectable input(s), selectable between linear + /// (default) and sRGB color space for calculations + /// Source: https://developer.mozilla.org/en-US/docs/Web/CSS/mix-blend-mode + SVGFEBlendOverlay, + /// combine 2 images with SVG_FEBLEND_MODE_COLOR_DODGE + /// parameters: FilterOpGraphNode + /// SVG filter semantics - selectable input(s), selectable between linear + /// (default) and sRGB color space for calculations + /// Source: https://developer.mozilla.org/en-US/docs/Web/CSS/mix-blend-mode + SVGFEBlendColorDodge, + /// combine 2 images with SVG_FEBLEND_MODE_COLOR_BURN + /// parameters: FilterOpGraphNode + /// SVG filter semantics - selectable input(s), selectable between linear + /// (default) and sRGB color space for calculations + /// Source: https://developer.mozilla.org/en-US/docs/Web/CSS/mix-blend-mode + SVGFEBlendColorBurn, + /// combine 2 images with SVG_FEBLEND_MODE_HARD_LIGHT + /// parameters: FilterOpGraphNode + /// SVG filter semantics - selectable input(s), selectable between linear + /// (default) and sRGB color space for calculations + /// Source: https://developer.mozilla.org/en-US/docs/Web/CSS/mix-blend-mode + SVGFEBlendHardLight, + /// combine 2 images with SVG_FEBLEND_MODE_SOFT_LIGHT + /// parameters: FilterOpGraphNode + /// SVG filter semantics - selectable input(s), selectable between linear + /// (default) and sRGB color space for calculations + /// Source: https://developer.mozilla.org/en-US/docs/Web/CSS/mix-blend-mode + SVGFEBlendSoftLight, + /// combine 2 images with SVG_FEBLEND_MODE_DIFFERENCE + /// parameters: FilterOpGraphNode + /// SVG filter semantics - selectable input(s), selectable between linear + /// (default) and sRGB color space for calculations + /// Source: https://developer.mozilla.org/en-US/docs/Web/CSS/mix-blend-mode + SVGFEBlendDifference, + /// combine 2 images with SVG_FEBLEND_MODE_EXCLUSION + /// parameters: FilterOpGraphNode + /// SVG filter semantics - selectable input(s), selectable between linear + /// (default) and sRGB color space for calculations + /// Source: https://developer.mozilla.org/en-US/docs/Web/CSS/mix-blend-mode + SVGFEBlendExclusion, + /// combine 2 images with SVG_FEBLEND_MODE_HUE + /// parameters: FilterOpGraphNode + /// SVG filter semantics - selectable input(s), selectable between linear + /// (default) and sRGB color space for calculations + /// Source: https://developer.mozilla.org/en-US/docs/Web/CSS/mix-blend-mode + SVGFEBlendHue, + /// combine 2 images with SVG_FEBLEND_MODE_SATURATION + /// parameters: FilterOpGraphNode + /// SVG filter semantics - selectable input(s), selectable between linear + /// (default) and sRGB color space for calculations + /// Source: https://developer.mozilla.org/en-US/docs/Web/CSS/mix-blend-mode + SVGFEBlendSaturation, + /// combine 2 images with SVG_FEBLEND_MODE_COLOR + /// parameters: FilterOpGraphNode + /// SVG filter semantics - selectable input(s), selectable between linear + /// (default) and sRGB color space for calculations + /// Source: https://developer.mozilla.org/en-US/docs/Web/CSS/mix-blend-mode + SVGFEBlendColor, + /// combine 2 images with SVG_FEBLEND_MODE_LUMINOSITY + /// parameters: FilterOpGraphNode + /// SVG filter semantics - selectable input(s), selectable between linear + /// (default) and sRGB color space for calculations + /// Source: https://developer.mozilla.org/en-US/docs/Web/CSS/mix-blend-mode + SVGFEBlendLuminosity, + /// transform colors of image through 5x4 color matrix (transposed for + /// efficiency) + /// parameters: FilterOpGraphNode, matrix[5][4] + /// SVG filter semantics - selectable input(s), selectable between linear + /// (default) and sRGB color space for calculations + /// Spec: https://www.w3.org/TR/filter-effects-1/#feColorMatrixElement + SVGFEColorMatrix{values: [Au; 20]}, + /// transform colors of image through configurable gradients with component + /// swizzle + /// parameters: FilterOpGraphNode, FilterData + /// SVG filter semantics - selectable input(s), selectable between linear + /// (default) and sRGB color space for calculations + /// Spec: https://www.w3.org/TR/filter-effects-1/#feComponentTransferElement + SVGFEComponentTransferInterned{handle: ItemUid, creates_pixels: bool}, + /// composite 2 images with chosen composite mode with parameters for that + /// mode + /// parameters: FilterOpGraphNode, k1, k2, k3, k4 + /// SVG filter semantics - selectable input(s), selectable between linear + /// (default) and sRGB color space for calculations + /// Spec: https://www.w3.org/TR/filter-effects-1/#feCompositeElement + SVGFECompositeArithmetic{k1: Au, k2: Au, k3: Au, k4: Au}, + /// composite 2 images with chosen composite mode with parameters for that + /// mode + /// parameters: FilterOpGraphNode + /// SVG filter semantics - selectable input(s), selectable between linear + /// (default) and sRGB color space for calculations + /// Spec: https://www.w3.org/TR/filter-effects-1/#feCompositeElement + SVGFECompositeATop, + /// composite 2 images with chosen composite mode with parameters for that + /// mode + /// parameters: FilterOpGraphNode + /// SVG filter semantics - selectable input(s), selectable between linear + /// (default) and sRGB color space for calculations + /// Spec: https://www.w3.org/TR/filter-effects-1/#feCompositeElement + SVGFECompositeIn, + /// composite 2 images with chosen composite mode with parameters for that + /// mode + /// parameters: FilterOpGraphNode + /// SVG filter semantics - selectable input(s), selectable between linear + /// (default) and sRGB color space for calculations + /// Docs: https://developer.mozilla.org/en-US/docs/Web/SVG/Element/feComposite + SVGFECompositeLighter, + /// composite 2 images with chosen composite mode with parameters for that + /// mode + /// parameters: FilterOpGraphNode + /// SVG filter semantics - selectable input(s), selectable between linear + /// (default) and sRGB color space for calculations + /// Spec: https://www.w3.org/TR/filter-effects-1/#feCompositeElement + SVGFECompositeOut, + /// composite 2 images with chosen composite mode with parameters for that + /// mode + /// parameters: FilterOpGraphNode + /// SVG filter semantics - selectable input(s), selectable between linear + /// (default) and sRGB color space for calculations + /// Spec: https://www.w3.org/TR/filter-effects-1/#feCompositeElement + SVGFECompositeOver, + /// composite 2 images with chosen composite mode with parameters for that + /// mode + /// parameters: FilterOpGraphNode + /// SVG filter semantics - selectable input(s), selectable between linear + /// (default) and sRGB color space for calculations + /// Spec: https://www.w3.org/TR/filter-effects-1/#feCompositeElement + SVGFECompositeXOR, + /// transform image through convolution matrix of up to 25 values (spec + /// allows more but for performance reasons we do not) + /// parameters: FilterOpGraphNode, orderX, orderY, kernelValues[25], + /// divisor, bias, targetX, targetY, kernelUnitLengthX, kernelUnitLengthY, + /// preserveAlpha + /// SVG filter semantics - selectable input(s), selectable between linear + /// (default) and sRGB color space for calculations + /// Spec: https://www.w3.org/TR/filter-effects-1/#feConvolveMatrixElement + SVGFEConvolveMatrixEdgeModeDuplicate{order_x: i32, order_y: i32, + kernel: [Au; SVGFE_CONVOLVE_VALUES_LIMIT], divisor: Au, bias: Au, + target_x: i32, target_y: i32, kernel_unit_length_x: Au, + kernel_unit_length_y: Au, preserve_alpha: i32}, + /// transform image through convolution matrix of up to 25 values (spec + /// allows more but for performance reasons we do not) + /// parameters: FilterOpGraphNode, orderX, orderY, kernelValues[25], + /// divisor, bias, targetX, targetY, kernelUnitLengthX, kernelUnitLengthY, + /// preserveAlpha + /// SVG filter semantics - selectable input(s), selectable between linear + /// (default) and sRGB color space for calculations + /// Spec: https://www.w3.org/TR/filter-effects-1/#feConvolveMatrixElement + SVGFEConvolveMatrixEdgeModeNone{order_x: i32, order_y: i32, + kernel: [Au; SVGFE_CONVOLVE_VALUES_LIMIT], divisor: Au, bias: Au, + target_x: i32, target_y: i32, kernel_unit_length_x: Au, + kernel_unit_length_y: Au, preserve_alpha: i32}, + /// transform image through convolution matrix of up to 25 values (spec + /// allows more but for performance reasons we do not) + /// parameters: FilterOpGraphNode, orderX, orderY, kernelValues[25], + /// divisor, bias, targetX, targetY, kernelUnitLengthX, kernelUnitLengthY, + /// preserveAlpha + /// SVG filter semantics - selectable input(s), selectable between linear + /// (default) and sRGB color space for calculations + /// Spec: https://www.w3.org/TR/filter-effects-1/#feConvolveMatrixElement + SVGFEConvolveMatrixEdgeModeWrap{order_x: i32, order_y: i32, + kernel: [Au; SVGFE_CONVOLVE_VALUES_LIMIT], divisor: Au, bias: Au, + target_x: i32, target_y: i32, kernel_unit_length_x: Au, + kernel_unit_length_y: Au, preserve_alpha: i32}, + /// calculate lighting based on heightmap image with provided values for a + /// distant light source with specified direction + /// parameters: FilterOpGraphNode, surfaceScale, diffuseConstant, + /// kernelUnitLengthX, kernelUnitLengthY, azimuth, elevation + /// SVG filter semantics - selectable input(s), selectable between linear + /// (default) and sRGB color space for calculations + /// Spec: https://www.w3.org/TR/filter-effects-1/#InterfaceSVGFEDiffuseLightingElement + /// https://www.w3.org/TR/filter-effects-1/#InterfaceSVGFEDistantLightElement + SVGFEDiffuseLightingDistant{surface_scale: Au, diffuse_constant: Au, + kernel_unit_length_x: Au, kernel_unit_length_y: Au, azimuth: Au, + elevation: Au}, + /// calculate lighting based on heightmap image with provided values for a + /// point light source at specified location + /// parameters: FilterOpGraphNode, surfaceScale, diffuseConstant, + /// kernelUnitLengthX, kernelUnitLengthY, x, y, z + /// SVG filter semantics - selectable input(s), selectable between linear + /// (default) and sRGB color space for calculations + /// Spec: https://www.w3.org/TR/filter-effects-1/#InterfaceSVGFEDiffuseLightingElement + /// https://www.w3.org/TR/filter-effects-1/#InterfaceSVGFEPointLightElement + SVGFEDiffuseLightingPoint{surface_scale: Au, diffuse_constant: Au, + kernel_unit_length_x: Au, kernel_unit_length_y: Au, x: Au, y: Au, + z: Au}, + /// calculate lighting based on heightmap image with provided values for a + /// spot light source at specified location pointing at specified target + /// location with specified hotspot sharpness and cone angle + /// parameters: FilterOpGraphNode, surfaceScale, diffuseConstant, + /// kernelUnitLengthX, kernelUnitLengthY, x, y, z, pointsAtX, pointsAtY, + /// pointsAtZ, specularExponent, limitingConeAngle + /// SVG filter semantics - selectable input(s), selectable between linear + /// (default) and sRGB color space for calculations + /// Spec: https://www.w3.org/TR/filter-effects-1/#InterfaceSVGFEDiffuseLightingElement + /// https://www.w3.org/TR/filter-effects-1/#InterfaceSVGFESpotLightElement + SVGFEDiffuseLightingSpot{surface_scale: Au, diffuse_constant: Au, + kernel_unit_length_x: Au, kernel_unit_length_y: Au, x: Au, y: Au, z: Au, + points_at_x: Au, points_at_y: Au, points_at_z: Au, cone_exponent: Au, + limiting_cone_angle: Au}, + /// calculate a distorted version of first input image using offset values + /// from second input image at specified intensity + /// parameters: FilterOpGraphNode, scale, xChannelSelector, yChannelSelector + /// SVG filter semantics - selectable input(s), selectable between linear + /// (default) and sRGB color space for calculations + /// Spec: https://www.w3.org/TR/filter-effects-1/#InterfaceSVGFEDisplacementMapElement + SVGFEDisplacementMap{scale: Au, x_channel_selector: u32, + y_channel_selector: u32}, + /// create and merge a dropshadow version of the specified image's alpha + /// channel with specified offset and blur radius + /// parameters: FilterOpGraphNode, flood_color, flood_opacity, dx, dy, + /// stdDeviationX, stdDeviationY + /// SVG filter semantics - selectable input(s), selectable between linear + /// (default) and sRGB color space for calculations + /// Spec: https://www.w3.org/TR/filter-effects-1/#InterfaceSVGFEDropShadowElement + SVGFEDropShadow{color: ColorU, dx: Au, dy: Au, std_deviation_x: Au, + std_deviation_y: Au}, + /// synthesize a new image of specified size containing a solid color + /// parameters: FilterOpGraphNode, color + /// SVG filter semantics - selectable input(s), selectable between linear + /// (default) and sRGB color space for calculations + /// Spec: https://www.w3.org/TR/filter-effects-1/#InterfaceSVGFEFloodElement + SVGFEFlood{color: ColorU}, + /// create a blurred version of the input image + /// parameters: FilterOpGraphNode, stdDeviationX, stdDeviationY + /// SVG filter semantics - selectable input(s), selectable between linear + /// (default) and sRGB color space for calculations + /// Spec: https://www.w3.org/TR/filter-effects-1/#InterfaceSVGFEGaussianBlurElement + SVGFEGaussianBlur{std_deviation_x: Au, std_deviation_y: Au}, + /// Filter that does no transformation of the colors, needed for + /// debug purposes, and is the default value in impl_default_for_enums. + SVGFEIdentity, + /// synthesize a new image based on a url (i.e. blob image source) + /// parameters: FilterOpGraphNode, sampling_filter (see SamplingFilter in + /// Types.h), transform + /// SVG filter semantics - selectable input(s), selectable between linear + /// (default) and sRGB color space for calculations + /// Spec: https://www.w3.org/TR/filter-effects-1/#InterfaceSVGFEImageElement + SVGFEImage{sampling_filter: u32, matrix: [Au; 6]}, + /// create a new image based on the input image with the contour stretched + /// outward (dilate operator) + /// parameters: FilterOpGraphNode, radiusX, radiusY + /// SVG filter semantics - selectable input(s), selectable between linear + /// (default) and sRGB color space for calculations + /// Spec: https://www.w3.org/TR/filter-effects-1/#InterfaceSVGFEMorphologyElement + SVGFEMorphologyDilate{radius_x: Au, radius_y: Au}, + /// create a new image based on the input image with the contour shrunken + /// inward (erode operator) + /// parameters: FilterOpGraphNode, radiusX, radiusY + /// SVG filter semantics - selectable input(s), selectable between linear + /// (default) and sRGB color space for calculations + /// Spec: https://www.w3.org/TR/filter-effects-1/#InterfaceSVGFEMorphologyElement + SVGFEMorphologyErode{radius_x: Au, radius_y: Au}, + /// represents CSS opacity property as a graph node like the rest of the + /// SVGFE* filters + /// parameters: FilterOpGraphNode + /// SVG filter semantics - selectable input(s), selectable between linear + /// (default) and sRGB color space for calculations + SVGFEOpacity{value: Au}, + /// represents CSS opacity property as a graph node like the rest of the + /// SVGFE* filters + /// parameters: FilterOpGraphNode + /// SVG filter semantics - selectable input(s), selectable between linear + /// (default) and sRGB color space for calculations + SVGFEOpacityBinding{valuebindingid: PropertyBindingId, value: Au}, + /// Filter that copies the SourceGraphic image into the specified subregion, + /// This is intentionally the only way to get SourceGraphic into the graph, + /// as the filter region must be applied before it is used. + /// parameters: FilterOpGraphNode + /// SVG filter semantics - no inputs, no linear + SVGFESourceGraphic, + /// Filter that copies the SourceAlpha image into the specified subregion, + /// This is intentionally the only way to get SourceAlpha into the graph, + /// as the filter region must be applied before it is used. + /// parameters: FilterOpGraphNode + /// SVG filter semantics - no inputs, no linear + SVGFESourceAlpha, + /// calculate lighting based on heightmap image with provided values for a + /// distant light source with specified direction + /// parameters: FilerData, surfaceScale, specularConstant, specularExponent, + /// kernelUnitLengthX, kernelUnitLengthY, azimuth, elevation + /// SVG filter semantics - selectable input(s), selectable between linear + /// (default) and sRGB color space for calculations + /// Spec: https://www.w3.org/TR/filter-effects-1/#InterfaceSVGFESpecularLightingElement + /// https://www.w3.org/TR/filter-effects-1/#InterfaceSVGFEDistantLightElement + SVGFESpecularLightingDistant{surface_scale: Au, specular_constant: Au, + specular_exponent: Au, kernel_unit_length_x: Au, + kernel_unit_length_y: Au, azimuth: Au, elevation: Au}, + /// calculate lighting based on heightmap image with provided values for a + /// point light source at specified location + /// parameters: FilterOpGraphNode, surfaceScale, specularConstant, + /// specularExponent, kernelUnitLengthX, kernelUnitLengthY, x, y, z + /// SVG filter semantics - selectable input(s), selectable between linear + /// (default) and sRGB color space for calculations + /// Spec: https://www.w3.org/TR/filter-effects-1/#InterfaceSVGFESpecularLightingElement + /// https://www.w3.org/TR/filter-effects-1/#InterfaceSVGFEPointLightElement + SVGFESpecularLightingPoint{surface_scale: Au, specular_constant: Au, + specular_exponent: Au, kernel_unit_length_x: Au, + kernel_unit_length_y: Au, x: Au, y: Au, z: Au}, + /// calculate lighting based on heightmap image with provided values for a + /// spot light source at specified location pointing at specified target + /// location with specified hotspot sharpness and cone angle + /// parameters: FilterOpGraphNode, surfaceScale, specularConstant, + /// specularExponent, kernelUnitLengthX, kernelUnitLengthY, x, y, z, + /// pointsAtX, pointsAtY, pointsAtZ, specularExponent, limitingConeAngle + /// SVG filter semantics - selectable input(s), selectable between linear + /// (default) and sRGB color space for calculations + /// Spec: https://www.w3.org/TR/filter-effects-1/#InterfaceSVGFESpecularLightingElement + /// https://www.w3.org/TR/filter-effects-1/#InterfaceSVGFESpotLightElement + SVGFESpecularLightingSpot{surface_scale: Au, specular_constant: Au, + specular_exponent: Au, kernel_unit_length_x: Au, + kernel_unit_length_y: Au, x: Au, y: Au, z: Au, points_at_x: Au, + points_at_y: Au, points_at_z: Au, cone_exponent: Au, + limiting_cone_angle: Au}, + /// create a new image based on the input image, repeated throughout the + /// output rectangle + /// parameters: FilterOpGraphNode + /// SVG filter semantics - selectable input(s), selectable between linear + /// (default) and sRGB color space for calculations + /// Spec: https://www.w3.org/TR/filter-effects-1/#InterfaceSVGFETileElement + SVGFETile, + /// convert a color image to an alpha channel - internal use; generated by + /// SVGFilterInstance::GetOrCreateSourceAlphaIndex(). + SVGFEToAlpha, + /// synthesize a new image based on Fractal Noise (Perlin) with the chosen + /// stitching mode + /// parameters: FilterOpGraphNode, baseFrequencyX, baseFrequencyY, + /// numOctaves, seed + /// SVG filter semantics - selectable input(s), selectable between linear + /// (default) and sRGB color space for calculations + /// Spec: https://www.w3.org/TR/filter-effects-1/#InterfaceSVGFETurbulenceElement + SVGFETurbulenceWithFractalNoiseWithNoStitching{base_frequency_x: Au, + base_frequency_y: Au, num_octaves: u32, seed: u32}, + /// synthesize a new image based on Fractal Noise (Perlin) with the chosen + /// stitching mode + /// parameters: FilterOpGraphNode, baseFrequencyX, baseFrequencyY, + /// numOctaves, seed + /// SVG filter semantics - selectable input(s), selectable between linear + /// (default) and sRGB color space for calculations + /// Spec: https://www.w3.org/TR/filter-effects-1/#InterfaceSVGFETurbulenceElement + SVGFETurbulenceWithFractalNoiseWithStitching{base_frequency_x: Au, + base_frequency_y: Au, num_octaves: u32, seed: u32}, + /// synthesize a new image based on Turbulence Noise (offset vectors) + /// parameters: FilterOpGraphNode, baseFrequencyX, baseFrequencyY, + /// numOctaves, seed + /// SVG filter semantics - selectable input(s), selectable between linear + /// (default) and sRGB color space for calculations + /// Spec: https://www.w3.org/TR/filter-effects-1/#InterfaceSVGFETurbulenceElement + SVGFETurbulenceWithTurbulenceNoiseWithNoStitching{base_frequency_x: Au, + base_frequency_y: Au, num_octaves: u32, seed: u32}, + /// synthesize a new image based on Turbulence Noise (offset vectors) + /// parameters: FilterOpGraphNode, baseFrequencyX, baseFrequencyY, + /// numOctaves, seed + /// SVG filter semantics - selectable input(s), selectable between linear + /// (default) and sRGB color space for calculations + /// Spec: https://www.w3.org/TR/filter-effects-1/#InterfaceSVGFETurbulenceElement + SVGFETurbulenceWithTurbulenceNoiseWithStitching{base_frequency_x: Au, + base_frequency_y: Au, num_octaves: u32, seed: u32}, +} + +impl From<FilterGraphOp> for FilterGraphOpKey { + fn from(op: FilterGraphOp) -> Self { + match op { + FilterGraphOp::SVGFEBlendDarken => FilterGraphOpKey::SVGFEBlendDarken, + FilterGraphOp::SVGFEBlendLighten => FilterGraphOpKey::SVGFEBlendLighten, + FilterGraphOp::SVGFEBlendMultiply => FilterGraphOpKey::SVGFEBlendMultiply, + FilterGraphOp::SVGFEBlendNormal => FilterGraphOpKey::SVGFEBlendNormal, + FilterGraphOp::SVGFEBlendScreen => FilterGraphOpKey::SVGFEBlendScreen, + FilterGraphOp::SVGFEBlendOverlay => FilterGraphOpKey::SVGFEBlendOverlay, + FilterGraphOp::SVGFEBlendColorDodge => FilterGraphOpKey::SVGFEBlendColorDodge, + FilterGraphOp::SVGFEBlendColorBurn => FilterGraphOpKey::SVGFEBlendColorBurn, + FilterGraphOp::SVGFEBlendHardLight => FilterGraphOpKey::SVGFEBlendHardLight, + FilterGraphOp::SVGFEBlendSoftLight => FilterGraphOpKey::SVGFEBlendSoftLight, + FilterGraphOp::SVGFEBlendDifference => FilterGraphOpKey::SVGFEBlendDifference, + FilterGraphOp::SVGFEBlendExclusion => FilterGraphOpKey::SVGFEBlendExclusion, + FilterGraphOp::SVGFEBlendHue => FilterGraphOpKey::SVGFEBlendHue, + FilterGraphOp::SVGFEBlendSaturation => FilterGraphOpKey::SVGFEBlendSaturation, + FilterGraphOp::SVGFEBlendColor => FilterGraphOpKey::SVGFEBlendColor, + FilterGraphOp::SVGFEBlendLuminosity => FilterGraphOpKey::SVGFEBlendLuminosity, + FilterGraphOp::SVGFEColorMatrix { values: color_matrix } => { + let mut quantized_values: [Au; 20] = [Au(0); 20]; + for (value, result) in color_matrix.iter().zip(quantized_values.iter_mut()) { + *result = Au::from_f32_px(*value); + } + FilterGraphOpKey::SVGFEColorMatrix{values: quantized_values} + } + FilterGraphOp::SVGFEComponentTransfer => unreachable!(), + FilterGraphOp::SVGFEComponentTransferInterned { handle, creates_pixels } => FilterGraphOpKey::SVGFEComponentTransferInterned{ + handle: handle.uid(), + creates_pixels, + }, + FilterGraphOp::SVGFECompositeArithmetic { k1, k2, k3, k4 } => { + FilterGraphOpKey::SVGFECompositeArithmetic{ + k1: Au::from_f32_px(k1), + k2: Au::from_f32_px(k2), + k3: Au::from_f32_px(k3), + k4: Au::from_f32_px(k4), + } + } + FilterGraphOp::SVGFECompositeATop => FilterGraphOpKey::SVGFECompositeATop, + FilterGraphOp::SVGFECompositeIn => FilterGraphOpKey::SVGFECompositeIn, + FilterGraphOp::SVGFECompositeLighter => FilterGraphOpKey::SVGFECompositeLighter, + FilterGraphOp::SVGFECompositeOut => FilterGraphOpKey::SVGFECompositeOut, + FilterGraphOp::SVGFECompositeOver => FilterGraphOpKey::SVGFECompositeOver, + FilterGraphOp::SVGFECompositeXOR => FilterGraphOpKey::SVGFECompositeXOR, + FilterGraphOp::SVGFEConvolveMatrixEdgeModeDuplicate { order_x, order_y, kernel, divisor, bias, target_x, target_y, kernel_unit_length_x, kernel_unit_length_y, preserve_alpha } => { + let mut values: [Au; SVGFE_CONVOLVE_VALUES_LIMIT] = [Au(0); SVGFE_CONVOLVE_VALUES_LIMIT]; + for (value, result) in kernel.iter().zip(values.iter_mut()) { + *result = Au::from_f32_px(*value) + } + FilterGraphOpKey::SVGFEConvolveMatrixEdgeModeDuplicate{ + order_x, + order_y, + kernel: values, + divisor: Au::from_f32_px(divisor), + bias: Au::from_f32_px(bias), + target_x, + target_y, + kernel_unit_length_x: Au::from_f32_px(kernel_unit_length_x), + kernel_unit_length_y: Au::from_f32_px(kernel_unit_length_y), + preserve_alpha, + } + } + FilterGraphOp::SVGFEConvolveMatrixEdgeModeNone { order_x, order_y, kernel, divisor, bias, target_x, target_y, kernel_unit_length_x, kernel_unit_length_y, preserve_alpha } => { + let mut values: [Au; SVGFE_CONVOLVE_VALUES_LIMIT] = [Au(0); SVGFE_CONVOLVE_VALUES_LIMIT]; + for (value, result) in kernel.iter().zip(values.iter_mut()) { + *result = Au::from_f32_px(*value) + } + FilterGraphOpKey::SVGFEConvolveMatrixEdgeModeNone{ + order_x, + order_y, + kernel: values, + divisor: Au::from_f32_px(divisor), + bias: Au::from_f32_px(bias), + target_x, + target_y, + kernel_unit_length_x: Au::from_f32_px(kernel_unit_length_x), + kernel_unit_length_y: Au::from_f32_px(kernel_unit_length_y), + preserve_alpha, + } + } + FilterGraphOp::SVGFEConvolveMatrixEdgeModeWrap { order_x, order_y, kernel, divisor, bias, target_x, target_y, kernel_unit_length_x, kernel_unit_length_y, preserve_alpha } => { + let mut values: [Au; SVGFE_CONVOLVE_VALUES_LIMIT] = [Au(0); SVGFE_CONVOLVE_VALUES_LIMIT]; + for (value, result) in kernel.iter().zip(values.iter_mut()) { + *result = Au::from_f32_px(*value) + } + FilterGraphOpKey::SVGFEConvolveMatrixEdgeModeWrap{ + order_x, + order_y, + kernel: values, + divisor: Au::from_f32_px(divisor), + bias: Au::from_f32_px(bias), + target_x, + target_y, + kernel_unit_length_x: Au::from_f32_px(kernel_unit_length_x), + kernel_unit_length_y: Au::from_f32_px(kernel_unit_length_y), + preserve_alpha, + } + } + FilterGraphOp::SVGFEDiffuseLightingDistant { surface_scale, diffuse_constant, kernel_unit_length_x, kernel_unit_length_y, azimuth, elevation } => { + FilterGraphOpKey::SVGFEDiffuseLightingDistant{ + surface_scale: Au::from_f32_px(surface_scale), + diffuse_constant: Au::from_f32_px(diffuse_constant), + kernel_unit_length_x: Au::from_f32_px(kernel_unit_length_x), + kernel_unit_length_y: Au::from_f32_px(kernel_unit_length_y), + azimuth: Au::from_f32_px(azimuth), + elevation: Au::from_f32_px(elevation), + } + } + FilterGraphOp::SVGFEDiffuseLightingPoint { surface_scale, diffuse_constant, kernel_unit_length_x, kernel_unit_length_y, x, y, z } => { + FilterGraphOpKey::SVGFEDiffuseLightingPoint{ + surface_scale: Au::from_f32_px(surface_scale), + diffuse_constant: Au::from_f32_px(diffuse_constant), + kernel_unit_length_x: Au::from_f32_px(kernel_unit_length_x), + kernel_unit_length_y: Au::from_f32_px(kernel_unit_length_y), + x: Au::from_f32_px(x), + y: Au::from_f32_px(y), + z: Au::from_f32_px(z), + } + } + FilterGraphOp::SVGFEDiffuseLightingSpot { surface_scale, diffuse_constant, kernel_unit_length_x, kernel_unit_length_y, x, y, z, points_at_x, points_at_y, points_at_z, cone_exponent, limiting_cone_angle } => { + FilterGraphOpKey::SVGFEDiffuseLightingSpot{ + surface_scale: Au::from_f32_px(surface_scale), + diffuse_constant: Au::from_f32_px(diffuse_constant), + kernel_unit_length_x: Au::from_f32_px(kernel_unit_length_x), + kernel_unit_length_y: Au::from_f32_px(kernel_unit_length_y), + x: Au::from_f32_px(x), + y: Au::from_f32_px(y), + z: Au::from_f32_px(z), + points_at_x: Au::from_f32_px(points_at_x), + points_at_y: Au::from_f32_px(points_at_y), + points_at_z: Au::from_f32_px(points_at_z), + cone_exponent: Au::from_f32_px(cone_exponent), + limiting_cone_angle: Au::from_f32_px(limiting_cone_angle), + } + } + FilterGraphOp::SVGFEDisplacementMap { scale, x_channel_selector, y_channel_selector } => { + FilterGraphOpKey::SVGFEDisplacementMap{ + scale: Au::from_f32_px(scale), + x_channel_selector, + y_channel_selector, + } + } + FilterGraphOp::SVGFEDropShadow { color, dx, dy, std_deviation_x, std_deviation_y } => { + FilterGraphOpKey::SVGFEDropShadow{ + color: color.into(), + dx: Au::from_f32_px(dx), + dy: Au::from_f32_px(dy), + std_deviation_x: Au::from_f32_px(std_deviation_x), + std_deviation_y: Au::from_f32_px(std_deviation_y), + } + } + FilterGraphOp::SVGFEFlood { color } => FilterGraphOpKey::SVGFEFlood{color: color.into()}, + FilterGraphOp::SVGFEGaussianBlur { std_deviation_x, std_deviation_y } => { + FilterGraphOpKey::SVGFEGaussianBlur{ + std_deviation_x: Au::from_f32_px(std_deviation_x), + std_deviation_y: Au::from_f32_px(std_deviation_y), + } + } + FilterGraphOp::SVGFEIdentity => FilterGraphOpKey::SVGFEIdentity, + FilterGraphOp::SVGFEImage { sampling_filter, matrix } => { + let mut values: [Au; 6] = [Au(0); 6]; + for (value, result) in matrix.iter().zip(values.iter_mut()) { + *result = Au::from_f32_px(*value) + } + FilterGraphOpKey::SVGFEImage{ + sampling_filter, + matrix: values, + } + } + FilterGraphOp::SVGFEMorphologyDilate { radius_x, radius_y } => { + FilterGraphOpKey::SVGFEMorphologyDilate{ + radius_x: Au::from_f32_px(radius_x), + radius_y: Au::from_f32_px(radius_y), + } + } + FilterGraphOp::SVGFEMorphologyErode { radius_x, radius_y } => { + FilterGraphOpKey::SVGFEMorphologyErode{ + radius_x: Au::from_f32_px(radius_x), + radius_y: Au::from_f32_px(radius_y), + } + } + FilterGraphOp::SVGFEOpacity{valuebinding: binding, value: _} => { + match binding { + PropertyBinding::Value(value) => { + FilterGraphOpKey::SVGFEOpacity{value: Au::from_f32_px(value)} + } + PropertyBinding::Binding(key, default) => { + FilterGraphOpKey::SVGFEOpacityBinding{valuebindingid: key.id, value: Au::from_f32_px(default)} + } + } + } + FilterGraphOp::SVGFESourceAlpha => FilterGraphOpKey::SVGFESourceAlpha, + FilterGraphOp::SVGFESourceGraphic => FilterGraphOpKey::SVGFESourceGraphic, + FilterGraphOp::SVGFESpecularLightingDistant { surface_scale, specular_constant, specular_exponent, kernel_unit_length_x, kernel_unit_length_y, azimuth, elevation } => { + FilterGraphOpKey::SVGFESpecularLightingDistant{ + surface_scale: Au::from_f32_px(surface_scale), + specular_constant: Au::from_f32_px(specular_constant), + specular_exponent: Au::from_f32_px(specular_exponent), + kernel_unit_length_x: Au::from_f32_px(kernel_unit_length_x), + kernel_unit_length_y: Au::from_f32_px(kernel_unit_length_y), + azimuth: Au::from_f32_px(azimuth), + elevation: Au::from_f32_px(elevation), + } + } + FilterGraphOp::SVGFESpecularLightingPoint { surface_scale, specular_constant, specular_exponent, kernel_unit_length_x, kernel_unit_length_y, x, y, z } => { + FilterGraphOpKey::SVGFESpecularLightingPoint{ + surface_scale: Au::from_f32_px(surface_scale), + specular_constant: Au::from_f32_px(specular_constant), + specular_exponent: Au::from_f32_px(specular_exponent), + kernel_unit_length_x: Au::from_f32_px(kernel_unit_length_x), + kernel_unit_length_y: Au::from_f32_px(kernel_unit_length_y), + x: Au::from_f32_px(x), + y: Au::from_f32_px(y), + z: Au::from_f32_px(z), + } + } + FilterGraphOp::SVGFESpecularLightingSpot { surface_scale, specular_constant, specular_exponent, kernel_unit_length_x, kernel_unit_length_y, x, y, z, points_at_x, points_at_y, points_at_z, cone_exponent, limiting_cone_angle } => { + FilterGraphOpKey::SVGFESpecularLightingSpot{ + surface_scale: Au::from_f32_px(surface_scale), + specular_constant: Au::from_f32_px(specular_constant), + specular_exponent: Au::from_f32_px(specular_exponent), + kernel_unit_length_x: Au::from_f32_px(kernel_unit_length_x), + kernel_unit_length_y: Au::from_f32_px(kernel_unit_length_y), + x: Au::from_f32_px(x), + y: Au::from_f32_px(y), + z: Au::from_f32_px(z), + points_at_x: Au::from_f32_px(points_at_x), + points_at_y: Au::from_f32_px(points_at_y), + points_at_z: Au::from_f32_px(points_at_z), + cone_exponent: Au::from_f32_px(cone_exponent), + limiting_cone_angle: Au::from_f32_px(limiting_cone_angle), + } + } + FilterGraphOp::SVGFETile => FilterGraphOpKey::SVGFETile, + FilterGraphOp::SVGFEToAlpha => FilterGraphOpKey::SVGFEToAlpha, + FilterGraphOp::SVGFETurbulenceWithFractalNoiseWithNoStitching { base_frequency_x, base_frequency_y, num_octaves, seed } => { + FilterGraphOpKey::SVGFETurbulenceWithFractalNoiseWithNoStitching { + base_frequency_x: Au::from_f32_px(base_frequency_x), + base_frequency_y: Au::from_f32_px(base_frequency_y), + num_octaves, + seed, + } + } + FilterGraphOp::SVGFETurbulenceWithFractalNoiseWithStitching { base_frequency_x, base_frequency_y, num_octaves, seed } => { + FilterGraphOpKey::SVGFETurbulenceWithFractalNoiseWithStitching { + base_frequency_x: Au::from_f32_px(base_frequency_x), + base_frequency_y: Au::from_f32_px(base_frequency_y), + num_octaves, + seed, + } + } + FilterGraphOp::SVGFETurbulenceWithTurbulenceNoiseWithNoStitching { base_frequency_x, base_frequency_y, num_octaves, seed } => { + FilterGraphOpKey::SVGFETurbulenceWithTurbulenceNoiseWithNoStitching { + base_frequency_x: Au::from_f32_px(base_frequency_x), + base_frequency_y: Au::from_f32_px(base_frequency_y), + num_octaves, + seed, + } + } + FilterGraphOp::SVGFETurbulenceWithTurbulenceNoiseWithStitching { base_frequency_x, base_frequency_y, num_octaves, seed } => { + FilterGraphOpKey::SVGFETurbulenceWithTurbulenceNoiseWithStitching { + base_frequency_x: Au::from_f32_px(base_frequency_x), + base_frequency_y: Au::from_f32_px(base_frequency_y), + num_octaves, + seed, + } + } + } + } +} + +#[cfg_attr(feature = "capture", derive(Serialize))] +#[cfg_attr(feature = "replay", derive(Deserialize))] +#[derive(Debug, Clone, MallocSizeOf, PartialEq, Hash, Eq)] +pub struct FilterGraphNodeKey { + /// Indicates this graph node was marked as unnecessary by the DAG optimizer + /// (for example SVGFEOffset can often be folded into downstream nodes) + pub kept_by_optimizer: bool, + /// True if color_interpolation_filter == LinearRgb; shader will convert + /// sRGB texture pixel colors on load and convert back on store, for correct + /// interpolation + pub linear: bool, + /// virtualized picture input binding 1 (i.e. texture source), typically + /// this is used, but certain filters do not use it + pub inputs: Vec<FilterGraphPictureReferenceKey>, + /// rect this node will render into, in filter space, does not account for + /// inflate or device_pixel_scale + pub subregion: [Au; 4], +} + +impl From<FilterGraphNode> for FilterGraphNodeKey { + fn from(node: FilterGraphNode) -> Self { + FilterGraphNodeKey{ + kept_by_optimizer: node.kept_by_optimizer, + linear: node.linear, + inputs: node.inputs.into_iter().map(|node| {node.into()}).collect(), + subregion: [ + Au::from_f32_px(node.subregion.min.x), + Au::from_f32_px(node.subregion.min.y), + Au::from_f32_px(node.subregion.max.x), + Au::from_f32_px(node.subregion.max.y), + ], + } + } +} + #[derive(Clone, Copy, Debug)] #[cfg_attr(feature = "capture", derive(Serialize))] #[cfg_attr(feature = "replay", derive(Deserialize))]