mirror of
https://github.com/GraphiteEditor/Graphite.git
synced 2026-09-15 22:28:10 +08:00
Box the largest message and update payloads
This commit is contained in:
@@ -157,7 +157,8 @@ pub enum NodeGraphMessage {
|
||||
SetInputValue {
|
||||
node_id: NodeId,
|
||||
input_index: usize,
|
||||
value: TaggedValue,
|
||||
// Boxed to keep the whole editor message tree small; `TaggedValue` alone is 568 bytes
|
||||
value: Box<TaggedValue>,
|
||||
},
|
||||
SetInput {
|
||||
input_connector: InputConnector,
|
||||
|
||||
@@ -1765,6 +1765,7 @@ impl<'a> MessageHandler<NodeGraphMessage, NodeGraphMessageContext<'a>> for NodeG
|
||||
NodeGraphMessage::SetInputValue { node_id, input_index, value } => {
|
||||
use graphene_std::vector::generator_nodes::*;
|
||||
|
||||
let value = *value;
|
||||
let reference = network_interface.reference(&node_id, selection_network_path);
|
||||
let is_text_node = reference.as_ref().is_some_and(|r| *r == DefinitionIdentifier::ProtoNode(graphene_std::text::text::IDENTIFIER));
|
||||
let is_stroke_node = reference.as_ref().is_some_and(|r| *r == DefinitionIdentifier::ProtoNode(graphene_std::vector::stroke::IDENTIFIER));
|
||||
|
||||
@@ -44,7 +44,12 @@ pub(crate) fn string_properties(text: &str) -> Vec<LayoutGroup> {
|
||||
|
||||
fn optionally_update_value<T>(value: impl Fn(&T) -> Option<TaggedValue> + 'static + Send + Sync, node_id: NodeId, input_index: usize) -> impl Fn(&T) -> Message + 'static + Send + Sync {
|
||||
move |input_value: &T| match value(input_value) {
|
||||
Some(value) => NodeGraphMessage::SetInputValue { node_id, input_index, value }.into(),
|
||||
Some(value) => NodeGraphMessage::SetInputValue {
|
||||
node_id,
|
||||
input_index,
|
||||
value: Box::new(value),
|
||||
}
|
||||
.into(),
|
||||
None => Message::NoOp,
|
||||
}
|
||||
}
|
||||
@@ -867,7 +872,7 @@ pub fn font_inputs(parameter_widgets_info: ParameterWidgetsInfo) -> (Vec<WidgetI
|
||||
NodeGraphMessage::SetInputValue {
|
||||
node_id,
|
||||
input_index: graphene_std::text::text::FontInput::INDEX,
|
||||
value: TaggedValue::Resource(resource_id),
|
||||
value: Box::new(TaggedValue::Resource(resource_id)),
|
||||
}
|
||||
.into(),
|
||||
]),
|
||||
@@ -1437,7 +1442,7 @@ fn build_shared_spectrum_section(node_id: NodeId, context: &mut NodePropertiesCo
|
||||
NodeGraphMessage::SetInputValue {
|
||||
node_id,
|
||||
input_index,
|
||||
value: TaggedValue::F32(percent.clamp(0., 100.) as f32),
|
||||
value: Box::new(TaggedValue::F32(percent.clamp(0., 100.) as f32)),
|
||||
}
|
||||
.into()
|
||||
}
|
||||
@@ -1594,7 +1599,7 @@ fn spectrum_slider_row(
|
||||
NodeGraphMessage::SetInputValue {
|
||||
node_id,
|
||||
input_index,
|
||||
value: TaggedValue::F32(position_to_value(new_position).clamp(value_min, value_max) as f32),
|
||||
value: Box::new(TaggedValue::F32(position_to_value(new_position).clamp(value_min, value_max) as f32)),
|
||||
}
|
||||
.into()
|
||||
})
|
||||
@@ -2148,13 +2153,13 @@ pub(crate) fn string_capitalization_properties(node_id: NodeId, context: &mut No
|
||||
NodeGraphMessage::SetInputValue {
|
||||
node_id,
|
||||
input_index: UseJoinerInput::INDEX,
|
||||
value: TaggedValue::Bool(true),
|
||||
value: Box::new(TaggedValue::Bool(true)),
|
||||
}
|
||||
.into(),
|
||||
NodeGraphMessage::SetInputValue {
|
||||
node_id,
|
||||
input_index: JoinerInput::INDEX,
|
||||
value: TaggedValue::String(value.clone()),
|
||||
value: Box::new(TaggedValue::String(value.clone())),
|
||||
}
|
||||
.into(),
|
||||
]),
|
||||
@@ -2214,13 +2219,13 @@ pub(crate) fn rectangle_properties(node_id: NodeId, context: &mut NodeProperties
|
||||
NodeGraphMessage::SetInputValue {
|
||||
node_id,
|
||||
input_index: IndividualCornerRadiiInput::INDEX,
|
||||
value: TaggedValue::Bool(false),
|
||||
value: Box::new(TaggedValue::Bool(false)),
|
||||
}
|
||||
.into(),
|
||||
NodeGraphMessage::SetInputValue {
|
||||
node_id,
|
||||
input_index: CornerRadiusInput::INDEX,
|
||||
value: TaggedValue::F64(uniform_val),
|
||||
value: Box::new(TaggedValue::F64(uniform_val)),
|
||||
}
|
||||
.into(),
|
||||
]),
|
||||
@@ -2234,13 +2239,13 @@ pub(crate) fn rectangle_properties(node_id: NodeId, context: &mut NodeProperties
|
||||
NodeGraphMessage::SetInputValue {
|
||||
node_id,
|
||||
input_index: IndividualCornerRadiiInput::INDEX,
|
||||
value: TaggedValue::Bool(true),
|
||||
value: Box::new(TaggedValue::Bool(true)),
|
||||
}
|
||||
.into(),
|
||||
NodeGraphMessage::SetInputValue {
|
||||
node_id,
|
||||
input_index: CornerRadiusInput::INDEX,
|
||||
value: TaggedValue::F64Array(individual_val_for_switch.clone()),
|
||||
value: Box::new(TaggedValue::F64Array(individual_val_for_switch.clone())),
|
||||
}
|
||||
.into(),
|
||||
]),
|
||||
@@ -2549,13 +2554,13 @@ pub(crate) fn fill_properties(node_id: NodeId, context: &mut NodePropertiesConte
|
||||
NodeGraphMessage::SetInputValue {
|
||||
node_id,
|
||||
input_index: FillInput::INDEX,
|
||||
value: TaggedValue::Color(color),
|
||||
value: Box::new(TaggedValue::Color(color)),
|
||||
}
|
||||
.into(),
|
||||
NodeGraphMessage::SetInputValue {
|
||||
node_id,
|
||||
input_index: BackupColorInput::INDEX,
|
||||
value: TaggedValue::Color(color),
|
||||
value: Box::new(TaggedValue::Color(color)),
|
||||
}
|
||||
.into(),
|
||||
]),
|
||||
@@ -2566,13 +2571,13 @@ pub(crate) fn fill_properties(node_id: NodeId, context: &mut NodePropertiesConte
|
||||
NodeGraphMessage::SetInputValue {
|
||||
node_id,
|
||||
input_index: FillInput::INDEX,
|
||||
value: TaggedValue::Gradient(gradient.clone()),
|
||||
value: Box::new(TaggedValue::Gradient(gradient.clone())),
|
||||
}
|
||||
.into(),
|
||||
NodeGraphMessage::SetInputValue {
|
||||
node_id,
|
||||
input_index: BackupGradientInput::INDEX,
|
||||
value: TaggedValue::Gradient(gradient),
|
||||
value: Box::new(TaggedValue::Gradient(gradient)),
|
||||
}
|
||||
.into(),
|
||||
]),
|
||||
|
||||
@@ -2729,12 +2729,12 @@ impl NodeNetworkInterface {
|
||||
DocumentNodeClickTargets {
|
||||
node_click_target,
|
||||
port_click_targets,
|
||||
node_type_metadata: NodeTypeClickTargets::Layer(LayerClickTargets {
|
||||
node_type_metadata: NodeTypeClickTargets::Layer(Box::new(LayerClickTargets {
|
||||
visibility_click_target,
|
||||
lock_click_target,
|
||||
grip_click_target,
|
||||
name_click_target,
|
||||
}),
|
||||
})),
|
||||
}
|
||||
};
|
||||
|
||||
@@ -6953,7 +6953,7 @@ pub struct LayerTransientMetadata {
|
||||
|
||||
#[derive(Debug, Clone)]
|
||||
pub enum NodeTypeClickTargets {
|
||||
Layer(LayerClickTargets),
|
||||
Layer(Box<LayerClickTargets>),
|
||||
Node, // No transient click targets are stored exclusively for nodes
|
||||
}
|
||||
|
||||
|
||||
@@ -52,7 +52,7 @@ pub enum PortfolioMessage {
|
||||
reopened: bool,
|
||||
#[serde(skip, default)]
|
||||
#[derivative(Debug = "ignore", PartialEq = "ignore", Clone(clone_with = "clone_to_none"))]
|
||||
gdd: Option<document_format::GddV1>,
|
||||
gdd: Option<Box<document_format::GddV1>>,
|
||||
},
|
||||
DestroyAllDocuments,
|
||||
EditorPreferences,
|
||||
|
||||
@@ -305,7 +305,7 @@ impl MessageHandler<PortfolioMessage, PortfolioMessageContext<'_>> for Portfolio
|
||||
// Document was closed before its working copy finished mounting.
|
||||
return;
|
||||
};
|
||||
document.set_storage(gdd);
|
||||
document.set_storage(gdd.map(|gdd| *gdd));
|
||||
if !reopened {
|
||||
document.commit_storage_snapshot(&resource_storage.resources_mut(), preferences.validate_storage_round_trip);
|
||||
document.retire_storage_interaction();
|
||||
@@ -1914,7 +1914,7 @@ impl PortfolioMessageHandler {
|
||||
Message::Portfolio(PortfolioMessage::DocumentStorageMounted {
|
||||
document_id,
|
||||
reopened,
|
||||
gdd: Some(gdd),
|
||||
gdd: Some(Box::new(gdd)),
|
||||
})
|
||||
};
|
||||
future.into()
|
||||
|
||||
@@ -613,7 +613,7 @@ pub fn set_stroke_weight_for_selected_layers(weight: f64, document: &DocumentMes
|
||||
for layer in layers {
|
||||
if let Some(node_id) = get_stroke_id(layer, &document.network_interface) {
|
||||
let input_index = graphene_std::vector::stroke::WeightInput::INDEX;
|
||||
let value = TaggedValue::F64(weight);
|
||||
let value = Box::new(TaggedValue::F64(weight));
|
||||
responses.add(NodeGraphMessage::SetInputValue { node_id, input_index, value });
|
||||
} else if weight > 0. {
|
||||
let color = Some(Color::BLACK);
|
||||
@@ -825,7 +825,7 @@ pub fn set_stroke_color_for_selected_layers(color: Option<Color>, weight: f64, d
|
||||
for layer in layers {
|
||||
if let Some(node_id) = get_stroke_id(layer, &document.network_interface) {
|
||||
let input_index = graphene_std::vector::stroke::PaintInput::INDEX;
|
||||
let value = TaggedValue::Color(color);
|
||||
let value = Box::new(TaggedValue::Color(color));
|
||||
responses.add(NodeGraphMessage::SetInputValue { node_id, input_index, value });
|
||||
} else {
|
||||
let stroke = graphene_std::vector::style::Stroke::new(weight);
|
||||
@@ -896,7 +896,7 @@ pub fn set_proto_node_input_for_selected_layers(
|
||||
responses.add(NodeGraphMessage::SetInputValue {
|
||||
node_id,
|
||||
input_index,
|
||||
value: value.clone(),
|
||||
value: Box::new(value.clone()),
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
@@ -2146,7 +2146,7 @@ mod test_gradient {
|
||||
.handle_message(NodeGraphMessage::SetInputValue {
|
||||
node_id: gradient_node_id,
|
||||
input_index: 1,
|
||||
value: TaggedValue::Gradient(GradientStops::new([
|
||||
value: Box::new(TaggedValue::Gradient(GradientStops::new([
|
||||
GradientStop {
|
||||
position: 0.,
|
||||
midpoint: 0.5,
|
||||
@@ -2157,7 +2157,7 @@ mod test_gradient {
|
||||
midpoint: 0.5,
|
||||
color: Color::BLUE,
|
||||
},
|
||||
])),
|
||||
]))),
|
||||
})
|
||||
.await;
|
||||
|
||||
@@ -2183,7 +2183,7 @@ mod test_gradient {
|
||||
.handle_message(NodeGraphMessage::SetInputValue {
|
||||
node_id: gradient_node_id,
|
||||
input_index: 1,
|
||||
value: TaggedValue::Gradient(GradientStops::new([
|
||||
value: Box::new(TaggedValue::Gradient(GradientStops::new([
|
||||
GradientStop {
|
||||
position: 0.,
|
||||
midpoint: 0.5,
|
||||
@@ -2194,7 +2194,7 @@ mod test_gradient {
|
||||
midpoint: 0.5,
|
||||
color: Color::BLUE,
|
||||
},
|
||||
])),
|
||||
]))),
|
||||
})
|
||||
.await;
|
||||
|
||||
@@ -2826,7 +2826,7 @@ mod test_gradient {
|
||||
.handle_message(NodeGraphMessage::SetInputValue {
|
||||
node_id: gradient_value_id,
|
||||
input_index: 1,
|
||||
value: TaggedValue::Gradient(GradientStops::new([
|
||||
value: Box::new(TaggedValue::Gradient(GradientStops::new([
|
||||
GradientStop {
|
||||
position: 0.,
|
||||
midpoint: 0.5,
|
||||
@@ -2837,7 +2837,7 @@ mod test_gradient {
|
||||
midpoint: 0.5,
|
||||
color: Color::BLUE,
|
||||
},
|
||||
])),
|
||||
]))),
|
||||
})
|
||||
.await;
|
||||
|
||||
|
||||
@@ -118,7 +118,7 @@ fn create_text_widgets(tool: &TextTool, font_catalog: &FontCatalog, document: &D
|
||||
NodeGraphMessage::SetInputValue {
|
||||
node_id,
|
||||
input_index: graphene_std::text::text::FontInput::INDEX,
|
||||
value: TaggedValue::Resource(resource_id),
|
||||
value: Box::new(TaggedValue::Resource(resource_id)),
|
||||
}
|
||||
.into(),
|
||||
]),
|
||||
@@ -349,7 +349,7 @@ impl<'a> MessageHandler<ToolMessage, &mut ToolActionMessageContext<'a>> for Text
|
||||
responses.add(NodeGraphMessage::SetInputValue {
|
||||
node_id,
|
||||
input_index: graphene_std::text::text::SizeInput::INDEX,
|
||||
value: TaggedValue::F64(font_size),
|
||||
value: Box::new(TaggedValue::F64(font_size)),
|
||||
});
|
||||
}
|
||||
}
|
||||
@@ -364,7 +364,7 @@ impl<'a> MessageHandler<ToolMessage, &mut ToolActionMessageContext<'a>> for Text
|
||||
responses.add(NodeGraphMessage::SetInputValue {
|
||||
node_id,
|
||||
input_index: graphene_std::text::text::AlignInput::INDEX,
|
||||
value: TaggedValue::TextAlign(align),
|
||||
value: Box::new(TaggedValue::TextAlign(align)),
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
@@ -47,7 +47,7 @@ pub struct CompilationResponse {
|
||||
}
|
||||
|
||||
pub enum NodeGraphUpdate {
|
||||
ExecutionResponse(ExecutionResponse),
|
||||
ExecutionResponse(Box<ExecutionResponse>),
|
||||
CompilationResponse(CompilationResponse),
|
||||
EyedropperPreview(Raster<CPU>),
|
||||
NodeGraphUpdateMessage(NodeGraphUpdateMessage),
|
||||
@@ -368,7 +368,7 @@ impl NodeGraphExecutor {
|
||||
responses: existing_responses,
|
||||
vector_modify,
|
||||
inspect_result,
|
||||
} = execution_response;
|
||||
} = *execution_response;
|
||||
|
||||
while let Some(&(queued_execution_id, _)) = self.futures.front() {
|
||||
if queued_execution_id < execution_id {
|
||||
|
||||
@@ -104,7 +104,7 @@ impl InternalNodeGraphUpdateSender {
|
||||
}
|
||||
|
||||
fn send_execution_response(&self, response: ExecutionResponse) {
|
||||
self.0.send(NodeGraphUpdate::ExecutionResponse(response)).expect("Failed to send response")
|
||||
self.0.send(NodeGraphUpdate::ExecutionResponse(Box::new(response))).expect("Failed to send response")
|
||||
}
|
||||
|
||||
fn send_eyedropper_preview(&self, raster: Raster<CPU>) {
|
||||
|
||||
@@ -258,6 +258,9 @@ pub struct ParsedField {
|
||||
pub(crate) attribute_reads: Vec<AttributeRead>,
|
||||
}
|
||||
|
||||
// Both variants are large parsed-syntax payloads (888/672 bytes), so boxing one still leaves the other large while forcing a
|
||||
// deref on every pattern match across codegen; this is built once per node at compile time, never on a hot path
|
||||
#[allow(clippy::large_enum_variant)]
|
||||
#[derive(Clone, Debug)]
|
||||
pub enum ParsedFieldType {
|
||||
Regular(RegularParsedField),
|
||||
|
||||
Reference in New Issue
Block a user