* src/raster/ftraster.c, src/smooth/ftgrays.c: small optimization, the

rasterizers now	uses the render pool to store their state during scanline
	convertion. this saves about 6 KB of heap space for each FT_Library instance
This commit is contained in:
David Turner 2007-01-04 18:33:12 +00:00
parent 91bd5ddf17
commit 8a2c7f8fb8
3 changed files with 76 additions and 54 deletions

View File

@ -1,8 +1,8 @@
2007-01-04 David Turner <david@freetype.org> 2007-01-04 David Turner <david@freetype.org>
* src/smooth/ftgrays.c: small optimization, the rasterizer now * src/raster/ftraster.c, src/smooth/ftgrays.c: small optimization, the
uses the render pool to store its state during its operation, rasterizers now uses the render pool to store their state during scanline
this saves about 4 KB of heap for each FT_Library instance convertion. this saves about 6 KB of heap space for each FT_Library instance
* src/sfnt/sfobjs.c, src/sfnt/ttkern.c, src/sfnt/ttkern.h, * src/sfnt/sfobjs.c, src/sfnt/ttkern.c, src/sfnt/ttkern.h,
src/sfnt/ttmtx.c, src/sfnt/ttsbit.c, src/sfnt/ttsbit.h, src/sfnt/ttmtx.c, src/sfnt/ttsbit.c, src/sfnt/ttsbit.h,

View File

