summaryrefslogtreecommitdiffstatsci
diff options
context:
space:
mode:
authorJean-Philippe Bruyère <jp_bruyere@hotmail.com>2026-10-13 15:43:35 +0200
committerJean-Philippe Bruyère <jp_bruyere@hotmail.com>2026-10-13 15:43:35 +0200
commit2803b4585ea30b0da5efd19bb5f60a386cc1ebf3 (patch)
tree5385a247c5f9ac2cc34da1d44e0d96fbe0f7a6f7
parentd238e7da22967f8da18e6aa03233417f8554e040 (diff)
svg inner text handling, text element wip
-rw-r--r--src/svg/svg-parse.c29
-rw-r--r--src/svg/vkvg_svg_internal.h6
-rw-r--r--src/vkvg_fonts.c15
-rw-r--r--tests/vkvg-svg/svg-viewer.c3
4 files changed, 35 insertions, 18 deletions
diff --git a/src/svg/svg-parse.c b/src/svg/svg-parse.c
index d6331ef..90542e8 100644
--- a/src/svg/svg-parse.c
+++ b/src/svg/svg-parse.c
@@ -119,7 +119,7 @@
//=== TEXT ===
#define PREPROC_TEXT vkvg_save(svg->ctx); \
- parentData = _new_path();
+ parentData = _new_text();
#define PROCESS_TEXT process_element(svg, &attribs, parentData, false);
#define POSTPROC_TEXT vkvg_restore(svg->ctx);
@@ -1581,6 +1581,22 @@ void process_svg(svg_context *const svg) {
vkvg_scale(svg->ctx, xScale, yScale);
}
+void process_innerText(SVG_COMMON_SIG, const uint8_t * innerText, size_t txt_len) {
+ if (!parentData)
+ return;
+ const uint8_t *const buff_end = innerText + txt_len;
+
+ innerText = skip_whitespaces(innerText, buff_end);
+
+ /*if (innerText < buff_end)
+ LOG("%p innerText: %.*s\n",parentData, (int)(buff_end - innerText), innerText);*/
+
+ svg_element_type eltType = _get_element_type(parentData);
+ if (eltType == svg_element_type_text) {
+ LOG("Text innerText: %.*s\n", (int)(buff_end - innerText), innerText);
+ }
+}
+
int try_parse_attibute(svg_context *const svg) {
const uint8_t *buff = svg->style ? svg->style : svg->buff_ptr;
const uint8_t *const buff_end = svg->style ? svg->style_end : svg->buff_end;
@@ -1656,7 +1672,6 @@ int parse_element(SVG_COMMON_SIG) {
if (*buff == '>') {
//read element childrens
svg->buff_ptr = ++buff;
- svg->text = svg->buff_ptr;//if innerText, it starts here
parse_children(svg, attribs, parentData);
buff = svg->buff_ptr;
return 1;
@@ -1685,6 +1700,7 @@ int parse_children(SVG_COMMON_SIG) {
const uint8_t *const ns = svg->ns;
const uint8_t *elt = svg->elt;
const size_t ns_len = svg->ns_len;
+ const uint8_t *innerText = buff;
size_t elt_len = svg->elt_len;
//svg->ns_len = 0;
uint8_t c = 0;
@@ -1692,7 +1708,10 @@ int parse_children(SVG_COMMON_SIG) {
while (buff < buff_end) {
if (*buff == '<') {
//handle inner text
- size_t txt_len = svg->text - buff;
+ size_t txt_len = buff - innerText;
+ if (txt_len > 0) {
+ process_innerText(svg, attribs, parentData, innerText, txt_len);
+ }
if (++buff == buff_end)
return -1;
c = *buff;
@@ -1721,6 +1740,7 @@ int parse_children(SVG_COMMON_SIG) {
buff = svg->buff_ptr;
svg->currentIdHash = 0;
svg->currentXlinkHref = 0;
+ innerText = buff;
continue;
} else if (c == '!') {
if (++buff == buff_end)
@@ -1782,8 +1802,7 @@ int parse_children(SVG_COMMON_SIG) {
LOGE("parse_children: malformed xml\n");
return -1;
} else {
-
- buff++;
+ buff++;//inner text
}
}
svg->buff_ptr = buff + 1;
diff --git a/src/svg/vkvg_svg_internal.h b/src/svg/vkvg_svg_internal.h
index 13d8285..5996aad 100644
--- a/src/svg/vkvg_svg_internal.h
+++ b/src/svg/vkvg_svg_internal.h
@@ -19,7 +19,7 @@
#define CLR_YELLOW "\x1b[33m"
#define CLR_BLUE "\x1b[34m"
-//#define DEBUG_LOG
+#define DEBUG_LOG
#ifdef LOG
#undef LOG
#endif
@@ -334,7 +334,7 @@ typedef struct _svg_context {
const uint8_t *elt;
const uint8_t *att;
const uint8_t *value;
- const uint8_t *text;
+ //const uint8_t *text;
const uint8_t *style;
const uint8_t *style_end;
size_t ns_len;
@@ -405,10 +405,10 @@ CREATE_CTOR_ELT(gradient_stop)
svg_element_linear_gradient *_new_linear_gradient();
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 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);
int parse_children(SVG_COMMON_SIG);
diff --git a/src/vkvg_fonts.c b/src/vkvg_fonts.c
index bbaba7d..f49e3d3 100644
--- a/src/vkvg_fonts.c
+++ b/src/vkvg_fonts.c
@@ -659,10 +659,10 @@ bool try_get_or_create_font_face_from_query (VkvgDevice dev, const char* querySt
FT_Face ftface = (*face)->face;
FT_MM_Var* mm_var = NULL;
if (!FT_Get_MM_Var(ftface, &mm_var)) {
- FT_Fixed* coords = (FT_Fixed*)malloc(sizeof(FT_Fixed) * mm_var->num_axis);
int num_axes_retrieved = 0;
FcChar8* var_string = NULL;
if (FcPatternGetString(font, FC_FONT_VARIATIONS, 0, &var_string) == FcResultMatch) {
+ FT_Fixed* coords = (FT_Fixed*)malloc(sizeof(FT_Fixed) * mm_var->num_axis);
for (FT_UInt i = 0; i < mm_var->num_axis; i++) {
coords[i] = mm_var->axis[i].def;
}
@@ -689,9 +689,8 @@ bool try_get_or_create_font_face_from_query (VkvgDevice dev, const char* querySt
}
*pCoords = coords;
(*face)->numAxis = mm_var->num_axis;
- FT_Done_MM_Var(cache->library, mm_var);
}
-
+ FT_Done_MM_Var(cache->library, mm_var);
}
#endif
@@ -718,6 +717,7 @@ bool try_get_font_size (FontFace face, uint32_t pt26_6, signed long* coords, Vkv
if (f->coords[axe] != coords[axe])
return false;
}
+ free(coords);//coords matche, free new coords
*font = f;
return true;
}
@@ -1007,15 +1007,16 @@ VkvgFont _create_font_from_face (VkvgDevice dev, FontFace face, float pointSize,
#ifdef VKVG_USE_FREETYPE
if (dev->threadAware)
mtx_lock(&font->face->mutex);
- font->coords = coords;
+ if (face->numAxis && coords)
+ font->coords = coords;
font->charSize = (uint32_t)(pointSize * 64.f);;
if (!(face->face->face_flags & FT_FACE_FLAG_SCALABLE) || !(face->face->face_flags & FT_FACE_FLAG_SFNT)) {
char tmp[1024];
ft_face_flags_to_string (face->face->face_flags, tmp, 1024);
LOGW("Unsuported font flags: %s\n", tmp);
- free(font);
if (dev->threadAware)
mtx_lock(&font->face->mutex);
+ free(font);
return (VkvgFont)&_vkvg_status_null_pointer;
} else {
char tmp[1024];
@@ -1077,8 +1078,8 @@ VkvgFont vkvg_font_create (VkvgDevice dev, const char* query, float pointSize) {
uint32_t pt26_6 = (uint32_t)(pointSize * 64.f);
VkvgFont font = NULL;
FontFace face = NULL;
- signed long* coords;
- unsigned int numAxis;
+ signed long* coords = NULL;
+ unsigned int numAxis = 0;
if (try_get_or_create_font_face_from_query(dev, query, &face, &coords)) {
if (try_get_font_size(face, pt26_6, coords, &font)) {
vkvg_font_reference(font);
diff --git a/tests/vkvg-svg/svg-viewer.c b/tests/vkvg-svg/svg-viewer.c
index 18ec876..450157b 100644
--- a/tests/vkvg-svg/svg-viewer.c
+++ b/tests/vkvg-svg/svg-viewer.c
@@ -58,9 +58,6 @@ static int drawnIcons = 0;
#define DT_DIR 4
#endif
-
-
-
uint32_t count_svg_files(DIR* pDir) {
rewinddir(pDir);
struct dirent* de;