diff options
| author | Jean-Philippe Bruyère <jp_bruyere@hotmail.com> | 2026-10-13 15:43:35 +0200 |
|---|---|---|
| committer | Jean-Philippe Bruyère <jp_bruyere@hotmail.com> | 2026-10-13 15:43:35 +0200 |
| commit | 2803b4585ea30b0da5efd19bb5f60a386cc1ebf3 (patch) | |
| tree | 5385a247c5f9ac2cc34da1d44e0d96fbe0f7a6f7 | |
| parent | d238e7da22967f8da18e6aa03233417f8554e040 (diff) | |
svg inner text handling, text element wip
| -rw-r--r-- | src/svg/svg-parse.c | 29 | ||||
| -rw-r--r-- | src/svg/vkvg_svg_internal.h | 6 | ||||
| -rw-r--r-- | src/vkvg_fonts.c | 15 | ||||
| -rw-r--r-- | tests/vkvg-svg/svg-viewer.c | 3 |
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; |