summaryrefslogtreecommitdiffstats
path: root/libass/ass_render.c
diff options
context:
space:
mode:
authorDr.Smile <vabnick@gmail.com>2014-03-28 22:17:46 +0400
committerRodger Combs <rodger.combs@gmail.com>2014-04-29 11:08:39 -0500
commitaf6c1d42c5a76a89697ecfddbba73102a28d3e1e (patch)
treecdfdf9f331dd7d385cd33af6691f65ba39fe9112 /libass/ass_render.c
parent35d06db7e58054a93bb97bb4e5096baf0272fb31 (diff)
downloadlibass-af6c1d42c5a76a89697ecfddbba73102a28d3e1e.tar.bz2
libass-af6c1d42c5a76a89697ecfddbba73102a28d3e1e.tar.xz
Implement fast quad-tree rasterizer in C and x86/SSE2/AVX2
Signed-off-by: Rodger Combs <rodger.combs@gmail.com>
Diffstat (limited to 'libass/ass_render.c')
-rw-r--r--libass/ass_render.c46
1 files changed, 41 insertions, 5 deletions
diff --git a/libass/ass_render.c b/libass/ass_render.c
index 1221c08..67d1b78 100644
--- a/libass/ass_render.c
+++ b/libass/ass_render.c
@@ -37,6 +37,7 @@
#include "x86/blend_bitmaps.h"
#include "x86/be_blur.h"
+#include "x86/rasterizer.h"
#endif // ASM
@@ -91,6 +92,40 @@ ASS_Renderer *ass_renderer_init(ASS_Library *library)
#endif
priv->restride_bitmap_func = restride_bitmap_c;
+#if CONFIG_RASTERIZER
+#if CONFIG_LARGE_TILES
+ priv->rasterizer.tile_order = 5;
+ #if (defined(__i386__) || defined(__x86_64__)) && CONFIG_ASM
+ priv->rasterizer.fill_solid = avx2 ? ass_fill_solid_tile32_avx2 :
+ (sse2 ? ass_fill_solid_tile32_sse2 : ass_fill_solid_tile32_c);
+ priv->rasterizer.fill_halfplane = avx2 ? ass_fill_halfplane_tile32_avx2 :
+ (sse2 ? ass_fill_halfplane_tile32_sse2 : ass_fill_halfplane_tile32_c);
+ priv->rasterizer.fill_generic = avx2 ? ass_fill_generic_tile32_avx2 :
+ (sse2 ? ass_fill_generic_tile32_sse2 : ass_fill_generic_tile32_c);
+ #else
+ priv->rasterizer.fill_solid = ass_fill_solid_tile32_c;
+ priv->rasterizer.fill_halfplane = ass_fill_halfplane_tile32_c;
+ priv->rasterizer.fill_generic = ass_fill_generic_tile32_c;
+ #endif
+#else
+ priv->rasterizer.tile_order = 4;
+ #if (defined(__i386__) || defined(__x86_64__)) && CONFIG_ASM
+ priv->rasterizer.fill_solid = avx2 ? ass_fill_solid_tile16_avx2 :
+ (sse2 ? ass_fill_solid_tile16_sse2 : ass_fill_solid_tile16_c);
+ priv->rasterizer.fill_halfplane = avx2 ? ass_fill_halfplane_tile16_avx2 :
+ (sse2 ? ass_fill_halfplane_tile16_sse2 : ass_fill_halfplane_tile16_c);
+ priv->rasterizer.fill_generic = avx2 ? ass_fill_generic_tile16_avx2 :
+ (sse2 ? ass_fill_generic_tile16_sse2 : ass_fill_generic_tile16_c);
+ #else
+ priv->rasterizer.fill_solid = ass_fill_solid_tile16_c;
+ priv->rasterizer.fill_halfplane = ass_fill_halfplane_tile16_c;
+ priv->rasterizer.fill_generic = ass_fill_generic_tile16_c;
+ #endif
+#endif
+ priv->rasterizer.outline_error = 16;
+ rasterizer_init(&priv->rasterizer);
+#endif
+
priv->cache.font_cache = ass_font_cache_create();
priv->cache.bitmap_cache = ass_bitmap_cache_create();
priv->cache.composite_cache = ass_composite_cache_create();
@@ -150,6 +185,10 @@ void ass_renderer_done(ASS_Renderer *render_priv)
ass_free_images(render_priv->images_root);
ass_free_images(render_priv->prev_images_root);
+#if CONFIG_RASTERIZER
+ rasterizer_done(&render_priv->rasterizer);
+#endif
+
if (render_priv->state.stroker) {
FT_Stroker_Done(render_priv->state.stroker);
render_priv->state.stroker = 0;
@@ -514,8 +553,7 @@ static void blend_vector_clip(ASS_Renderer *render_priv,
FT_Outline_Translate(outline, trans.x, trans.y);
}
- clip_bm = outline_to_bitmap(render_priv->library,
- render_priv->ftlibrary, outline, 0);
+ clip_bm = outline_to_bitmap(render_priv, outline, 0);
// Add to cache
memset(&v, 0, sizeof(v));
@@ -1258,9 +1296,7 @@ get_bitmap_glyph(ASS_Renderer *render_priv, GlyphInfo *info)
}
// render glyph
- error = outline_to_bitmap3(render_priv->library,
- render_priv->synth_priv,
- render_priv->ftlibrary,
+ error = outline_to_bitmap3(render_priv,
outline, border,
&hash_val.bm, &hash_val.bm_o,
&hash_val.bm_s, info->be,