From 146f3c52b50cde7d356e904858ac9aad7fa6710a Mon Sep 17 00:00:00 2001 From: Subhransu Mohanty Date: Mon, 17 Aug 2015 13:13:38 +0900 Subject: [PATCH] ector: now software rasterizer allocates memory on stack to work in multi threading env. Signed-off-by: Cedric BAIL --- .../software/ector_software_rasterizer.c | 5 -- src/lib/ector/software/sw_ft_raster.c | 59 ++++++------------- 2 files changed, 17 insertions(+), 47 deletions(-) diff --git a/src/lib/ector/software/ector_software_rasterizer.c b/src/lib/ector/software/ector_software_rasterizer.c index d98a8dc54a..47a0cae07d 100644 --- a/src/lib/ector/software/ector_software_rasterizer.c +++ b/src/lib/ector/software/ector_software_rasterizer.c @@ -304,14 +304,10 @@ _adjust_span_fill_methods(Span_Data *spdata) } } - - void ector_software_rasterizer_init(Software_Rasterizer *rasterizer) { // initialize the rasterizer and stroker - unsigned char* renderPool = (unsigned char*) malloc(1024 * 100); sw_ft_grays_raster.raster_new(&rasterizer->raster); - sw_ft_grays_raster.raster_reset(rasterizer->raster, renderPool, 1024*100); SW_FT_Stroker_New(&rasterizer->stroker); SW_FT_Stroker_Set(rasterizer->stroker, 1<<6,SW_FT_STROKER_LINECAP_BUTT,SW_FT_STROKER_LINEJOIN_MITER,0); @@ -327,7 +323,6 @@ void ector_software_rasterizer_done(Software_Rasterizer *rasterizer) { sw_ft_grays_raster.raster_done(rasterizer->raster); SW_FT_Stroker_Done(rasterizer->stroker); - //TODO free the pool memory } diff --git a/src/lib/ector/software/sw_ft_raster.c b/src/lib/ector/software/sw_ft_raster.c index f20a881d1e..38b85392d4 100644 --- a/src/lib/ector/software/sw_ft_raster.c +++ b/src/lib/ector/software/sw_ft_raster.c @@ -104,7 +104,9 @@ typedef ptrdiff_t SW_FT_PtrDist; #define SW_FT_ERROR( x ) do { } while ( 0 ) /* nothing */ #define SW_FT_THROW( e ) SW_FT_ERR_CAT( ErrRaster_, e ) - + /* The size in bytes of the render pool used by the scan-line converter */ + /* to do all of its work. */ +#define SW_FT_RENDER_POOL_SIZE 16384L typedef int (*SW_FT_Outline_MoveToFunc)( const SW_FT_Vector* to, @@ -383,11 +385,7 @@ typedef struct SW_FT_Outline_Funcs_ typedef struct gray_TRaster_ { - void* buffer; - long buffer_size; - int band_size; void* memory; - gray_PWorker worker; } gray_TRaster, *gray_PRaster; @@ -1719,16 +1717,20 @@ typedef struct SW_FT_Outline_Funcs_ return 0; } - static int gray_raster_render( gray_PRaster raster, const SW_FT_Raster_Params* params ) { - const SW_FT_Outline* outline = (const SW_FT_Outline*)params->source; - gray_PWorker worker; + const SW_FT_Outline* outline = (const SW_FT_Outline*)params->source; + gray_TWorker worker[1]; - if ( !raster || !raster->buffer || !raster->buffer_size ) + TCell buffer[SW_FT_RENDER_POOL_SIZE / sizeof ( TCell )]; + long buffer_size = sizeof ( buffer ); + int band_size = (int)( buffer_size / + (long)( sizeof ( TCell ) * 8 ) ); + + if ( !raster) return SW_FT_THROW( Invalid_Argument ); if ( !outline ) @@ -1745,8 +1747,6 @@ typedef struct SW_FT_Outline_Funcs_ outline->contours[outline->n_contours - 1] + 1 ) return SW_FT_THROW( Invalid_Outline ); - worker = raster->worker; - /* this version does not support monochrome rendering */ if ( !( params->flags & SW_FT_RASTER_FLAG_AA ) ) return SW_FT_THROW( Invalid_Mode ); @@ -1761,13 +1761,14 @@ typedef struct SW_FT_Outline_Funcs_ ras.clip_box.yMax = 32767L; } - gray_init_cells( RAS_VAR_ raster->buffer, raster->buffer_size ); + gray_init_cells( RAS_VAR_ buffer, buffer_size ); ras.outline = *outline; ras.num_cells = 0; ras.invalid = 1; - ras.band_size = raster->band_size; + ras.band_size = band_size; ras.num_gray_spans = 0; + ras.span_y = 0; ras.render_span = (SW_FT_Raster_Span_Func)params->gray_spans; ras.render_span_data = params->user; @@ -1775,7 +1776,6 @@ typedef struct SW_FT_Outline_Funcs_ return gray_convert_glyph( RAS_VAR ); } - /**** RASTER OBJECT CREATION: In stand-alone mode, we simply use *****/ /**** a static object. *****/ @@ -1803,34 +1803,9 @@ typedef struct SW_FT_Outline_Funcs_ char* pool_base, long pool_size ) { - gray_PRaster rast = (gray_PRaster)raster; - - - if ( raster ) - { - if ( pool_base && pool_size >= (long)sizeof ( gray_TWorker ) + 2048 ) - { - gray_PWorker worker = (gray_PWorker)pool_base; - - - rast->worker = worker; - rast->buffer = pool_base + - ( ( sizeof ( gray_TWorker ) + - sizeof ( TCell ) - 1 ) & - ~( sizeof ( TCell ) - 1 ) ); - rast->buffer_size = (long)( ( pool_base + pool_size ) - - (char*)rast->buffer ) & - ~( sizeof ( TCell ) - 1 ); - rast->band_size = (int)( rast->buffer_size / - ( sizeof ( TCell ) * 8 ) ); - } - else - { - rast->buffer = NULL; - rast->buffer_size = 0; - rast->worker = NULL; - } - } + SW_FT_UNUSED( raster ); + SW_FT_UNUSED( pool_base ); + SW_FT_UNUSED( pool_size ); }