diff options
author | Dr.Smile <vabnick@gmail.com> | 2014-11-23 20:01:03 +0300 |
---|---|---|
committer | Dr.Smile <vabnick@gmail.com> | 2014-11-23 20:01:03 +0300 |
commit | 507ae26358a491c7f665d32a3e07c2f176d152e9 (patch) | |
tree | e7827a525028d594eb4d3a35ea80a6a9f139da11 /libass/ass_bitmap.c | |
parent | f3f8230189634e0ce4ffe06c1e380bea829d85d9 (diff) | |
download | libass-507ae26358a491c7f665d32a3e07c2f176d152e9.tar.bz2 libass-507ae26358a491c7f665d32a3e07c2f176d152e9.tar.xz |
Replace FT_Outline with ASS_Outline
Diffstat (limited to 'libass/ass_bitmap.c')
-rw-r--r-- | libass/ass_bitmap.c | 45 |
1 files changed, 41 insertions, 4 deletions
diff --git a/libass/ass_bitmap.c b/libass/ass_bitmap.c index 0eb4577..01bf013 100644 --- a/libass/ass_bitmap.c +++ b/libass/ass_bitmap.c @@ -279,7 +279,7 @@ Bitmap *copy_bitmap(const Bitmap *src) #if CONFIG_RASTERIZER Bitmap *outline_to_bitmap(ASS_Renderer *render_priv, - FT_Outline *outline, int bord) + ASS_Outline *outline, int bord) { ASS_Rasterizer *rst = &render_priv->rasterizer; if (!rasterizer_set_outline(rst, outline)) { @@ -343,8 +343,8 @@ Bitmap *outline_to_bitmap(ASS_Renderer *render_priv, #else -Bitmap *outline_to_bitmap(ASS_Renderer *render_priv, - FT_Outline *outline, int bord) +static Bitmap *outline_to_bitmap_ft(ASS_Renderer *render_priv, + FT_Outline *outline, int bord) { Bitmap *bm; int w, h; @@ -406,6 +406,42 @@ Bitmap *outline_to_bitmap(ASS_Renderer *render_priv, return bm; } +Bitmap *outline_to_bitmap(ASS_Renderer *render_priv, + ASS_Outline *outline, int bord) +{ + size_t n_points = outline->n_points; + if (n_points > SHRT_MAX) { + ass_msg(render_priv->library, MSGL_WARN, "Too many outline points: %d", + outline->n_points); + n_points = SHRT_MAX; + } + + size_t n_contours = FFMIN(outline->n_contours, SHRT_MAX); + short contours_small[EFFICIENT_CONTOUR_COUNT]; + short *contours = contours_small; + short *contours_large = NULL; + if (n_contours > EFFICIENT_CONTOUR_COUNT) { + contours_large = malloc(n_contours * sizeof(short)); + if (!contours_large) + return NULL; + contours = contours_large; + } + for (size_t i = 0; i < n_contours; ++i) + contours[i] = FFMIN(outline->contours[i], n_points - 1); + + FT_Outline ftol; + ftol.n_points = n_points; + ftol.n_contours = n_contours; + ftol.points = outline->points; + ftol.tags = outline->tags; + ftol.contours = contours; + ftol.flags = 0; + + Bitmap *bm = outline_to_bitmap_ft(render_priv, &ftol, bord); + free(contours_large); + return bm; +} + #endif /** @@ -671,7 +707,8 @@ void be_blur_c(uint8_t *buf, intptr_t w, } } -int outline_to_bitmap3(ASS_Renderer *render_priv, FT_Outline *outline, FT_Outline *border, +int outline_to_bitmap3(ASS_Renderer *render_priv, + ASS_Outline *outline, ASS_Outline *border, Bitmap **bm_g, Bitmap **bm_o, Bitmap **bm_s, int be, double blur_radius, FT_Vector shadow_offset, int border_style, int border_visible) |