[sdf] Added essential enums and structs required.
This commit is contained in:
parent
d21ceef7b4
commit
38bc88ae6f
|
@ -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.
|
||||
|
|
|
@ -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 */
|
||||
|
|
157
src/sdf/ftsdf.c
157
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
|
||||
|
|
|
@ -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 */
|
||||
)
|
||||
|
|
Loading…
Reference in New Issue