fix: shrink buffers when unused fraction gets too large

This commit is contained in:
2026-03-10 14:48:55 +00:00
parent 2d6746c99c
commit 143a33558d
9 changed files with 229 additions and 215 deletions

View File

@@ -17,6 +17,11 @@ void vektor_polyline_add_point(VektorPolyline* pl, V2 point) {
pl->points = realloc(pl->points, sizeof(V2) * pl->capacity);
}
pl->points[pl->count++] = point;
if (pl->count <= pl->capacity / 4) {
pl->capacity /= 2;
pl->points = realloc(pl->points, sizeof(V2) * pl->capacity);
}
}
void vektor_polyline_free(VektorPolyline* pl) {
@@ -40,6 +45,11 @@ void vektor_polygon_add_point(VektorPolygon* pg, V2 point) {
pg->points = realloc(pg->points, sizeof(V2) * pg->capacity);
}
pg->points[pg->count++] = point;
if (pg->count <= pg->capacity / 4) {
pg->capacity /= 2;
pg->points = realloc(pg->points, sizeof(V2) * pg->capacity);
}
}
void vektor_polygon_free(VektorPolygon* pg) {
@@ -63,9 +73,7 @@ void vektor_rectangle_set_start(VektorRectangle* rct, V2 point) {
rct->start = point;
}
void vektor_rectangle_free(VektorRectangle* rct) {
free(rct);
}
void vektor_rectangle_free(VektorRectangle* rct) { free(rct); }
void vektor_shapebuffer_add_shape(VektorShapeBuffer* buffer,
VektorShape shape) {
@@ -75,6 +83,12 @@ void vektor_shapebuffer_add_shape(VektorShapeBuffer* buffer,
realloc(buffer->shapes, sizeof(VektorShape) * buffer->capacity);
}
buffer->shapes[buffer->count++] = shape;
if (buffer->count <= buffer->capacity / 4) {
buffer->capacity /= 2;
buffer->shapes =
realloc(buffer->shapes, sizeof(VektorShape) * buffer->capacity);
}
}
VektorBBox vektor_polyline_get_bbox(VektorPrimitive prim) {
@@ -136,17 +150,21 @@ VektorBBox vektor_primitive_get_bbox(VektorPrimitive prim) {
}
bool vektor_bbox_isinside(VektorBBox bbox, V2 point) {
return point.x >= bbox.min.x && point.y >= bbox.min.y
&& point.x <= bbox.max.x && point.y <= bbox.max.y;
return point.x >= bbox.min.x && point.y >= bbox.min.y &&
point.x <= bbox.max.x && point.y <= bbox.max.y;
}
VektorShape vektor_shape_new(VektorPrimitive prim, VektorStyle style,
int z_index) {
return (VektorShape){.primitive = prim, .style = style, .z_index = z_index, .bbox=vektor_primitive_get_bbox(prim)};
return (VektorShape){.primitive = prim,
.style = style,
.z_index = z_index,
.bbox = vektor_primitive_get_bbox(prim)};
}
void vektor_shapes_update_bbox(VektorShapeBuffer* buffer) {
for (size_t i = 0; i < buffer->count; i++) {
buffer->shapes[i].bbox = vektor_primitive_get_bbox(buffer->shapes[i].primitive);
buffer->shapes[i].bbox =
vektor_primitive_get_bbox(buffer->shapes[i].primitive);
}
}

View File

@@ -14,7 +14,7 @@ void vektor_edgebuffer_add_edge(EdgeBuffer* buffer, Edge edge) {
}
void vektor_polyline_tessellate(EdgeBuffer* buffer, VektorPolyline* line,
size_t j) {
size_t j) {
for (size_t i = 0; i + 1 < line->count; i++) {
vektor_edgebuffer_add_edge(
buffer, (Edge){line->points[i], line->points[i + 1], 0, j});
@@ -22,22 +22,26 @@ void vektor_polyline_tessellate(EdgeBuffer* buffer, VektorPolyline* line,
}
void vektor_polygon_tessellate(EdgeBuffer* buffer, VektorPolygon* polygon,
size_t j) {
size_t j) {
for (size_t i = 0; i + 1 < polygon->count; i++) {
vektor_edgebuffer_add_edge(
buffer, (Edge){polygon->points[i], polygon->points[i + 1], 0, j});
}
vektor_edgebuffer_add_edge(
buffer, (Edge){polygon->points[polygon->count - 1], polygon->points[0], 0, j});
buffer,
(Edge){polygon->points[polygon->count - 1], polygon->points[0], 0, j});
}
void vektor_rectangle_tessellate(EdgeBuffer* buffer, VektorRectangle* rct, size_t j) {
if (vec2_equals(rct->end, rct->start)) {return;}
void vektor_rectangle_tessellate(EdgeBuffer* buffer, VektorRectangle* rct,
size_t j) {
if (vec2_equals(rct->end, rct->start)) {
return;
}
Edge top = (Edge){rct->start, (V2){rct->end.x, rct->start.y}, 0, j };
Edge top = (Edge){rct->start, (V2){rct->end.x, rct->start.y}, 0, j};
Edge right = (Edge){(V2){rct->end.x, rct->start.y}, rct->end, 0, j};
Edge bottom = (Edge){(V2){rct->start.x, rct->end.y}, rct->end, 0, j};
Edge left = (Edge){rct->start, (V2){rct->start.x, rct->end.y}, 0, j };
Edge left = (Edge){rct->start, (V2){rct->start.x, rct->end.y}, 0, j};
vektor_edgebuffer_add_edge(buffer, top);
vektor_edgebuffer_add_edge(buffer, right);
@@ -72,7 +76,8 @@ void vektor_rasterize(VertexBuffer* vb, VektorShapeBuffer* shapes) {
vektor_edges_to_triangles(vb, &edges, shapes);
}
void vektor_vb_add_triangle(VertexBuffer* vb, V2 v0, V2 v1, V2 v2, VektorColor color) {
void vektor_vb_add_triangle(VertexBuffer* vb, V2 v0, V2 v1, V2 v2,
VektorColor color) {
if (vb->count + 3 >= vb->capacity) {
vb->capacity = vb->capacity ? vb->capacity * 2 : 8;
vb->vertices = realloc(vb->vertices, sizeof(Vertex) * vb->capacity);
@@ -80,6 +85,11 @@ void vektor_vb_add_triangle(VertexBuffer* vb, V2 v0, V2 v1, V2 v2, VektorColor c
vb->vertices[vb->count++] = (Vertex){v0, color};
vb->vertices[vb->count++] = (Vertex){v1, color};
vb->vertices[vb->count++] = (Vertex){v2, color};
if (vb->count <= vb->capacity / 4) {
vb->capacity /= 2;
vb->vertices = realloc(vb->vertices, sizeof(Vertex) * vb->capacity);
}
}
void vektor_vb_add_quad(VertexBuffer* vb, V2 a, V2 b, VektorColor color) {
@@ -117,9 +127,9 @@ void vektor_edge_to_triangles(VertexBuffer* vb, Edge e,
V2 v3 = {e.p2.x - px, e.p2.y - py};
vektor_vb_add_triangle(vb, v0, v1, v2,
shape_buffer->shapes[e.shape_id].style.stroke_color);
shape_buffer->shapes[e.shape_id].style.stroke_color);
vektor_vb_add_triangle(vb, v2, v1, v3,
shape_buffer->shapes[e.shape_id].style.stroke_color);
shape_buffer->shapes[e.shape_id].style.stroke_color);
}
void vektor_edges_to_triangles(VertexBuffer* vb, EdgeBuffer* edges,

View File

@@ -23,9 +23,12 @@ typedef struct {
void vektor_edgebuffer_add_edge(EdgeBuffer* edges, Edge edge);
void vektor_polyline_tessellate(EdgeBuffer* edges, VektorPolyline* line, size_t i);
void vektor_polygon_tessellate(EdgeBuffer* buffer, VektorPolygon* polygon, size_t i);
void vektor_rectangle_tessellate(EdgeBuffer* buffer, VektorRectangle* rct, size_t i);
void vektor_polyline_tessellate(EdgeBuffer* edges, VektorPolyline* line,
size_t i);
void vektor_polygon_tessellate(EdgeBuffer* buffer, VektorPolygon* polygon,
size_t i);
void vektor_rectangle_tessellate(EdgeBuffer* buffer, VektorRectangle* rct,
size_t i);
typedef struct {
V2 coords;
@@ -38,7 +41,8 @@ typedef struct {
size_t capacity;
} VertexBuffer;
void vektor_vb_add_triangle(VertexBuffer* vb, V2 v0, V2 v1, V2 v2, VektorColor color);
void vektor_vb_add_triangle(VertexBuffer* vb, V2 v0, V2 v1, V2 v2,
VektorColor color);
void vektor_vb_add_quad(VertexBuffer* vb, V2 v0, V2 v1, VektorColor color);
void vektor_edge_to_triangles(VertexBuffer* vb, Edge e,