@ -378,19 +378,19 @@
#else /* FT_STATIC_RASTER */ #else /* FT_STATIC_RASTER */
#define RAS_ARGS TRaster_Instance* raster, #define RAS_ARGS PWorker worker,
#define RAS_ARG TRaster_Instance* raster #define RAS_ARG PWorker worker
#define RAS_VARS raster, #define RAS_VARS worker,
#define RAS_VAR raster #define RAS_VAR worker
#define FT_UNUSED_RASTER FT_UNUSED( raster ) #define FT_UNUSED_RASTER FT_UNUSED( worker )
#endif /* FT_STATIC_RASTER */ #endif /* FT_STATIC_RASTER */
typedef struct TRaster_Instance_ TRaster_Instance; typedef struct TWorker_ TWorker, *PWorker;
/* prototypes used for sweep function dispatch */ /* prototypes used for sweep function dispatch */
@ -422,7 +422,7 @@
/* at the top. Thus, their offset can be coded with less */ /* at the top. Thus, their offset can be coded with less */
/* opcodes, and it results in a smaller executable. */ /* opcodes, and it results in a smaller executable. */
struct TRaster_Instance_ struct TWorker_
{ {
Int precision_bits; /* precision related variables */ Int precision_bits; /* precision related variables */
Int precision; Int precision;
@ -498,15 +498,11 @@
TBand band_stack[16]; /* band stack used for sub-banding */ TBand band_stack[16]; /* band stack used for sub-banding */
Int band_top; /* band stack top */ Int band_top; /* band stack top */
Int count_table[256]; /* Look-up table used to quickly count */ Int* count_table;
/* set bits in a gray 2x2 cell */
void* memory;
#ifdef FT_RASTER_OPTION_ANTI_ALIASING #ifdef FT_RASTER_OPTION_ANTI_ALIASING
Byte grays[5]; /* Palette of gray levels used for */ Byte* grays;
/* render. */
Byte gray_lines[RASTER_GRAY_LINES]; Byte gray_lines[RASTER_GRAY_LINES];
/* Intermediate table used to render the */ /* Intermediate table used to render the */
@ -523,26 +519,30 @@
#endif /* FT_RASTER_ANTI_ALIASING */ #endif /* FT_RASTER_ANTI_ALIASING */
#if 0
PByte flags; /* current flags table */
PUShort outs; /* current outlines table */
FT_Vector* coords;
UShort nPoints; /* number of points in current glyph */
Short nContours; /* number of contours in current glyph */
#endif
}; };
typedef struct TRaster_
{
char* buffer;
long buffer_size;
void* memory;
PWorker worker;
Int count_table[256]; /* Look-up table used to quickly count */
/* set bits in a gray 2x2 cell */
Byte grays[5];
Short gray_width;
} TRaster, *PRaster;
#ifdef FT_STATIC_RASTER #ifdef FT_STATIC_RASTER
static TRaster_Instance cur_ras; static TWorker cur_ras;
#define ras cur_ras #define ras cur_ras
#else #else
#define ras (*raster) #define ras (*worker)
#endif /* FT_STATIC_RASTER */ #endif /* FT_STATIC_RASTER */
@ -3153,7 +3153,7 @@
static void static void
ft_black_init( TRaster_Instance* raster ) ft_black_init( PRaster raster )
{ {
FT_UInt n; FT_UInt n;
FT_ULong c; FT_ULong c;
@ -3169,7 +3169,7 @@
( ( c << 2 ) & 0x0030 ) | ( ( c << 2 ) & 0x0030 ) |
(c & 0x0003 ); (c & 0x0003 );
ras.count_table[n] = (UInt)c; raster->count_table[n] = (UInt)c;
} }
#ifdef FT_RASTER_OPTION_ANTI_ALIASING #ifdef FT_RASTER_OPTION_ANTI_ALIASING
@ -3178,7 +3178,7 @@
for ( n = 0; n < 5; n++ ) for ( n = 0; n < 5; n++ )
raster->grays[n] = n * 255 / 4; raster->grays[n] = n * 255 / 4;
ras.gray_width = RASTER_GRAY_LINES / 2; raster->gray_width = RASTER_GRAY_LINES / 2;
#endif #endif
} }
@ -3195,7 +3195,7 @@
ft_black_new( void* memory, ft_black_new( void* memory,
FT_Raster *araster ) FT_Raster *araster )
{ {
static TRaster_Instance the_raster; static TRaster the_raster;
*araster = (FT_Raster)&the_raster; *araster = (FT_Raster)&the_raster;
@ -3218,11 +3218,11 @@
static int static int
ft_black_new( FT_Memory memory, ft_black_new( FT_Memory memory,
TRaster_Instance** araster ) PRaster *araster )
{ {
FT_Error error; FT_Error error;
TRaster_Instance* raster; PRaster raster;
*araster = 0; *araster = 0;
@ -3239,7 +3239,7 @@
static void static void
ft_black_done( TRaster_Instance* raster ) ft_black_done( PRaster raster )
{ {
FT_Memory memory = (FT_Memory)raster->memory; FT_Memory memory = (FT_Memory)raster->memory;
FT_FREE( raster ); FT_FREE( raster );
@ -3250,21 +3250,32 @@
static void static void
ft_black_reset( TRaster_Instance* raster, ft_black_reset( PRaster raster,
char* pool_base, char* pool_base,
long pool_size ) long pool_size )
{ {
if ( (&ras) && pool_base && pool_size >= 4096 ) if ( raster )
{ {
/* save the pool */ if ( pool_base && pool_size >= (long)sizeof(TWorker) + 2048 )
ras.buff = (PLong)pool_base; {
ras.sizeBuff = ras.buff + pool_size / sizeof ( Long ); PWorker worker = (PWorker)pool_base;
raster->buffer = pool_base + ((sizeof(*worker) + 7) & ~7);
raster->buffer_size = ((pool_base + pool_size) - (char*)raster->buffer)/sizeof(Long);
raster->worker = worker;
}
else
{
raster->buffer = NULL;
raster->buffer_size = 0;
raster->worker = NULL;
}
} }
} }
static void static void
ft_black_set_mode( TRaster_Instance* raster, ft_black_set_mode( PRaster raster,
unsigned long mode, unsigned long mode,
const char* palette ) const char* palette )
{ {
@ -3273,11 +3284,11 @@
if ( mode == FT_MAKE_TAG( 'p', 'a', 'l', '5' ) ) if ( mode == FT_MAKE_TAG( 'p', 'a', 'l', '5' ) )
{ {
/* set 5-levels gray palette */ /* set 5-levels gray palette */
ras.grays[0] = palette[0]; raster->grays[0] = palette[0];
ras.grays[1] = palette[1]; raster->grays[1] = palette[1];
ras.grays[2] = palette[2]; raster->grays[2] = palette[2];
ras.grays[3] = palette[3]; raster->grays[3] = palette[3];
ras.grays[4] = palette[4]; raster->grays[4] = palette[4];
} }
#else #else
@ -3291,14 +3302,15 @@
static int static int
ft_black_render( TRaster_Instance* raster, ft_black_render( PRaster raster,
const FT_Raster_Params* params ) const FT_Raster_Params* params )
{ {
const FT_Outline* outline = (const FT_Outline*)params->source; const FT_Outline* outline = (const FT_Outline*)params->source;
const FT_Bitmap* target_map = params->target; const FT_Bitmap* target_map = params->target;
PWorker worker;
if ( !(&ras) || !ras.buff || !ras.sizeBuff ) if ( !raster || !raster->buffer || !raster->buffer_size )
return Raster_Err_Not_Ini; return Raster_Err_Not_Ini;
/* return immediately if the outline is empty */ /* return immediately if the outline is empty */
@ -3311,6 +3323,8 @@
if ( outline->n_points != outline->contours[outline->n_contours - 1] + 1 ) if ( outline->n_points != outline->contours[outline->n_contours - 1] + 1 )
return Raster_Err_Invalid; return Raster_Err_Invalid;
worker = raster->worker;
/* this version of the raster does not support direct rendering, sorry */ /* this version of the raster does not support direct rendering, sorry */
if ( params->flags & FT_RASTER_FLAG_DIRECT ) if ( params->flags & FT_RASTER_FLAG_DIRECT )
return Raster_Err_Unsupported; return Raster_Err_Unsupported;
@ -3321,6 +3335,14 @@
ras.outline = *outline; ras.outline = *outline;
ras.target = *target_map; ras.target = *target_map;
worker->count_table = raster->count_table;
worker->buff = (PLong) raster->buffer;
worker->sizeBuff = worker->buff + raster->buffer_size/sizeof(Long);
#ifdef FT_RASTER_OPTION_ANTI_ALIASING
worker->grays = raster->grays;
worker->gray_width = raster->gray_width;
#endif
return ( ( params->flags & FT_RASTER_FLAG_AA ) return ( ( params->flags & FT_RASTER_FLAG_AA )
? Render_Gray_Glyph( RAS_VAR ) ? Render_Gray_Glyph( RAS_VAR )
: Render_Glyph( RAS_VAR ) ); : Render_Glyph( RAS_VAR ) );

View File

@ -1834,6 +1834,8 @@
ras.clip_box.yMax = 32767L; ras.clip_box.yMax = 32767L;
} }
gray_init_cells( worker, raster->buffer, raster->buffer_size );
ras.outline = *outline; ras.outline = *outline;
ras.num_cells = 0; ras.num_cells = 0;
ras.invalid = 1; ras.invalid = 1;
@ -1927,7 +1929,7 @@
if ( raster ) if ( raster )
{ {
if ( pool_base && pool_size >= sizeof(TWorker) + 2048 ) if ( pool_base && pool_size >= (long)sizeof(TWorker) + 2048 )
{ {
PWorker worker = (PWorker) pool_base; PWorker worker = (PWorker) pool_base;
@ -1935,8 +1937,6 @@
rast->buffer = pool_base + ((sizeof(TWorker) + sizeof(TCell)-1) & ~(sizeof(TCell)-1)); rast->buffer = pool_base + ((sizeof(TWorker) + sizeof(TCell)-1) & ~(sizeof(TCell)-1));
rast->buffer_size = (long)((pool_base + pool_size) - (char*)rast->buffer) & ~(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) ); rast->band_size = (int)( rast->buffer_size/(sizeof(TCell)*8) );
gray_init_cells( RAS_VAR_ rast->buffer, rast->buffer_size );
} }
else else
{ {