diff options
| author | Jean-Philippe Bruyère <jp_bruyere@hotmail.com> | 2026-10-13 16:07:42 +0200 |
|---|---|---|
| committer | Jean-Philippe Bruyère <jp_bruyere@hotmail.com> | 2026-10-13 16:07:42 +0200 |
| commit | aa9296a0b81c1cc72d42d5367004d7144766f924 (patch) | |
| tree | a2ef93a041317f93499f6ef4a4815bafce3604ec | |
| parent | 2803b4585ea30b0da5efd19bb5f60a386cc1ebf3 (diff) | |
replace svg array.h with new font array handling
| -rw-r--r-- | src/array.h | 55 | ||||
| -rw-r--r-- | src/svg/array.h | 57 | ||||
| -rw-r--r-- | src/svg/svg-parse.c | 46 | ||||
| -rw-r--r-- | src/svg/vkvg_svg_internal.h | 15 | ||||
| -rw-r--r-- | src/vkvg_internal.h | 50 |
5 files changed, 87 insertions, 136 deletions
diff --git a/src/array.h b/src/array.h new file mode 100644 index 0000000..fc3a8ce --- /dev/null +++ b/src/array.h @@ -0,0 +1,55 @@ +#ifndef ARRAY_H_INCLUDED +#define ARRAY_H_INCLUDED + +#include <stddef.h> + +#define CTOR_ARRAY_EXP(type, expansion) \ +typedef struct { \ + uint32_t count; \ + uint32_t size; \ + type *elements; \ +} array_##type; \ +static array_##type array_create_##type (uint32_t reservedSize) { \ + type *elts = (type*)malloc(reservedSize * sizeof(type)); \ + return (array_##type) {0, reservedSize, elts}; \ +} \ +static int array_add_##type (array_##type* arr, type elt) { \ + if (arr->size <= arr->count) { \ + uint32_t newSize = arr->size expansion; \ + type *elts = (type*)realloc(arr->elements, newSize * sizeof(type)); \ + if (elts == NULL) \ + return -1; \ + arr->elements = elts; \ + arr->size = newSize; \ + } \ + arr->elements[arr->count++] = elt; \ + return arr->count - 1; \ +} \ +static type* array_last_##type (array_##type* arr) { \ + if (!arr->count) \ + return NULL; \ + return &arr->elements[arr->count - 1]; \ +} \ +static void array_destroy_##type (array_##type* arr) { \ + free(arr->elements); \ + arr->elements = NULL; \ + arr->count = 0; \ + arr->size = 0; \ +} +#define ARRAY_DEL_ELT(type) \ +static void array_del_##type (array_##type* arr, type elt) { \ + uint32_t i; \ + for (i = 0; i < arr->count; i++) { \ + if (arr->elements[i] == elt) \ + break; \ + } \ + if (i == arr->count) { \ + return; \ + } \ + if (i < arr->count - 1) \ + memmove (&arr->elements[i], &arr->elements[i + 1], (arr->count - i - 1) * sizeof(type)); \ + arr->count--; \ +} + +#define CTOR_ARRAY(type) CTOR_ARRAY_EXP(type,* 2) +#endif diff --git a/src/svg/array.h b/src/svg/array.h deleted file mode 100644 index f9b941f..0000000 --- a/src/svg/array.h +++ /dev/null @@ -1,57 +0,0 @@ -#ifndef ARRAY_H_INCLUDED -#define ARRAY_H_INCLUDED - -#include <stdint.h> -#include <stdlib.h> -#include <string.h> - -#ifndef ARRAY_ELASTICITY -#define ARRAY_ELASTICITY 10 -#endif -#ifndef ARRAY_INIT -#define ARRAY_INIT 4 -#endif -#ifndef ARRAY_ELEMENT_TYPE -#define ARRAY_ELEMENT_TYPE void * -#endif - -typedef struct _array_t { - uint32_t count; - uint32_t size; - ARRAY_ELEMENT_TYPE *elements; -} array_t; - -struct _array_t *array_create(); -void array_destroy(struct _array_t *arr); -void array_clean(struct _array_t *arr); -void array_add(struct _array_t *arr, ARRAY_ELEMENT_TYPE element); - -#ifdef ARRAY_IMPLEMENTATION -array_t *array_create() { - array_t *arr = (array_t *)malloc(sizeof(array_t)); - arr->elements = (ARRAY_ELEMENT_TYPE *)malloc(ARRAY_INIT * sizeof(ARRAY_ELEMENT_TYPE)); - arr->count = 0; - arr->size = ARRAY_INIT; - return arr; -} - -void array_destroy(array_t *arr) { - free(arr->elements); - free(arr); -} - -void array_add(array_t *arr, ARRAY_ELEMENT_TYPE element) { - if (arr->size == arr->count) { - arr->size += ARRAY_ELASTICITY; - arr->elements = (ARRAY_ELEMENT_TYPE *)realloc(arr->elements, (arr->size) * sizeof(ARRAY_ELEMENT_TYPE)); - } - // memcpy (&arr->elements[arr->count], &element, sizeof (ARRAY_ELEMENT_TYPE)); - arr->elements[arr->count] = element; - arr->count++; -} - -void array_reset(array_t *arr) { - arr->count = 0; -} -#endif -#endif diff --git a/src/svg/svg-parse.c b/src/svg/svg-parse.c index 90542e8..1ebdf4c 100644 --- a/src/svg/svg-parse.c +++ b/src/svg/svg-parse.c @@ -10,11 +10,7 @@ #include <immintrin.h> -#define ARRAY_INIT 8 -#define ARRAY_ELEMENT_TYPE void * -#define ARRAY_IMPLEMENTATION -#include "array.h" //#define PREPROC_SVG #define PROCESS_SVG \ @@ -135,10 +131,9 @@ rg->id.hash = svg->currentIdHash; \ rg->id.xlinkHref = svg->currentXlinkHref; \ LOG("SVG: store pattern id:%u href:%u\n", rg->id.hash, rg->id.xlinkHref); \ - if (rg->hasTransform) \ - vkvg_pattern_set_matrix(rg->pattern, &rg->transform); \ - array_add(svg->idList, rg); - + if (rg->hasTransform) \ + vkvg_pattern_set_matrix(rg->pattern, &rg->transform); \ + array_add_SvgElt(&svg->idList, rg); #define SVG_ATT_LINEARGRADIENT_X1 try_parse_length_or_percentage(svg, &(CAST(linear_gradient)->x1)); #define SVG_ATT_LINEARGRADIENT_Y1 try_parse_length_or_percentage(svg, &(CAST(linear_gradient)->y1)); #define SVG_ATT_LINEARGRADIENT_X2 try_parse_length_or_percentage(svg, &(CAST(linear_gradient)->x2)); @@ -161,16 +156,16 @@ //= RADIAL GRADIENT = #define PREPROC_RADIALGRADIENT \ parentData = _new_radial_gradient(); -#define PROCESS_RADIALGRADIENT \ +#define PROCESS_RADIALGRADIENT \ CASTELT(rg,radial_gradient,parentData); \ rg->pattern = \ - vkvg_pattern_create_radial(rg->fx.number, rg->fy.number, 0, rg->cx.number, rg->cy.number, rg->r.number); \ + vkvg_pattern_create_radial(rg->fx.number, rg->fy.number, 0, rg->cx.number, rg->cy.number, rg->r.number); \ rg->id.hash = svg->currentIdHash; \ rg->id.xlinkHref = svg->currentXlinkHref; \ LOG("store pattern id:%u href:%u\n", rg->id.hash, rg->id.xlinkHref); \ - if (rg->hasTransform) \ - vkvg_pattern_set_matrix(rg->pattern, &rg->transform); \ - array_add(svg->idList, rg); + if (rg->hasTransform) \ + vkvg_pattern_set_matrix(rg->pattern, &rg->transform); \ + array_add_SvgElt(&svg->idList, rg); #define SVG_ATT_RADIALGRADIENT_CX try_parse_length_or_percentage(svg, &(CAST(radial_gradient)->cx)); #define SVG_ATT_RADIALGRADIENT_CY try_parse_length_or_percentage(svg, &(CAST(radial_gradient)->cy)); @@ -524,9 +519,9 @@ bool try_parse_flags(const uint8_t **buff_ptr, const uint8_t *const restrict buf } bool try_find_by_id(svg_context *const svg, uint32_t hash, void **elt) { *elt = NULL; - for (uint32_t i = 0; i < svg->idList->count; i++) { - if (_get_element_hash(svg->idList->elements[i]) == hash) { - *elt = svg->idList->elements[i]; + for (uint32_t i = 0; i < svg->idList.count; i++) { + if (_get_element_hash(svg->idList.elements[i]) == hash) { + *elt = svg->idList.elements[i]; return true; } } @@ -536,7 +531,7 @@ void _store_or_throw(svg_context *const svg, void *elt) { if (svg->currentIdHash) { svg_element_header *id = (svg_element_header *)elt; id->hash = svg->currentIdHash; - array_add(svg->idList, elt); + array_add_SvgElt(&svg->idList, elt); LOG("SVG: store elemnt: %u type:%u\n", id->hash, id->type); } else { free(elt); @@ -1588,9 +1583,6 @@ void process_innerText(SVG_COMMON_SIG, const uint8_t * innerText, size_t 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); @@ -1819,7 +1811,7 @@ void vkvg_svg_get_dimensions(VkvgSvg svg, uint32_t *width, uint32_t *height) { } bool try_parse_svg (svg_context *svg) { - svg->idList = array_create(); + svg->idList = array_create_SvgElt(10); svg->preserveAspectRatio = true; svg->width = (svg_length_or_percentage) {100.0f, svg_unit_percentage}; svg->height = (svg_length_or_percentage) {100.0f, svg_unit_percentage}; @@ -1847,18 +1839,18 @@ 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])) { + 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); + 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); + vkvg_pattern_destroy((VkvgPattern)((svg_element_radial_gradient *)svg->idList.elements[i])->pattern); break; } - free(svg->idList->elements[i]); + free(svg->idList.elements[i]); } - array_destroy(svg->idList); + array_destroy_SvgElt(&svg->idList); return true; } diff --git a/src/svg/vkvg_svg_internal.h b/src/svg/vkvg_svg_internal.h index 5996aad..94d4364 100644 --- a/src/svg/vkvg_svg_internal.h +++ b/src/svg/vkvg_svg_internal.h @@ -4,14 +4,18 @@ #include <stdint.h> #include <stdio.h> #include <stddef.h> +#include <stdlib.h> +#include <string.h> #include "svg_elt_gperf.h" #include "svg_att_gperf.h" #include "svg_colors_gperf.h" #include "array.h" + #include "vkvg.h" + // 1. Define ANSI Color Codes #define CLR_RESET "\x1b[0m" #define CLR_RED "\x1b[31m" @@ -19,7 +23,7 @@ #define CLR_YELLOW "\x1b[33m" #define CLR_BLUE "\x1b[34m" -#define DEBUG_LOG +//#define DEBUG_LOG #ifdef LOG #undef LOG #endif @@ -109,7 +113,7 @@ typedef struct { svg_unit units; } svg_length_or_percentage; -typedef struct { +typedef struct _svg_element_header{ uint32_t hash; svg_element_type type; uint32_t xlinkHref; // 0 if unused @@ -326,6 +330,10 @@ typedef struct { enum prevCmd { none, quad, cubic }; +typedef void* SvgElt; + +CTOR_ARRAY(SvgElt) + typedef struct _svg_context { const uint8_t *buff_ptr; const uint8_t *buff_end; @@ -370,7 +378,8 @@ typedef struct _svg_context { uint32_t renderOnlyIdHash; uint32_t currentIdHash; uint32_t currentXlinkHref; - array_t *idList; + + array_SvgElt idList; /*long currentTagStartPos;*/ SvgEltTokId curEltType; } svg_context; diff --git a/src/vkvg_internal.h b/src/vkvg_internal.h index ff592f0..cdffdb5 100644 --- a/src/vkvg_internal.h +++ b/src/vkvg_internal.h @@ -132,7 +132,7 @@ static inline uint64_t fnv1a_64_str(const char *const restrict str) { #include "deps/tinycthread.h" #include "cross_os.h" - +#include "array.h" #ifdef LOG #undef LOG #endif @@ -160,55 +160,7 @@ static inline uint64_t fnv1a_64_str(const char *const restrict str) { #define VKVG_FENCE_TIMEOUT 30000000000 // #define VKVG_FENCE_TIMEOUT 10000 -#define CTOR_ARRAY_EXP(type, expansion) \ -typedef struct { \ - uint32_t count; \ - uint32_t size; \ - type *elements; \ -} array_##type; \ -static array_##type array_create_##type (uint32_t reservedSize) { \ - type *elts = (type*)malloc(reservedSize * sizeof(type)); \ - return (array_##type) {0, reservedSize, elts}; \ -} \ -static int array_add_##type (array_##type* arr, type elt) { \ - if (arr->size <= arr->count) { \ - uint32_t newSize = arr->size expansion; \ - type *elts = (type*)realloc(arr->elements, newSize * sizeof(type)); \ - if (elts == NULL) \ - return -1; \ - arr->elements = elts; \ - arr->size = newSize; \ - } \ - arr->elements[arr->count++] = elt; \ - return arr->count - 1; \ -} \ -static type* array_last_##type (array_##type* arr) { \ - if (!arr->count) \ - return NULL; \ - return &arr->elements[arr->count - 1]; \ -} \ -static void array_destroy_##type (array_##type* arr) { \ - free(arr->elements); \ - arr->elements = NULL; \ - arr->count = 0; \ - arr->size = 0; \ -} -#define ARRAY_DEL_ELT(type) \ -static void array_del_##type (array_##type* arr, type elt) { \ - uint32_t i; \ - for (i = 0; i < arr->count; i++) { \ - if (arr->elements[i] == elt) \ - break; \ - } \ - if (i == arr->count) { \ - return; \ - } \ - if (i < arr->count - 1) \ - memmove (&arr->elements[i], &arr->elements[i + 1], (arr->count - i - 1) * sizeof(type)); \ - arr->count--; \ -} -#define CTOR_ARRAY(type) CTOR_ARRAY_EXP(type,* 2) #include "vectors.h" |