This commit is contained in:
2026-02-26 19:56:43 -08:00
commit f000ee7c19
1137 changed files with 603879 additions and 0 deletions

View File

@@ -0,0 +1,124 @@
/**
* @file lv_svg.c
*
*/
/*********************
* INCLUDES
*********************/
#include "lv_svg.h"
#if LV_USE_SVG
#include "../../misc/lv_assert.h"
#include "../../misc/lv_log.h"
#include "../../stdlib/lv_mem.h"
#include "lv_svg_token.h"
#include "lv_svg_parser.h"
/*********************
* DEFINES
*********************/
/**********************
* TYPEDEFS
**********************/
/**********************
* STATIC PROTOTYPES
**********************/
static void lv_svg_node_constructor(const lv_tree_class_t * class_p, lv_tree_node_t * node)
{
LV_UNUSED(class_p);
lv_svg_node_t * t = (lv_svg_node_t *)node;
t->xml_id = NULL;
t->type = LV_SVG_TAG_INVALID;
lv_array_init(&t->attrs, 4, sizeof(lv_svg_attr_t));
t->render_obj = NULL;
}
static void lv_svg_node_destructor(const lv_tree_class_t * class_p, lv_tree_node_t * node)
{
LV_UNUSED(class_p);
lv_svg_node_t * t = (lv_svg_node_t *)node;
if(t->xml_id) {
lv_free(t->xml_id);
}
for(uint32_t i = 0; i < lv_array_size(&t->attrs); i++) {
lv_svg_attr_t * attr = lv_array_at(&t->attrs, i);
if(attr->val_type == LV_SVG_ATTR_VALUE_PTR) {
lv_free(attr->value.val);
}
}
lv_array_deinit(&t->attrs);
}
static bool svg_token_process_cb(_lv_svg_token_t * token, void * data)
{
_lv_svg_parser_t * parser = (_lv_svg_parser_t *)data;
return _lv_svg_parser_token(parser, token);
}
/**********************
* STATIC VARIABLES
**********************/
const lv_tree_class_t lv_svg_node_class = {
.base_class = &lv_tree_node_class,
.instance_size = sizeof(lv_svg_node_t),
.constructor_cb = lv_svg_node_constructor,
.destructor_cb = lv_svg_node_destructor,
};
/**********************
* MACROS
**********************/
/**********************
* GLOBAL FUNCTIONS
**********************/
lv_svg_node_t * lv_svg_load_data(const char * svg_data, uint32_t data_len)
{
LV_ASSERT_NULL(svg_data);
LV_ASSERT(data_len > 0);
_lv_svg_parser_t parser;
_lv_svg_parser_init(&parser);
if(_lv_svg_tokenizer(svg_data, data_len, svg_token_process_cb, &parser)) {
if(_lv_svg_parser_is_finish(&parser)) {
lv_svg_node_t * doc = parser.doc_root;
parser.doc_root = NULL;
_lv_svg_parser_deinit(&parser);
#if LV_USE_SVG_DEBUG
_lv_svg_dump_tree(doc, 0);
#endif
return doc;
}
else {
_lv_svg_parser_deinit(&parser);
LV_LOG_ERROR("svg document parser raise errors!");
return NULL;
}
}
else {
_lv_svg_parser_deinit(&parser);
LV_LOG_ERROR("svg document tokenizer raise errors!");
return NULL;
}
}
lv_svg_node_t * lv_svg_node_create(lv_svg_node_t * parent)
{
lv_tree_node_t * node = lv_tree_node_create(&lv_svg_node_class, (lv_tree_node_t *)parent);
return (lv_svg_node_t *)node;
}
void lv_svg_node_delete(lv_svg_node_t * node)
{
lv_tree_node_delete((lv_tree_node_t *)node);
}
/**********************
* STATIC FUNCTIONS
**********************/
#endif /*LV_USE_SVG*/