Init
This commit is contained in:
124
inc/lvgl/src/libs/svg/lv_svg.c
Normal file
124
inc/lvgl/src/libs/svg/lv_svg.c
Normal 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*/
|
||||
Reference in New Issue
Block a user