Implement `globalAlpha` for canvas
This commit is contained in:
parent
0deb12b3a2
commit
6eab3fa2d8
|
@ -20,7 +20,8 @@ use pathfinder_geometry::basic::transform2d::Transform2DF32;
|
||||||
use pathfinder_geometry::color::ColorU;
|
use pathfinder_geometry::color::ColorU;
|
||||||
use pathfinder_geometry::outline::{Contour, Outline};
|
use pathfinder_geometry::outline::{Contour, Outline};
|
||||||
use pathfinder_geometry::stroke::OutlineStrokeToFill;
|
use pathfinder_geometry::stroke::OutlineStrokeToFill;
|
||||||
use pathfinder_renderer::scene::{Paint, PathObject, Scene};
|
use pathfinder_renderer::paint::Paint;
|
||||||
|
use pathfinder_renderer::scene::{PathObject, Scene};
|
||||||
use pathfinder_text::{SceneExt, TextRenderMode};
|
use pathfinder_text::{SceneExt, TextRenderMode};
|
||||||
use skribo::{FontCollection, FontFamily, TextStyle};
|
use skribo::{FontCollection, FontFamily, TextStyle};
|
||||||
use std::default::Default;
|
use std::default::Default;
|
||||||
|
@ -149,13 +150,18 @@ impl CanvasRenderingContext2D {
|
||||||
pub fn fill_path(&mut self, path: Path2D) {
|
pub fn fill_path(&mut self, path: Path2D) {
|
||||||
let mut outline = path.into_outline();
|
let mut outline = path.into_outline();
|
||||||
outline.transform(&self.current_state.transform);
|
outline.transform(&self.current_state.transform);
|
||||||
let paint_id = self.scene.push_paint(&self.current_state.fill_paint);
|
|
||||||
|
let paint = self.current_state.resolve_paint(self.current_state.fill_paint);
|
||||||
|
let paint_id = self.scene.push_paint(&paint);
|
||||||
|
|
||||||
self.scene.push_path(PathObject::new(outline, paint_id, String::new()))
|
self.scene.push_path(PathObject::new(outline, paint_id, String::new()))
|
||||||
}
|
}
|
||||||
|
|
||||||
#[inline]
|
#[inline]
|
||||||
pub fn stroke_path(&mut self, path: Path2D) {
|
pub fn stroke_path(&mut self, path: Path2D) {
|
||||||
let paint_id = self.scene.push_paint(&self.current_state.stroke_paint);
|
let paint = self.current_state.resolve_paint(self.current_state.stroke_paint);
|
||||||
|
let paint_id = self.scene.push_paint(&paint);
|
||||||
|
|
||||||
let stroke_width = f32::max(self.current_state.line_width, HAIRLINE_STROKE_WIDTH);
|
let stroke_width = f32::max(self.current_state.line_width, HAIRLINE_STROKE_WIDTH);
|
||||||
let mut stroke_to_fill = OutlineStrokeToFill::new(path.into_outline(), stroke_width);
|
let mut stroke_to_fill = OutlineStrokeToFill::new(path.into_outline(), stroke_width);
|
||||||
stroke_to_fill.offset();
|
stroke_to_fill.offset();
|
||||||
|
@ -180,6 +186,18 @@ impl CanvasRenderingContext2D {
|
||||||
self.current_state.transform = Transform2DF32::default();
|
self.current_state.transform = Transform2DF32::default();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Compositing
|
||||||
|
|
||||||
|
#[inline]
|
||||||
|
pub fn global_alpha(&self) -> f32 {
|
||||||
|
self.current_state.global_alpha
|
||||||
|
}
|
||||||
|
|
||||||
|
#[inline]
|
||||||
|
pub fn set_global_alpha(&mut self, new_global_alpha: f32) {
|
||||||
|
self.current_state.global_alpha = new_global_alpha;
|
||||||
|
}
|
||||||
|
|
||||||
// The canvas state
|
// The canvas state
|
||||||
|
|
||||||
#[inline]
|
#[inline]
|
||||||
|
@ -203,6 +221,7 @@ pub struct State {
|
||||||
fill_paint: Paint,
|
fill_paint: Paint,
|
||||||
stroke_paint: Paint,
|
stroke_paint: Paint,
|
||||||
line_width: f32,
|
line_width: f32,
|
||||||
|
global_alpha: f32,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl State {
|
impl State {
|
||||||
|
@ -214,8 +233,14 @@ impl State {
|
||||||
fill_paint: Paint { color: ColorU::black() },
|
fill_paint: Paint { color: ColorU::black() },
|
||||||
stroke_paint: Paint { color: ColorU::black() },
|
stroke_paint: Paint { color: ColorU::black() },
|
||||||
line_width: 1.0,
|
line_width: 1.0,
|
||||||
|
global_alpha: 1.0,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn resolve_paint(&self, mut paint: Paint) -> Paint {
|
||||||
|
paint.color.a = (paint.color.a as f32 * self.global_alpha).round() as u8;
|
||||||
|
paint
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Clone)]
|
#[derive(Clone)]
|
||||||
|
|
|
@ -131,6 +131,7 @@ impl MoireRenderer {
|
||||||
let mut canvas = CanvasRenderingContext2D::new(self.drawable_size.to_f32());
|
let mut canvas = CanvasRenderingContext2D::new(self.drawable_size.to_f32());
|
||||||
canvas.set_line_width(CIRCLE_THICKNESS * self.device_pixel_ratio);
|
canvas.set_line_width(CIRCLE_THICKNESS * self.device_pixel_ratio);
|
||||||
canvas.set_stroke_style(FillStyle::Color(foreground_color.to_u8()));
|
canvas.set_stroke_style(FillStyle::Color(foreground_color.to_u8()));
|
||||||
|
canvas.set_global_alpha(0.75);
|
||||||
|
|
||||||
// Draw circles.
|
// Draw circles.
|
||||||
self.draw_circles(&mut canvas, outer_center);
|
self.draw_circles(&mut canvas, outer_center);
|
||||||
|
|
|
@ -17,7 +17,8 @@ use pathfinder_geometry::basic::point::Point2DF32;
|
||||||
use pathfinder_geometry::basic::transform2d::Transform2DF32;
|
use pathfinder_geometry::basic::transform2d::Transform2DF32;
|
||||||
use pathfinder_geometry::outline::{Contour, Outline};
|
use pathfinder_geometry::outline::{Contour, Outline};
|
||||||
use pathfinder_geometry::stroke::OutlineStrokeToFill;
|
use pathfinder_geometry::stroke::OutlineStrokeToFill;
|
||||||
use pathfinder_renderer::scene::{PaintId, PathObject, Scene};
|
use pathfinder_renderer::paint::PaintId;
|
||||||
|
use pathfinder_renderer::scene::{PathObject, Scene};
|
||||||
use skribo::{FontCollection, Layout, TextStyle};
|
use skribo::{FontCollection, Layout, TextStyle};
|
||||||
use std::mem;
|
use std::mem;
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue