[sdf] Added function to get contour orientation.

* src/sdf/ftsdf.c (SDF_Contour_Orientation): Added
  enum to hold the different orientations of a contour.

* src/sdf/ftsdf.c (get_contour_orientation): Added
  function which can be used to compute the orientation
  of a contour.

* src/sdf/ftbsdf.c (*): Remove completed `[TODO]'s.
This commit is contained in:
Anuj Verma 2020-08-06 11:42:26 +05:30
parent 5014394b3e
commit 06bbff76b9
3 changed files with 85 additions and 3 deletions

View File

@ -1,3 +1,16 @@
2020-08-6 Anuj Verma <anujv@iitbhilai.ac.in>
[sdf] Added function to get contour orientation.
* src/sdf/ftsdf.c (SDF_Contour_Orientation): Added
enum to hold the different orientations of a contour.
* src/sdf/ftsdf.c (get_contour_orientation): Added
function which can be used to compute the orientation
of a contour.
* src/sdf/ftbsdf.c (*): Remove completed `[TODO]'s.
2020-08-6 Anuj Verma <anujv@iitbhilai.ac.in>
[sdf -> bsdf] Added documentation for functions of the `bsdf' renderer.

View File

@ -308,7 +308,6 @@
/* approximate direction of the edge, we can */
/* approximate the edge distance much better. */
/* [TODO]: Add squared distance support. */
if ( g.x == 0 || g.y == 0 )
dist = ONE / 2 - alphas[4];
else
@ -509,7 +508,6 @@
/* convert the source bitmap to desired bpp. */
switch ( source->pixel_mode ) {
case FT_PIXEL_MODE_MONO:
/* [TODO] */
{
FT_Int t_width = worker->width;
FT_Int t_rows = worker->rows;

View File

@ -151,7 +151,7 @@
*
*/
#define MUL_26D6( a, b ) ( ( a * b ) / 64 )
#define MUL_26D6( a, b ) ( ( ( a ) * ( b ) ) / 64 )
#define VEC_26D6_DOT( p, q ) ( MUL_26D6( p.x, q.x ) + \
MUL_26D6( p.y, q.y ) )
@ -177,6 +177,16 @@
} SDF_Edge_Type;
/* Enumeration for the orientation of a contour, remember */
/* the orientation is independent of the fill rule. */
typedef enum SDF_Contour_Orientation_
{
SDF_ORIENTATION_NONE = 0, /* undefined, used to initialize */
SDF_ORIENTATION_CW = 0, /* clockwise orientation */
SDF_ORIENTATION_ACW = 0, /* anti-clockwise orientation */
} SDF_Contour_Orientation;
/* represent a single edge in a contour */
typedef struct SDF_Edge_
{
@ -694,6 +704,67 @@
return cbox;
}
/* The function returns the orientation for a single contour. */
/* Note that the orientation is independent of the fill rule. */
/* So, for ttf the clockwise has to be filled and the opposite */
/* for otf fonts. */
static SDF_Contour_Orientation
get_contour_orientation ( SDF_Contour* contour )
{
SDF_Edge* head = NULL;
FT_26D6 area = 0;
/* return none if invalid parameters */
if ( !contour || !contour->edges )
return SDF_ORIENTATION_NONE;
head = contour->edges;
/* Simply calculate the area of the control box for */
/* all the edges. */
while ( head )
{
switch ( head->edge_type ) {
case SDF_EDGE_LINE:
{
area += MUL_26D6( ( head->end_pos.x - head->start_pos.x ),
( head->end_pos.y + head->start_pos.y ) );
break;
}
case SDF_EDGE_CONIC:
{
area += MUL_26D6( head->control_a.x - head->start_pos.x,
head->control_a.y + head->start_pos.y );
area += MUL_26D6( head->end_pos.x - head->control_a.x,
head->end_pos.y + head->control_a.y );
break;
}
case SDF_EDGE_CUBIC:
{
area += MUL_26D6( head->control_a.x - head->start_pos.x,
head->control_a.y + head->start_pos.y );
area += MUL_26D6( head->control_b.x - head->control_a.x,
head->control_b.y + head->control_a.y );
area += MUL_26D6( head->end_pos.x - head->control_b.x,
head->end_pos.y + head->control_b.y );
break;
}
default:
return SDF_ORIENTATION_NONE;
}
head = head->next;
}
/* Clockwise contour cover a positive area, and Anti-Clockwise */
/* contour cover a negitive area. */
if ( area > 0 )
return SDF_ORIENTATION_CW;
else
return SDF_ORIENTATION_ACW;
}
/* The function is exactly same as the one */
/* in the smooth renderer. It splits a conic */
/* into two conic exactly half way at t = 0.5 */