mirror of
https://github.com/GraphiteEditor/Graphite.git
synced 2026-10-01 04:48:13 +08:00
Store artboard content as a native group
This commit is contained in:
@@ -30,8 +30,43 @@ impl Artboard {
|
|||||||
pub fn into_graphic_list(self) -> List<Graphic> {
|
pub fn into_graphic_list(self) -> List<Graphic> {
|
||||||
self.0
|
self.0
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// The artboard with every content group converted to its legacy form, so
|
||||||
|
/// the value owns all of its content free of arena borrows.
|
||||||
|
pub fn with_legacy_groups(&self) -> Artboard {
|
||||||
|
let mut content = self.0.clone();
|
||||||
|
for element in content.iter_element_values_mut() {
|
||||||
|
*element = crate::graphic::map_groups_to_legacy(element);
|
||||||
|
}
|
||||||
|
Artboard(content)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// The deep clone-out for `Artboard` elements: as for `Graphic`, a plain
|
||||||
|
/// clone of group content would carry frame pointers into the evaluation's
|
||||||
|
/// arena, so memo and capture seams copy out the legacy-converted form.
|
||||||
|
///
|
||||||
|
/// # Safety
|
||||||
|
/// `ptr` must point at a live parked `Artboard` element field.
|
||||||
|
unsafe fn deep_clone_artboard(ptr: *const u8) -> Box<dyn std::any::Any + Send + Sync> {
|
||||||
|
let artboard = unsafe { core_types::record::borrow_element::<Artboard>(core_types::record::Rec::new(ptr)) };
|
||||||
|
Box::new(artboard.with_legacy_groups())
|
||||||
|
}
|
||||||
|
|
||||||
|
const _: () = {
|
||||||
|
#[cfg(not(target_family = "wasm"))]
|
||||||
|
#[core_types::ctor::ctor]
|
||||||
|
fn register() {
|
||||||
|
core_types::record::register_deep_element_clone::<Artboard>(deep_clone_artboard);
|
||||||
|
}
|
||||||
|
|
||||||
|
#[cfg(target_family = "wasm")]
|
||||||
|
#[unsafe(export_name = "__node_registry_deep_element_artboard")]
|
||||||
|
extern "C" fn register() {
|
||||||
|
core_types::record::register_deep_element_clone::<Artboard>(deep_clone_artboard);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
impl From<List<Graphic>> for Artboard {
|
impl From<List<Graphic>> for Artboard {
|
||||||
fn from(content: List<Graphic>) -> Self {
|
fn from(content: List<Graphic>) -> Self {
|
||||||
Self(content)
|
Self(content)
|
||||||
|
|||||||
@@ -68,7 +68,16 @@ pub fn capture_to_legacy(capture: &RecordCapture, arena: &Arena) -> Option<Box<d
|
|||||||
};
|
};
|
||||||
return Some(Box::new(group_to_legacy_list(&group)));
|
return Some(Box::new(group_to_legacy_list(&group)));
|
||||||
}
|
}
|
||||||
None.or_else(|| typed::<Artboard>(&item))
|
fn typed_artboards(item: &GroupItem) -> Option<Box<dyn std::any::Any + Send + Sync>> {
|
||||||
|
let mut list = run_to_legacy_list::<Artboard>(item)?;
|
||||||
|
// The capture outlives the arena generation, so group content must
|
||||||
|
// leave in its owned legacy form.
|
||||||
|
for artboard in list.iter_element_values_mut() {
|
||||||
|
*artboard = artboard.with_legacy_groups();
|
||||||
|
}
|
||||||
|
Some(Box::new(list))
|
||||||
|
}
|
||||||
|
None.or_else(|| typed_artboards(&item))
|
||||||
.or_else(|| typed::<Vector>(&item))
|
.or_else(|| typed::<Vector>(&item))
|
||||||
.or_else(|| typed::<Raster<CPU>>(&item))
|
.or_else(|| typed::<Raster<CPU>>(&item))
|
||||||
.or_else(|| typed::<Raster<GPU>>(&item))
|
.or_else(|| typed::<Raster<GPU>>(&item))
|
||||||
|
|||||||
@@ -37,10 +37,10 @@ pub fn create_artboard(
|
|||||||
) -> (Artboard, Attr<Location>, Attr<Dimensions>, Attr<Background>, Attr<Clip>) {
|
) -> (Artboard, Attr<Location>, Attr<Dimensions>, Attr<Background>, Attr<Clip>) {
|
||||||
// SAFETY: a materialized input's frames are arena-resident.
|
// SAFETY: a materialized input's frames are arena-resident.
|
||||||
let item = unsafe { core_types::record::GroupItem::from_resident(content.batch()) };
|
let item = unsafe { core_types::record::GroupItem::from_resident(content.batch()) };
|
||||||
let content = graphic_types::graphic::group_to_legacy_list(&core_types::record::Group {
|
let content = core_types::list::List::new_from_element(Graphic::Group(core_types::record::Group {
|
||||||
row: None,
|
row: None,
|
||||||
content: core_types::record::GroupContent::Run(item),
|
content: core_types::record::GroupContent::Run(item),
|
||||||
});
|
}));
|
||||||
|
|
||||||
// Normalize so `location` is the top-left corner and `dimensions` are positive (allowing negative input
|
// Normalize so `location` is the top-left corner and `dimensions` are positive (allowing negative input
|
||||||
// dimensions to represent dragging from the opposite corner). Compute the corner using the raw signed
|
// dimensions to represent dragging from the opposite corner). Compute the corner using the raw signed
|
||||||
|
|||||||
Reference in New Issue
Block a user