mirror of
https://github.com/servo/servo.git
synced 2025-08-06 06:00:15 +01:00
canvas: Fully stateless backend (#38214)
I think this simplifies canvas backends greatly. Before there were many (needless) hoops from abstract to concrete (backend) and back, now we can do most stuff on abstract types. Testing: Existing WPT tests Fixes: #38022 try run: https://github.com/sagudev/servo/actions/runs/16450978211 Signed-off-by: sagudev <16504129+sagudev@users.noreply.github.com>
This commit is contained in:
parent
86d8317460
commit
d39e701b46
6 changed files with 650 additions and 806 deletions
|
@ -3,55 +3,26 @@
|
|||
* file, You can obtain one at https://mozilla.org/MPL/2.0/. */
|
||||
|
||||
use canvas_traits::canvas::{
|
||||
CompositionOrBlending, FillOrStrokeStyle, LineCapStyle, LineJoinStyle, Path,
|
||||
CompositionOptions, FillOrStrokeStyle, LineOptions, Path, ShadowOptions,
|
||||
};
|
||||
use compositing_traits::SerializableImageData;
|
||||
use euclid::default::{Point2D, Rect, Size2D, Transform2D, Vector2D};
|
||||
use euclid::default::{Point2D, Rect, Size2D, Transform2D};
|
||||
use pixels::Snapshot;
|
||||
use style::color::AbsoluteColor;
|
||||
use webrender_api::ImageDescriptor;
|
||||
|
||||
use crate::canvas_data::{CanvasPaintState, Filter, TextRun};
|
||||
use crate::canvas_data::{Filter, TextRun};
|
||||
|
||||
pub(crate) trait Backend: Clone + Sized {
|
||||
type Pattern<'a>: PatternHelpers + Clone;
|
||||
type StrokeOptions: StrokeOptionsHelpers + Clone;
|
||||
type Color: Clone;
|
||||
type DrawOptions: DrawOptionsHelpers + Clone;
|
||||
type CompositionOp;
|
||||
type DrawTarget: GenericDrawTarget<Self>;
|
||||
type SourceSurface;
|
||||
type GradientStop;
|
||||
type GradientStops;
|
||||
|
||||
fn get_composition_op(&self, opts: &Self::DrawOptions) -> Self::CompositionOp;
|
||||
fn need_to_draw_shadow(&self, color: &Self::Color) -> bool;
|
||||
fn set_shadow_color(&mut self, color: AbsoluteColor, state: &mut CanvasPaintState<'_, Self>);
|
||||
fn set_fill_style(
|
||||
&mut self,
|
||||
style: FillOrStrokeStyle,
|
||||
state: &mut CanvasPaintState<'_, Self>,
|
||||
drawtarget: &Self::DrawTarget,
|
||||
);
|
||||
fn set_stroke_style(
|
||||
&mut self,
|
||||
style: FillOrStrokeStyle,
|
||||
state: &mut CanvasPaintState<'_, Self>,
|
||||
drawtarget: &Self::DrawTarget,
|
||||
);
|
||||
fn set_global_composition(
|
||||
&mut self,
|
||||
op: CompositionOrBlending,
|
||||
state: &mut CanvasPaintState<'_, Self>,
|
||||
);
|
||||
fn create_drawtarget(&self, size: Size2D<u64>) -> Self::DrawTarget;
|
||||
fn new_paint_state<'a>(&self) -> CanvasPaintState<'a, Self>;
|
||||
}
|
||||
|
||||
// This defines required methods for a DrawTarget (currently only implemented for raqote). The
|
||||
// prototypes are derived from the now-removed Azure backend's methods.
|
||||
pub(crate) trait GenericDrawTarget<B: Backend> {
|
||||
fn clear_rect(&mut self, rect: &Rect<f32>);
|
||||
fn clear_rect(&mut self, rect: &Rect<f32>, transform: Transform2D<f32>);
|
||||
fn copy_surface(
|
||||
&mut self,
|
||||
surface: B::SourceSurface,
|
||||
|
@ -66,72 +37,59 @@ pub(crate) trait GenericDrawTarget<B: Backend> {
|
|||
dest: Rect<f64>,
|
||||
source: Rect<f64>,
|
||||
filter: Filter,
|
||||
draw_options: &B::DrawOptions,
|
||||
composition_options: CompositionOptions,
|
||||
transform: Transform2D<f32>,
|
||||
);
|
||||
fn draw_surface_with_shadow(
|
||||
&self,
|
||||
surface: B::SourceSurface,
|
||||
dest: &Point2D<f32>,
|
||||
color: &B::Color,
|
||||
offset: &Vector2D<f32>,
|
||||
sigma: f32,
|
||||
operator: B::CompositionOp,
|
||||
shadow_options: ShadowOptions,
|
||||
composition_options: CompositionOptions,
|
||||
);
|
||||
fn fill(
|
||||
&mut self,
|
||||
path: &Path,
|
||||
style: FillOrStrokeStyle,
|
||||
composition_options: CompositionOptions,
|
||||
transform: Transform2D<f32>,
|
||||
);
|
||||
fn fill(&mut self, path: &Path, pattern: &B::Pattern<'_>, draw_options: &B::DrawOptions);
|
||||
fn fill_text(
|
||||
&mut self,
|
||||
text_runs: Vec<TextRun>,
|
||||
start: Point2D<f32>,
|
||||
pattern: &B::Pattern<'_>,
|
||||
draw_options: &B::DrawOptions,
|
||||
style: FillOrStrokeStyle,
|
||||
composition_options: CompositionOptions,
|
||||
transform: Transform2D<f32>,
|
||||
);
|
||||
fn fill_rect(
|
||||
&mut self,
|
||||
rect: &Rect<f32>,
|
||||
pattern: &B::Pattern<'_>,
|
||||
draw_options: &B::DrawOptions,
|
||||
style: FillOrStrokeStyle,
|
||||
composition_options: CompositionOptions,
|
||||
transform: Transform2D<f32>,
|
||||
);
|
||||
fn get_size(&self) -> Size2D<i32>;
|
||||
fn get_transform(&self) -> Transform2D<f32>;
|
||||
fn pop_clip(&mut self);
|
||||
fn push_clip(&mut self, path: &Path);
|
||||
fn push_clip(&mut self, path: &Path, transform: Transform2D<f32>);
|
||||
fn push_clip_rect(&mut self, rect: &Rect<i32>);
|
||||
fn set_transform(&mut self, matrix: &Transform2D<f32>);
|
||||
fn stroke(
|
||||
&mut self,
|
||||
path: &Path,
|
||||
pattern: &B::Pattern<'_>,
|
||||
stroke_options: &B::StrokeOptions,
|
||||
draw_options: &B::DrawOptions,
|
||||
style: FillOrStrokeStyle,
|
||||
line_options: LineOptions,
|
||||
composition_options: CompositionOptions,
|
||||
transform: Transform2D<f32>,
|
||||
);
|
||||
fn stroke_rect(
|
||||
&mut self,
|
||||
rect: &Rect<f32>,
|
||||
pattern: &B::Pattern<'_>,
|
||||
stroke_options: &B::StrokeOptions,
|
||||
draw_options: &B::DrawOptions,
|
||||
style: FillOrStrokeStyle,
|
||||
line_options: LineOptions,
|
||||
composition_options: CompositionOptions,
|
||||
transform: Transform2D<f32>,
|
||||
);
|
||||
fn surface(&self) -> B::SourceSurface;
|
||||
fn image_descriptor_and_serializable_data(&self) -> (ImageDescriptor, SerializableImageData);
|
||||
fn snapshot(&self) -> Snapshot;
|
||||
}
|
||||
|
||||
pub(crate) trait PatternHelpers {
|
||||
fn is_zero_size_gradient(&self) -> bool;
|
||||
fn x_bound(&self) -> Option<u32>;
|
||||
fn y_bound(&self) -> Option<u32>;
|
||||
}
|
||||
|
||||
pub(crate) trait StrokeOptionsHelpers {
|
||||
fn set_line_width(&mut self, _val: f32);
|
||||
fn set_miter_limit(&mut self, _val: f32);
|
||||
fn set_line_join(&mut self, val: LineJoinStyle);
|
||||
fn set_line_cap(&mut self, val: LineCapStyle);
|
||||
fn set_line_dash(&mut self, items: Vec<f32>);
|
||||
fn set_line_dash_offset(&mut self, offset: f32);
|
||||
}
|
||||
|
||||
pub(crate) trait DrawOptionsHelpers {
|
||||
fn set_alpha(&mut self, val: f32);
|
||||
fn is_clear(&self) -> bool;
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue