From b3aee558c38636e45d86ea89fc7993d6fbd9e56a Mon Sep 17 00:00:00 2001 From: Timon Date: Thu, 22 Jan 2026 19:07:32 +0000 Subject: [PATCH] Fix Export not preserving alpha --- desktop/src/render/state.rs | 7 ++----- desktop/wrapper/src/lib.rs | 2 -- node-graph/libraries/wgpu-executor/src/lib.rs | 6 +++--- node-graph/nodes/gstd/src/render_node.rs | 9 +++++---- 4 files changed, 10 insertions(+), 14 deletions(-) diff --git a/desktop/src/render/state.rs b/desktop/src/render/state.rs index 0933be079f..19b4b40247 100644 --- a/desktop/src/render/state.rs +++ b/desktop/src/render/state.rs @@ -1,7 +1,7 @@ use std::borrow::Cow; use crate::window::Window; -use crate::wrapper::{Color, TargetTexture, WgpuContext, WgpuExecutor}; +use crate::wrapper::{TargetTexture, WgpuContext, WgpuExecutor}; #[derive(derivative::Derivative)] #[derivative(Debug)] @@ -232,10 +232,7 @@ impl RenderState { return; }; let size = glam::UVec2::new(viewport_texture.width(), viewport_texture.height()); - let result = futures::executor::block_on( - self.executor - .render_vello_scene_to_target_texture(&scene, size, &Default::default(), Color::TRANSPARENT, &mut self.overlays_texture), - ); + let result = futures::executor::block_on(self.executor.render_vello_scene_to_target_texture(&scene, size, &Default::default(), None, &mut self.overlays_texture)); if let Err(e) = result { tracing::error!("Error rendering overlays: {:?}", e); return; diff --git a/desktop/wrapper/src/lib.rs b/desktop/wrapper/src/lib.rs index 7cc51281c3..2ef3bbb60c 100644 --- a/desktop/wrapper/src/lib.rs +++ b/desktop/wrapper/src/lib.rs @@ -3,8 +3,6 @@ use graphite_editor::application::{Editor, Environment, Host, Platform}; use graphite_editor::messages::prelude::{FrontendMessage, Message}; pub use graphite_editor::consts::FILE_EXTENSION; -// TODO: Remove usage of this reexport in desktop create and remove this line -pub use graphene_std::Color; pub use wgpu_executor::TargetTexture; pub use wgpu_executor::WgpuContext; diff --git a/node-graph/libraries/wgpu-executor/src/lib.rs b/node-graph/libraries/wgpu-executor/src/lib.rs index 3cbf47b92a..bdff32ee9f 100644 --- a/node-graph/libraries/wgpu-executor/src/lib.rs +++ b/node-graph/libraries/wgpu-executor/src/lib.rs @@ -112,12 +112,12 @@ unsafe impl StaticType for Surface { const VELLO_SURFACE_FORMAT: wgpu::TextureFormat = wgpu::TextureFormat::Rgba8Unorm; impl WgpuExecutor { - pub async fn render_vello_scene_to_texture(&self, scene: &Scene, size: UVec2, context: &RenderContext, background: Color) -> Result { + pub async fn render_vello_scene_to_texture(&self, scene: &Scene, size: UVec2, context: &RenderContext, background: Option) -> Result { let mut output = None; self.render_vello_scene_to_target_texture(scene, size, context, background, &mut output).await?; Ok(output.unwrap().texture) } - pub async fn render_vello_scene_to_target_texture(&self, scene: &Scene, size: UVec2, context: &RenderContext, background: Color, output: &mut Option) -> Result<()> { + pub async fn render_vello_scene_to_target_texture(&self, scene: &Scene, size: UVec2, context: &RenderContext, background: Option, output: &mut Option) -> Result<()> { // Initialize (lazily) if this is the first call if output.is_none() { *output = Some(TargetTexture::new(&self.context.device, size)); @@ -126,7 +126,7 @@ impl WgpuExecutor { if let Some(target_texture) = output.as_mut() { target_texture.ensure_size(&self.context.device, size); - let [r, g, b, a] = background.to_rgba8_srgb(); + let [r, g, b, a] = background.unwrap_or(Color::TRANSPARENT).to_rgba8_srgb(); let render_params = RenderParams { base_color: vello::peniko::Color::from_rgba8(r, g, b, a), width: size.x, diff --git a/node-graph/nodes/gstd/src/render_node.rs b/node-graph/nodes/gstd/src/render_node.rs index 6f09b8835c..29641085f4 100644 --- a/node-graph/nodes/gstd/src/render_node.rs +++ b/node-graph/nodes/gstd/src/render_node.rs @@ -189,10 +189,11 @@ async fn render<'a: 'n>(ctx: impl Ctx + ExtractFootprint + ExtractVarArgs, edito } } - let mut background = Color::from_rgb8_srgb(0x22, 0x22, 0x22); - if !contains_artboard && !render_params.hide_artboards { - background = Color::WHITE; - } + let background = if !render_params.for_export && !contains_artboard && !render_params.hide_artboards { + Some(Color::WHITE) + } else { + None + }; let texture = exec .render_vello_scene_to_texture(&scene, physical_resolution, context, background)