[sdf] Added essential enums and structs required.

This commit is contained in:
Anuj Verma 2020-06-25 10:21:59 +05:30 committed by anujverma
parent d21ceef7b4
commit 38bc88ae6f
4 changed files with 187 additions and 21 deletions

View File

@ -1,3 +1,16 @@
2020-06-25 Anuj Verma <anujv@iitbhilai.ac.in>
[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 <anujv@iitbhilai.ac.in>
[sdf] Added functionality to set and get module properties.

View File

@ -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 */

View File

@ -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

View File

@ -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 */
)