summaryrefslogtreecommitdiffstatsci
diff options
context:
space:
mode:
authorJean-Philippe Bruyère <jp_bruyere@hotmail.com>2026-10-15 21:56:17 +0200
committerJean-Philippe Bruyère <jp_bruyere@hotmail.com>2026-10-15 21:56:17 +0200
commit0ea75d9f9a84a9fdcb8375512165728aa2820ad7 (patch)
treec85b0c7a1ea0c9a2647e9b5b105dbaf39109e820
parent44a2e03dd1a3d98b215d0a1cba71d16574cc2b6b (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.c54
-rw-r--r--src/svg/vkvg_svg_internal.h6
-rw-r--r--src/vkvg_context.c3
-rw-r--r--src/vkvg_context_internal.c9
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;*/
-}