[Bf-blender-cvs] [4ffee9a48d1] master: Fix T99316: Crash with no font in String to Curves node

Iliay Katueshenock noreply at git.blender.org
Sun Jul 3 01:37:59 CEST 2022


Commit: 4ffee9a48d1bc01442e554d44a1f55dfc459a221
Author: Iliay Katueshenock
Date:   Sat Jul 2 18:37:32 2022 -0500
Branches: master
https://developer.blender.org/rB4ffee9a48d1bc01442e554d44a1f55dfc459a221

Fix T99316: Crash with no font in String to Curves node

If you remove the default font from the project, the node will not
have the selected font. In this case, there is no check that the font
does not exist. This suggestion adds an error message if the font
is not specified.

Differential Revision: https://developer.blender.org/D15337

===================================================================

M	source/blender/nodes/geometry/nodes/node_geo_string_to_curves.cc

===================================================================

diff --git a/source/blender/nodes/geometry/nodes/node_geo_string_to_curves.cc b/source/blender/nodes/geometry/nodes/node_geo_string_to_curves.cc
index efcc8809c9c..94d5d7f946f 100644
--- a/source/blender/nodes/geometry/nodes/node_geo_string_to_curves.cc
+++ b/source/blender/nodes/geometry/nodes/node_geo_string_to_curves.cc
@@ -157,12 +157,18 @@ struct TextLayout {
   float final_font_size;
 };
 
-static TextLayout get_text_layout(GeoNodeExecParams &params)
+static std::optional<TextLayout> get_text_layout(GeoNodeExecParams &params)
 {
+  VFont *vfont = reinterpret_cast<VFont *>(params.node().id);
+  if (!vfont) {
+    params.error_message_add(NodeWarningType::Error, TIP_("Font not specified"));
+    return std::nullopt;
+  }
+
   TextLayout layout;
   layout.text = params.extract_input<std::string>("String");
   if (layout.text.empty()) {
-    return {};
+    return std::nullopt;
   }
 
   const NodeGeometryStringToCurves &storage = node_storage(params.node());
@@ -181,7 +187,6 @@ static TextLayout get_text_layout(GeoNodeExecParams &params)
   const float textbox_h = overflow == GEO_NODE_STRING_TO_CURVES_MODE_OVERFLOW ?
                               0.0f :
                               params.extract_input<float>("Text Box Height");
-  VFont *vfont = (VFont *)params.node().id;
 
   Curve cu = dna::shallow_zero_initialize();
   cu.type = OB_FONT;
@@ -361,15 +366,19 @@ static void create_attributes(GeoNodeExecParams &params,
 
 static void node_geo_exec(GeoNodeExecParams params)
 {
-  TextLayout layout = get_text_layout(params);
+  std::optional<TextLayout> layout = get_text_layout(params);
+  if (!layout) {
+    params.set_default_remaining_outputs();
+    return;
+  }
 
   const NodeGeometryStringToCurves &storage =
       *(const NodeGeometryStringToCurves *)params.node().storage;
   if (storage.overflow == GEO_NODE_STRING_TO_CURVES_MODE_TRUNCATE) {
-    params.set_output("Remainder", std::move(layout.truncated_text));
+    params.set_output("Remainder", std::move(layout->truncated_text));
   }
 
-  if (layout.positions.size() == 0) {
+  if (layout->positions.size() == 0) {
     params.set_output("Curve Instances", GeometrySet());
     params.set_default_remaining_outputs();
     return;
@@ -378,9 +387,9 @@ static void node_geo_exec(GeoNodeExecParams params)
   /* Create and add instances. */
   GeometrySet geometry_set_out;
   InstancesComponent &instances = geometry_set_out.get_component_for_write<InstancesComponent>();
-  Map<int, int> char_handles = create_curve_instances(params, layout, instances);
-  add_instances_from_handles(instances, char_handles, layout);
-  create_attributes(params, layout, instances);
+  Map<int, int> char_handles = create_curve_instances(params, *layout, instances);
+  add_instances_from_handles(instances, char_handles, *layout);
+  create_attributes(params, *layout, instances);
 
   params.set_output("Curve Instances", std::move(geometry_set_out));
 }



More information about the Bf-blender-cvs mailing list