Skip to content

Commit 5c25935

Browse files
committed
Fix default empty images being 1x1 instead of 0x0 as they should be
1 parent 2074684 commit 5c25935

File tree

9 files changed

+41
-48
lines changed

9 files changed

+41
-48
lines changed

editor/src/messages/portfolio/document/node_graph/document_node_definitions.rs

Lines changed: 20 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -571,7 +571,7 @@ fn static_nodes() -> Vec<DocumentNodeDefinition> {
571571
.collect(),
572572
..Default::default()
573573
}),
574-
inputs: vec![NodeInput::value(TaggedValue::ImageFrame(ImageFrameTable::default()), true)],
574+
inputs: vec![NodeInput::value(TaggedValue::ImageFrame(ImageFrameTable::empty()), true)],
575575
..Default::default()
576576
},
577577
persistent_node_metadata: DocumentNodePersistentMetadata {
@@ -809,8 +809,8 @@ fn static_nodes() -> Vec<DocumentNodeDefinition> {
809809
document_node: DocumentNode {
810810
implementation: DocumentNodeImplementation::proto("graphene_std::raster::MaskImageNode"),
811811
inputs: vec![
812-
NodeInput::value(TaggedValue::ImageFrame(ImageFrameTable::default()), true),
813-
NodeInput::value(TaggedValue::ImageFrame(ImageFrameTable::default()), true),
812+
NodeInput::value(TaggedValue::ImageFrame(ImageFrameTable::empty()), true),
813+
NodeInput::value(TaggedValue::ImageFrame(ImageFrameTable::empty()), true),
814814
],
815815
..Default::default()
816816
},
@@ -832,8 +832,8 @@ fn static_nodes() -> Vec<DocumentNodeDefinition> {
832832
document_node: DocumentNode {
833833
implementation: DocumentNodeImplementation::proto("graphene_std::raster::InsertChannelNode"),
834834
inputs: vec![
835-
NodeInput::value(TaggedValue::ImageFrame(ImageFrameTable::default()), true),
836-
NodeInput::value(TaggedValue::ImageFrame(ImageFrameTable::default()), true),
835+
NodeInput::value(TaggedValue::ImageFrame(ImageFrameTable::empty()), true),
836+
NodeInput::value(TaggedValue::ImageFrame(ImageFrameTable::empty()), true),
837837
NodeInput::value(TaggedValue::RedGreenBlue(RedGreenBlue::default()), false),
838838
],
839839
..Default::default()
@@ -856,10 +856,10 @@ fn static_nodes() -> Vec<DocumentNodeDefinition> {
856856
implementation: DocumentNodeImplementation::proto("graphene_std::raster::CombineChannelsNode"),
857857
inputs: vec![
858858
NodeInput::value(TaggedValue::None, false),
859-
NodeInput::value(TaggedValue::ImageFrame(ImageFrameTable::default()), true),
860-
NodeInput::value(TaggedValue::ImageFrame(ImageFrameTable::default()), true),
861-
NodeInput::value(TaggedValue::ImageFrame(ImageFrameTable::default()), true),
862-
NodeInput::value(TaggedValue::ImageFrame(ImageFrameTable::default()), true),
859+
NodeInput::value(TaggedValue::ImageFrame(ImageFrameTable::empty()), true),
860+
NodeInput::value(TaggedValue::ImageFrame(ImageFrameTable::empty()), true),
861+
NodeInput::value(TaggedValue::ImageFrame(ImageFrameTable::empty()), true),
862+
NodeInput::value(TaggedValue::ImageFrame(ImageFrameTable::empty()), true),
863863
],
864864
..Default::default()
865865
},
@@ -929,7 +929,7 @@ fn static_nodes() -> Vec<DocumentNodeDefinition> {
929929

930930
..Default::default()
931931
}),
932-
inputs: vec![NodeInput::value(TaggedValue::ImageFrame(ImageFrameTable::default()), true)],
932+
inputs: vec![NodeInput::value(TaggedValue::ImageFrame(ImageFrameTable::empty()), true)],
933933
..Default::default()
934934
},
935935
persistent_node_metadata: DocumentNodePersistentMetadata {
@@ -1011,8 +1011,8 @@ fn static_nodes() -> Vec<DocumentNodeDefinition> {
10111011
..Default::default()
10121012
}),
10131013
inputs: vec![
1014-
NodeInput::value(TaggedValue::ImageFrame(ImageFrameTable::default()), true),
1015-
NodeInput::value(TaggedValue::ImageFrame(ImageFrameTable::default()), true),
1014+
NodeInput::value(TaggedValue::ImageFrame(ImageFrameTable::empty()), true),
1015+
NodeInput::value(TaggedValue::ImageFrame(ImageFrameTable::empty()), true),
10161016
NodeInput::value(TaggedValue::BrushStrokes(Vec::new()), false),
10171017
NodeInput::value(TaggedValue::BrushCache(BrushCache::new_proto()), false),
10181018
],
@@ -1061,7 +1061,7 @@ fn static_nodes() -> Vec<DocumentNodeDefinition> {
10611061
node_template: NodeTemplate {
10621062
document_node: DocumentNode {
10631063
implementation: DocumentNodeImplementation::proto("graphene_core::memo::MemoNode"),
1064-
inputs: vec![NodeInput::value(TaggedValue::ImageFrame(ImageFrameTable::default()), true)],
1064+
inputs: vec![NodeInput::value(TaggedValue::ImageFrame(ImageFrameTable::empty()), true)],
10651065
manual_composition: Some(concrete!(Context)),
10661066
..Default::default()
10671067
},
@@ -1080,7 +1080,7 @@ fn static_nodes() -> Vec<DocumentNodeDefinition> {
10801080
node_template: NodeTemplate {
10811081
document_node: DocumentNode {
10821082
implementation: DocumentNodeImplementation::proto("graphene_core::memo::ImpureMemoNode"),
1083-
inputs: vec![NodeInput::value(TaggedValue::ImageFrame(ImageFrameTable::default()), true)],
1083+
inputs: vec![NodeInput::value(TaggedValue::ImageFrame(ImageFrameTable::empty()), true)],
10841084
manual_composition: Some(concrete!(Context)),
10851085
..Default::default()
10861086
},
@@ -1112,7 +1112,7 @@ fn static_nodes() -> Vec<DocumentNodeDefinition> {
11121112
.collect(),
11131113
..Default::default()
11141114
}),
1115-
inputs: vec![NodeInput::value(TaggedValue::None, false), NodeInput::value(TaggedValue::ImageFrame(ImageFrameTable::default()), false)],
1115+
inputs: vec![NodeInput::value(TaggedValue::None, false), NodeInput::value(TaggedValue::ImageFrame(ImageFrameTable::empty()), false)],
11161116
..Default::default()
11171117
},
11181118
persistent_node_metadata: DocumentNodePersistentMetadata {
@@ -1825,7 +1825,7 @@ fn static_nodes() -> Vec<DocumentNodeDefinition> {
18251825
.collect(),
18261826
..Default::default()
18271827
}),
1828-
inputs: vec![NodeInput::value(TaggedValue::ImageFrame(ImageFrameTable::default()), true)],
1828+
inputs: vec![NodeInput::value(TaggedValue::ImageFrame(ImageFrameTable::empty()), true)],
18291829
..Default::default()
18301830
},
18311831
persistent_node_metadata: DocumentNodePersistentMetadata {
@@ -1881,7 +1881,7 @@ fn static_nodes() -> Vec<DocumentNodeDefinition> {
18811881
document_node: DocumentNode {
18821882
implementation: DocumentNodeImplementation::proto("graphene_std::executor::MapGpuSingleImageNode"),
18831883
inputs: vec![
1884-
NodeInput::value(TaggedValue::ImageFrame(ImageFrameTable::default()), true),
1884+
NodeInput::value(TaggedValue::ImageFrame(ImageFrameTable::empty()), true),
18851885
NodeInput::value(TaggedValue::DocumentNode(DocumentNode::default()), true),
18861886
],
18871887
..Default::default()
@@ -1923,7 +1923,7 @@ fn static_nodes() -> Vec<DocumentNodeDefinition> {
19231923
document_node: DocumentNode {
19241924
implementation: DocumentNodeImplementation::proto("graphene_core::raster::BrightnessContrastNode"),
19251925
inputs: vec![
1926-
NodeInput::value(TaggedValue::ImageFrame(ImageFrameTable::default()), true),
1926+
NodeInput::value(TaggedValue::ImageFrame(ImageFrameTable::empty()), true),
19271927
NodeInput::value(TaggedValue::F64(0.), false),
19281928
NodeInput::value(TaggedValue::F64(0.), false),
19291929
NodeInput::value(TaggedValue::Bool(false), false),
@@ -1954,7 +1954,7 @@ fn static_nodes() -> Vec<DocumentNodeDefinition> {
19541954
document_node: DocumentNode {
19551955
implementation: DocumentNodeImplementation::proto("graphene_core::raster::CurvesNode"),
19561956
inputs: vec![
1957-
NodeInput::value(TaggedValue::ImageFrame(ImageFrameTable::default()), true),
1957+
NodeInput::value(TaggedValue::ImageFrame(ImageFrameTable::empty()), true),
19581958
NodeInput::value(TaggedValue::Curve(Default::default()), false),
19591959
],
19601960
..Default::default()
@@ -2820,7 +2820,7 @@ pub static IMAGINATE_NODE: Lazy<DocumentNodeDefinition> = Lazy::new(|| DocumentN
28202820
..Default::default()
28212821
}),
28222822
inputs: vec![
2823-
NodeInput::value(TaggedValue::ImageFrame(ImageFrameTable::default()), true),
2823+
NodeInput::value(TaggedValue::ImageFrame(ImageFrameTable::empty()), true),
28242824
NodeInput::scope("editor-api"),
28252825
NodeInput::value(TaggedValue::ImaginateController(Default::default()), false),
28262826
NodeInput::value(TaggedValue::F64(0.), false), // Remember to keep index used in `ImaginateRandom` updated with this entry's index

node-graph/gcore/src/raster.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -129,7 +129,7 @@ impl<T: serde::Serialize + for<'a> serde::Deserialize<'a>> Serde for T {}
129129
impl<T> Serde for T {}
130130

131131
// TODO: Come up with a better name for this trait
132-
pub trait Pixel: Clone + Pod + Zeroable {
132+
pub trait Pixel: Clone + Pod + Zeroable + Default {
133133
#[cfg(not(target_arch = "spirv"))]
134134
fn to_bytes(&self) -> Vec<u8> {
135135
bytemuck::bytes_of(self).to_vec()

node-graph/gcore/src/raster/brush_cache.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,7 @@ impl BrushCacheImpl {
5454
background = core::mem::take(&mut self.blended_image);
5555

5656
// Check if the first non-blended stroke is an extension of the last one.
57-
let mut first_stroke_texture = ImageFrameTable::default();
57+
let mut first_stroke_texture = ImageFrameTable::empty();
5858
let mut first_stroke_point_skip = 0;
5959
let strokes = input[num_blended_strokes..].to_vec();
6060
if !strokes.is_empty() && self.prev_input.len() > num_blended_strokes {

node-graph/gcore/src/raster/image.rs

Lines changed: 11 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
use super::discrete_srgb::float_to_srgb_u8;
22
use super::Color;
3-
use crate::instances::Instances;
43
use crate::GraphicElement;
4+
use crate::{instances::Instances, transform::TransformMut};
55
use alloc::vec::Vec;
66
use core::hash::{Hash, Hasher};
77
use dyn_any::StaticType;
@@ -110,15 +110,6 @@ impl<P: Hash + Pixel> Hash for Image<P> {
110110
}
111111

112112
impl<P: Pixel> Image<P> {
113-
pub const fn empty() -> Self {
114-
Self {
115-
width: 0,
116-
height: 0,
117-
data: Vec::new(),
118-
base64_string: None,
119-
}
120-
}
121-
122113
pub fn new(width: u32, height: u32, color: P) -> Self {
123114
Self {
124115
width,
@@ -236,18 +227,21 @@ pub fn migrate_image_frame<'de, D: serde::Deserializer<'de>>(deserializer: D) ->
236227

237228
pub type ImageFrameTable<P> = Instances<ImageFrame<P>>;
238229

239-
#[derive(Clone, Debug, PartialEq, specta::Type)]
230+
/// Construct a 0x0 image frame table. This is useful because ImageFrameTable::default() will return a 1x1 image frame table.
231+
impl ImageFrameTable<Color> {
232+
pub fn empty() -> Self {
233+
let mut result = Self::new(ImageFrame::default());
234+
*result.transform_mut() = DAffine2::ZERO;
235+
result
236+
}
237+
}
238+
239+
#[derive(Clone, Default, Debug, PartialEq, specta::Type)]
240240
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
241241
pub struct ImageFrame<P: Pixel> {
242242
pub image: Image<P>,
243243
}
244244

245-
impl<P: Pixel> Default for ImageFrame<P> {
246-
fn default() -> Self {
247-
Self { image: Image::empty() }
248-
}
249-
}
250-
251245
impl<P: Debug + Copy + Pixel> Sample for ImageFrame<P> {
252246
type Pixel = P;
253247

node-graph/gstd/src/gpu_nodes.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -83,7 +83,7 @@ async fn map_gpu<'a: 'input>(image: ImageFrameTable<Color>, node: DocumentNode,
8383
let name = "placeholder".to_string();
8484
let Ok(compute_pass_descriptor) = create_compute_pass_descriptor(node, image_frame_table, executor).await else {
8585
log::error!("Error creating compute pass descriptor in 'map_gpu()");
86-
return ImageFrameTable::default();
86+
return ImageFrameTable::empty();
8787
};
8888
self.cache.lock().as_mut().unwrap().insert(name, compute_pass_descriptor.clone());
8989
log::error!("created compute pass");
@@ -340,7 +340,7 @@ async fn blend_gpu_image(_: impl Ctx, foreground: ImageFrameTable<Color>, backgr
340340
let proto_networks: Result<Vec<_>, _> = compiler.compile(network.clone()).collect();
341341
let Ok(proto_networks_result) = proto_networks else {
342342
log::error!("Error compiling network in 'blend_gpu_image()");
343-
return ImageFrameTable::default();
343+
return ImageFrameTable::empty();
344344
};
345345
let proto_networks = proto_networks_result;
346346
log::debug!("compiling shader");

node-graph/gstd/src/image_color_palette.rs

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -82,7 +82,6 @@ mod test {
8282
data: vec![Color::from_rgbaf32(0., 0., 0., 1.).unwrap(); 10000],
8383
base64_string: None,
8484
},
85-
..Default::default()
8685
})),
8786
};
8887
assert_eq!(futures::executor::block_on(node.eval(())), [Color::from_rgbaf32(0., 0., 0., 1.).unwrap()]);

node-graph/gstd/src/imaginate.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -327,7 +327,7 @@ pub async fn imaginate<'a, P: Pixel>(
327327
set_progress(ImaginateStatus::Failed(err.to_string()));
328328
}
329329
};
330-
Image::empty()
330+
Image::default()
331331
})
332332
}
333333

node-graph/gstd/src/raster.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,7 @@ fn sample_image(ctx: impl ExtractFootprint + Clone, image_frame: ImageFrameTable
4949

5050
// If the image would not be visible, return an empty image
5151
if size.x <= 0. || size.y <= 0. {
52-
return ImageFrameTable::default();
52+
return ImageFrameTable::empty();
5353
}
5454

5555
let image_buffer = image::Rgba32FImage::from_raw(image.width, image.height, data).expect("Failed to convert internal image format into image-rs data type.");
@@ -515,7 +515,7 @@ fn noise_pattern(
515515

516516
// If the image would not be visible, return an empty image
517517
if size.x <= 0. || size.y <= 0. {
518-
return ImageFrameTable::default();
518+
return ImageFrameTable::empty();
519519
}
520520

521521
let footprint_scale = footprint.scale();
@@ -641,7 +641,7 @@ fn mandelbrot(ctx: impl ExtractFootprint) -> ImageFrameTable<Color> {
641641

642642
// If the image would not be visible, return an empty image
643643
if size.x <= 0. || size.y <= 0. {
644-
return ImageFrameTable::default();
644+
return ImageFrameTable::empty();
645645
}
646646

647647
let scale = footprint.scale();

node-graph/gstd/src/wasm_application_io.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -78,7 +78,7 @@ async fn load_resource<'a: 'n>(_: impl Ctx, _primary: (), #[scope("editor-api")]
7878
#[node_macro::node(category("Raster"))]
7979
fn decode_image(_: impl Ctx, data: Arc<[u8]>) -> ImageFrameTable<Color> {
8080
let Some(image) = image::load_from_memory(data.as_ref()).ok() else {
81-
return ImageFrameTable::default();
81+
return ImageFrameTable::empty();
8282
};
8383
let image = image.to_rgba32f();
8484
let image = ImageFrame {
@@ -163,7 +163,7 @@ async fn rasterize<T: GraphicElementRendered + graphene_core::transform::Transfo
163163
) -> ImageFrameTable<Color> {
164164
if footprint.transform.matrix2.determinant() == 0. {
165165
log::trace!("Invalid footprint received for rasterization");
166-
return ImageFrameTable::default();
166+
return ImageFrameTable::empty();
167167
}
168168

169169
let mut render = SvgRender::new();

0 commit comments

Comments
 (0)