summaryrefslogtreecommitdiffstatsci
diff options
context:
space:
mode:
authorJean-Philippe Bruyère <jp_bruyere@hotmail.com>2026-10-13 16:07:42 +0200
committerJean-Philippe Bruyère <jp_bruyere@hotmail.com>2026-10-13 16:07:42 +0200
commitaa9296a0b81c1cc72d42d5367004d7144766f924 (patch)
treea2ef93a041317f93499f6ef4a4815bafce3604ec
parent2803b4585ea30b0da5efd19bb5f60a386cc1ebf3 (diff)
replace svg array.h with new font array handling
-rw-r--r--src/array.h55
-rw-r--r--src/svg/array.h57
-rw-r--r--src/svg/svg-parse.c46
-rw-r--r--src/svg/vkvg_svg_internal.h15
-rw-r--r--src/vkvg_internal.h50
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"