mirror of
https://github.com/GraphiteEditor/Graphite.git
synced 2026-09-17 07:18:04 +08:00
Add the image segmentation node (#1122)
* Add image segmentation node This is a node which receives as input: - An image. - A mask, which consists of colors that define the image segments. Each unique color in the mask defines an area where a segmen resides. The node generates a `Vec<ImageFrame>` where the length of the result is the number of unique colors in the mask. Signed-off-by: Ică Alexandru-Gabriel <alexandru@seyhanlee.com> * Add the Index node for image segments Since the output of the image segmentation node is a `Vec<ImageFrame>`, we want a way to access the segments individually. The Index node receives a `Vec<ImageFrame>` as input and an index, and returns the image found at that index in the vec. Signed-off-by: Ică Alexandru-Gabriel <alexandru@seyhanlee.com> * Integrate the image segmentation and index nodes into the editor Signed-off-by: Ică Alexandru-Gabriel <alexandru@seyhanlee.com> * Initialize the input of the index node with an empty image frame Signed-off-by: Ică Alexandru-Gabriel <alexandru@seyhanlee.com> * Don't expose the parameter for the index node Signed-off-by: Ică Alexandru-Gabriel <alexandru@seyhanlee.com> * Don't crash the editor when the number of segments exceeds the accepted limit Signed-off-by: Ică Alexandru-Gabriel <alexandru@seyhanlee.com> * Print a warning in the console when the number of segments exceeds the accepted limit Signed-off-by: Ică Alexandru-Gabriel <alexandru@seyhanlee.com> * Add a few more checks so that the editor doesn't crash on invalid input Signed-off-by: Ică Alexandru-Gabriel <alexandru@seyhanlee.com> * Replace the tagged value for the index node Signed-off-by: Ică Alexandru-Gabriel <alexandru@seyhanlee.com> * Fix merge conflicts --------- Signed-off-by: Ică Alexandru-Gabriel <alexandru@seyhanlee.com> Co-authored-by: Dennis Kobert <dennis@kobert.dev>
This commit is contained in:
@@ -48,6 +48,7 @@ pub enum TaggedValue {
|
||||
OptionalColor(Option<graphene_core::raster::color::Color>),
|
||||
ManipulatorGroupIds(Vec<graphene_core::uuid::ManipulatorGroupId>),
|
||||
VecDVec2(Vec<DVec2>),
|
||||
Segments(Vec<graphene_core::raster::ImageFrame<Color>>),
|
||||
}
|
||||
|
||||
#[allow(clippy::derived_hash_with_manual_eq)]
|
||||
@@ -111,6 +112,12 @@ impl Hash for TaggedValue {
|
||||
dvec2.to_array().iter().for_each(|x| x.to_bits().hash(state));
|
||||
}
|
||||
}
|
||||
Self::Segments(segments) => {
|
||||
32.hash(state);
|
||||
for segment in segments {
|
||||
segment.hash(state)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -153,6 +160,7 @@ impl<'a> TaggedValue {
|
||||
TaggedValue::OptionalColor(x) => Box::new(x),
|
||||
TaggedValue::ManipulatorGroupIds(x) => Box::new(x),
|
||||
TaggedValue::VecDVec2(x) => Box::new(x),
|
||||
TaggedValue::Segments(x) => Box::new(x),
|
||||
}
|
||||
}
|
||||
|
||||
@@ -194,6 +202,7 @@ impl<'a> TaggedValue {
|
||||
TaggedValue::OptionalColor(_) => concrete!(Option<graphene_core::Color>),
|
||||
TaggedValue::ManipulatorGroupIds(_) => concrete!(Vec<graphene_core::uuid::ManipulatorGroupId>),
|
||||
TaggedValue::VecDVec2(_) => concrete!(Vec<DVec2>),
|
||||
TaggedValue::Segments(_) => concrete!(graphene_core::raster::IndexNode<Vec<graphene_core::raster::ImageFrame<Color>>>),
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user