21 #include FT_TRIGONOMETRY_H 23 #include FT_INTERNAL_MEMORY_H 24 #include FT_INTERNAL_DEBUG_H 25 #include FT_INTERNAL_OBJECTS_H 62 #define FT_SMALL_CONIC_THRESHOLD ( FT_ANGLE_PI / 6 ) 63 #define FT_SMALL_CUBIC_THRESHOLD ( FT_ANGLE_PI / 8 ) 67 #define FT_IS_SMALL( x ) ( (x) > -FT_EPSILON && (x) < FT_EPSILON ) 73 return x >= 0 ?
x : -
x;
83 base[4].
x = base[2].
x;
85 a = base[3].
x = ( base[2].
x +
b ) / 2;
86 b = base[1].
x = ( base[0].
x +
b ) / 2;
87 base[2].
x = ( a +
b ) / 2;
89 base[4].
y = base[2].
y;
91 a = base[3].
y = ( base[2].
y +
b ) / 2;
92 b = base[1].
y = ( base[0].
y +
b ) / 2;
93 base[2].
y = ( a +
b ) / 2;
98 ft_conic_is_small_enough(
FT_Vector* base,
107 d1.
x = base[1].
x - base[2].
x;
108 d1.
y = base[1].
y - base[2].
y;
109 d2.
x = base[0].
x - base[1].
x;
110 d2.
y = base[0].
y - base[1].
y;
142 theta = ft_pos_abs(
FT_Angle_Diff( *angle_in, *angle_out ) );
154 base[6].
x = base[3].
x;
157 base[1].
x = a = ( base[0].
x +
c ) / 2;
158 base[5].
x = b = ( base[3].
x + d ) / 2;
160 base[2].
x = a = ( a +
c ) / 2;
161 base[4].
x = b = ( b +
c ) / 2;
162 base[3].
x = ( a +
b ) / 2;
164 base[6].
y = base[3].
y;
167 base[1].
y = a = ( base[0].
y +
c ) / 2;
168 base[5].
y = b = ( base[3].
y + d ) / 2;
170 base[2].
y = a = ( a +
c ) / 2;
171 base[4].
y = b = ( b +
c ) / 2;
172 base[3].
y = ( a +
b ) / 2;
188 ft_cubic_is_small_enough(
FT_Vector* base,
195 FT_Int close1, close2, close3;
198 d1.
x = base[2].
x - base[3].
x;
199 d1.
y = base[2].
y - base[3].
y;
200 d2.
x = base[1].
x - base[2].
x;
201 d2.
y = base[1].
y - base[2].
y;
202 d3.
x = base[0].
x - base[1].
x;
203 d3.
y = base[0].
y - base[1].
y;
255 *angle_mid = ft_angle_mean( *angle_in, *angle_out );
275 theta1 = ft_pos_abs(
FT_Angle_Diff( *angle_in, *angle_mid ) );
276 theta2 = ft_pos_abs(
FT_Angle_Diff( *angle_mid, *angle_out ) );
300 #define FT_STROKE_TAG_BEGIN_END ( FT_STROKE_TAG_BEGIN | FT_STROKE_TAG_END ) 302 typedef struct FT_StrokeBorderRec_
325 if ( new_max > old_max )
331 while ( cur_max < new_max )
332 cur_max += ( cur_max >> 1 ) + 16;
338 border->max_points = cur_max;
357 if ( count <= start + 1U )
374 for ( ; vec1 <
vec2; vec1++, vec2-- )
391 for ( ; tag1 < tag2; tag1++, tag2-- )
430 if (
border->num_points > 0 &&
436 error = ft_stroke_border_grow(
border, 1 );
449 border->movable = movable;
464 error = ft_stroke_border_grow(
border, 2 );
497 error = ft_stroke_border_grow(
border, 3 );
521 #define FT_ARC_CUBIC_ANGLE ( FT_ANGLE_PI / 2 ) 569 ( 0x10000L +
FT_Cos( theta ) ) * 3 );
580 error = ft_stroke_border_cubicto( border, &a2, &b2, &b );
605 return ft_stroke_border_lineto(
border, to,
FALSE );
627 border->num_points = 0;
629 border->valid =
FALSE;
642 border->num_points = 0;
643 border->max_points = 0;
645 border->valid =
FALSE;
664 for ( ; count > 0; count--, num_points++, point++, tags++ )
668 if ( in_contour != 0 )
673 else if ( in_contour == 0 )
683 if ( in_contour != 0 )
689 *anum_points = num_points;
690 *anum_contours = num_contours;
716 for ( ; count > 0; count--, read++, write++ )
735 for ( ; count > 0; count--, tags++, idx++ )
759 #define FT_SIDE_TO_ROTATE( s ) ( FT_ANGLE_PI2 - (s) * FT_ANGLE_PI ) 761 typedef struct FT_StrokerRec_
798 return FT_THROW( Invalid_Argument );
806 ft_stroke_border_init( &stroker->borders[0], memory );
807 ft_stroke_border_init( &stroker->borders[1], memory );
825 stroker->radius = radius;
826 stroker->line_cap = line_cap;
827 stroker->line_join = line_join;
828 stroker->miter_limit = miter_limit;
831 if ( stroker->miter_limit < 0x10000 )
832 stroker->miter_limit = 0x10000;
836 stroker->line_join_saved = line_join;
849 ft_stroke_border_reset( &stroker->borders[0] );
850 ft_stroke_border_reset( &stroker->borders[1] );
862 FT_Memory memory = stroker->library->memory;
865 ft_stroke_border_done( &stroker->borders[0] );
866 ft_stroke_border_done( &stroker->borders[1] );
868 stroker->library =
NULL;
887 total =
FT_Angle_Diff( stroker->angle_in, stroker->angle_out );
891 error = ft_stroke_border_arcto( border,
894 stroker->angle_in + rotate,
896 border->movable =
FALSE;
913 stroker->angle_in =
angle;
916 error = ft_stroker_arcto( stroker, side );
930 delta.
x += stroker->center.x + delta2.
x;
931 delta.
y += stroker->center.y + delta2.
y;
933 error = ft_stroke_border_lineto( border, &delta,
FALSE );
940 delta.
x += delta2.
x + stroker->center.x;
941 delta.
y += delta2.
y + stroker->center.y;
943 error = ft_stroke_border_lineto( border, &delta,
FALSE );
956 delta.
x += stroker->center.x;
957 delta.
y += stroker->center.y;
959 error = ft_stroke_border_lineto( border, &delta,
FALSE );
965 delta.
x += stroker->center.x;
966 delta.
y += stroker->center.y;
968 error = ft_stroke_border_lineto( border, &delta,
FALSE );
992 theta =
FT_Angle_Diff( stroker->angle_in, stroker->angle_out ) / 2;
996 if ( !border->movable || line_length == 0 )
1005 intersect =
FT_BOOL( stroker->line_length >= min_length &&
1006 line_length >= min_length );
1012 stroker->angle_out + rotate );
1013 delta.
x += stroker->center.x;
1014 delta.
y += stroker->center.y;
1016 border->movable =
FALSE;
1021 phi = stroker->angle_in + theta;
1025 length =
FT_DivFix( stroker->radius, thcos );
1028 delta.
x += stroker->center.x;
1029 delta.
y += stroker->center.y;
1032 error = ft_stroke_border_lineto( border, &delta,
FALSE );
1050 error = ft_stroker_arcto( stroker, side );
1054 FT_Fixed sigma = 0, radius = stroker->radius;
1070 theta =
FT_Angle_Diff( stroker->angle_in, stroker->angle_out );
1075 phi = stroker->angle_in;
1080 phi = stroker->angle_in + theta +
rotate;
1084 sigma =
FT_MulFix( stroker->miter_limit, thcos );
1087 if ( sigma < 0x10000L )
1091 if ( fixed_bevel || ft_pos_abs( theta ) > 57 )
1107 stroker->angle_out + rotate );
1108 delta.
x += stroker->center.x;
1109 delta.
y += stroker->center.y;
1111 border->movable =
FALSE;
1112 error = ft_stroke_border_lineto( border, &delta,
FALSE );
1123 FT_MulFix( radius, stroker->miter_limit ),
1125 middle.
x += stroker->center.x;
1126 middle.
y += stroker->center.y;
1129 length =
FT_MulDiv( radius, 0x10000L - sigma,
1130 ft_pos_abs(
FT_Sin( theta ) ) );
1133 delta.
x += middle.
x;
1134 delta.
y += middle.
y;
1136 error = ft_stroke_border_lineto( border, &delta,
FALSE );
1142 delta.
x += middle.
x;
1143 delta.
y += middle.
y;
1145 error = ft_stroke_border_lineto( border, &delta,
FALSE );
1151 if ( line_length == 0 )
1155 stroker->angle_out + rotate );
1157 delta.
x += stroker->center.x;
1158 delta.
y += stroker->center.y;
1160 error = ft_stroke_border_lineto( border, &delta,
FALSE );
1170 length =
FT_DivFix( stroker->radius, thcos );
1173 delta.
x += stroker->center.x;
1174 delta.
y += stroker->center.y;
1176 error = ft_stroke_border_lineto( border, &delta,
FALSE );
1182 if ( line_length == 0 )
1186 stroker->angle_out + rotate );
1187 delta.
x += stroker->center.x;
1188 delta.
y += stroker->center.y;
1190 error = ft_stroke_border_lineto( border, &delta,
FALSE );
1201 ft_stroker_process_corner(
FT_Stroker stroker,
1209 turn =
FT_Angle_Diff( stroker->angle_in, stroker->angle_out );
1223 error = ft_stroker_inside( stroker, inside_side, line_length );
1228 error = ft_stroker_outside( stroker, 1 - inside_side, line_length );
1238 ft_stroker_subpath_start(
FT_Stroker stroker,
1251 point.
x = stroker->center.x + delta.
x;
1252 point.
y = stroker->center.y + delta.
y;
1254 border = stroker->borders;
1255 error = ft_stroke_border_moveto( border, &point );
1259 point.
x = stroker->center.x - delta.
x;
1260 point.
y = stroker->center.y - delta.
y;
1263 error = ft_stroke_border_moveto( border, &point );
1267 stroker->subpath_angle = start_angle;
1268 stroker->first_point =
FALSE;
1269 stroker->subpath_line_length = line_length;
1290 delta.
x = to->
x - stroker->center.x;
1291 delta.
y = to->
y - stroker->center.y;
1294 if ( delta.
x == 0 && delta.
y == 0 )
1304 if ( stroker->first_point )
1309 error = ft_stroker_subpath_start( stroker,
angle, line_length );
1316 stroker->angle_out =
angle;
1317 error = ft_stroker_process_corner( stroker, line_length );
1323 for (
border = stroker->borders, side = 1; side >= 0; side--,
border++ )
1328 point.
x = to->
x + delta.
x;
1329 point.
y = to->
y + delta.
y;
1340 stroker->angle_in =
angle;
1341 stroker->center = *to;
1342 stroker->line_length = line_length;
1370 stroker->center = *to;
1377 arc[2] = stroker->center;
1379 while ( arc >= bez_stack )
1385 angle_in = angle_out = stroker->angle_in;
1388 !ft_conic_is_small_enough( arc, &angle_in, &angle_out ) )
1390 if ( stroker->first_point )
1391 stroker->angle_in = angle_in;
1393 ft_conic_split( arc );
1403 if ( stroker->first_point )
1404 error = ft_stroker_subpath_start( stroker, angle_in, 0 );
1407 stroker->angle_out = angle_in;
1408 error = ft_stroker_process_corner( stroker, 0 );
1411 else if ( ft_pos_abs(
FT_Angle_Diff( stroker->angle_in, angle_in ) ) >
1416 stroker->center = arc[2];
1417 stroker->angle_out = angle_in;
1420 error = ft_stroker_process_corner( stroker, 0 );
1423 stroker->line_join = stroker->line_join_saved;
1440 phi = angle_in + theta;
1444 if ( stroker->handle_wide_strokes )
1445 alpha0 =
FT_Atan2( arc[0].
x - arc[2].
x, arc[0].
y - arc[2].
y );
1447 for ( border = stroker->borders, side = 0;
1463 if ( stroker->handle_wide_strokes )
1471 start = border->points[border->num_points - 1];
1486 beta =
FT_Atan2( arc[2].x - start.
x, arc[2].
y - start.
y );
1487 gamma =
FT_Atan2( arc[0].x - end.
x, arc[0].
y - end.
y );
1489 bvec.
x = end.
x - start.
x;
1490 bvec.
y = end.
y - start.
y;
1494 sinA = ft_pos_abs(
FT_Sin( alpha1 - gamma ) );
1495 sinB = ft_pos_abs(
FT_Sin( beta - gamma ) );
1504 border->movable =
FALSE;
1505 error = ft_stroke_border_lineto( border, &delta,
FALSE );
1508 error = ft_stroke_border_lineto( border, &end,
FALSE );
1511 error = ft_stroke_border_conicto( border, &ctrl, &start );
1515 error = ft_stroke_border_lineto( border, &end,
FALSE );
1526 error = ft_stroke_border_conicto( border, &ctrl, &end );
1534 stroker->angle_in = angle_out;
1537 stroker->center = *to;
1568 stroker->center = *to;
1576 arc[3] = stroker->center;
1578 while ( arc >= bez_stack )
1580 FT_Angle angle_in, angle_mid, angle_out;
1584 angle_in = angle_out = angle_mid = stroker->angle_in;
1587 !ft_cubic_is_small_enough( arc, &angle_in,
1588 &angle_mid, &angle_out ) )
1590 if ( stroker->first_point )
1591 stroker->angle_in = angle_in;
1593 ft_cubic_split( arc );
1603 if ( stroker->first_point )
1604 error = ft_stroker_subpath_start( stroker, angle_in, 0 );
1607 stroker->angle_out = angle_in;
1608 error = ft_stroker_process_corner( stroker, 0 );
1611 else if ( ft_pos_abs(
FT_Angle_Diff( stroker->angle_in, angle_in ) ) >
1616 stroker->center = arc[3];
1617 stroker->angle_out = angle_in;
1620 error = ft_stroker_process_corner( stroker, 0 );
1623 stroker->line_join = stroker->line_join_saved;
1641 phi1 = ft_angle_mean( angle_in, angle_mid );
1642 phi2 = ft_angle_mean( angle_mid, angle_out );
1647 if ( stroker->handle_wide_strokes )
1648 alpha0 =
FT_Atan2( arc[0].
x - arc[3].
x, arc[0].
y - arc[3].
y );
1650 for ( border = stroker->borders, side = 0;
1658 ctrl1.
x += arc[2].
x;
1659 ctrl1.
y += arc[2].
y;
1662 ctrl2.
x += arc[1].
x;
1663 ctrl2.
y += arc[1].
y;
1670 if ( stroker->handle_wide_strokes )
1678 start = border->points[border->num_points - 1];
1693 beta =
FT_Atan2( arc[3].x - start.
x, arc[3].
y - start.
y );
1694 gamma =
FT_Atan2( arc[0].x - end.
x, arc[0].
y - end.
y );
1696 bvec.
x = end.
x - start.
x;
1697 bvec.
y = end.
y - start.
y;
1701 sinA = ft_pos_abs(
FT_Sin( alpha1 - gamma ) );
1702 sinB = ft_pos_abs(
FT_Sin( beta - gamma ) );
1711 border->movable =
FALSE;
1712 error = ft_stroke_border_lineto( border, &delta,
FALSE );
1715 error = ft_stroke_border_lineto( border, &end,
FALSE );
1718 error = ft_stroke_border_cubicto( border,
1725 error = ft_stroke_border_lineto( border, &end,
FALSE );
1736 error = ft_stroke_border_cubicto( border, &ctrl1, &ctrl2, &end );
1744 stroker->angle_in = angle_out;
1747 stroker->center = *to;
1765 stroker->first_point =
TRUE;
1766 stroker->center = *to;
1767 stroker->subpath_open =
open;
1774 stroker->handle_wide_strokes =
1776 ( stroker->subpath_open &&
1780 stroker->subpath_start = *to;
1782 stroker->angle_in = 0;
1789 ft_stroker_add_reverse_left(
FT_Stroker stroker,
1800 new_points = left->num_points - left->start;
1801 if ( new_points > 0 )
1803 error = ft_stroke_border_grow( right, (
FT_UInt)new_points );
1808 FT_Vector* dst_point = right->points + right->num_points;
1809 FT_Byte* dst_tag = right->tags + right->num_points;
1810 FT_Vector* src_point = left->points + left->num_points - 1;
1811 FT_Byte* src_tag = left->tags + left->num_points - 1;
1814 while ( src_point >= left->points + left->start )
1816 *dst_point = *src_point;
1817 *dst_tag = *src_tag;
1840 left->num_points = left->start;
1841 right->num_points += new_points;
1843 right->movable =
FALSE;
1844 left->movable =
FALSE;
1861 if ( stroker->subpath_open )
1869 error = ft_stroker_cap( stroker, stroker->angle_in, 0 );
1874 error = ft_stroker_add_reverse_left( stroker,
TRUE );
1879 stroker->center = stroker->subpath_start;
1880 error = ft_stroker_cap( stroker,
1887 ft_stroke_border_close( right,
FALSE );
1896 if ( stroker->center.x != stroker->subpath_start.x ||
1897 stroker->center.y != stroker->subpath_start.y )
1905 stroker->angle_out = stroker->subpath_angle;
1907 stroker->angle_out );
1919 error = ft_stroker_inside( stroker,
1921 stroker->subpath_line_length );
1926 error = ft_stroker_outside( stroker,
1928 stroker->subpath_line_length );
1934 ft_stroke_border_close( stroker->borders + 0,
FALSE );
1935 ft_stroke_border_close( stroker->borders + 1,
TRUE );
1951 FT_UInt num_points = 0, num_contours = 0;
1955 if ( !stroker ||
border > 1 )
1961 error = ft_stroke_border_get_counts( stroker->borders +
border,
1962 &num_points, &num_contours );
1965 *anum_points = num_points;
1967 if ( anum_contours )
1968 *anum_contours = num_contours;
1981 FT_UInt count1, count2, num_points = 0;
1982 FT_UInt count3, count4, num_contours = 0;
1986 error = ft_stroke_border_get_counts( stroker->borders + 0,
1991 error = ft_stroke_border_get_counts( stroker->borders + 1,
1996 num_points = count1 + count3;
1997 num_contours = count2 + count4;
2000 *anum_points = num_points;
2001 *anum_contours = num_contours;
2019 if ( sborder->valid )
2020 ft_stroke_border_export( sborder, outline );
2062 if ( !outline || !stroker )
2063 return FT_THROW( Invalid_Argument );
2075 limit = outline->
points + last;
2078 if ( last <=
first )
2085 v_last = outline->
points[last];
2087 v_control = v_start;
2095 goto Invalid_Outline;
2111 v_start.
x = ( v_start.
x + v_last.
x ) / 2;
2112 v_start.
y = ( v_start.
y + v_last.
y ) / 2;
2122 while ( point < limit )
2145 v_control.
x = point->
x;
2146 v_control.
y = point->
y;
2149 if ( point < limit )
2170 goto Invalid_Outline;
2172 v_middle.
x = ( v_control.
x + vec.
x ) / 2;
2173 v_middle.
y = ( v_control.
y + vec.
y ) / 2;
2191 if ( point + 1 > limit ||
2193 goto Invalid_Outline;
2201 if ( point <= limit )
2225 if ( !stroker->first_point )
2241 return FT_THROW( Invalid_Outline );
2248 #ifndef FT_CONFIG_OPTION_PIC 2268 if ( pglyph ==
NULL )
2289 FT_UInt num_points, num_contours;
2301 num_points, num_contours, outline );
2344 if ( pglyph ==
NULL )
2366 FT_UInt num_points, num_contours;
2383 &num_points, &num_contours );
GLenum GLuint GLenum GLsizei length
enum FT_Stroker_LineCap_ FT_Stroker_LineCap
FT_DivFix(FT_Long a, FT_Long b)
FT_Stroker_GetCounts(FT_Stroker stroker, FT_UInt *anum_points, FT_UInt *anum_contours)
FT_Stroker_GetBorderCounts(FT_Stroker stroker, FT_StrokerBorder border, FT_UInt *anum_points, FT_UInt *anum_contours)
for(n=1;n< outline->n_points;n++)
#define FT_ARC_CUBIC_ANGLE
const FT_Glyph_Class * clazz
struct FT_OutlineGlyphRec_ * FT_OutlineGlyph
FT_BEGIN_HEADER typedef signed long FT_Pos
struct FT_StrokeBorderRec_ FT_StrokeBorderRec
GLboolean GLboolean GLboolean GLboolean a
GLsizei const GLfloat * points
FT_Glyph_StrokeBorder(FT_Glyph *pglyph, FT_Stroker stroker, FT_Bool inside, FT_Bool destroy)
fvec2 vec2
Defined as: 'typedef fvec2 vec2'. See also VL_PIPELINE_PRECISION.
FT_Stroker_BeginSubPath(FT_Stroker stroker, FT_Vector *to, FT_Bool open)
typedefFT_BEGIN_HEADER struct FT_Glyph_Class_ FT_Glyph_Class
int write(int fd, const char *buf, int nbytes)
int read(int fd, char *buf, int nbytes)
#define FT_CURVE_TAG_CUBIC
const FT_Glyph_Class ft_outline_glyph_class
GLint GLint GLint GLint GLint GLint y
#define FT_ARRAY_COPY(dest, source, count)
struct FT_StrokeBorderRec_ * FT_StrokeBorder
enum FT_Orientation_ FT_Orientation
return FT_THROW(Missing_Property)
FT_Glyph_Copy(FT_Glyph source, FT_Glyph *target)
FT_Outline_Get_Orientation(FT_Outline *outline)
#define FT_SMALL_CONIC_THRESHOLD
GLint GLint GLint GLint GLint x
local void rotate(unsigned char *list, unsigned len, unsigned rot)
typedef void(APIENTRY *GLDEBUGPROCARB)(GLenum source
GLboolean GLboolean GLboolean b
FT_BEGIN_HEADER typedef unsigned char FT_Bool
FT_Stroker_Rewind(FT_Stroker stroker)
#define FT_ASSERT(condition)
GLint GLint GLsizei GLsizei GLsizei GLint border
FT_Vector_From_Polar(FT_Vector *vec, FT_Fixed length, FT_Angle angle)
enum FT_StrokeTags_ FT_StrokeTags
FT_Stroker_LineTo(FT_Stroker stroker, FT_Vector *to)
FT_Glyph_Stroke(FT_Glyph *pglyph, FT_Stroker stroker, FT_Bool destroy)
#define FT_STROKE_TAG_BEGIN_END
FT_Outline_New(FT_Library library, FT_UInt numPoints, FT_Int numContours, FT_Outline *anoutline)
FT_Atan2(FT_Fixed x, FT_Fixed y)
enum FT_StrokerBorder_ FT_StrokerBorder
FT_MulDiv(FT_Long a, FT_Long b, FT_Long c)
FT_Outline_Done(FT_Library library, FT_Outline *outline)
struct FT_StrokerRec_ FT_StrokerRec
FT_Stroker_ConicTo(FT_Stroker stroker, FT_Vector *control, FT_Vector *to)
FT_BEGIN_HEADER typedef FT_Fixed FT_Angle
#define FT_RENEW_ARRAY(ptr, curcnt, newcnt)
#define FT_SIDE_TO_ROTATE(s)
FT_Stroker_CubicTo(FT_Stroker stroker, FT_Vector *control1, FT_Vector *control2, FT_Vector *to)
FT_Stroker_Done(FT_Stroker stroker)
FT_Stroker_Export(FT_Stroker stroker, FT_Outline *outline)
#define FT_SMALL_CUBIC_THRESHOLD
typedefFT_BEGIN_HEADER struct FT_MemoryRec_ * FT_Memory
enum FT_Stroker_LineJoin_ FT_Stroker_LineJoin
FT_MulFix(FT_Long a, FT_Long b)
FT_Outline_Check(FT_Outline *outline)
#define FT_OUTLINE_GLYPH_CLASS_GET
FT_Stroker_ExportBorder(FT_Stroker stroker, FT_StrokerBorder border, FT_Outline *outline)
FT_Angle_Diff(FT_Angle angle1, FT_Angle angle2)
int open(const char *name, int flags, int mode)
FT_Stroker_Set(FT_Stroker stroker, FT_Fixed radius, FT_Stroker_LineCap line_cap, FT_Stroker_LineJoin line_join, FT_Fixed miter_limit)
typedefFT_BEGIN_HEADER struct FT_StrokerRec_ * FT_Stroker
FT_Vector_Length(FT_Vector *vec)
GLuint GLuint GLsizei count
#define FT_CURVE_TAG_CONIC
#define FT_CURVE_TAG(flag)
FT_Outline_GetInsideBorder(FT_Outline *outline)
FT_Done_Glyph(FT_Glyph glyph)
FT_Stroker_New(FT_Library library, FT_Stroker *astroker)
FT_Outline_GetOutsideBorder(FT_Outline *outline)
FT_Stroker_EndSubPath(FT_Stroker stroker)
FT_Stroker_ParseOutline(FT_Stroker stroker, FT_Outline *outline, FT_Bool opened)