commit a5133cb167280d25f9a5c0e4efad8bbc9347af50
parent 8b0792e54c1ad81505b1a230bfe750407dc606f3
Author: Nicolas Silva <nical@fastmail.com>
Date: Mon, 15 Dec 2025 10:53:22 +0000
Bug 1998913 - Part 11 - Move PictureCompositeKey into picture_composite_mode.rs. r=gfx-reviewers,jnicol
Differential Revision: https://phabricator.services.mozilla.com/D276247
Diffstat:
3 files changed, 149 insertions(+), 153 deletions(-)
diff --git a/gfx/wr/webrender/src/picture_composite_mode.rs b/gfx/wr/webrender/src/picture_composite_mode.rs
@@ -2,13 +2,14 @@
* 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::{ColorF, SnapshotInfo};
+use api::{ColorF, ColorU, SnapshotInfo, PropertyBinding, PropertyBindingId};
use api::units::*;
use crate::prim_store::image::AdjustedImageSource;
use crate::{render_task_graph::RenderTaskGraphBuilder, renderer::GpuBufferBuilderF};
use crate::box_shadow::BLUR_SAMPLE_SCALE;
use crate::frame_builder::{FrameBuildingContext, FrameBuildingState};
use crate::gpu_types::{BlurEdgeMode, UvRectKind};
+use crate::intern::ItemUid;
use crate::render_backend::DataStores;
use crate::render_task_graph::RenderTaskId;
use crate::render_target::RenderTargetKind;
@@ -19,7 +20,7 @@ use crate::space::SpaceMapper;
use crate::spatial_tree::SpatialTree;
use crate::surface::{SurfaceDescriptor, SurfaceInfo, calculate_screen_uv};
use crate::surface::SurfaceIndex;
-use crate::svg_filter::get_coverage_source_svgfe;
+use crate::svg_filter::{get_coverage_source_svgfe, FilterGraphNodeKey, FilterGraphOpKey};
use crate::util::MaxRect;
use smallvec::SmallVec;
use crate::internal_types::Filter;
@@ -31,6 +32,7 @@ use crate::filterdata::FilterDataHandle;
use crate::tile_cache::SliceId;
use crate::svg_filter::{FilterGraphNode, FilterGraphOp, get_coverage_target_svgfe};
use crate::picture::BlitReason;
+use crate::prim_store::VectorKey;
#[cfg(feature = "capture")]
use serde::Serialize;
@@ -1009,3 +1011,142 @@ pub fn calculate_uv_rect_kind(
bottom_right,
}
}
+
+/// Represents a hashable description of how a picture primitive
+/// will be composited into its parent.
+#[cfg_attr(feature = "capture", derive(Serialize))]
+#[cfg_attr(feature = "replay", derive(Deserialize))]
+#[derive(Debug, Clone, MallocSizeOf, PartialEq, Hash, Eq)]
+pub enum PictureCompositeKey {
+ // No visual compositing effect
+ Identity,
+
+ // FilterOp
+ Blur(Au, Au, bool, BlurEdgeMode),
+ Brightness(Au),
+ Contrast(Au),
+ Grayscale(Au),
+ HueRotate(Au),
+ Invert(Au),
+ Opacity(Au),
+ OpacityBinding(PropertyBindingId, Au),
+ Saturate(Au),
+ Sepia(Au),
+ DropShadows(Vec<(VectorKey, Au, ColorU)>),
+ ColorMatrix([Au; 20]),
+ SrgbToLinear,
+ LinearToSrgb,
+ ComponentTransfer(ItemUid),
+ Flood(ColorU),
+ SVGFEGraph(Vec<(FilterGraphNodeKey, FilterGraphOpKey)>),
+
+ // MixBlendMode
+ Multiply,
+ Screen,
+ Overlay,
+ Darken,
+ Lighten,
+ ColorDodge,
+ ColorBurn,
+ HardLight,
+ SoftLight,
+ Difference,
+ Exclusion,
+ Hue,
+ Saturation,
+ Color,
+ Luminosity,
+ PlusLighter,
+}
+
+impl From<Option<PictureCompositeMode>> for PictureCompositeKey {
+ fn from(mode: Option<PictureCompositeMode>) -> Self {
+ match mode {
+ Some(PictureCompositeMode::MixBlend(mode)) => {
+ match mode {
+ MixBlendMode::Normal => PictureCompositeKey::Identity,
+ MixBlendMode::Multiply => PictureCompositeKey::Multiply,
+ MixBlendMode::Screen => PictureCompositeKey::Screen,
+ MixBlendMode::Overlay => PictureCompositeKey::Overlay,
+ MixBlendMode::Darken => PictureCompositeKey::Darken,
+ MixBlendMode::Lighten => PictureCompositeKey::Lighten,
+ MixBlendMode::ColorDodge => PictureCompositeKey::ColorDodge,
+ MixBlendMode::ColorBurn => PictureCompositeKey::ColorBurn,
+ MixBlendMode::HardLight => PictureCompositeKey::HardLight,
+ MixBlendMode::SoftLight => PictureCompositeKey::SoftLight,
+ MixBlendMode::Difference => PictureCompositeKey::Difference,
+ MixBlendMode::Exclusion => PictureCompositeKey::Exclusion,
+ MixBlendMode::Hue => PictureCompositeKey::Hue,
+ MixBlendMode::Saturation => PictureCompositeKey::Saturation,
+ MixBlendMode::Color => PictureCompositeKey::Color,
+ MixBlendMode::Luminosity => PictureCompositeKey::Luminosity,
+ MixBlendMode::PlusLighter => PictureCompositeKey::PlusLighter,
+ }
+ }
+ Some(PictureCompositeMode::Filter(op)) => {
+ match op {
+ Filter::Blur { width, height, should_inflate, edge_mode } => {
+ PictureCompositeKey::Blur(
+ Au::from_f32_px(width),
+ Au::from_f32_px(height),
+ should_inflate,
+ edge_mode,
+ )
+ }
+ Filter::Brightness(value) => PictureCompositeKey::Brightness(Au::from_f32_px(value)),
+ Filter::Contrast(value) => PictureCompositeKey::Contrast(Au::from_f32_px(value)),
+ Filter::Grayscale(value) => PictureCompositeKey::Grayscale(Au::from_f32_px(value)),
+ Filter::HueRotate(value) => PictureCompositeKey::HueRotate(Au::from_f32_px(value)),
+ Filter::Invert(value) => PictureCompositeKey::Invert(Au::from_f32_px(value)),
+ Filter::Saturate(value) => PictureCompositeKey::Saturate(Au::from_f32_px(value)),
+ Filter::Sepia(value) => PictureCompositeKey::Sepia(Au::from_f32_px(value)),
+ Filter::SrgbToLinear => PictureCompositeKey::SrgbToLinear,
+ Filter::LinearToSrgb => PictureCompositeKey::LinearToSrgb,
+ Filter::Identity => PictureCompositeKey::Identity,
+ Filter::DropShadows(ref shadows) => {
+ PictureCompositeKey::DropShadows(
+ shadows.iter().map(|shadow| {
+ (shadow.offset.into(), Au::from_f32_px(shadow.blur_radius), shadow.color.into())
+ }).collect()
+ )
+ }
+ Filter::Opacity(binding, _) => {
+ match binding {
+ PropertyBinding::Value(value) => {
+ PictureCompositeKey::Opacity(Au::from_f32_px(value))
+ }
+ PropertyBinding::Binding(key, default) => {
+ PictureCompositeKey::OpacityBinding(key.id, Au::from_f32_px(default))
+ }
+ }
+ }
+ Filter::ColorMatrix(values) => {
+ let mut quantized_values: [Au; 20] = [Au(0); 20];
+ for (value, result) in values.iter().zip(quantized_values.iter_mut()) {
+ *result = Au::from_f32_px(*value);
+ }
+ PictureCompositeKey::ColorMatrix(quantized_values)
+ }
+ Filter::ComponentTransfer => unreachable!(),
+ Filter::Flood(color) => PictureCompositeKey::Flood(color.into()),
+ Filter::SVGGraphNode(_node, _op) => unreachable!(),
+ }
+ }
+ Some(PictureCompositeMode::ComponentTransferFilter(handle)) => {
+ PictureCompositeKey::ComponentTransfer(handle.uid())
+ }
+ Some(PictureCompositeMode::SVGFEGraph(filter_nodes)) => {
+ PictureCompositeKey::SVGFEGraph(
+ filter_nodes.into_iter().map(|(node, op)| {
+ (node.into(), op.into())
+ }).collect())
+ }
+ Some(PictureCompositeMode::Blit(_)) |
+ Some(PictureCompositeMode::TileCache { .. }) |
+ Some(PictureCompositeMode::IntermediateSurface) |
+ None => {
+ PictureCompositeKey::Identity
+ }
+ }
+ }
+}
diff --git a/gfx/wr/webrender/src/prim_store/picture.rs b/gfx/wr/webrender/src/prim_store/picture.rs
@@ -2,162 +2,16 @@
* 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::{
- ColorU, MixBlendMode, PropertyBinding, PropertyBindingId,
- RasterSpace,
-};
-use api::units::Au;
+use api::RasterSpace;
use crate::scene_building::IsVisible;
-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::{FilterGraphNodeKey, FilterGraphOpKey};
-use crate::picture::PictureCompositeMode;
+use crate::internal_types::LayoutPrimitiveInfo;
+use crate::picture_composite_mode::PictureCompositeKey;
use crate::prim_store::{
- PrimitiveInstanceKind, PrimitiveStore, VectorKey,
+ PrimitiveInstanceKind, PrimitiveStore,
InternablePrimitive,
};
-/// Represents a hashable description of how a picture primitive
-/// will be composited into its parent.
-#[cfg_attr(feature = "capture", derive(Serialize))]
-#[cfg_attr(feature = "replay", derive(Deserialize))]
-#[derive(Debug, Clone, MallocSizeOf, PartialEq, Hash, Eq)]
-pub enum PictureCompositeKey {
- // No visual compositing effect
- Identity,
-
- // FilterOp
- Blur(Au, Au, bool, BlurEdgeMode),
- Brightness(Au),
- Contrast(Au),
- Grayscale(Au),
- HueRotate(Au),
- Invert(Au),
- Opacity(Au),
- OpacityBinding(PropertyBindingId, Au),
- Saturate(Au),
- Sepia(Au),
- DropShadows(Vec<(VectorKey, Au, ColorU)>),
- ColorMatrix([Au; 20]),
- SrgbToLinear,
- LinearToSrgb,
- ComponentTransfer(ItemUid),
- Flood(ColorU),
- SVGFEGraph(Vec<(FilterGraphNodeKey, FilterGraphOpKey)>),
-
- // MixBlendMode
- Multiply,
- Screen,
- Overlay,
- Darken,
- Lighten,
- ColorDodge,
- ColorBurn,
- HardLight,
- SoftLight,
- Difference,
- Exclusion,
- Hue,
- Saturation,
- Color,
- Luminosity,
- PlusLighter,
-}
-
-impl From<Option<PictureCompositeMode>> for PictureCompositeKey {
- fn from(mode: Option<PictureCompositeMode>) -> Self {
- match mode {
- Some(PictureCompositeMode::MixBlend(mode)) => {
- match mode {
- MixBlendMode::Normal => PictureCompositeKey::Identity,
- MixBlendMode::Multiply => PictureCompositeKey::Multiply,
- MixBlendMode::Screen => PictureCompositeKey::Screen,
- MixBlendMode::Overlay => PictureCompositeKey::Overlay,
- MixBlendMode::Darken => PictureCompositeKey::Darken,
- MixBlendMode::Lighten => PictureCompositeKey::Lighten,
- MixBlendMode::ColorDodge => PictureCompositeKey::ColorDodge,
- MixBlendMode::ColorBurn => PictureCompositeKey::ColorBurn,
- MixBlendMode::HardLight => PictureCompositeKey::HardLight,
- MixBlendMode::SoftLight => PictureCompositeKey::SoftLight,
- MixBlendMode::Difference => PictureCompositeKey::Difference,
- MixBlendMode::Exclusion => PictureCompositeKey::Exclusion,
- MixBlendMode::Hue => PictureCompositeKey::Hue,
- MixBlendMode::Saturation => PictureCompositeKey::Saturation,
- MixBlendMode::Color => PictureCompositeKey::Color,
- MixBlendMode::Luminosity => PictureCompositeKey::Luminosity,
- MixBlendMode::PlusLighter => PictureCompositeKey::PlusLighter,
- }
- }
- Some(PictureCompositeMode::Filter(op)) => {
- match op {
- Filter::Blur { width, height, should_inflate, edge_mode } => {
- PictureCompositeKey::Blur(
- Au::from_f32_px(width),
- Au::from_f32_px(height),
- should_inflate,
- edge_mode,
- )
- }
- Filter::Brightness(value) => PictureCompositeKey::Brightness(Au::from_f32_px(value)),
- Filter::Contrast(value) => PictureCompositeKey::Contrast(Au::from_f32_px(value)),
- Filter::Grayscale(value) => PictureCompositeKey::Grayscale(Au::from_f32_px(value)),
- Filter::HueRotate(value) => PictureCompositeKey::HueRotate(Au::from_f32_px(value)),
- Filter::Invert(value) => PictureCompositeKey::Invert(Au::from_f32_px(value)),
- Filter::Saturate(value) => PictureCompositeKey::Saturate(Au::from_f32_px(value)),
- Filter::Sepia(value) => PictureCompositeKey::Sepia(Au::from_f32_px(value)),
- Filter::SrgbToLinear => PictureCompositeKey::SrgbToLinear,
- Filter::LinearToSrgb => PictureCompositeKey::LinearToSrgb,
- Filter::Identity => PictureCompositeKey::Identity,
- Filter::DropShadows(ref shadows) => {
- PictureCompositeKey::DropShadows(
- shadows.iter().map(|shadow| {
- (shadow.offset.into(), Au::from_f32_px(shadow.blur_radius), shadow.color.into())
- }).collect()
- )
- }
- Filter::Opacity(binding, _) => {
- match binding {
- PropertyBinding::Value(value) => {
- PictureCompositeKey::Opacity(Au::from_f32_px(value))
- }
- PropertyBinding::Binding(key, default) => {
- PictureCompositeKey::OpacityBinding(key.id, Au::from_f32_px(default))
- }
- }
- }
- Filter::ColorMatrix(values) => {
- let mut quantized_values: [Au; 20] = [Au(0); 20];
- for (value, result) in values.iter().zip(quantized_values.iter_mut()) {
- *result = Au::from_f32_px(*value);
- }
- PictureCompositeKey::ColorMatrix(quantized_values)
- }
- Filter::ComponentTransfer => unreachable!(),
- Filter::Flood(color) => PictureCompositeKey::Flood(color.into()),
- Filter::SVGGraphNode(_node, _op) => unreachable!(),
- }
- }
- Some(PictureCompositeMode::ComponentTransferFilter(handle)) => {
- PictureCompositeKey::ComponentTransfer(handle.uid())
- }
- Some(PictureCompositeMode::SVGFEGraph(filter_nodes)) => {
- PictureCompositeKey::SVGFEGraph(
- filter_nodes.into_iter().map(|(node, op)| {
- (node.into(), op.into())
- }).collect())
- }
- Some(PictureCompositeMode::Blit(_)) |
- Some(PictureCompositeMode::TileCache { .. }) |
- Some(PictureCompositeMode::IntermediateSurface) |
- None => {
- PictureCompositeKey::Identity
- }
- }
- }
-}
-
#[cfg_attr(feature = "capture", derive(Serialize))]
#[cfg_attr(feature = "replay", derive(Deserialize))]
#[derive(Debug, Clone, Eq, MallocSizeOf, PartialEq, Hash)]
diff --git a/gfx/wr/webrender/src/scene_building.rs b/gfx/wr/webrender/src/scene_building.rs
@@ -78,7 +78,8 @@ use crate::prim_store::gradient::{
};
use crate::prim_store::image::{Image, YuvImage};
use crate::prim_store::line_dec::{LineDecoration, LineDecorationCacheKey, get_line_decoration_size};
-use crate::prim_store::picture::{Picture, PictureCompositeKey, PictureKey};
+use crate::prim_store::picture::{Picture, PictureKey};
+use crate::picture_composite_mode::PictureCompositeKey;
use crate::prim_store::text_run::TextRun;
use crate::render_backend::SceneView;
use crate::resource_cache::ImageRequest;