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 by */ | 7 /* Copyright 2002-2006, 2008-2011, 2013, 2014 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 "../../include/ft2build.h" | 19 #include <ft2build.h> |
20 #include "../../include/freetype/ftstroke.h" | 20 #include FT_STROKER_H |
21 #include "../../include/freetype/fttrigon.h" | 21 #include FT_TRIGONOMETRY_H |
22 #include "../../include/freetype/ftoutln.h" | 22 #include FT_OUTLINE_H |
23 #include "../../include/freetype/internal/ftmemory.h" | 23 #include FT_INTERNAL_MEMORY_H |
24 #include "../../include/freetype/internal/ftdebug.h" | 24 #include FT_INTERNAL_DEBUG_H |
25 #include "../../include/freetype/internal/ftobjs.h" | 25 #include FT_INTERNAL_OBJECTS_H |
26 | 26 |
27 | 27 |
28 /* documentation is in ftstroke.h */ | 28 /* documentation is in ftstroke.h */ |
29 | 29 |
30 FT_EXPORT_DEF( FT_StrokerBorder ) | 30 FT_EXPORT_DEF( FT_StrokerBorder ) |
31 FT_Outline_GetInsideBorder( FT_Outline* outline ) | 31 FT_Outline_GetInsideBorder( FT_Outline* outline ) |
32 { | 32 { |
33 FT_Orientation o = FT_Outline_Get_Orientation( outline ); | 33 FT_Orientation o = FT_Outline_Get_Orientation( outline ); |
34 | 34 |
35 | 35 |
(...skipping 752 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
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; /* assigned in FT_NEW */ | 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_THROW( Invalid_Library_Handle ); |
| 799 |
| 800 if ( !astroker ) |
798 return FT_THROW( Invalid_Argument ); | 801 return FT_THROW( Invalid_Argument ); |
799 | 802 |
800 memory = library->memory; | 803 memory = library->memory; |
801 | 804 |
802 if ( !FT_NEW( stroker ) ) | 805 if ( !FT_NEW( stroker ) ) |
803 { | 806 { |
804 stroker->library = library; | 807 stroker->library = library; |
805 | 808 |
806 ft_stroke_border_init( &stroker->borders[0], memory ); | 809 ft_stroke_border_init( &stroker->borders[0], memory ); |
807 ft_stroke_border_init( &stroker->borders[1], memory ); | 810 ft_stroke_border_init( &stroker->borders[1], memory ); |
808 } | 811 } |
809 | 812 |
810 *astroker = stroker; | 813 *astroker = stroker; |
811 | 814 |
812 return error; | 815 return error; |
813 } | 816 } |
814 | 817 |
815 | 818 |
816 /* documentation is in ftstroke.h */ | 819 /* documentation is in ftstroke.h */ |
817 | 820 |
818 FT_EXPORT_DEF( void ) | 821 FT_EXPORT_DEF( void ) |
819 FT_Stroker_Set( FT_Stroker stroker, | 822 FT_Stroker_Set( FT_Stroker stroker, |
820 FT_Fixed radius, | 823 FT_Fixed radius, |
821 FT_Stroker_LineCap line_cap, | 824 FT_Stroker_LineCap line_cap, |
822 FT_Stroker_LineJoin line_join, | 825 FT_Stroker_LineJoin line_join, |
823 FT_Fixed miter_limit ) | 826 FT_Fixed miter_limit ) |
824 { | 827 { |
| 828 if ( !stroker ) |
| 829 return; |
| 830 |
825 stroker->radius = radius; | 831 stroker->radius = radius; |
826 stroker->line_cap = line_cap; | 832 stroker->line_cap = line_cap; |
827 stroker->line_join = line_join; | 833 stroker->line_join = line_join; |
828 stroker->miter_limit = miter_limit; | 834 stroker->miter_limit = miter_limit; |
829 | 835 |
830 /* ensure miter limit has sensible value */ | 836 /* ensure miter limit has sensible value */ |
831 if ( stroker->miter_limit < 0x10000 ) | 837 if ( stroker->miter_limit < 0x10000 ) |
832 stroker->miter_limit = 0x10000; | 838 stroker->miter_limit = 0x10000; |
833 | 839 |
834 /* save line join style: */ | 840 /* save line join style: */ |
(...skipping 160 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
995 /* lines are long enough (line_length is zero for curves). */ | 1001 /* lines are long enough (line_length is zero for curves). */ |
996 if ( !border->movable || line_length == 0 ) | 1002 if ( !border->movable || line_length == 0 ) |
997 intersect = FALSE; | 1003 intersect = FALSE; |
998 else | 1004 else |
999 { | 1005 { |
1000 /* compute minimum required length of lines */ | 1006 /* compute minimum required length of lines */ |
1001 FT_Fixed min_length = ft_pos_abs( FT_MulFix( stroker->radius, | 1007 FT_Fixed min_length = ft_pos_abs( FT_MulFix( stroker->radius, |
1002 FT_Tan( theta ) ) ); | 1008 FT_Tan( theta ) ) ); |
1003 | 1009 |
1004 | 1010 |
1005 intersect = FT_BOOL( stroker->line_length >= min_length && | 1011 intersect = FT_BOOL( min_length && |
| 1012 stroker->line_length >= min_length && |
1006 line_length >= min_length ); | 1013 line_length >= min_length ); |
1007 } | 1014 } |
1008 | 1015 |
1009 if ( !intersect ) | 1016 if ( !intersect ) |
1010 { | 1017 { |
1011 FT_Vector_From_Polar( &delta, stroker->radius, | 1018 FT_Vector_From_Polar( &delta, stroker->radius, |
1012 stroker->angle_out + rotate ); | 1019 stroker->angle_out + rotate ); |
1013 delta.x += stroker->center.x; | 1020 delta.x += stroker->center.x; |
1014 delta.y += stroker->center.y; | 1021 delta.y += stroker->center.y; |
1015 | 1022 |
(...skipping 264 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1280 FT_Vector* to ) | 1287 FT_Vector* to ) |
1281 { | 1288 { |
1282 FT_Error error = FT_Err_Ok; | 1289 FT_Error error = FT_Err_Ok; |
1283 FT_StrokeBorder border; | 1290 FT_StrokeBorder border; |
1284 FT_Vector delta; | 1291 FT_Vector delta; |
1285 FT_Angle angle; | 1292 FT_Angle angle; |
1286 FT_Int side; | 1293 FT_Int side; |
1287 FT_Fixed line_length; | 1294 FT_Fixed line_length; |
1288 | 1295 |
1289 | 1296 |
| 1297 if ( !stroker || !to ) |
| 1298 return FT_THROW( Invalid_Argument ); |
| 1299 |
1290 delta.x = to->x - stroker->center.x; | 1300 delta.x = to->x - stroker->center.x; |
1291 delta.y = to->y - stroker->center.y; | 1301 delta.y = to->y - stroker->center.y; |
1292 | 1302 |
1293 /* a zero-length lineto is a no-op; avoid creating a spurious corner */ | 1303 /* a zero-length lineto is a no-op; avoid creating a spurious corner */ |
1294 if ( delta.x == 0 && delta.y == 0 ) | 1304 if ( delta.x == 0 && delta.y == 0 ) |
1295 goto Exit; | 1305 goto Exit; |
1296 | 1306 |
1297 /* compute length of line */ | 1307 /* compute length of line */ |
1298 line_length = FT_Vector_Length( &delta ); | 1308 line_length = FT_Vector_Length( &delta ); |
1299 | 1309 |
(...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1353 FT_Vector* control, | 1363 FT_Vector* control, |
1354 FT_Vector* to ) | 1364 FT_Vector* to ) |
1355 { | 1365 { |
1356 FT_Error error = FT_Err_Ok; | 1366 FT_Error error = FT_Err_Ok; |
1357 FT_Vector bez_stack[34]; | 1367 FT_Vector bez_stack[34]; |
1358 FT_Vector* arc; | 1368 FT_Vector* arc; |
1359 FT_Vector* limit = bez_stack + 30; | 1369 FT_Vector* limit = bez_stack + 30; |
1360 FT_Bool first_arc = TRUE; | 1370 FT_Bool first_arc = TRUE; |
1361 | 1371 |
1362 | 1372 |
| 1373 if ( !stroker || !control || !to ) |
| 1374 { |
| 1375 error = FT_THROW( Invalid_Argument ); |
| 1376 goto Exit; |
| 1377 } |
| 1378 |
1363 /* if all control points are coincident, this is a no-op; */ | 1379 /* if all control points are coincident, this is a no-op; */ |
1364 /* avoid creating a spurious corner */ | 1380 /* avoid creating a spurious corner */ |
1365 if ( FT_IS_SMALL( stroker->center.x - control->x ) && | 1381 if ( FT_IS_SMALL( stroker->center.x - control->x ) && |
1366 FT_IS_SMALL( stroker->center.y - control->y ) && | 1382 FT_IS_SMALL( stroker->center.y - control->y ) && |
1367 FT_IS_SMALL( control->x - to->x ) && | 1383 FT_IS_SMALL( control->x - to->x ) && |
1368 FT_IS_SMALL( control->y - to->y ) ) | 1384 FT_IS_SMALL( control->y - to->y ) ) |
1369 { | 1385 { |
1370 stroker->center = *to; | 1386 stroker->center = *to; |
1371 goto Exit; | 1387 goto Exit; |
1372 } | 1388 } |
(...skipping 176 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1549 FT_Vector* control2, | 1565 FT_Vector* control2, |
1550 FT_Vector* to ) | 1566 FT_Vector* to ) |
1551 { | 1567 { |
1552 FT_Error error = FT_Err_Ok; | 1568 FT_Error error = FT_Err_Ok; |
1553 FT_Vector bez_stack[37]; | 1569 FT_Vector bez_stack[37]; |
1554 FT_Vector* arc; | 1570 FT_Vector* arc; |
1555 FT_Vector* limit = bez_stack + 32; | 1571 FT_Vector* limit = bez_stack + 32; |
1556 FT_Bool first_arc = TRUE; | 1572 FT_Bool first_arc = TRUE; |
1557 | 1573 |
1558 | 1574 |
| 1575 if ( !stroker || !control1 || !control2 || !to ) |
| 1576 { |
| 1577 error = FT_THROW( Invalid_Argument ); |
| 1578 goto Exit; |
| 1579 } |
| 1580 |
1559 /* if all control points are coincident, this is a no-op; */ | 1581 /* if all control points are coincident, this is a no-op; */ |
1560 /* avoid creating a spurious corner */ | 1582 /* avoid creating a spurious corner */ |
1561 if ( FT_IS_SMALL( stroker->center.x - control1->x ) && | 1583 if ( FT_IS_SMALL( stroker->center.x - control1->x ) && |
1562 FT_IS_SMALL( stroker->center.y - control1->y ) && | 1584 FT_IS_SMALL( stroker->center.y - control1->y ) && |
1563 FT_IS_SMALL( control1->x - control2->x ) && | 1585 FT_IS_SMALL( control1->x - control2->x ) && |
1564 FT_IS_SMALL( control1->y - control2->y ) && | 1586 FT_IS_SMALL( control1->y - control2->y ) && |
1565 FT_IS_SMALL( control2->x - to->x ) && | 1587 FT_IS_SMALL( control2->x - to->x ) && |
1566 FT_IS_SMALL( control2->y - to->y ) ) | 1588 FT_IS_SMALL( control2->y - to->y ) ) |
1567 { | 1589 { |
1568 stroker->center = *to; | 1590 stroker->center = *to; |
(...skipping 182 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1751 } | 1773 } |
1752 | 1774 |
1753 | 1775 |
1754 /* documentation is in ftstroke.h */ | 1776 /* documentation is in ftstroke.h */ |
1755 | 1777 |
1756 FT_EXPORT_DEF( FT_Error ) | 1778 FT_EXPORT_DEF( FT_Error ) |
1757 FT_Stroker_BeginSubPath( FT_Stroker stroker, | 1779 FT_Stroker_BeginSubPath( FT_Stroker stroker, |
1758 FT_Vector* to, | 1780 FT_Vector* to, |
1759 FT_Bool open ) | 1781 FT_Bool open ) |
1760 { | 1782 { |
| 1783 if ( !stroker || !to ) |
| 1784 return FT_THROW( Invalid_Argument ); |
| 1785 |
1761 /* We cannot process the first point, because there is not enough */ | 1786 /* We cannot process the first point, because there is not enough */ |
1762 /* information regarding its corner/cap. The latter will be processed */ | 1787 /* information regarding its corner/cap. The latter will be processed */ |
1763 /* in the `FT_Stroker_EndSubPath' routine. */ | 1788 /* in the `FT_Stroker_EndSubPath' routine. */ |
1764 /* */ | 1789 /* */ |
1765 stroker->first_point = TRUE; | 1790 stroker->first_point = TRUE; |
1766 stroker->center = *to; | 1791 stroker->center = *to; |
1767 stroker->subpath_open = open; | 1792 stroker->subpath_open = open; |
1768 | 1793 |
1769 /* Determine if we need to check whether the border radius is greater */ | 1794 /* Determine if we need to check whether the border radius is greater */ |
1770 /* than the radius of curvature of a curve, to handle this case */ | 1795 /* than the radius of curvature of a curve, to handle this case */ |
(...skipping 80 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1851 | 1876 |
1852 /* documentation is in ftstroke.h */ | 1877 /* documentation is in ftstroke.h */ |
1853 | 1878 |
1854 /* there's a lot of magic in this function! */ | 1879 /* there's a lot of magic in this function! */ |
1855 FT_EXPORT_DEF( FT_Error ) | 1880 FT_EXPORT_DEF( FT_Error ) |
1856 FT_Stroker_EndSubPath( FT_Stroker stroker ) | 1881 FT_Stroker_EndSubPath( FT_Stroker stroker ) |
1857 { | 1882 { |
1858 FT_Error error = FT_Err_Ok; | 1883 FT_Error error = FT_Err_Ok; |
1859 | 1884 |
1860 | 1885 |
| 1886 if ( !stroker ) |
| 1887 { |
| 1888 error = FT_THROW( Invalid_Argument ); |
| 1889 goto Exit; |
| 1890 } |
| 1891 |
1861 if ( stroker->subpath_open ) | 1892 if ( stroker->subpath_open ) |
1862 { | 1893 { |
1863 FT_StrokeBorder right = stroker->borders; | 1894 FT_StrokeBorder right = stroker->borders; |
1864 | 1895 |
1865 | 1896 |
1866 /* All right, this is an opened path, we need to add a cap between */ | 1897 /* All right, this is an opened path, we need to add a cap between */ |
1867 /* right & left, add the reverse of left, then add a final cap */ | 1898 /* right & left, add the reverse of left, then add a final cap */ |
1868 /* between left & right. */ | 1899 /* between left & right. */ |
1869 error = ft_stroker_cap( stroker, stroker->angle_in, 0 ); | 1900 error = ft_stroker_cap( stroker, stroker->angle_in, 0 ); |
1870 if ( error ) | 1901 if ( error ) |
(...skipping 105 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1976 FT_EXPORT_DEF( FT_Error ) | 2007 FT_EXPORT_DEF( FT_Error ) |
1977 FT_Stroker_GetCounts( FT_Stroker stroker, | 2008 FT_Stroker_GetCounts( FT_Stroker stroker, |
1978 FT_UInt *anum_points, | 2009 FT_UInt *anum_points, |
1979 FT_UInt *anum_contours ) | 2010 FT_UInt *anum_contours ) |
1980 { | 2011 { |
1981 FT_UInt count1, count2, num_points = 0; | 2012 FT_UInt count1, count2, num_points = 0; |
1982 FT_UInt count3, count4, num_contours = 0; | 2013 FT_UInt count3, count4, num_contours = 0; |
1983 FT_Error error; | 2014 FT_Error error; |
1984 | 2015 |
1985 | 2016 |
| 2017 if ( !stroker ) |
| 2018 { |
| 2019 error = FT_THROW( Invalid_Argument ); |
| 2020 goto Exit; |
| 2021 } |
| 2022 |
1986 error = ft_stroke_border_get_counts( stroker->borders + 0, | 2023 error = ft_stroke_border_get_counts( stroker->borders + 0, |
1987 &count1, &count2 ); | 2024 &count1, &count2 ); |
1988 if ( error ) | 2025 if ( error ) |
1989 goto Exit; | 2026 goto Exit; |
1990 | 2027 |
1991 error = ft_stroke_border_get_counts( stroker->borders + 1, | 2028 error = ft_stroke_border_get_counts( stroker->borders + 1, |
1992 &count3, &count4 ); | 2029 &count3, &count4 ); |
1993 if ( error ) | 2030 if ( error ) |
1994 goto Exit; | 2031 goto Exit; |
1995 | 2032 |
1996 num_points = count1 + count3; | 2033 num_points = count1 + count3; |
1997 num_contours = count2 + count4; | 2034 num_contours = count2 + count4; |
1998 | 2035 |
1999 Exit: | 2036 Exit: |
2000 *anum_points = num_points; | 2037 if ( anum_points ) |
2001 *anum_contours = num_contours; | 2038 *anum_points = num_points; |
| 2039 |
| 2040 if ( anum_contours ) |
| 2041 *anum_contours = num_contours; |
| 2042 |
2002 return error; | 2043 return error; |
2003 } | 2044 } |
2004 | 2045 |
2005 | 2046 |
2006 /* documentation is in ftstroke.h */ | 2047 /* documentation is in ftstroke.h */ |
2007 | 2048 |
2008 FT_EXPORT_DEF( void ) | 2049 FT_EXPORT_DEF( void ) |
2009 FT_Stroker_ExportBorder( FT_Stroker stroker, | 2050 FT_Stroker_ExportBorder( FT_Stroker stroker, |
2010 FT_StrokerBorder border, | 2051 FT_StrokerBorder border, |
2011 FT_Outline* outline ) | 2052 FT_Outline* outline ) |
2012 { | 2053 { |
| 2054 if ( !stroker || !outline ) |
| 2055 return; |
| 2056 |
2013 if ( border == FT_STROKER_BORDER_LEFT || | 2057 if ( border == FT_STROKER_BORDER_LEFT || |
2014 border == FT_STROKER_BORDER_RIGHT ) | 2058 border == FT_STROKER_BORDER_RIGHT ) |
2015 { | 2059 { |
2016 FT_StrokeBorder sborder = & stroker->borders[border]; | 2060 FT_StrokeBorder sborder = & stroker->borders[border]; |
2017 | 2061 |
2018 | 2062 |
2019 if ( sborder->valid ) | 2063 if ( sborder->valid ) |
2020 ft_stroke_border_export( sborder, outline ); | 2064 ft_stroke_border_export( sborder, outline ); |
2021 } | 2065 } |
2022 } | 2066 } |
(...skipping 29 matching lines...) Expand all Loading... |
2052 FT_Vector* limit; | 2096 FT_Vector* limit; |
2053 char* tags; | 2097 char* tags; |
2054 | 2098 |
2055 FT_Error error; | 2099 FT_Error error; |
2056 | 2100 |
2057 FT_Int n; /* index of contour in outline */ | 2101 FT_Int n; /* index of contour in outline */ |
2058 FT_UInt first; /* index of first point in contour */ | 2102 FT_UInt first; /* index of first point in contour */ |
2059 FT_Int tag; /* current point's state */ | 2103 FT_Int tag; /* current point's state */ |
2060 | 2104 |
2061 | 2105 |
2062 if ( !outline || !stroker ) | 2106 if ( !outline ) |
| 2107 return FT_THROW( Invalid_Outline ); |
| 2108 |
| 2109 if ( !stroker ) |
2063 return FT_THROW( Invalid_Argument ); | 2110 return FT_THROW( Invalid_Argument ); |
2064 | 2111 |
2065 FT_Stroker_Rewind( stroker ); | 2112 FT_Stroker_Rewind( stroker ); |
2066 | 2113 |
2067 first = 0; | 2114 first = 0; |
2068 | 2115 |
2069 for ( n = 0; n < outline->n_contours; n++ ) | 2116 for ( n = 0; n < outline->n_contours; n++ ) |
2070 { | 2117 { |
2071 FT_UInt last; /* index of last point in contour */ | 2118 FT_UInt last; /* index of last point in contour */ |
2072 | 2119 |
(...skipping 178 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2251 #include "basepic.h" | 2298 #include "basepic.h" |
2252 | 2299 |
2253 | 2300 |
2254 /* documentation is in ftstroke.h */ | 2301 /* documentation is in ftstroke.h */ |
2255 | 2302 |
2256 FT_EXPORT_DEF( FT_Error ) | 2303 FT_EXPORT_DEF( FT_Error ) |
2257 FT_Glyph_Stroke( FT_Glyph *pglyph, | 2304 FT_Glyph_Stroke( FT_Glyph *pglyph, |
2258 FT_Stroker stroker, | 2305 FT_Stroker stroker, |
2259 FT_Bool destroy ) | 2306 FT_Bool destroy ) |
2260 { | 2307 { |
2261 FT_Error error = FT_ERR( Invalid_Argument ); | 2308 FT_Error error = FT_ERR( Invalid_Argument ); |
2262 FT_Glyph glyph = NULL; | 2309 FT_Glyph glyph = NULL; |
| 2310 |
| 2311 /* for FT_OUTLINE_GLYPH_CLASS_GET (in PIC mode) */ |
2263 FT_Library library = stroker->library; | 2312 FT_Library library = stroker->library; |
2264 | 2313 |
2265 FT_UNUSED( library ); | 2314 FT_UNUSED( library ); |
2266 | 2315 |
2267 | 2316 |
2268 if ( pglyph == NULL ) | 2317 if ( !pglyph ) |
2269 goto Exit; | 2318 goto Exit; |
2270 | 2319 |
2271 glyph = *pglyph; | 2320 glyph = *pglyph; |
2272 if ( glyph == NULL || glyph->clazz != FT_OUTLINE_GLYPH_CLASS_GET ) | 2321 if ( !glyph || glyph->clazz != FT_OUTLINE_GLYPH_CLASS_GET ) |
2273 goto Exit; | 2322 goto Exit; |
2274 | 2323 |
2275 { | 2324 { |
2276 FT_Glyph copy; | 2325 FT_Glyph copy; |
2277 | 2326 |
2278 | 2327 |
2279 error = FT_Glyph_Copy( glyph, © ); | 2328 error = FT_Glyph_Copy( glyph, © ); |
2280 if ( error ) | 2329 if ( error ) |
2281 goto Exit; | 2330 goto Exit; |
2282 | 2331 |
2283 glyph = copy; | 2332 glyph = copy; |
2284 } | 2333 } |
2285 | 2334 |
2286 { | 2335 { |
2287 FT_OutlineGlyph oglyph = (FT_OutlineGlyph)glyph; | 2336 FT_OutlineGlyph oglyph = (FT_OutlineGlyph)glyph; |
2288 FT_Outline* outline = &oglyph->outline; | 2337 FT_Outline* outline = &oglyph->outline; |
2289 FT_UInt num_points, num_contours; | 2338 FT_UInt num_points, num_contours; |
2290 | 2339 |
2291 | 2340 |
2292 error = FT_Stroker_ParseOutline( stroker, outline, FALSE ); | 2341 error = FT_Stroker_ParseOutline( stroker, outline, FALSE ); |
2293 if ( error ) | 2342 if ( error ) |
2294 goto Fail; | 2343 goto Fail; |
2295 | 2344 |
2296 (void)FT_Stroker_GetCounts( stroker, &num_points, &num_contours ); | 2345 FT_Stroker_GetCounts( stroker, &num_points, &num_contours ); |
2297 | 2346 |
2298 FT_Outline_Done( glyph->library, outline ); | 2347 FT_Outline_Done( glyph->library, outline ); |
2299 | 2348 |
2300 error = FT_Outline_New( glyph->library, | 2349 error = FT_Outline_New( glyph->library, |
2301 num_points, num_contours, outline ); | 2350 num_points, num_contours, outline ); |
2302 if ( error ) | 2351 if ( error ) |
2303 goto Fail; | 2352 goto Fail; |
2304 | 2353 |
2305 outline->n_points = 0; | 2354 outline->n_points = 0; |
2306 outline->n_contours = 0; | 2355 outline->n_contours = 0; |
(...skipping 20 matching lines...) Expand all Loading... |
2327 | 2376 |
2328 | 2377 |
2329 /* documentation is in ftstroke.h */ | 2378 /* documentation is in ftstroke.h */ |
2330 | 2379 |
2331 FT_EXPORT_DEF( FT_Error ) | 2380 FT_EXPORT_DEF( FT_Error ) |
2332 FT_Glyph_StrokeBorder( FT_Glyph *pglyph, | 2381 FT_Glyph_StrokeBorder( FT_Glyph *pglyph, |
2333 FT_Stroker stroker, | 2382 FT_Stroker stroker, |
2334 FT_Bool inside, | 2383 FT_Bool inside, |
2335 FT_Bool destroy ) | 2384 FT_Bool destroy ) |
2336 { | 2385 { |
2337 FT_Error error = FT_ERR( Invalid_Argument ); | 2386 FT_Error error = FT_ERR( Invalid_Argument ); |
2338 FT_Glyph glyph = NULL; | 2387 FT_Glyph glyph = NULL; |
| 2388 |
| 2389 /* for FT_OUTLINE_GLYPH_CLASS_GET (in PIC mode) */ |
2339 FT_Library library = stroker->library; | 2390 FT_Library library = stroker->library; |
2340 | 2391 |
2341 FT_UNUSED( library ); | 2392 FT_UNUSED( library ); |
2342 | 2393 |
2343 | 2394 |
2344 if ( pglyph == NULL ) | 2395 if ( !pglyph ) |
2345 goto Exit; | 2396 goto Exit; |
2346 | 2397 |
2347 glyph = *pglyph; | 2398 glyph = *pglyph; |
2348 if ( glyph == NULL || glyph->clazz != FT_OUTLINE_GLYPH_CLASS_GET ) | 2399 if ( !glyph || glyph->clazz != FT_OUTLINE_GLYPH_CLASS_GET ) |
2349 goto Exit; | 2400 goto Exit; |
2350 | 2401 |
2351 { | 2402 { |
2352 FT_Glyph copy; | 2403 FT_Glyph copy; |
2353 | 2404 |
2354 | 2405 |
2355 error = FT_Glyph_Copy( glyph, © ); | 2406 error = FT_Glyph_Copy( glyph, © ); |
2356 if ( error ) | 2407 if ( error ) |
2357 goto Exit; | 2408 goto Exit; |
2358 | 2409 |
(...skipping 13 matching lines...) Expand all Loading... |
2372 if ( border == FT_STROKER_BORDER_LEFT ) | 2423 if ( border == FT_STROKER_BORDER_LEFT ) |
2373 border = FT_STROKER_BORDER_RIGHT; | 2424 border = FT_STROKER_BORDER_RIGHT; |
2374 else | 2425 else |
2375 border = FT_STROKER_BORDER_LEFT; | 2426 border = FT_STROKER_BORDER_LEFT; |
2376 } | 2427 } |
2377 | 2428 |
2378 error = FT_Stroker_ParseOutline( stroker, outline, FALSE ); | 2429 error = FT_Stroker_ParseOutline( stroker, outline, FALSE ); |
2379 if ( error ) | 2430 if ( error ) |
2380 goto Fail; | 2431 goto Fail; |
2381 | 2432 |
2382 (void)FT_Stroker_GetBorderCounts( stroker, border, | 2433 FT_Stroker_GetBorderCounts( stroker, border, |
2383 &num_points, &num_contours ); | 2434 &num_points, &num_contours ); |
2384 | 2435 |
2385 FT_Outline_Done( glyph->library, outline ); | 2436 FT_Outline_Done( glyph->library, outline ); |
2386 | 2437 |
2387 error = FT_Outline_New( glyph->library, | 2438 error = FT_Outline_New( glyph->library, |
2388 num_points, | 2439 num_points, |
2389 num_contours, | 2440 num_contours, |
2390 outline ); | 2441 outline ); |
2391 if ( error ) | 2442 if ( error ) |
2392 goto Fail; | 2443 goto Fail; |
2393 | 2444 |
(...skipping 15 matching lines...) Expand all Loading... |
2409 | 2460 |
2410 if ( !destroy ) | 2461 if ( !destroy ) |
2411 *pglyph = NULL; | 2462 *pglyph = NULL; |
2412 | 2463 |
2413 Exit: | 2464 Exit: |
2414 return error; | 2465 return error; |
2415 } | 2466 } |
2416 | 2467 |
2417 | 2468 |
2418 /* END */ | 2469 /* END */ |
OLD | NEW |