From 697cf93e09a1ce8720effebc605795267ebee4fd Mon Sep 17 00:00:00 2001 From: Alexey Fedoseev Date: Mon, 8 Apr 2024 18:02:07 +0300 Subject: [PATCH] correct node geometry --- cyberiadaml.c | 18 +++++++++++------- cyberiadaml.h | 4 ++-- 2 files changed, 13 insertions(+), 9 deletions(-) diff --git a/cyberiadaml.c b/cyberiadaml.c index ec2ecef..52848a1 100644 --- a/cyberiadaml.c +++ b/cyberiadaml.c @@ -479,6 +479,7 @@ static int cyberiada_destroy_node(CyberiadaNode* node) cyberiada_destroy_all_nodes(node->children); } 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->color) free(node->color); 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, const char* attr_name, - double* result) + float* result) { char buffer[MAX_STR_LEN]; 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) { return CYBERIADA_BAD_PARAMETER; } - *result = atof(buffer); + *result = (float)atof(buffer); return CYBERIADA_NO_ERROR; } @@ -1607,24 +1608,27 @@ static GraphProcessorState handle_node_geometry(xmlNode* xml_node, { CyberiadaNodeType type; CyberiadaNode* current = node_stack_current_node(stack); + CyberiadaRect* rect; if (current == NULL) { ERROR("current node invalid\n"); return gpsInvalid; } type = current->type; if (cyberiada_xml_read_rect(xml_node, - &(current->geometry_rect)) != CYBERIADA_NO_ERROR) { + &rect) != CYBERIADA_NO_ERROR) { return gpsInvalid; } if (type == cybNodeInitial) { - current->geometry_rect->x += current->geometry_rect->width / 2.0; - current->geometry_rect->y += current->geometry_rect->height / 2.0; - current->geometry_rect->width = PSEUDO_NODE_SIZE; - current->geometry_rect->height = PSEUDO_NODE_SIZE; + current->geometry_point = (CyberiadaPoint*)malloc(sizeof(CyberiadaPoint)); + current->geometry_point->x = rect->x + rect->width / 2.0f; + current->geometry_point->y = rect->y + rect->height / 2.0f; + free(rect); return gpsNodeStart; } else if (type == cybNodeComment) { + current->geometry_rect = rect; return gpsNodeAction; } else { + current->geometry_rect = rect; return gpsNodeTitle; } } diff --git a/cyberiadaml.h b/cyberiadaml.h index a66c89a..d391e0a 100644 --- a/cyberiadaml.h +++ b/cyberiadaml.h @@ -70,11 +70,11 @@ typedef enum { /* SM node & transitions geometry */ typedef struct { - double x, y; + float x, y; } CyberiadaPoint; typedef struct { - double x, y, width, height; + float x, y, width, height; } CyberiadaRect; typedef struct _CyberiadaPolyline {