diff options
| author | Jean-Philippe Bruyère <jp_bruyere@hotmail.com> | 2026-10-15 21:56:17 +0200 |
|---|---|---|
| committer | Jean-Philippe Bruyère <jp_bruyere@hotmail.com> | 2026-10-15 21:56:17 +0200 |
| commit | 0ea75d9f9a84a9fdcb8375512165728aa2820ad7 (patch) | |
| tree | c85b0c7a1ea0c9a2647e9b5b105dbaf39109e820 | |
| parent | 44a2e03dd1a3d98b215d0a1cba71d16574cc2b6b (diff) | |
finalize text/tspan, not possible for now to have text/span in defs; _store_or_throw use finalize ookfont_revamping
| -rw-r--r-- | src/svg/svg-parse.c | 54 | ||||
| -rw-r--r-- | src/svg/vkvg_svg_internal.h | 6 | ||||
| -rw-r--r-- | src/vkvg_context.c | 3 | ||||
| -rw-r--r-- | src/vkvg_context_internal.c | 9 |
4 files changed, 43 insertions, 29 deletions
diff --git a/src/svg/svg-parse.c b/src/svg/svg-parse.c index 90b019f..f4de1a0 100644 --- a/src/svg/svg-parse.c +++ b/src/svg/svg-parse.c @@ -119,12 +119,15 @@ parentData = _new_text(); #define PROCESS_TEXT process_element(svg, &attribs, parentData, false); -#define POSTPROC_TEXT vkvg_restore(svg->ctx); +#define POSTPROC_TEXT \ + finalize_elt(parentData); \ + vkvg_restore(svg->ctx); #define SVG_ATT_TEXT_X parse_coordinate_list(svg->value, svg->value + svg->value_len, &(CAST(text)->coords.x)); #define SVG_ATT_TEXT_Y parse_coordinate_list(svg->value, svg->value + svg->value_len, &(CAST(text)->coords.y)); #define SVG_ATT_TEXT_DX parse_coordinate_list(svg->value, svg->value + svg->value_len, &(CAST(text)->coords.dx)); #define SVG_ATT_TEXT_DY parse_coordinate_list(svg->value, svg->value + svg->value_len, &(CAST(text)->coords.dy)); //============ + //== TSPAN === #define PREPROC_TSPAN \ vkvg_save(svg->ctx); \ @@ -133,7 +136,10 @@ CAST(tspan)->parent = tspanParent; #define PROCESS_TSPAN process_element(svg, &attribs, parentData, false); -#define POSTPROC_TSPAN vkvg_restore(svg->ctx); +#define POSTPROC_TSPAN \ + finalize_elt(parentData); \ + vkvg_restore(svg->ctx); + #define SVG_ATT_TSPAN_X parse_coordinate_list(svg->value, svg->value + svg->value_len, &(CAST(tspan)->coords.x)); #define SVG_ATT_TSPAN_Y parse_coordinate_list(svg->value, svg->value + svg->value_len, &(CAST(tspan)->coords.y)); #define SVG_ATT_TSPAN_DX parse_coordinate_list(svg->value, svg->value + svg->value_len, &(CAST(tspan)->coords.dx)); @@ -565,6 +571,34 @@ bool try_find_by_id(svg_context *const svg, uint32_t hash, void **elt) { } return false; } + +void finalize_text_coords (svg_text_coords* coords) { + if (coords->x.size) + array_destroy_float(&coords->x); + if (coords->y.size) + array_destroy_float(&coords->y); + if (coords->dx.size) + array_destroy_float(&coords->dx); + if (coords->dy.size) + array_destroy_float(&coords->dy); +} +void finalize_elt (void *elt) { + switch (_get_element_type(elt)) { + case svg_element_type_linear_gradient: + vkvg_pattern_destroy((VkvgPattern)((svg_element_linear_gradient *)elt)->pattern); + break; + case svg_element_type_radial_gradient: + vkvg_pattern_destroy((VkvgPattern)((svg_element_radial_gradient *)elt)->pattern); + break; + case svg_element_type_text: + finalize_text_coords(&((svg_element_text*)elt)->coords); + case svg_element_type_tspan: + finalize_text_coords(&((svg_element_tspan*)elt)->coords); + break; + } + free(elt); +} + void _store_or_throw(svg_context *const svg, void *elt) { if (svg->currentIdHash) { svg_element_header *id = (svg_element_header *)elt; @@ -572,7 +606,7 @@ void _store_or_throw(svg_context *const svg, void *elt) { array_add_SvgElt(&svg->idList, elt); LOG("SVG: store elemnt: %u type:%u\n", id->hash, id->type); } else { - free(elt); + finalize_elt(elt); } } @@ -1959,17 +1993,9 @@ bool try_parse_svg (svg_context *svg) { parse_children (svg, &attribs, NULL); - for (uint32_t i = 0; i < svg->idList.count; i++) { - switch (_get_element_type(svg->idList.elements[i])) { - case svg_element_type_linear_gradient: - vkvg_pattern_destroy((VkvgPattern)((svg_element_linear_gradient *)svg->idList.elements[i])->pattern); - break; - case svg_element_type_radial_gradient: - vkvg_pattern_destroy((VkvgPattern)((svg_element_radial_gradient *)svg->idList.elements[i])->pattern); - break; - } - free(svg->idList.elements[i]); - } + for (uint32_t i = 0; i < svg->idList.count; i++) + finalize_elt(svg->idList.elements[i]); + array_destroy_SvgElt(&svg->idList); return true; diff --git a/src/svg/vkvg_svg_internal.h b/src/svg/vkvg_svg_internal.h index bf2af9c..223a587 100644 --- a/src/svg/vkvg_svg_internal.h +++ b/src/svg/vkvg_svg_internal.h @@ -113,13 +113,10 @@ typedef struct { svg_unit units; } svg_length_or_percentage; -typedef void (*f_finish) (void*); - typedef struct _svg_element_header{ - uint32_t hash; svg_element_type type; + uint32_t hash; uint32_t xlinkHref; // 0 if unused - f_finish finish; // dispose method or null if none. } svg_element_header; typedef struct { @@ -435,6 +432,7 @@ svg_element_radial_gradient *_new_radial_gradient(); #define SVG_COMMON_SIG svg_context *const svg, SvgPresentationAttributes *const attribs, void *parentData #define SVG_SIG_STACK_ATTRIB svg_context *const svg, SvgPresentationAttributes attribs, void *parentData +void finalize_elt (void *elt); void process_innerText(SVG_COMMON_SIG, const uint8_t * innerText, size_t txt_len); int parse_element(SVG_COMMON_SIG); void parse_attributes(SVG_COMMON_SIG); diff --git a/src/vkvg_context.c b/src/vkvg_context.c index c7bc897..bc0e646 100644 --- a/src/vkvg_context.c +++ b/src/vkvg_context.c @@ -390,7 +390,6 @@ void vkvg_line_to(VkvgContext ctx, float x, float y) { _line_to(ctx, x, y); } - /*static inline float getArcStep(VkvgContext ctx,float radius, float arcAngle) { float sx, sy; vkvg_matrix_get_scale(&ctx->pushConsts.mat, &sx, &sy); @@ -1218,7 +1217,7 @@ void vkvg_load_font_from_memory(VkvgContext ctx, unsigned char* fontBuffer, long fid->fontBuffer = fontBuffer; fid->fontBufSize = fontBufferByteSize;*/ - _select_font_face(ctx, name); + //_select_font_face(ctx, name); } void vkvg_set_font_size(VkvgContext ctx, uint32_t size) { if (vkvg_status(ctx)) diff --git a/src/vkvg_context_internal.c b/src/vkvg_context_internal.c index 47f274b..a9fc268 100644 --- a/src/vkvg_context_internal.c +++ b/src/vkvg_context_internal.c @@ -1946,12 +1946,3 @@ void _draw_full_screen_quad(VkvgContext ctx, vec4* scissor) { vkh_cmd_label_end(ctx->cmd); #endif } - -void _select_font_face(VkvgContext ctx, const char* name) { - uint64_t h = fnv1a_64_str(name); - /*if (ctx->selectedFont == h) - return; - ctx->selectedFont = h;*/ - /*ctx->currentFont = NULL; - ctx->currentFontSize = NULL;*/ -} |