correct node geometry

This commit is contained in:
Alexey Fedoseev
2024-04-08 18:02:07 +03:00
parent 61b5be4cd8
commit 697cf93e09
2 changed files with 13 additions and 9 deletions

View File

@@ -479,6 +479,7 @@ static int cyberiada_destroy_node(CyberiadaNode* node)
cyberiada_destroy_all_nodes(node->children); cyberiada_destroy_all_nodes(node->children);
} }
if (node->actions) cyberiada_destroy_action(node->actions); if (node->actions) cyberiada_destroy_action(node->actions);
if (node->geometry_point) free(node->geometry_point);
if (node->geometry_rect) free(node->geometry_rect); if (node->geometry_rect) free(node->geometry_rect);
if (node->color) free(node->color); if (node->color) free(node->color);
if (node->link) { if (node->link) {
@@ -1356,7 +1357,7 @@ static int cyberiada_get_element_text(char* buffer, size_t buffer_len,
static int cyberiada_xml_read_coord(xmlNode* xml_node, static int cyberiada_xml_read_coord(xmlNode* xml_node,
const char* attr_name, const char* attr_name,
double* result) float* result)
{ {
char buffer[MAX_STR_LEN]; char buffer[MAX_STR_LEN];
size_t buffer_len = sizeof(buffer) - 1; size_t buffer_len = sizeof(buffer) - 1;
@@ -1365,7 +1366,7 @@ static int cyberiada_xml_read_coord(xmlNode* xml_node,
attr_name) != CYBERIADA_NO_ERROR) { attr_name) != CYBERIADA_NO_ERROR) {
return CYBERIADA_BAD_PARAMETER; return CYBERIADA_BAD_PARAMETER;
} }
*result = atof(buffer); *result = (float)atof(buffer);
return CYBERIADA_NO_ERROR; return CYBERIADA_NO_ERROR;
} }
@@ -1607,24 +1608,27 @@ static GraphProcessorState handle_node_geometry(xmlNode* xml_node,
{ {
CyberiadaNodeType type; CyberiadaNodeType type;
CyberiadaNode* current = node_stack_current_node(stack); CyberiadaNode* current = node_stack_current_node(stack);
CyberiadaRect* rect;
if (current == NULL) { if (current == NULL) {
ERROR("current node invalid\n"); ERROR("current node invalid\n");
return gpsInvalid; return gpsInvalid;
} }
type = current->type; type = current->type;
if (cyberiada_xml_read_rect(xml_node, if (cyberiada_xml_read_rect(xml_node,
&(current->geometry_rect)) != CYBERIADA_NO_ERROR) { &rect) != CYBERIADA_NO_ERROR) {
return gpsInvalid; return gpsInvalid;
} }
if (type == cybNodeInitial) { if (type == cybNodeInitial) {
current->geometry_rect->x += current->geometry_rect->width / 2.0; current->geometry_point = (CyberiadaPoint*)malloc(sizeof(CyberiadaPoint));
current->geometry_rect->y += current->geometry_rect->height / 2.0; current->geometry_point->x = rect->x + rect->width / 2.0f;
current->geometry_rect->width = PSEUDO_NODE_SIZE; current->geometry_point->y = rect->y + rect->height / 2.0f;
current->geometry_rect->height = PSEUDO_NODE_SIZE; free(rect);
return gpsNodeStart; return gpsNodeStart;
} else if (type == cybNodeComment) { } else if (type == cybNodeComment) {
current->geometry_rect = rect;
return gpsNodeAction; return gpsNodeAction;
} else { } else {
current->geometry_rect = rect;
return gpsNodeTitle; return gpsNodeTitle;
} }
} }

View File

@@ -70,11 +70,11 @@ typedef enum {
/* SM node & transitions geometry */ /* SM node & transitions geometry */
typedef struct { typedef struct {
double x, y; float x, y;
} CyberiadaPoint; } CyberiadaPoint;
typedef struct { typedef struct {
double x, y, width, height; float x, y, width, height;
} CyberiadaRect; } CyberiadaRect;
typedef struct _CyberiadaPolyline { typedef struct _CyberiadaPolyline {