mirror of
https://github.com/GraphiteEditor/Graphite.git
synced 2025-08-31 10:17:21 +00:00
Fix blend modes and opacity on raster data (#1996)
* Apply alpha blending to images when using vello * Fix bounds for image layer * Fix rendering for non vello images
This commit is contained in:
parent
768ca0c535
commit
32da545a49
3 changed files with 26 additions and 8 deletions
|
@ -1,6 +1,7 @@
|
||||||
use crate::text::FontCache;
|
use crate::text::FontCache;
|
||||||
use crate::transform::{Footprint, Transform, TransformMut};
|
use crate::transform::{Footprint, Transform, TransformMut};
|
||||||
use crate::vector::style::ViewMode;
|
use crate::vector::style::ViewMode;
|
||||||
|
use crate::AlphaBlending;
|
||||||
|
|
||||||
use dyn_any::{DynAny, StaticType, StaticTypeSized};
|
use dyn_any::{DynAny, StaticType, StaticTypeSized};
|
||||||
|
|
||||||
|
@ -70,6 +71,7 @@ pub struct TextureFrame {
|
||||||
#[cfg(not(feature = "wgpu"))]
|
#[cfg(not(feature = "wgpu"))]
|
||||||
pub texture: (),
|
pub texture: (),
|
||||||
pub transform: DAffine2,
|
pub transform: DAffine2,
|
||||||
|
pub alpha_blend: AlphaBlending,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Hash for TextureFrame {
|
impl Hash for TextureFrame {
|
||||||
|
|
|
@ -762,6 +762,9 @@ impl GraphicElementRendered for ImageFrame<Color> {
|
||||||
if !matrix.is_empty() {
|
if !matrix.is_empty() {
|
||||||
attributes.push("transform", matrix);
|
attributes.push("transform", matrix);
|
||||||
}
|
}
|
||||||
|
if self.alpha_blending.opacity < 1. {
|
||||||
|
attributes.push("opacity", self.alpha_blending.opacity.to_string());
|
||||||
|
}
|
||||||
if self.alpha_blending.blend_mode != BlendMode::default() {
|
if self.alpha_blending.blend_mode != BlendMode::default() {
|
||||||
attributes.push("style", self.alpha_blending.blend_mode.render());
|
attributes.push("style", self.alpha_blending.blend_mode.render());
|
||||||
}
|
}
|
||||||
|
@ -840,6 +843,9 @@ impl GraphicElementRendered for Raster {
|
||||||
if !matrix.is_empty() {
|
if !matrix.is_empty() {
|
||||||
attributes.push("transform", matrix);
|
attributes.push("transform", matrix);
|
||||||
}
|
}
|
||||||
|
if blending.opacity < 1. {
|
||||||
|
attributes.push("opacity", blending.opacity.to_string());
|
||||||
|
}
|
||||||
if blending.blend_mode != BlendMode::default() {
|
if blending.blend_mode != BlendMode::default() {
|
||||||
attributes.push("style", blending.blend_mode.render());
|
attributes.push("style", blending.blend_mode.render());
|
||||||
}
|
}
|
||||||
|
@ -870,7 +876,7 @@ impl GraphicElementRendered for Raster {
|
||||||
fn render_to_vello(&self, scene: &mut Scene, transform: DAffine2, context: &mut RenderContext) {
|
fn render_to_vello(&self, scene: &mut Scene, transform: DAffine2, context: &mut RenderContext) {
|
||||||
use vello::peniko;
|
use vello::peniko;
|
||||||
|
|
||||||
match self {
|
let (image, blend_mode) = match self {
|
||||||
Raster::ImageFrame(image_frame) => {
|
Raster::ImageFrame(image_frame) => {
|
||||||
let image = &image_frame.image;
|
let image = &image_frame.image;
|
||||||
if image.data.is_empty() {
|
if image.data.is_empty() {
|
||||||
|
@ -883,9 +889,7 @@ impl GraphicElementRendered for Raster {
|
||||||
format: peniko::Format::Rgba8,
|
format: peniko::Format::Rgba8,
|
||||||
extend: peniko::Extend::Repeat,
|
extend: peniko::Extend::Repeat,
|
||||||
};
|
};
|
||||||
let transform = transform * self.transform() * DAffine2::from_scale(1. / DVec2::new(image.width as f64, image.height as f64));
|
(image, image_frame.alpha_blending)
|
||||||
|
|
||||||
scene.draw_image(&image, vello::kurbo::Affine::new(transform.to_cols_array()));
|
|
||||||
}
|
}
|
||||||
Raster::Texture(texture) => {
|
Raster::Texture(texture) => {
|
||||||
let image = vello::peniko::Image {
|
let image = vello::peniko::Image {
|
||||||
|
@ -897,12 +901,23 @@ impl GraphicElementRendered for Raster {
|
||||||
};
|
};
|
||||||
let id = image.data.id();
|
let id = image.data.id();
|
||||||
context.ressource_overrides.insert(id, texture.texture.clone());
|
context.ressource_overrides.insert(id, texture.texture.clone());
|
||||||
|
(image, texture.alpha_blend)
|
||||||
let transform = transform * self.transform() * DAffine2::from_scale(1. / DVec2::new(image.width as f64, image.height as f64));
|
|
||||||
|
|
||||||
scene.draw_image(&image, vello::kurbo::Affine::new(transform.to_cols_array()));
|
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
let image_transform = transform * self.transform() * DAffine2::from_scale(1. / DVec2::new(image.width as f64, image.height as f64));
|
||||||
|
let layer = blend_mode != Default::default();
|
||||||
|
|
||||||
|
let Some(bounds) = self.bounding_box(transform) else { return };
|
||||||
|
let blending = vello::peniko::BlendMode::new(blend_mode.blend_mode.into(), vello::peniko::Compose::SrcOver);
|
||||||
|
|
||||||
|
if layer {
|
||||||
|
let rect = vello::kurbo::Rect::new(bounds[0].x, bounds[0].y, bounds[1].x, bounds[1].y);
|
||||||
|
scene.push_layer(blending, blend_mode.opacity, kurbo::Affine::IDENTITY, &rect);
|
||||||
|
}
|
||||||
|
scene.draw_image(&image, vello::kurbo::Affine::new(image_transform.to_cols_array()));
|
||||||
|
if layer {
|
||||||
|
scene.pop_layer()
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -931,5 +931,6 @@ async fn upload_texture<'a: 'n>(_: (), input: ImageFrame<Color>, executor: &'a W
|
||||||
TextureFrame {
|
TextureFrame {
|
||||||
texture: texture.into(),
|
texture: texture.into(),
|
||||||
transform: input.transform,
|
transform: input.transform,
|
||||||
|
alpha_blend: Default::default(),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue