diff --git a/[GSoC]ChangeLog b/[GSoC]ChangeLog index 8e1043187..df74a8517 100644 --- a/[GSoC]ChangeLog +++ b/[GSoC]ChangeLog @@ -1,3 +1,16 @@ +2020-06-25 Anuj Verma + + [sdf] Added essential enums and structs required. + + * src/freetype/internal/fttrace.h: Remove tabs. + + * src/sdf/ftsdfrend.c (ft_sdf_render): Calculate padding + using the `spread'. + + * src/sdf/ftsdf.c (SDF_Edge_Type, SDF_Edge, SDF_Contour, + SDF_Shape): Added structures and their initializer + functions. + 2020-06-23 Anuj Verma [sdf] Added functionality to set and get module properties. diff --git a/include/freetype/internal/fttrace.h b/include/freetype/internal/fttrace.h index 6caadd35c..d0fb482fd 100644 --- a/include/freetype/internal/fttrace.h +++ b/include/freetype/internal/fttrace.h @@ -40,7 +40,7 @@ FT_TRACE_DEF( psprops ) /* PS driver properties (ftpsprop.c) */ FT_TRACE_DEF( raccess ) /* resource fork accessor (ftrfork.c) */ FT_TRACE_DEF( raster ) /* monochrome rasterizer (ftraster.c) */ FT_TRACE_DEF( smooth ) /* anti-aliasing raster (ftgrays.c) */ -FT_TRACE_DEF( sdf ) /* signed distance raster (ftsdf.c) */ +FT_TRACE_DEF( sdf ) /* signed distance raster (ftsdf.c) */ FT_TRACE_DEF( synth ) /* bold/slant synthesizer (ftsynth.c) */ /* Cache sub-system */ diff --git a/src/sdf/ftsdf.c b/src/sdf/ftsdf.c index af18e6b10..8f4d5503d 100644 --- a/src/sdf/ftsdf.c +++ b/src/sdf/ftsdf.c @@ -5,6 +5,15 @@ #include "ftsdferrs.h" + /************************************************************************** + * + * typedefs + * + */ + + typedef FT_Vector FT_26D6_Vec; /* with 26.6 fixed point components */ + typedef FT_Vector FT_16D16_Vec; /* with 16.16 fixed point components */ + /************************************************************************** * * structures and enums @@ -14,8 +23,152 @@ typedef struct SDF_TRaster_ { FT_Memory memory; /* used internally to allocate memory */ + } SDF_TRaster; + /* enumeration of all the types of curve present in vector fonts */ + typedef enum SDF_Edge_Type_ + { + SDF_EDGE_UNDEFINED = 0, /* undefined, used to initialize */ + SDF_EDGE_LINE = 1, /* straight line segment */ + SDF_EDGE_CONIC = 2, /* second order bezier curve */ + SDF_EDGE_CUBIC = 3 /* third order bezier curve */ + + } SDF_Edge_Type; + + /* represent a single edge in a contour */ + typedef struct SDF_Edge_ + { + FT_26D6_Vec start_pos; /* start position of the edge */ + FT_26D6_Vec end_pos; /* end position of the edge */ + FT_26D6_Vec control_a; /* first control point of a bezier curve */ + FT_26D6_Vec control_b; /* second control point of a bezier curve */ + + SDF_Edge_Type edge_type; /* edge identifier */ + + } SDF_Edge; + + /* A contour represent a set of edges which make a closed */ + /* loop. */ + typedef struct SDF_Contour_ + { + FT_26D6_Vec last_pos; /* end position of the last edge */ + FT_List edges /* list of all edges in the contour */ + + } SDF_Contour; + + /* Represent a set a contours which makes up a complete */ + /* glyph outline. */ + typedef struct SDF_Shape_ + { + FT_Memory memory; /* used internally to allocate memory */ + FT_List contours; /* list of all contours in the outline */ + + } SDF_Shape; + + /************************************************************************** + * + * constants, initializer and destructor + * + */ + + static + const FT_Vector zero_vector = { 0, 0 }; + + static + const SDF_Edge null_edge = { { 0, 0 }, { 0, 0 }, + { 0, 0 }, { 0, 0 }, + SDF_EDGE_UNDEFINED }; + + static + const SDF_Contour null_contour = { { 0, 0 }, NULL }; + + static + const SDF_Shape null_shape = { NULL, NULL }; + + static FT_Error + sdf_edge_new( FT_Memory memory, + SDF_Edge** edge ) + { + FT_Error error = FT_Err_Ok; + SDF_Edge* ptr = NULL; + + + if ( !memory || !edge ) + { + error = FT_THROW( Invalid_Argument ); + goto Exit; + } + + FT_QNEW( ptr ); + if ( error != FT_Err_Ok ) + *edge = NULL; + else + { + *ptr = null_edge; + *edge = ptr; + } + + Exit: + return error; + } + + static FT_Error + sdf_contour_new( FT_Memory memory, + SDF_Contour** contour ) + { + FT_Error error = FT_Err_Ok; + SDF_Contour* ptr = NULL; + + + if ( !memory || !contour ) + { + error = FT_THROW( Invalid_Argument ); + goto Exit; + } + + FT_QNEW( ptr ); + if ( error != FT_Err_Ok ) + *contour = NULL; + else + { + *ptr = null_contour; + FT_QNEW( ptr->edges ); + *contour = ptr; + } + + Exit: + return error; + } + + static void + sdf_shape_new( FT_Memory memory, + SDF_Shape** shape ) + { + FT_Error error = FT_Err_Ok; + SDF_Shape* ptr = NULL; + + + if ( !memory || !shape ) + { + error = FT_THROW( Invalid_Argument ); + goto Exit; + } + + FT_QNEW( ptr ); + if ( error != FT_Err_Ok ) + *shape = NULL; + else + { + *ptr = null_shape; + FT_QNEW( ptr->contours ); + *shape = ptr; + } + + Exit: + return error; + } + /************************************************************************** * * interface functions @@ -56,14 +209,12 @@ unsigned long mode, void* args ) { - /* Currently there is no use for this function but later */ - /* it will be used to modify the `spread' parameter. */ FT_UNUSED( raster ); FT_UNUSED( mode ); FT_UNUSED( args ); - return FT_THROW( Unimplemented_Feature ); + return FT_Err_Ok; } static FT_Error diff --git a/src/sdf/ftsdfrend.c b/src/sdf/ftsdfrend.c index 14fb48904..b1bda929d 100644 --- a/src/sdf/ftsdfrend.c +++ b/src/sdf/ftsdfrend.c @@ -48,18 +48,19 @@ if ( ft_strcmp( property_name, "spread" ) == 0 ) { - FT_UInt val = *(const FT_UInt*)value; + FT_Int val = *(const FT_Int*)value; - if ( val > MAX_SPREAD ) + if ( val > MAX_SPREAD || val <= 0 ) { FT_TRACE0(( "[sdf module] sdf_property_set: " "the `spread' property can have a " - "maximum value of %d\n", MAX_SPREAD )); + "value within range [1, %d] " + "(value provided %d)\n", MAX_SPREAD, val )); error = FT_THROW( Invalid_Argument ); goto Exit; } - render->spread = val; + render->spread = (FT_UInt)val; FT_TRACE7(( "[sdf module] sdf_property_set: " "updated property `spread' to %d\n", val )); } @@ -68,7 +69,6 @@ FT_TRACE0(( "[sdf module] sdf_property_set: " "missing property `%s'\n", property_name )); error = FT_THROW( Missing_Property ); - goto Exit; } Exit: @@ -86,7 +86,7 @@ if ( ft_strcmp( property_name, "spread" ) == 0 ) { - FT_UInt* val = (FT_UInt*)value; + FT_Int* val = (FT_Int*)value; *val = render->spread; @@ -96,7 +96,6 @@ FT_TRACE0(( "[sdf module] sdf_property_get: " "missing property `%s'\n", property_name )); error = FT_THROW( Missing_Property ); - goto Exit; } Exit: @@ -164,9 +163,8 @@ FT_Pos x_shift = 0; FT_Pos y_shift = 0; - /* use hardcoded padding for now */ - FT_UInt x_pad = 10; - FT_UInt y_pad = 10; + FT_UInt x_pad = 0; + FT_UInt y_pad = 0; FT_Raster_Params params; SDF_Renderer sdf_module = SDF_RENDERER( module ); @@ -210,9 +208,13 @@ if ( !bitmap->rows || !bitmap->pitch ) goto Exit; - /* apply the padding */ - bitmap->rows += y_pad; - bitmap->width += x_pad; + /* the padding will simply be equal to the `spread' */ + x_pad = sdf_module->spread; + y_pad = sdf_module->spread; + + /* apply the padding, will be in all the directions */ + bitmap->rows += y_pad * 2; + bitmap->width += x_pad * 2; /* ignore the pitch, pixel mode and set custom */ bitmap->pixel_mode = FT_PIXEL_MODE_GRAY16; @@ -333,10 +335,10 @@ FT_GLYPH_FORMAT_OUTLINE, - (FT_Renderer_RenderFunc) ft_sdf_render, /* render_glyph */ - (FT_Renderer_TransformFunc)ft_sdf_transform, /* transform_glyph */ - (FT_Renderer_GetCBoxFunc) ft_sdf_get_cbox, /* get_glyph_cbox */ - (FT_Renderer_SetModeFunc) ft_sdf_set_mode, /* set_mode */ + (FT_Renderer_RenderFunc) ft_sdf_render, /* render_glyph */ + (FT_Renderer_TransformFunc) ft_sdf_transform, /* transform_glyph */ + (FT_Renderer_GetCBoxFunc) ft_sdf_get_cbox, /* get_glyph_cbox */ + (FT_Renderer_SetModeFunc) ft_sdf_set_mode, /* set_mode */ (FT_Raster_Funcs*)&ft_sdf_raster /* raster_class */ )