Skip to content

Commit

Permalink
refactor : plutovg
Browse files Browse the repository at this point in the history
  • Loading branch information
sammycage committed Dec 12, 2020
1 parent 6cf1b2e commit 9150634
Show file tree
Hide file tree
Showing 3 changed files with 49 additions and 27 deletions.
5 changes: 4 additions & 1 deletion 3rdparty/plutovg/plutovg-private.h
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand Down
41 changes: 28 additions & 13 deletions 3rdparty/plutovg/plutovg-rle.c
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -254,17 +271,6 @@ plutovg_rle_t* plutovg_rasterize(const plutovg_path_t* path, const plutovg_matri
sw_ft_grays_raster.raster_render(NULL, &params);
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))
Expand Down Expand Up @@ -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;
}
30 changes: 17 additions & 13 deletions 3rdparty/plutovg/plutovg.c
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -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);
}
Expand Down Expand Up @@ -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);
}

Expand All @@ -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);
}
}

0 comments on commit 9150634

Please sign in to comment.