OLD | NEW |
1 /***************************************************************************/ | 1 /***************************************************************************/ |
2 /* */ | 2 /* */ |
3 /* ftstroke.c */ | 3 /* ftstroke.c */ |
4 /* */ | 4 /* */ |
5 /* FreeType path stroker (body). */ | 5 /* FreeType path stroker (body). */ |
6 /* */ | 6 /* */ |
7 /* Copyright 2002-2006, 2008-2011 by */ | 7 /* Copyright 2002-2006, 2008-2011, 2013 by */ |
8 /* David Turner, Robert Wilhelm, and Werner Lemberg. */ | 8 /* David Turner, Robert Wilhelm, and Werner Lemberg. */ |
9 /* */ | 9 /* */ |
10 /* This file is part of the FreeType project, and may only be used, */ | 10 /* This file is part of the FreeType project, and may only be used, */ |
11 /* modified, and distributed under the terms of the FreeType project */ | 11 /* modified, and distributed under the terms of the FreeType project */ |
12 /* license, LICENSE.TXT. By continuing to use, modify, or distribute */ | 12 /* license, LICENSE.TXT. By continuing to use, modify, or distribute */ |
13 /* this file you indicate that you have read the license and */ | 13 /* this file you indicate that you have read the license and */ |
14 /* understand and accept it fully. */ | 14 /* understand and accept it fully. */ |
15 /* */ | 15 /* */ |
16 /***************************************************************************/ | 16 /***************************************************************************/ |
17 | 17 |
(...skipping 764 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
782 | 782 |
783 } FT_StrokerRec; | 783 } FT_StrokerRec; |
784 | 784 |
785 | 785 |
786 /* documentation is in ftstroke.h */ | 786 /* documentation is in ftstroke.h */ |
787 | 787 |
788 FT_EXPORT_DEF( FT_Error ) | 788 FT_EXPORT_DEF( FT_Error ) |
789 FT_Stroker_New( FT_Library library, | 789 FT_Stroker_New( FT_Library library, |
790 FT_Stroker *astroker ) | 790 FT_Stroker *astroker ) |
791 { | 791 { |
792 FT_Error error; | 792 FT_Error error; /* assigned in FT_NEW */ |
793 FT_Memory memory; | 793 FT_Memory memory; |
794 FT_Stroker stroker = NULL; | 794 FT_Stroker stroker = NULL; |
795 | 795 |
796 | 796 |
797 if ( !library ) | 797 if ( !library ) |
798 return FT_Err_Invalid_Argument; | 798 return FT_THROW( Invalid_Argument ); |
799 | 799 |
800 memory = library->memory; | 800 memory = library->memory; |
801 | 801 |
802 if ( !FT_NEW( stroker ) ) | 802 if ( !FT_NEW( stroker ) ) |
803 { | 803 { |
804 stroker->library = library; | 804 stroker->library = library; |
805 | 805 |
806 ft_stroke_border_init( &stroker->borders[0], memory ); | 806 ft_stroke_border_init( &stroker->borders[0], memory ); |
807 ft_stroke_border_init( &stroker->borders[1], memory ); | 807 ft_stroke_border_init( &stroker->borders[1], memory ); |
808 } | 808 } |
(...skipping 310 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1119 | 1119 |
1120 | 1120 |
1121 /* compute middle point */ | 1121 /* compute middle point */ |
1122 FT_Vector_From_Polar( &middle, | 1122 FT_Vector_From_Polar( &middle, |
1123 FT_MulFix( radius, stroker->miter_limit ), | 1123 FT_MulFix( radius, stroker->miter_limit ), |
1124 phi ); | 1124 phi ); |
1125 middle.x += stroker->center.x; | 1125 middle.x += stroker->center.x; |
1126 middle.y += stroker->center.y; | 1126 middle.y += stroker->center.y; |
1127 | 1127 |
1128 /* compute first angle point */ | 1128 /* compute first angle point */ |
1129 length = FT_MulFix( radius, | 1129 length = FT_MulDiv( radius, 0x10000L - sigma, |
1130 FT_DivFix( 0x10000L - sigma, | 1130 ft_pos_abs( FT_Sin( theta ) ) ); |
1131 ft_pos_abs( FT_Sin( theta ) ) ) ); | |
1132 | 1131 |
1133 FT_Vector_From_Polar( &delta, length, phi + rotate ); | 1132 FT_Vector_From_Polar( &delta, length, phi + rotate ); |
1134 delta.x += middle.x; | 1133 delta.x += middle.x; |
1135 delta.y += middle.y; | 1134 delta.y += middle.y; |
1136 | 1135 |
1137 error = ft_stroke_border_lineto( border, &delta, FALSE ); | 1136 error = ft_stroke_border_lineto( border, &delta, FALSE ); |
1138 if ( error ) | 1137 if ( error ) |
1139 goto Exit; | 1138 goto Exit; |
1140 | 1139 |
1141 /* compute second angle point */ | 1140 /* compute second angle point */ |
(...skipping 346 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1488 gamma = FT_Atan2( arc[0].x - end.x, arc[0].y - end.y ); | 1487 gamma = FT_Atan2( arc[0].x - end.x, arc[0].y - end.y ); |
1489 | 1488 |
1490 bvec.x = end.x - start.x; | 1489 bvec.x = end.x - start.x; |
1491 bvec.y = end.y - start.y; | 1490 bvec.y = end.y - start.y; |
1492 | 1491 |
1493 blen = FT_Vector_Length( &bvec ); | 1492 blen = FT_Vector_Length( &bvec ); |
1494 | 1493 |
1495 sinA = ft_pos_abs( FT_Sin( alpha1 - gamma ) ); | 1494 sinA = ft_pos_abs( FT_Sin( alpha1 - gamma ) ); |
1496 sinB = ft_pos_abs( FT_Sin( beta - gamma ) ); | 1495 sinB = ft_pos_abs( FT_Sin( beta - gamma ) ); |
1497 | 1496 |
1498 alen = FT_DivFix( FT_MulFix( blen, sinA ), sinB ); | 1497 alen = FT_MulDiv( blen, sinA, sinB ); |
1499 | 1498 |
1500 FT_Vector_From_Polar( &delta, alen, beta ); | 1499 FT_Vector_From_Polar( &delta, alen, beta ); |
1501 delta.x += start.x; | 1500 delta.x += start.x; |
1502 delta.y += start.y; | 1501 delta.y += start.y; |
1503 | 1502 |
1504 /* circumnavigate the negative sector backwards */ | 1503 /* circumnavigate the negative sector backwards */ |
1505 border->movable = FALSE; | 1504 border->movable = FALSE; |
1506 error = ft_stroke_border_lineto( border, &delta, FALSE ); | 1505 error = ft_stroke_border_lineto( border, &delta, FALSE ); |
1507 if ( error ) | 1506 if ( error ) |
1508 goto Exit; | 1507 goto Exit; |
(...skipping 186 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1695 gamma = FT_Atan2( arc[0].x - end.x, arc[0].y - end.y ); | 1694 gamma = FT_Atan2( arc[0].x - end.x, arc[0].y - end.y ); |
1696 | 1695 |
1697 bvec.x = end.x - start.x; | 1696 bvec.x = end.x - start.x; |
1698 bvec.y = end.y - start.y; | 1697 bvec.y = end.y - start.y; |
1699 | 1698 |
1700 blen = FT_Vector_Length( &bvec ); | 1699 blen = FT_Vector_Length( &bvec ); |
1701 | 1700 |
1702 sinA = ft_pos_abs( FT_Sin( alpha1 - gamma ) ); | 1701 sinA = ft_pos_abs( FT_Sin( alpha1 - gamma ) ); |
1703 sinB = ft_pos_abs( FT_Sin( beta - gamma ) ); | 1702 sinB = ft_pos_abs( FT_Sin( beta - gamma ) ); |
1704 | 1703 |
1705 alen = FT_DivFix( FT_MulFix( blen, sinA ), sinB ); | 1704 alen = FT_MulDiv( blen, sinA, sinB ); |
1706 | 1705 |
1707 FT_Vector_From_Polar( &delta, alen, beta ); | 1706 FT_Vector_From_Polar( &delta, alen, beta ); |
1708 delta.x += start.x; | 1707 delta.x += start.x; |
1709 delta.y += start.y; | 1708 delta.y += start.y; |
1710 | 1709 |
1711 /* circumnavigate the negative sector backwards */ | 1710 /* circumnavigate the negative sector backwards */ |
1712 border->movable = FALSE; | 1711 border->movable = FALSE; |
1713 error = ft_stroke_border_lineto( border, &delta, FALSE ); | 1712 error = ft_stroke_border_lineto( border, &delta, FALSE ); |
1714 if ( error ) | 1713 if ( error ) |
1715 goto Exit; | 1714 goto Exit; |
(...skipping 232 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1948 FT_StrokerBorder border, | 1947 FT_StrokerBorder border, |
1949 FT_UInt *anum_points, | 1948 FT_UInt *anum_points, |
1950 FT_UInt *anum_contours ) | 1949 FT_UInt *anum_contours ) |
1951 { | 1950 { |
1952 FT_UInt num_points = 0, num_contours = 0; | 1951 FT_UInt num_points = 0, num_contours = 0; |
1953 FT_Error error; | 1952 FT_Error error; |
1954 | 1953 |
1955 | 1954 |
1956 if ( !stroker || border > 1 ) | 1955 if ( !stroker || border > 1 ) |
1957 { | 1956 { |
1958 error = FT_Err_Invalid_Argument; | 1957 error = FT_THROW( Invalid_Argument ); |
1959 goto Exit; | 1958 goto Exit; |
1960 } | 1959 } |
1961 | 1960 |
1962 error = ft_stroke_border_get_counts( stroker->borders + border, | 1961 error = ft_stroke_border_get_counts( stroker->borders + border, |
1963 &num_points, &num_contours ); | 1962 &num_points, &num_contours ); |
1964 Exit: | 1963 Exit: |
1965 if ( anum_points ) | 1964 if ( anum_points ) |
1966 *anum_points = num_points; | 1965 *anum_points = num_points; |
1967 | 1966 |
1968 if ( anum_contours ) | 1967 if ( anum_contours ) |
(...skipping 85 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2054 char* tags; | 2053 char* tags; |
2055 | 2054 |
2056 FT_Error error; | 2055 FT_Error error; |
2057 | 2056 |
2058 FT_Int n; /* index of contour in outline */ | 2057 FT_Int n; /* index of contour in outline */ |
2059 FT_UInt first; /* index of first point in contour */ | 2058 FT_UInt first; /* index of first point in contour */ |
2060 FT_Int tag; /* current point's state */ | 2059 FT_Int tag; /* current point's state */ |
2061 | 2060 |
2062 | 2061 |
2063 if ( !outline || !stroker ) | 2062 if ( !outline || !stroker ) |
2064 return FT_Err_Invalid_Argument; | 2063 return FT_THROW( Invalid_Argument ); |
2065 | 2064 |
2066 FT_Stroker_Rewind( stroker ); | 2065 FT_Stroker_Rewind( stroker ); |
2067 | 2066 |
2068 first = 0; | 2067 first = 0; |
2069 | 2068 |
2070 for ( n = 0; n < outline->n_contours; n++ ) | 2069 for ( n = 0; n < outline->n_contours; n++ ) |
2071 { | 2070 { |
2072 FT_UInt last; /* index of last point in contour */ | 2071 FT_UInt last; /* index of last point in contour */ |
2073 | 2072 |
2074 | 2073 |
(...skipping 157 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2232 | 2231 |
2233 first = last + 1; | 2232 first = last + 1; |
2234 } | 2233 } |
2235 | 2234 |
2236 return FT_Err_Ok; | 2235 return FT_Err_Ok; |
2237 | 2236 |
2238 Exit: | 2237 Exit: |
2239 return error; | 2238 return error; |
2240 | 2239 |
2241 Invalid_Outline: | 2240 Invalid_Outline: |
2242 return FT_Err_Invalid_Outline; | 2241 return FT_THROW( Invalid_Outline ); |
2243 } | 2242 } |
2244 | 2243 |
2245 | 2244 |
2246 /* declare an extern to access `ft_outline_glyph_class' globally */ | 2245 /* declare an extern to access `ft_outline_glyph_class' globally */ |
2247 /* allocated in `ftglyph.c', and use the FT_OUTLINE_GLYPH_CLASS_GET */ | 2246 /* allocated in `ftglyph.c', and use the FT_OUTLINE_GLYPH_CLASS_GET */ |
2248 /* macro to access it when FT_CONFIG_OPTION_PIC is defined */ | 2247 /* macro to access it when FT_CONFIG_OPTION_PIC is defined */ |
2249 #ifndef FT_CONFIG_OPTION_PIC | 2248 #ifndef FT_CONFIG_OPTION_PIC |
2250 extern const FT_Glyph_Class ft_outline_glyph_class; | 2249 extern const FT_Glyph_Class ft_outline_glyph_class; |
2251 #endif | 2250 #endif |
2252 #include "basepic.h" | 2251 #include "basepic.h" |
2253 | 2252 |
2254 | 2253 |
2255 /* documentation is in ftstroke.h */ | 2254 /* documentation is in ftstroke.h */ |
2256 | 2255 |
2257 FT_EXPORT_DEF( FT_Error ) | 2256 FT_EXPORT_DEF( FT_Error ) |
2258 FT_Glyph_Stroke( FT_Glyph *pglyph, | 2257 FT_Glyph_Stroke( FT_Glyph *pglyph, |
2259 FT_Stroker stroker, | 2258 FT_Stroker stroker, |
2260 FT_Bool destroy ) | 2259 FT_Bool destroy ) |
2261 { | 2260 { |
2262 FT_Error error = FT_Err_Invalid_Argument; | 2261 FT_Error error = FT_ERR( Invalid_Argument ); |
2263 FT_Glyph glyph = NULL; | 2262 FT_Glyph glyph = NULL; |
2264 FT_Library library = stroker->library; | 2263 FT_Library library = stroker->library; |
2265 | 2264 |
2266 FT_UNUSED( library ); | 2265 FT_UNUSED( library ); |
2267 | 2266 |
2268 | 2267 |
2269 if ( pglyph == NULL ) | 2268 if ( pglyph == NULL ) |
2270 goto Exit; | 2269 goto Exit; |
2271 | 2270 |
2272 glyph = *pglyph; | 2271 glyph = *pglyph; |
(...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2328 | 2327 |
2329 | 2328 |
2330 /* documentation is in ftstroke.h */ | 2329 /* documentation is in ftstroke.h */ |
2331 | 2330 |
2332 FT_EXPORT_DEF( FT_Error ) | 2331 FT_EXPORT_DEF( FT_Error ) |
2333 FT_Glyph_StrokeBorder( FT_Glyph *pglyph, | 2332 FT_Glyph_StrokeBorder( FT_Glyph *pglyph, |
2334 FT_Stroker stroker, | 2333 FT_Stroker stroker, |
2335 FT_Bool inside, | 2334 FT_Bool inside, |
2336 FT_Bool destroy ) | 2335 FT_Bool destroy ) |
2337 { | 2336 { |
2338 FT_Error error = FT_Err_Invalid_Argument; | 2337 FT_Error error = FT_ERR( Invalid_Argument ); |
2339 FT_Glyph glyph = NULL; | 2338 FT_Glyph glyph = NULL; |
2340 FT_Library library = stroker->library; | 2339 FT_Library library = stroker->library; |
2341 | 2340 |
2342 FT_UNUSED( library ); | 2341 FT_UNUSED( library ); |
2343 | 2342 |
2344 | 2343 |
2345 if ( pglyph == NULL ) | 2344 if ( pglyph == NULL ) |
2346 goto Exit; | 2345 goto Exit; |
2347 | 2346 |
2348 glyph = *pglyph; | 2347 glyph = *pglyph; |
(...skipping 61 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2410 | 2409 |
2411 if ( !destroy ) | 2410 if ( !destroy ) |
2412 *pglyph = NULL; | 2411 *pglyph = NULL; |
2413 | 2412 |
2414 Exit: | 2413 Exit: |
2415 return error; | 2414 return error; |
2416 } | 2415 } |
2417 | 2416 |
2418 | 2417 |
2419 /* END */ | 2418 /* END */ |
OLD | NEW |