From 9150634b87d037ff765c6064a311ffe07877aafe Mon Sep 17 00:00:00 2001 From: sammycage Date: Sat, 12 Dec 2020 01:57:29 +0100 Subject: [PATCH] refactor : plutovg --- 3rdparty/plutovg/plutovg-private.h | 5 +++- 3rdparty/plutovg/plutovg-rle.c | 41 ++++++++++++++++++++---------- 3rdparty/plutovg/plutovg.c | 30 ++++++++++++---------- 3 files changed, 49 insertions(+), 27 deletions(-) diff --git a/3rdparty/plutovg/plutovg-private.h b/3rdparty/plutovg/plutovg-private.h index 3fe69fa..c3d10f7 100644 --- a/3rdparty/plutovg/plutovg-private.h +++ b/3rdparty/plutovg/plutovg-private.h @@ -115,15 +115,18 @@ struct plutovg { plutovg_surface_t* surface; plutovg_state_t* state; plutovg_path_t* path; + plutovg_rle_t* rle; plutovg_rle_t* clippath; plutovg_rect_t clip; }; -plutovg_rle_t* plutovg_rasterize(const plutovg_path_t* path, const plutovg_matrix_t* matrix, const plutovg_rect_t* clip, const plutovg_stroke_data_t* stroke, plutovg_fill_rule_t winding); +plutovg_rle_t* plutovg_rle_create(void); void plutovg_rle_destroy(plutovg_rle_t* rle); +void plutovg_rle_rasterize(plutovg_rle_t* rle, const plutovg_path_t* path, const plutovg_matrix_t* matrix, const plutovg_rect_t* clip, const plutovg_stroke_data_t* stroke, plutovg_fill_rule_t winding); plutovg_rle_t* plutovg_rle_intersection(const plutovg_rle_t* a, const plutovg_rle_t* b); void plutovg_rle_clip_path(plutovg_rle_t* rle, const plutovg_rle_t* clip); plutovg_rle_t* plutovg_rle_clone(const plutovg_rle_t* rle); +void plutovg_rle_clear(plutovg_rle_t* rle); plutovg_dash_t* plutovg_dash_create(double offset, const double* data, int size); plutovg_dash_t* plutovg_dash_clone(const plutovg_dash_t* dash); diff --git a/3rdparty/plutovg/plutovg-rle.c b/3rdparty/plutovg/plutovg-rle.c index 4b6a07d..0472e46 100644 --- a/3rdparty/plutovg/plutovg-rle.c +++ b/3rdparty/plutovg/plutovg-rle.c @@ -157,12 +157,29 @@ static void bbox_callback(int x, int y, int w, int h, void* user) rle->h = h; } -#define SQRT2 1.41421356237309504880 -plutovg_rle_t* plutovg_rasterize(const plutovg_path_t* path, const plutovg_matrix_t* matrix, const plutovg_rect_t* clip, const plutovg_stroke_data_t* stroke, plutovg_fill_rule_t winding) +plutovg_rle_t* plutovg_rle_create(void) { plutovg_rle_t* rle = malloc(sizeof(plutovg_rle_t)); plutovg_array_init(rle->spans); + rle->x = 0; + rle->y = 0; + rle->w = 0; + rle->h = 0; + return rle; +} + +void plutovg_rle_destroy(plutovg_rle_t* rle) +{ + if(rle==NULL) + return; + free(rle->spans.data); + free(rle); +} + +#define SQRT2 1.41421356237309504880 +void plutovg_rle_rasterize(plutovg_rle_t* rle, const plutovg_path_t* path, const plutovg_matrix_t* matrix, const plutovg_rect_t* clip, const plutovg_stroke_data_t* stroke, plutovg_fill_rule_t winding) +{ SW_FT_Raster_Params params; params.flags = SW_FT_RASTER_FLAG_DIRECT | SW_FT_RASTER_FLAG_AA; params.gray_spans = generation_callback; @@ -254,17 +271,6 @@ plutovg_rle_t* plutovg_rasterize(const plutovg_path_t* path, const plutovg_matri sw_ft_grays_raster.raster_render(NULL, ¶ms); sw_ft_outline_destroy(outline); } - - return rle; -} - -void plutovg_rle_destroy(plutovg_rle_t* rle) -{ - if(rle==NULL) - return; - - free(rle->spans.data); - free(rle); } #define MIN(a, b) ((a) < (b) ? (a) : (b)) @@ -396,3 +402,12 @@ plutovg_rle_t* plutovg_rle_clone(const plutovg_rle_t* rle) result->h = rle->h; return result; } + +void plutovg_rle_clear(plutovg_rle_t* rle) +{ + rle->spans.size = 0; + rle->x = 0; + rle->y = 0; + rle->w = 0; + rle->h = 0; +} diff --git a/3rdparty/plutovg/plutovg.c b/3rdparty/plutovg/plutovg.c index 96e4e31..15263ea 100644 --- a/3rdparty/plutovg/plutovg.c +++ b/3rdparty/plutovg/plutovg.c @@ -120,6 +120,7 @@ plutovg_t* plutovg_create(plutovg_surface_t* surface) pluto->surface = plutovg_surface_reference(surface); pluto->state = plutovg_state_create(); pluto->path = plutovg_path_create(); + pluto->rle = plutovg_rle_create(); pluto->clippath = NULL; pluto->clip.x = 0.0; pluto->clip.y = 0.0; @@ -150,6 +151,7 @@ void plutovg_destroy(plutovg_t* pluto) plutovg_surface_destroy(pluto->surface); plutovg_path_destroy(pluto->path); + plutovg_rle_destroy(pluto->rle); plutovg_rle_destroy(pluto->clippath); free(pluto); } @@ -446,7 +448,8 @@ void plutovg_paint(plutovg_t* pluto) plutovg_path_add_rect(path, pluto->clip.x, pluto->clip.y, pluto->clip.w, pluto->clip.h); plutovg_matrix_t matrix; plutovg_matrix_init_identity(&matrix); - pluto->clippath = plutovg_rasterize(path, &matrix, &pluto->clip, NULL, plutovg_fill_rule_non_zero); + pluto->clippath = plutovg_rle_create(); + plutovg_rle_rasterize(pluto->clippath, path, &matrix, &pluto->clip, NULL, plutovg_fill_rule_non_zero); plutovg_path_destroy(path); } @@ -457,32 +460,33 @@ void plutovg_paint(plutovg_t* pluto) void plutovg_fill_preserve(plutovg_t* pluto) { plutovg_state_t* state = pluto->state; - plutovg_rle_t* rle = plutovg_rasterize(pluto->path, &state->matrix, &pluto->clip, NULL, state->winding); - plutovg_rle_clip_path(rle, state->clippath); - plutovg_blend(pluto, rle); - plutovg_rle_destroy(rle); + plutovg_rle_clear(pluto->rle); + plutovg_rle_rasterize(pluto->rle, pluto->path, &state->matrix, &pluto->clip, NULL, state->winding); + plutovg_rle_clip_path(pluto->rle, state->clippath); + plutovg_blend(pluto, pluto->rle); } void plutovg_stroke_preserve(plutovg_t* pluto) { plutovg_state_t* state = pluto->state; - plutovg_rle_t* rle = plutovg_rasterize(pluto->path, &state->matrix, &pluto->clip, &state->stroke, plutovg_fill_rule_non_zero); - plutovg_rle_clip_path(rle, state->clippath); - plutovg_blend(pluto, rle); - plutovg_rle_destroy(rle); + plutovg_rle_clear(pluto->rle); + plutovg_rle_rasterize(pluto->rle, pluto->path, &state->matrix, &pluto->clip, &state->stroke, plutovg_fill_rule_non_zero); + plutovg_rle_clip_path(pluto->rle, state->clippath); + plutovg_blend(pluto, pluto->rle); } void plutovg_clip_preserve(plutovg_t* pluto) { plutovg_state_t* state = pluto->state; - plutovg_rle_t* rle = plutovg_rasterize(pluto->path, &state->matrix, &pluto->clip, NULL, state->winding); if(state->clippath) { - plutovg_rle_clip_path(state->clippath, rle); - plutovg_rle_destroy(rle); + plutovg_rle_clear(pluto->rle); + plutovg_rle_rasterize(pluto->rle, pluto->path, &state->matrix, &pluto->clip, NULL, state->winding); + plutovg_rle_clip_path(state->clippath, pluto->rle); } else { - state->clippath = rle; + state->clippath = plutovg_rle_create(); + plutovg_rle_rasterize(state->clippath, pluto->path, &state->matrix, &pluto->clip, NULL, state->winding); } }