From af6c1d42c5a76a89697ecfddbba73102a28d3e1e Mon Sep 17 00:00:00 2001 From: "Dr.Smile" Date: Fri, 28 Mar 2014 22:17:46 +0400 Subject: Implement fast quad-tree rasterizer in C and x86/SSE2/AVX2 Signed-off-by: Rodger Combs --- libass/ass_render.c | 46 +++++++++++++++++++++++++++++++++++++++++----- 1 file changed, 41 insertions(+), 5 deletions(-) (limited to 'libass/ass_render.c') 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, -- cgit v1.2.3