| 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, 2013, 2014 by */ | 7 /* Copyright 2002-2015 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 |
| 18 | 18 |
| 19 #include <ft2build.h> | 19 #include <ft2build.h> |
| 20 #include FT_STROKER_H | 20 #include FT_STROKER_H |
| 21 #include FT_TRIGONOMETRY_H | 21 #include FT_TRIGONOMETRY_H |
| 22 #include FT_OUTLINE_H | 22 #include FT_OUTLINE_H |
| 23 #include FT_INTERNAL_MEMORY_H | 23 #include FT_INTERNAL_MEMORY_H |
| 24 #include FT_INTERNAL_DEBUG_H | 24 #include FT_INTERNAL_DEBUG_H |
| 25 #include FT_INTERNAL_OBJECTS_H | 25 #include FT_INTERNAL_OBJECTS_H |
| 26 | 26 |
| 27 #include "basepic.h" |
| 28 |
| 29 |
| 30 /* declare an extern to access `ft_outline_glyph_class' globally */ |
| 31 /* allocated in `ftglyph.c', and use the FT_OUTLINE_GLYPH_CLASS_GET */ |
| 32 /* macro to access it when FT_CONFIG_OPTION_PIC is defined */ |
| 33 #ifndef FT_CONFIG_OPTION_PIC |
| 34 FT_CALLBACK_TABLE const FT_Glyph_Class ft_outline_glyph_class; |
| 35 #endif |
| 36 |
| 27 | 37 |
| 28 /* documentation is in ftstroke.h */ | 38 /* documentation is in ftstroke.h */ |
| 29 | 39 |
| 30 FT_EXPORT_DEF( FT_StrokerBorder ) | 40 FT_EXPORT_DEF( FT_StrokerBorder ) |
| 31 FT_Outline_GetInsideBorder( FT_Outline* outline ) | 41 FT_Outline_GetInsideBorder( FT_Outline* outline ) |
| 32 { | 42 { |
| 33 FT_Orientation o = FT_Outline_Get_Orientation( outline ); | 43 FT_Orientation o = FT_Outline_Get_Orientation( outline ); |
| 34 | 44 |
| 35 | 45 |
| 36 return o == FT_ORIENTATION_TRUETYPE ? FT_STROKER_BORDER_RIGHT | 46 return o == FT_ORIENTATION_TRUETYPE ? FT_STROKER_BORDER_RIGHT |
| (...skipping 303 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 340 | 350 |
| 341 Exit: | 351 Exit: |
| 342 return error; | 352 return error; |
| 343 } | 353 } |
| 344 | 354 |
| 345 | 355 |
| 346 static void | 356 static void |
| 347 ft_stroke_border_close( FT_StrokeBorder border, | 357 ft_stroke_border_close( FT_StrokeBorder border, |
| 348 FT_Bool reverse ) | 358 FT_Bool reverse ) |
| 349 { | 359 { |
| 350 FT_UInt start = border->start; | 360 FT_UInt start = (FT_UInt)border->start; |
| 351 FT_UInt count = border->num_points; | 361 FT_UInt count = border->num_points; |
| 352 | 362 |
| 353 | 363 |
| 354 FT_ASSERT( border->start >= 0 ); | 364 FT_ASSERT( border->start >= 0 ); |
| 355 | 365 |
| 356 /* don't record empty paths! */ | 366 /* don't record empty paths! */ |
| 357 if ( count <= start + 1U ) | 367 if ( count <= start + 1U ) |
| 358 border->num_points = start; | 368 border->num_points = start; |
| 359 else | 369 else |
| 360 { | 370 { |
| (...skipping 231 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 592 | 602 |
| 593 | 603 |
| 594 static FT_Error | 604 static FT_Error |
| 595 ft_stroke_border_moveto( FT_StrokeBorder border, | 605 ft_stroke_border_moveto( FT_StrokeBorder border, |
| 596 FT_Vector* to ) | 606 FT_Vector* to ) |
| 597 { | 607 { |
| 598 /* close current open path if any ? */ | 608 /* close current open path if any ? */ |
| 599 if ( border->start >= 0 ) | 609 if ( border->start >= 0 ) |
| 600 ft_stroke_border_close( border, FALSE ); | 610 ft_stroke_border_close( border, FALSE ); |
| 601 | 611 |
| 602 border->start = border->num_points; | 612 border->start = (FT_Int)border->num_points; |
| 603 border->movable = FALSE; | 613 border->movable = FALSE; |
| 604 | 614 |
| 605 return ft_stroke_border_lineto( border, to, FALSE ); | 615 return ft_stroke_border_lineto( border, to, FALSE ); |
| 606 } | 616 } |
| 607 | 617 |
| 608 | 618 |
| 609 static void | 619 static void |
| 610 ft_stroke_border_init( FT_StrokeBorder border, | 620 ft_stroke_border_init( FT_StrokeBorder border, |
| 611 FT_Memory memory ) | 621 FT_Memory memory ) |
| 612 { | 622 { |
| (...skipping 122 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 735 for ( ; count > 0; count--, tags++, idx++ ) | 745 for ( ; count > 0; count--, tags++, idx++ ) |
| 736 { | 746 { |
| 737 if ( *tags & FT_STROKE_TAG_END ) | 747 if ( *tags & FT_STROKE_TAG_END ) |
| 738 { | 748 { |
| 739 *write++ = idx; | 749 *write++ = idx; |
| 740 outline->n_contours++; | 750 outline->n_contours++; |
| 741 } | 751 } |
| 742 } | 752 } |
| 743 } | 753 } |
| 744 | 754 |
| 745 outline->n_points = (short)( outline->n_points + border->num_points ); | 755 outline->n_points += (short)border->num_points; |
| 746 | 756 |
| 747 FT_ASSERT( FT_Outline_Check( outline ) == 0 ); | 757 FT_ASSERT( FT_Outline_Check( outline ) == 0 ); |
| 748 } | 758 } |
| 749 | 759 |
| 750 | 760 |
| 751 /*************************************************************************/ | 761 /*************************************************************************/ |
| 752 /*************************************************************************/ | 762 /*************************************************************************/ |
| 753 /***** *****/ | 763 /***** *****/ |
| 754 /***** STROKER *****/ | 764 /***** STROKER *****/ |
| 755 /***** *****/ | 765 /***** *****/ |
| (...skipping 71 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 827 { | 837 { |
| 828 if ( !stroker ) | 838 if ( !stroker ) |
| 829 return; | 839 return; |
| 830 | 840 |
| 831 stroker->radius = radius; | 841 stroker->radius = radius; |
| 832 stroker->line_cap = line_cap; | 842 stroker->line_cap = line_cap; |
| 833 stroker->line_join = line_join; | 843 stroker->line_join = line_join; |
| 834 stroker->miter_limit = miter_limit; | 844 stroker->miter_limit = miter_limit; |
| 835 | 845 |
| 836 /* ensure miter limit has sensible value */ | 846 /* ensure miter limit has sensible value */ |
| 837 if ( stroker->miter_limit < 0x10000 ) | 847 if ( stroker->miter_limit < 0x10000L ) |
| 838 stroker->miter_limit = 0x10000; | 848 stroker->miter_limit = 0x10000L; |
| 839 | 849 |
| 840 /* save line join style: */ | 850 /* save line join style: */ |
| 841 /* line join style can be temporarily changed when stroking curves */ | 851 /* line join style can be temporarily changed when stroking curves */ |
| 842 stroker->line_join_saved = line_join; | 852 stroker->line_join_saved = line_join; |
| 843 | 853 |
| 844 FT_Stroker_Rewind( stroker ); | 854 FT_Stroker_Rewind( stroker ); |
| 845 } | 855 } |
| 846 | 856 |
| 847 | 857 |
| 848 /* documentation is in ftstroke.h */ | 858 /* documentation is in ftstroke.h */ |
| (...skipping 143 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 992 FT_Error error = FT_Err_Ok; | 1002 FT_Error error = FT_Err_Ok; |
| 993 FT_Bool intersect; /* use intersection of lines? */ | 1003 FT_Bool intersect; /* use intersection of lines? */ |
| 994 | 1004 |
| 995 | 1005 |
| 996 rotate = FT_SIDE_TO_ROTATE( side ); | 1006 rotate = FT_SIDE_TO_ROTATE( side ); |
| 997 | 1007 |
| 998 theta = FT_Angle_Diff( stroker->angle_in, stroker->angle_out ) / 2; | 1008 theta = FT_Angle_Diff( stroker->angle_in, stroker->angle_out ) / 2; |
| 999 | 1009 |
| 1000 /* Only intersect borders if between two lineto's and both */ | 1010 /* Only intersect borders if between two lineto's and both */ |
| 1001 /* lines are long enough (line_length is zero for curves). */ | 1011 /* lines are long enough (line_length is zero for curves). */ |
| 1002 if ( !border->movable || line_length == 0 ) | 1012 /* Also avoid U-turns of nearly 180 degree. */ |
| 1013 if ( !border->movable || line_length == 0 || |
| 1014 theta > 0x59C000 || theta < -0x59C000 ) |
| 1003 intersect = FALSE; | 1015 intersect = FALSE; |
| 1004 else | 1016 else |
| 1005 { | 1017 { |
| 1006 /* compute minimum required length of lines */ | 1018 /* compute minimum required length of lines */ |
| 1007 FT_Fixed min_length = ft_pos_abs( FT_MulFix( stroker->radius, | 1019 FT_Fixed min_length = ft_pos_abs( FT_MulFix( stroker->radius, |
| 1008 FT_Tan( theta ) ) ); | 1020 FT_Tan( theta ) ) ); |
| 1009 | 1021 |
| 1010 | 1022 |
| 1011 intersect = FT_BOOL( min_length && | 1023 intersect = FT_BOOL( min_length && |
| 1012 stroker->line_length >= min_length && | 1024 stroker->line_length >= min_length && |
| (...skipping 200 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1213 FT_Int inside_side; | 1225 FT_Int inside_side; |
| 1214 | 1226 |
| 1215 | 1227 |
| 1216 turn = FT_Angle_Diff( stroker->angle_in, stroker->angle_out ); | 1228 turn = FT_Angle_Diff( stroker->angle_in, stroker->angle_out ); |
| 1217 | 1229 |
| 1218 /* no specific corner processing is required if the turn is 0 */ | 1230 /* no specific corner processing is required if the turn is 0 */ |
| 1219 if ( turn == 0 ) | 1231 if ( turn == 0 ) |
| 1220 goto Exit; | 1232 goto Exit; |
| 1221 | 1233 |
| 1222 /* when we turn to the right, the inside side is 0 */ | 1234 /* when we turn to the right, the inside side is 0 */ |
| 1223 inside_side = 0; | |
| 1224 | |
| 1225 /* otherwise, the inside side is 1 */ | 1235 /* otherwise, the inside side is 1 */ |
| 1226 if ( turn < 0 ) | 1236 inside_side = ( turn < 0 ); |
| 1227 inside_side = 1; | |
| 1228 | 1237 |
| 1229 /* process the inside side */ | 1238 /* process the inside side */ |
| 1230 error = ft_stroker_inside( stroker, inside_side, line_length ); | 1239 error = ft_stroker_inside( stroker, inside_side, line_length ); |
| 1231 if ( error ) | 1240 if ( error ) |
| 1232 goto Exit; | 1241 goto Exit; |
| 1233 | 1242 |
| 1234 /* process the outside side */ | 1243 /* process the outside side */ |
| 1235 error = ft_stroker_outside( stroker, 1 - inside_side, line_length ); | 1244 error = ft_stroker_outside( stroker, !inside_side, line_length ); |
| 1236 | 1245 |
| 1237 Exit: | 1246 Exit: |
| 1238 return error; | 1247 return error; |
| 1239 } | 1248 } |
| 1240 | 1249 |
| 1241 | 1250 |
| 1242 /* add two points to the left and right borders corresponding to the */ | 1251 /* add two points to the left and right borders corresponding to the */ |
| 1243 /* start of the subpath */ | 1252 /* start of the subpath */ |
| 1244 static FT_Error | 1253 static FT_Error |
| 1245 ft_stroker_subpath_start( FT_Stroker stroker, | 1254 ft_stroker_subpath_start( FT_Stroker stroker, |
| (...skipping 569 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1815 FT_Bool open ) | 1824 FT_Bool open ) |
| 1816 { | 1825 { |
| 1817 FT_StrokeBorder right = stroker->borders + 0; | 1826 FT_StrokeBorder right = stroker->borders + 0; |
| 1818 FT_StrokeBorder left = stroker->borders + 1; | 1827 FT_StrokeBorder left = stroker->borders + 1; |
| 1819 FT_Int new_points; | 1828 FT_Int new_points; |
| 1820 FT_Error error = FT_Err_Ok; | 1829 FT_Error error = FT_Err_Ok; |
| 1821 | 1830 |
| 1822 | 1831 |
| 1823 FT_ASSERT( left->start >= 0 ); | 1832 FT_ASSERT( left->start >= 0 ); |
| 1824 | 1833 |
| 1825 new_points = left->num_points - left->start; | 1834 new_points = (FT_Int)left->num_points - left->start; |
| 1826 if ( new_points > 0 ) | 1835 if ( new_points > 0 ) |
| 1827 { | 1836 { |
| 1828 error = ft_stroke_border_grow( right, (FT_UInt)new_points ); | 1837 error = ft_stroke_border_grow( right, (FT_UInt)new_points ); |
| 1829 if ( error ) | 1838 if ( error ) |
| 1830 goto Exit; | 1839 goto Exit; |
| 1831 | 1840 |
| 1832 { | 1841 { |
| 1833 FT_Vector* dst_point = right->points + right->num_points; | 1842 FT_Vector* dst_point = right->points + right->num_points; |
| 1834 FT_Byte* dst_tag = right->tags + right->num_points; | 1843 FT_Byte* dst_tag = right->tags + right->num_points; |
| 1835 FT_Vector* src_point = left->points + left->num_points - 1; | 1844 FT_Vector* src_point = left->points + left->num_points - 1; |
| (...skipping 19 matching lines...) Expand all Loading... |
| 1855 dst_tag[0] ^= FT_STROKE_TAG_BEGIN_END; | 1864 dst_tag[0] ^= FT_STROKE_TAG_BEGIN_END; |
| 1856 } | 1865 } |
| 1857 | 1866 |
| 1858 src_point--; | 1867 src_point--; |
| 1859 src_tag--; | 1868 src_tag--; |
| 1860 dst_point++; | 1869 dst_point++; |
| 1861 dst_tag++; | 1870 dst_tag++; |
| 1862 } | 1871 } |
| 1863 } | 1872 } |
| 1864 | 1873 |
| 1865 left->num_points = left->start; | 1874 left->num_points = (FT_UInt)left->start; |
| 1866 right->num_points += new_points; | 1875 right->num_points += (FT_UInt)new_points; |
| 1867 | 1876 |
| 1868 right->movable = FALSE; | 1877 right->movable = FALSE; |
| 1869 left->movable = FALSE; | 1878 left->movable = FALSE; |
| 1870 } | 1879 } |
| 1871 | 1880 |
| 1872 Exit: | 1881 Exit: |
| 1873 return error; | 1882 return error; |
| 1874 } | 1883 } |
| 1875 | 1884 |
| 1876 | 1885 |
| (...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1934 | 1943 |
| 1935 /* process the corner */ | 1944 /* process the corner */ |
| 1936 stroker->angle_out = stroker->subpath_angle; | 1945 stroker->angle_out = stroker->subpath_angle; |
| 1937 turn = FT_Angle_Diff( stroker->angle_in, | 1946 turn = FT_Angle_Diff( stroker->angle_in, |
| 1938 stroker->angle_out ); | 1947 stroker->angle_out ); |
| 1939 | 1948 |
| 1940 /* no specific corner processing is required if the turn is 0 */ | 1949 /* no specific corner processing is required if the turn is 0 */ |
| 1941 if ( turn != 0 ) | 1950 if ( turn != 0 ) |
| 1942 { | 1951 { |
| 1943 /* when we turn to the right, the inside side is 0 */ | 1952 /* when we turn to the right, the inside side is 0 */ |
| 1944 inside_side = 0; | |
| 1945 | |
| 1946 /* otherwise, the inside side is 1 */ | 1953 /* otherwise, the inside side is 1 */ |
| 1947 if ( turn < 0 ) | 1954 inside_side = ( turn < 0 ); |
| 1948 inside_side = 1; | |
| 1949 | 1955 |
| 1950 error = ft_stroker_inside( stroker, | 1956 error = ft_stroker_inside( stroker, |
| 1951 inside_side, | 1957 inside_side, |
| 1952 stroker->subpath_line_length ); | 1958 stroker->subpath_line_length ); |
| 1953 if ( error ) | 1959 if ( error ) |
| 1954 goto Exit; | 1960 goto Exit; |
| 1955 | 1961 |
| 1956 /* process the outside side */ | 1962 /* process the outside side */ |
| 1957 error = ft_stroker_outside( stroker, | 1963 error = ft_stroker_outside( stroker, |
| 1958 1 - inside_side, | 1964 !inside_side, |
| 1959 stroker->subpath_line_length ); | 1965 stroker->subpath_line_length ); |
| 1960 if ( error ) | 1966 if ( error ) |
| 1961 goto Exit; | 1967 goto Exit; |
| 1962 } | 1968 } |
| 1963 | 1969 |
| 1964 /* then end our two subpaths */ | 1970 /* then end our two subpaths */ |
| 1965 ft_stroke_border_close( stroker->borders + 0, FALSE ); | 1971 ft_stroke_border_close( stroker->borders + 0, FALSE ); |
| 1966 ft_stroke_border_close( stroker->borders + 1, TRUE ); | 1972 ft_stroke_border_close( stroker->borders + 1, TRUE ); |
| 1967 } | 1973 } |
| 1968 | 1974 |
| (...skipping 142 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2111 | 2117 |
| 2112 FT_Stroker_Rewind( stroker ); | 2118 FT_Stroker_Rewind( stroker ); |
| 2113 | 2119 |
| 2114 first = 0; | 2120 first = 0; |
| 2115 | 2121 |
| 2116 for ( n = 0; n < outline->n_contours; n++ ) | 2122 for ( n = 0; n < outline->n_contours; n++ ) |
| 2117 { | 2123 { |
| 2118 FT_UInt last; /* index of last point in contour */ | 2124 FT_UInt last; /* index of last point in contour */ |
| 2119 | 2125 |
| 2120 | 2126 |
| 2121 last = outline->contours[n]; | 2127 last = (FT_UInt)outline->contours[n]; |
| 2122 limit = outline->points + last; | 2128 limit = outline->points + last; |
| 2123 | 2129 |
| 2124 /* skip empty points; we don't stroke these */ | 2130 /* skip empty points; we don't stroke these */ |
| 2125 if ( last <= first ) | 2131 if ( last <= first ) |
| 2126 { | 2132 { |
| 2127 first = last + 1; | 2133 first = last + 1; |
| 2128 continue; | 2134 continue; |
| 2129 } | 2135 } |
| 2130 | 2136 |
| 2131 v_start = outline->points[first]; | 2137 v_start = outline->points[first]; |
| (...skipping 150 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2282 return FT_Err_Ok; | 2288 return FT_Err_Ok; |
| 2283 | 2289 |
| 2284 Exit: | 2290 Exit: |
| 2285 return error; | 2291 return error; |
| 2286 | 2292 |
| 2287 Invalid_Outline: | 2293 Invalid_Outline: |
| 2288 return FT_THROW( Invalid_Outline ); | 2294 return FT_THROW( Invalid_Outline ); |
| 2289 } | 2295 } |
| 2290 | 2296 |
| 2291 | 2297 |
| 2292 /* declare an extern to access `ft_outline_glyph_class' globally */ | |
| 2293 /* allocated in `ftglyph.c', and use the FT_OUTLINE_GLYPH_CLASS_GET */ | |
| 2294 /* macro to access it when FT_CONFIG_OPTION_PIC is defined */ | |
| 2295 #ifndef FT_CONFIG_OPTION_PIC | |
| 2296 extern const FT_Glyph_Class ft_outline_glyph_class; | |
| 2297 #endif | |
| 2298 #include "basepic.h" | |
| 2299 | |
| 2300 | |
| 2301 /* documentation is in ftstroke.h */ | 2298 /* documentation is in ftstroke.h */ |
| 2302 | 2299 |
| 2303 FT_EXPORT_DEF( FT_Error ) | 2300 FT_EXPORT_DEF( FT_Error ) |
| 2304 FT_Glyph_Stroke( FT_Glyph *pglyph, | 2301 FT_Glyph_Stroke( FT_Glyph *pglyph, |
| 2305 FT_Stroker stroker, | 2302 FT_Stroker stroker, |
| 2306 FT_Bool destroy ) | 2303 FT_Bool destroy ) |
| 2307 { | 2304 { |
| 2308 FT_Error error = FT_ERR( Invalid_Argument ); | 2305 FT_Error error = FT_ERR( Invalid_Argument ); |
| 2309 FT_Glyph glyph = NULL; | 2306 FT_Glyph glyph = NULL; |
| 2310 | 2307 |
| (...skipping 29 matching lines...) Expand all Loading... |
| 2340 | 2337 |
| 2341 error = FT_Stroker_ParseOutline( stroker, outline, FALSE ); | 2338 error = FT_Stroker_ParseOutline( stroker, outline, FALSE ); |
| 2342 if ( error ) | 2339 if ( error ) |
| 2343 goto Fail; | 2340 goto Fail; |
| 2344 | 2341 |
| 2345 FT_Stroker_GetCounts( stroker, &num_points, &num_contours ); | 2342 FT_Stroker_GetCounts( stroker, &num_points, &num_contours ); |
| 2346 | 2343 |
| 2347 FT_Outline_Done( glyph->library, outline ); | 2344 FT_Outline_Done( glyph->library, outline ); |
| 2348 | 2345 |
| 2349 error = FT_Outline_New( glyph->library, | 2346 error = FT_Outline_New( glyph->library, |
| 2350 num_points, num_contours, outline ); | 2347 num_points, |
| 2348 (FT_Int)num_contours, |
| 2349 outline ); |
| 2351 if ( error ) | 2350 if ( error ) |
| 2352 goto Fail; | 2351 goto Fail; |
| 2353 | 2352 |
| 2354 outline->n_points = 0; | 2353 outline->n_points = 0; |
| 2355 outline->n_contours = 0; | 2354 outline->n_contours = 0; |
| 2356 | 2355 |
| 2357 FT_Stroker_Export( stroker, outline ); | 2356 FT_Stroker_Export( stroker, outline ); |
| 2358 } | 2357 } |
| 2359 | 2358 |
| 2360 if ( destroy ) | 2359 if ( destroy ) |
| (...skipping 69 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2430 if ( error ) | 2429 if ( error ) |
| 2431 goto Fail; | 2430 goto Fail; |
| 2432 | 2431 |
| 2433 FT_Stroker_GetBorderCounts( stroker, border, | 2432 FT_Stroker_GetBorderCounts( stroker, border, |
| 2434 &num_points, &num_contours ); | 2433 &num_points, &num_contours ); |
| 2435 | 2434 |
| 2436 FT_Outline_Done( glyph->library, outline ); | 2435 FT_Outline_Done( glyph->library, outline ); |
| 2437 | 2436 |
| 2438 error = FT_Outline_New( glyph->library, | 2437 error = FT_Outline_New( glyph->library, |
| 2439 num_points, | 2438 num_points, |
| 2440 num_contours, | 2439 (FT_Int)num_contours, |
| 2441 outline ); | 2440 outline ); |
| 2442 if ( error ) | 2441 if ( error ) |
| 2443 goto Fail; | 2442 goto Fail; |
| 2444 | 2443 |
| 2445 outline->n_points = 0; | 2444 outline->n_points = 0; |
| 2446 outline->n_contours = 0; | 2445 outline->n_contours = 0; |
| 2447 | 2446 |
| 2448 FT_Stroker_ExportBorder( stroker, border, outline ); | 2447 FT_Stroker_ExportBorder( stroker, border, outline ); |
| 2449 } | 2448 } |
| 2450 | 2449 |
| 2451 if ( destroy ) | 2450 if ( destroy ) |
| 2452 FT_Done_Glyph( *pglyph ); | 2451 FT_Done_Glyph( *pglyph ); |
| 2453 | 2452 |
| 2454 *pglyph = glyph; | 2453 *pglyph = glyph; |
| 2455 goto Exit; | 2454 goto Exit; |
| 2456 | 2455 |
| 2457 Fail: | 2456 Fail: |
| 2458 FT_Done_Glyph( glyph ); | 2457 FT_Done_Glyph( glyph ); |
| 2459 glyph = NULL; | 2458 glyph = NULL; |
| 2460 | 2459 |
| 2461 if ( !destroy ) | 2460 if ( !destroy ) |
| 2462 *pglyph = NULL; | 2461 *pglyph = NULL; |
| 2463 | 2462 |
| 2464 Exit: | 2463 Exit: |
| 2465 return error; | 2464 return error; |
| 2466 } | 2465 } |
| 2467 | 2466 |
| 2468 | 2467 |
| 2469 /* END */ | 2468 /* END */ |
| OLD | NEW |