@ -3093,4 +3093,184 @@
return error ;
}
/**************************************************************************
*
* interface functions
*
*/
static FT_Error
sdf_raster_new ( FT_Memory memory ,
FT_Raster * araster )
{
FT_Error error = FT_Err_Ok ;
SDF_TRaster * raster = NULL ;
FT_Int line = __LINE__ ;
/* in non debugging mode this is not used */
FT_UNUSED ( line ) ;
* araster = 0 ;
if ( ! FT_ALLOC ( raster , sizeof ( SDF_TRaster ) ) )
{
raster - > memory = memory ;
* araster = ( FT_Raster ) raster ;
}
return error ;
}
static void
sdf_raster_reset ( FT_Raster raster ,
unsigned char * pool_base ,
unsigned long pool_size )
{
/* no use of this function */
FT_UNUSED ( raster ) ;
FT_UNUSED ( pool_base ) ;
FT_UNUSED ( pool_size ) ;
}
static FT_Error
sdf_raster_set_mode ( FT_Raster raster ,
unsigned long mode ,
void * args )
{
FT_UNUSED ( raster ) ;
FT_UNUSED ( mode ) ;
FT_UNUSED ( args ) ;
return FT_Err_Ok ;
}
static FT_Error
sdf_raster_render ( FT_Raster raster ,
const FT_Raster_Params * params )
{
FT_Error error = FT_Err_Ok ;
SDF_TRaster * sdf_raster = ( SDF_TRaster * ) raster ;
FT_Outline * outline = NULL ;
const SDF_Raster_Params * sdf_params = ( const SDF_Raster_Params * ) params ;
FT_Memory memory = NULL ;
SDF_Shape * shape = NULL ;
SDF_Params internal_params ;
SDF_MEMORY_TRACKER_DECLARE ( ) ;
/* check for valid arguments */
if ( ! sdf_raster | | ! sdf_params )
{
error = FT_THROW ( Invalid_Argument ) ;
goto Exit ;
}
outline = ( FT_Outline * ) sdf_params - > root . source ;
/* check if the outline is valid or not */
if ( ! outline )
{
error = FT_THROW ( Invalid_Outline ) ;
goto Exit ;
}
/* if the outline is empty, return */
if ( outline - > n_points < = 0 | | outline - > n_contours < = 0 )
goto Exit ;
/* check if the outline has valid fields */
if ( ! outline - > contours | | ! outline - > points )
{
error = FT_THROW ( Invalid_Outline ) ;
goto Exit ;
}
/* check if spread is set properly */
if ( sdf_params - > spread > MAX_SPREAD | |
sdf_params - > spread < MIN_SPREAD )
{
FT_TRACE0 ( (
" [sdf] sdf_raster_render: \n "
" The `spread' field of `SDF_Raster_Params' is invalid, \n "
" the value of this field must be within [%d, %d]. \n "
" Also, you must pass `SDF_Raster_Params' instead of the \n "
" default `FT_Raster_Params' while calling this function \n "
" and set the fields properly. \n "
, MIN_SPREAD , MAX_SPREAD ) ) ;
error = FT_THROW ( Invalid_Argument ) ;
goto Exit ;
}
memory = sdf_raster - > memory ;
if ( ! memory )
{
FT_TRACE0 ( ( " [sdf] sdf_raster_render: \n "
" Raster not setup properly, "
" unable to find memory handle. \n " ) ) ;
error = FT_THROW ( Invalid_Handle ) ;
goto Exit ;
}
/* setup the params */
internal_params . orientation = FT_Outline_Get_Orientation ( outline ) ;
internal_params . flip_sign = sdf_params - > flip_sign ;
internal_params . flip_y = sdf_params - > flip_y ;
internal_params . overload_sign = 0 ;
/* assign a custom user pointer to `FT_Memory' */
/* also keep a reference of the old user pointer */
/* in order to debug the memory while compiling */
/* with `FT_DEBUG_MEMORY'. */
SDF_MEMORY_TRACKER_SETUP ( ) ;
FT_CALL ( sdf_shape_new ( memory , & shape ) ) ;
FT_CALL ( sdf_outline_decompose ( outline , shape ) ) ;
if ( sdf_params - > overlaps )
FT_CALL ( sdf_generate_with_overlaps ( internal_params ,
shape , sdf_params - > spread ,
sdf_params - > root . target ) ) ;
else
FT_CALL ( sdf_generate_subdivision ( internal_params ,
shape , sdf_params - > spread ,
sdf_params - > root . target ) ) ;
if ( shape )
sdf_shape_done ( & shape ) ;
/* restore the memory->user */
SDF_MEMORY_TRACKER_DONE ( ) ;
Exit :
return error ;
}
static void
sdf_raster_done ( FT_Raster raster )
{
FT_Memory memory = ( FT_Memory ) ( ( SDF_TRaster * ) raster ) - > memory ;
FT_Int line = __LINE__ ;
/* in non debugging mode this is not used */
FT_UNUSED ( line ) ;
FT_FREE ( raster ) ;
}
FT_DEFINE_RASTER_FUNCS (
ft_sdf_raster ,
FT_GLYPH_FORMAT_OUTLINE ,
( FT_Raster_New_Func ) sdf_raster_new , /* raster_new */
( FT_Raster_Reset_Func ) sdf_raster_reset , /* raster_reset */
( FT_Raster_Set_Mode_Func ) sdf_raster_set_mode , /* raster_set_mode */
( FT_Raster_Render_Func ) sdf_raster_render , /* raster_render */
( FT_Raster_Done_Func ) sdf_raster_done /* raster_done */
)
/* END */