Alexei Podtelezhnikov pushed to branch master at FreeType / FreeType
Commits:
-
705f4161
by Alexei Podtelezhnikov at 2022-06-18T23:02:26-04:00
-
47103b2f
by Alexei Podtelezhnikov at 2022-06-18T23:09:17-04:00
3 changed files:
Changes:
... | ... | @@ -801,7 +801,7 @@ |
801 | 801 | FT_UInt start_point,
|
802 | 802 | FT_UInt start_contour )
|
803 | 803 | {
|
804 | - zone->n_points = (FT_UShort)load->outline.n_points -
|
|
804 | + zone->n_points = (FT_UShort)load->outline.n_points + 4 -
|
|
805 | 805 | (FT_UShort)start_point;
|
806 | 806 | zone->n_contours = load->outline.n_contours -
|
807 | 807 | (FT_Short)start_contour;
|
... | ... | @@ -970,11 +970,6 @@ |
970 | 970 | outline->points[n_points + 2] = loader->pp3;
|
971 | 971 | outline->points[n_points + 3] = loader->pp4;
|
972 | 972 | |
973 | - outline->tags[n_points ] = 0;
|
|
974 | - outline->tags[n_points + 1] = 0;
|
|
975 | - outline->tags[n_points + 2] = 0;
|
|
976 | - outline->tags[n_points + 3] = 0;
|
|
977 | - |
|
978 | 973 | n_points += 4;
|
979 | 974 | |
980 | 975 | #ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT
|
... | ... | @@ -987,8 +982,7 @@ |
987 | 982 | /* Deltas apply to the unscaled data. */
|
988 | 983 | error = TT_Vary_Apply_Glyph_Deltas( loader,
|
989 | 984 | outline,
|
990 | - unrounded,
|
|
991 | - (FT_UInt)n_points );
|
|
985 | + unrounded );
|
|
992 | 986 | if ( error )
|
993 | 987 | goto Exit;
|
994 | 988 | }
|
... | ... | @@ -1000,7 +994,7 @@ |
1000 | 994 | tt_prepare_zone( &loader->zone, &gloader->current, 0, 0 );
|
1001 | 995 | |
1002 | 996 | FT_ARRAY_COPY( loader->zone.orus, loader->zone.cur,
|
1003 | - loader->zone.n_points + 4 );
|
|
997 | + loader->zone.n_points );
|
|
1004 | 998 | }
|
1005 | 999 | |
1006 | 1000 | {
|
... | ... | @@ -1142,11 +1136,7 @@ |
1142 | 1136 | }
|
1143 | 1137 | |
1144 | 1138 | if ( IS_HINTED( loader->load_flags ) )
|
1145 | - {
|
|
1146 | - loader->zone.n_points += 4;
|
|
1147 | - |
|
1148 | 1139 | error = TT_Hint_Glyph( loader, 0 );
|
1149 | - }
|
|
1150 | 1140 | |
1151 | 1141 | #ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT
|
1152 | 1142 | Exit:
|
... | ... | @@ -1359,11 +1349,6 @@ |
1359 | 1349 | outline->points[outline->n_points + 2] = loader->pp3;
|
1360 | 1350 | outline->points[outline->n_points + 3] = loader->pp4;
|
1361 | 1351 | |
1362 | - outline->tags[outline->n_points ] = 0;
|
|
1363 | - outline->tags[outline->n_points + 1] = 0;
|
|
1364 | - outline->tags[outline->n_points + 2] = 0;
|
|
1365 | - outline->tags[outline->n_points + 3] = 0;
|
|
1366 | - |
|
1367 | 1352 | #ifdef TT_USE_BYTECODE_INTERPRETER
|
1368 | 1353 | |
1369 | 1354 | {
|
... | ... | @@ -1422,11 +1407,9 @@ |
1422 | 1407 | |
1423 | 1408 | /* Some points are likely touched during execution of */
|
1424 | 1409 | /* instructions on components. So let's untouch them. */
|
1425 | - for ( i = 0; i < loader->zone.n_points; i++ )
|
|
1410 | + for ( i = 0; i < loader->zone.n_points - 4; i++ )
|
|
1426 | 1411 | loader->zone.tags[i] &= ~FT_CURVE_TAG_TOUCH_BOTH;
|
1427 | 1412 | |
1428 | - loader->zone.n_points += 4;
|
|
1429 | - |
|
1430 | 1413 | return TT_Hint_Glyph( loader, 1 );
|
1431 | 1414 | }
|
1432 | 1415 | |
... | ... | @@ -1747,47 +1730,29 @@ |
1747 | 1730 | /* a small outline structure with four elements for */
|
1748 | 1731 | /* communication with `TT_Vary_Apply_Glyph_Deltas' */
|
1749 | 1732 | FT_Vector points[4];
|
1750 | - char tags[4] = { 1, 1, 1, 1 };
|
|
1751 | - short contours[4] = { 0, 1, 2, 3 };
|
|
1752 | 1733 | FT_Outline outline;
|
1753 | 1734 | |
1754 | 1735 | /* unrounded values */
|
1755 | 1736 | FT_Vector unrounded[4] = { {0, 0}, {0, 0}, {0, 0}, {0, 0} };
|
1756 | 1737 | |
1757 | 1738 | |
1758 | - points[0].x = loader->pp1.x;
|
|
1759 | - points[0].y = loader->pp1.y;
|
|
1760 | - points[1].x = loader->pp2.x;
|
|
1761 | - points[1].y = loader->pp2.y;
|
|
1739 | + points[0] = loader->pp1;
|
|
1740 | + points[1] = loader->pp2;
|
|
1741 | + points[2] = loader->pp3;
|
|
1742 | + points[3] = loader->pp4;
|
|
1762 | 1743 | |
1763 | - points[2].x = loader->pp3.x;
|
|
1764 | - points[2].y = loader->pp3.y;
|
|
1765 | - points[3].x = loader->pp4.x;
|
|
1766 | - points[3].y = loader->pp4.y;
|
|
1767 | - |
|
1768 | - outline.n_points = 4;
|
|
1769 | - outline.n_contours = 4;
|
|
1744 | + outline.n_points = 0;
|
|
1745 | + outline.n_contours = 0;
|
|
1770 | 1746 | outline.points = points;
|
1771 | - outline.tags = tags;
|
|
1772 | - outline.contours = contours;
|
|
1747 | + outline.tags = NULL;
|
|
1748 | + outline.contours = NULL;
|
|
1773 | 1749 | |
1774 | 1750 | /* this must be done before scaling */
|
1775 | 1751 | error = TT_Vary_Apply_Glyph_Deltas( loader,
|
1776 | 1752 | &outline,
|
1777 | - unrounded,
|
|
1778 | - (FT_UInt)outline.n_points );
|
|
1753 | + unrounded );
|
|
1779 | 1754 | if ( error )
|
1780 | 1755 | goto Exit;
|
1781 | - |
|
1782 | - loader->pp1.x = points[0].x;
|
|
1783 | - loader->pp1.y = points[0].y;
|
|
1784 | - loader->pp2.x = points[1].x;
|
|
1785 | - loader->pp2.y = points[1].y;
|
|
1786 | - |
|
1787 | - loader->pp3.x = points[2].x;
|
|
1788 | - loader->pp3.y = points[2].y;
|
|
1789 | - loader->pp4.x = points[3].x;
|
|
1790 | - loader->pp4.y = points[3].y;
|
|
1791 | 1756 | }
|
1792 | 1757 | |
1793 | 1758 | #endif /* TT_CONFIG_OPTION_GX_VAR_SUPPORT */
|
... | ... | @@ -1935,17 +1900,16 @@ |
1935 | 1900 | |
1936 | 1901 | /* construct an outline structure for */
|
1937 | 1902 | /* communication with `TT_Vary_Apply_Glyph_Deltas' */
|
1938 | - outline.n_points = (short)( gloader->current.num_subglyphs + 4 );
|
|
1939 | - outline.n_contours = outline.n_points;
|
|
1903 | + outline.n_contours = outline.n_points = limit;
|
|
1940 | 1904 | |
1941 | 1905 | outline.points = NULL;
|
1942 | 1906 | outline.tags = NULL;
|
1943 | 1907 | outline.contours = NULL;
|
1944 | 1908 | |
1945 | - if ( FT_NEW_ARRAY( points, outline.n_points ) ||
|
|
1946 | - FT_NEW_ARRAY( tags, outline.n_points ) ||
|
|
1947 | - FT_NEW_ARRAY( contours, outline.n_points ) ||
|
|
1948 | - FT_NEW_ARRAY( unrounded, outline.n_points ) )
|
|
1909 | + if ( FT_NEW_ARRAY( points, limit + 4 ) ||
|
|
1910 | + FT_NEW_ARRAY( tags, limit + 4 ) ||
|
|
1911 | + FT_NEW_ARRAY( contours, limit + 4 ) ||
|
|
1912 | + FT_NEW_ARRAY( unrounded, limit + 4 ) )
|
|
1949 | 1913 | goto Exit1;
|
1950 | 1914 | |
1951 | 1915 | subglyph = gloader->current.subglyphs;
|
... | ... | @@ -1961,28 +1925,10 @@ |
1961 | 1925 | contours[i] = i;
|
1962 | 1926 | }
|
1963 | 1927 | |
1964 | - points[i].x = loader->pp1.x;
|
|
1965 | - points[i].y = loader->pp1.y;
|
|
1966 | - tags[i] = 1;
|
|
1967 | - contours[i] = i;
|
|
1968 | - |
|
1969 | - i++;
|
|
1970 | - points[i].x = loader->pp2.x;
|
|
1971 | - points[i].y = loader->pp2.y;
|
|
1972 | - tags[i] = 1;
|
|
1973 | - contours[i] = i;
|
|
1974 | - |
|
1975 | - i++;
|
|
1976 | - points[i].x = loader->pp3.x;
|
|
1977 | - points[i].y = loader->pp3.y;
|
|
1978 | - tags[i] = 1;
|
|
1979 | - contours[i] = i;
|
|
1980 | - |
|
1981 | - i++;
|
|
1982 | - points[i].x = loader->pp4.x;
|
|
1983 | - points[i].y = loader->pp4.y;
|
|
1984 | - tags[i] = 1;
|
|
1985 | - contours[i] = i;
|
|
1928 | + points[i++] = loader->pp1;
|
|
1929 | + points[i++] = loader->pp2;
|
|
1930 | + points[i++] = loader->pp3;
|
|
1931 | + points[i ] = loader->pp4;
|
|
1986 | 1932 | |
1987 | 1933 | outline.points = points;
|
1988 | 1934 | outline.tags = tags;
|
... | ... | @@ -1990,11 +1936,9 @@ |
1990 | 1936 | |
1991 | 1937 | /* this call provides additional offsets */
|
1992 | 1938 | /* for each component's translation */
|
1993 | - if ( FT_SET_ERROR( TT_Vary_Apply_Glyph_Deltas(
|
|
1994 | - loader,
|
|
1995 | - &outline,
|
|
1996 | - unrounded,
|
|
1997 | - (FT_UInt)outline.n_points ) ) )
|
|
1939 | + if ( FT_SET_ERROR( TT_Vary_Apply_Glyph_Deltas( loader,
|
|
1940 | + &outline,
|
|
1941 | + unrounded ) ) )
|
|
1998 | 1942 | goto Exit1;
|
1999 | 1943 | |
2000 | 1944 | subglyph = gloader->current.subglyphs;
|
... | ... | @@ -2008,16 +1952,6 @@ |
2008 | 1952 | }
|
2009 | 1953 | }
|
2010 | 1954 | |
2011 | - loader->pp1.x = points[i + 0].x;
|
|
2012 | - loader->pp1.y = points[i + 0].y;
|
|
2013 | - loader->pp2.x = points[i + 1].x;
|
|
2014 | - loader->pp2.y = points[i + 1].y;
|
|
2015 | - |
|
2016 | - loader->pp3.x = points[i + 2].x;
|
|
2017 | - loader->pp3.y = points[i + 2].y;
|
|
2018 | - loader->pp4.x = points[i + 3].x;
|
|
2019 | - loader->pp4.y = points[i + 3].y;
|
|
2020 | - |
|
2021 | 1955 | Exit1:
|
2022 | 1956 | FT_FREE( outline.points );
|
2023 | 1957 | FT_FREE( outline.tags );
|
... | ... | @@ -3839,25 +3839,20 @@ |
3839 | 3839 | * An array with `n_points' elements that is filled with unrounded
|
3840 | 3840 | * point coordinates (in 26.6 format).
|
3841 | 3841 | *
|
3842 | - * @Input
|
|
3843 | - * n_points ::
|
|
3844 | - * The number of the points in the glyph, including
|
|
3845 | - * phantom points.
|
|
3846 | - *
|
|
3847 | 3842 | * @Return:
|
3848 | 3843 | * FreeType error code. 0 means success.
|
3849 | 3844 | */
|
3850 | 3845 | FT_LOCAL_DEF( FT_Error )
|
3851 | 3846 | TT_Vary_Apply_Glyph_Deltas( TT_Loader loader,
|
3852 | 3847 | FT_Outline* outline,
|
3853 | - FT_Vector* unrounded,
|
|
3854 | - FT_UInt n_points )
|
|
3848 | + FT_Vector* unrounded )
|
|
3855 | 3849 | {
|
3856 | 3850 | FT_Error error;
|
3857 | 3851 | TT_Face face = loader->face;
|
3858 | 3852 | FT_Stream stream = face->root.stream;
|
3859 | 3853 | FT_Memory memory = stream->memory;
|
3860 | 3854 | FT_UInt glyph_index = loader->glyph_index;
|
3855 | + FT_UInt n_points = (FT_UInt)outline->n_points + 4;
|
|
3861 | 3856 | |
3862 | 3857 | FT_Vector* points_org = NULL; /* coordinates in 16.16 format */
|
3863 | 3858 | FT_Vector* points_out = NULL; /* coordinates in 16.16 format */
|
... | ... | @@ -4075,36 +4070,8 @@ |
4075 | 4070 | FT_Fixed point_delta_y = FT_MulFix( deltas_y[j], apply );
|
4076 | 4071 | |
4077 | 4072 | |
4078 | - if ( j < n_points - 4 )
|
|
4079 | - {
|
|
4080 | - point_deltas_x[j] = old_point_delta_x + point_delta_x;
|
|
4081 | - point_deltas_y[j] = old_point_delta_y + point_delta_y;
|
|
4082 | - }
|
|
4083 | - else
|
|
4084 | - {
|
|
4085 | - /* To avoid double adjustment of advance width or height, */
|
|
4086 | - /* adjust phantom points only if there is no HVAR or VVAR */
|
|
4087 | - /* support, respectively. */
|
|
4088 | - if ( j == ( n_points - 4 ) &&
|
|
4089 | - !( face->variation_support &
|
|
4090 | - TT_FACE_FLAG_VAR_LSB ) )
|
|
4091 | - point_deltas_x[j] = old_point_delta_x + point_delta_x;
|
|
4092 | - |
|
4093 | - else if ( j == ( n_points - 3 ) &&
|
|
4094 | - !( face->variation_support &
|
|
4095 | - TT_FACE_FLAG_VAR_HADVANCE ) )
|
|
4096 | - point_deltas_x[j] = old_point_delta_x + point_delta_x;
|
|
4097 | - |
|
4098 | - else if ( j == ( n_points - 2 ) &&
|
|
4099 | - !( face->variation_support &
|
|
4100 | - TT_FACE_FLAG_VAR_TSB ) )
|
|
4101 | - point_deltas_y[j] = old_point_delta_y + point_delta_y;
|
|
4102 | - |
|
4103 | - else if ( j == ( n_points - 1 ) &&
|
|
4104 | - !( face->variation_support &
|
|
4105 | - TT_FACE_FLAG_VAR_VADVANCE ) )
|
|
4106 | - point_deltas_y[j] = old_point_delta_y + point_delta_y;
|
|
4107 | - }
|
|
4073 | + point_deltas_x[j] = old_point_delta_x + point_delta_x;
|
|
4074 | + point_deltas_y[j] = old_point_delta_y + point_delta_y;
|
|
4108 | 4075 | |
4109 | 4076 | #ifdef FT_DEBUG_LEVEL_TRACE
|
4110 | 4077 | if ( point_delta_x || point_delta_y )
|
... | ... | @@ -4177,36 +4144,8 @@ |
4177 | 4144 | FT_Pos point_delta_y = points_out[j].y - points_org[j].y;
|
4178 | 4145 | |
4179 | 4146 | |
4180 | - if ( j < n_points - 4 )
|
|
4181 | - {
|
|
4182 | - point_deltas_x[j] = old_point_delta_x + point_delta_x;
|
|
4183 | - point_deltas_y[j] = old_point_delta_y + point_delta_y;
|
|
4184 | - }
|
|
4185 | - else
|
|
4186 | - {
|
|
4187 | - /* To avoid double adjustment of advance width or height, */
|
|
4188 | - /* adjust phantom points only if there is no HVAR or VVAR */
|
|
4189 | - /* support, respectively. */
|
|
4190 | - if ( j == ( n_points - 4 ) &&
|
|
4191 | - !( face->variation_support &
|
|
4192 | - TT_FACE_FLAG_VAR_LSB ) )
|
|
4193 | - point_deltas_x[j] = old_point_delta_x + point_delta_x;
|
|
4194 | - |
|
4195 | - else if ( j == ( n_points - 3 ) &&
|
|
4196 | - !( face->variation_support &
|
|
4197 | - TT_FACE_FLAG_VAR_HADVANCE ) )
|
|
4198 | - point_deltas_x[j] = old_point_delta_x + point_delta_x;
|
|
4199 | - |
|
4200 | - else if ( j == ( n_points - 2 ) &&
|
|
4201 | - !( face->variation_support &
|
|
4202 | - TT_FACE_FLAG_VAR_TSB ) )
|
|
4203 | - point_deltas_y[j] = old_point_delta_y + point_delta_y;
|
|
4204 | - |
|
4205 | - else if ( j == ( n_points - 1 ) &&
|
|
4206 | - !( face->variation_support &
|
|
4207 | - TT_FACE_FLAG_VAR_VADVANCE ) )
|
|
4208 | - point_deltas_y[j] = old_point_delta_y + point_delta_y;
|
|
4209 | - }
|
|
4147 | + point_deltas_x[j] = old_point_delta_x + point_delta_x;
|
|
4148 | + point_deltas_y[j] = old_point_delta_y + point_delta_y;
|
|
4210 | 4149 | |
4211 | 4150 | #ifdef FT_DEBUG_LEVEL_TRACE
|
4212 | 4151 | if ( point_delta_x || point_delta_y )
|
... | ... | @@ -4244,6 +4183,24 @@ |
4244 | 4183 | |
4245 | 4184 | FT_TRACE5(( "\n" ));
|
4246 | 4185 | |
4186 | + /* To avoid double adjustment of advance width or height, */
|
|
4187 | + /* do not move phantom points if there is HVAR or VVAR */
|
|
4188 | + /* support, respectively. */
|
|
4189 | + if ( face->variation_support & TT_FACE_FLAG_VAR_HADVANCE )
|
|
4190 | + {
|
|
4191 | + point_deltas_x[n_points - 4] = 0;
|
|
4192 | + point_deltas_y[n_points - 4] = 0;
|
|
4193 | + point_deltas_x[n_points - 3] = 0;
|
|
4194 | + point_deltas_y[n_points - 3] = 0;
|
|
4195 | + }
|
|
4196 | + if ( face->variation_support & TT_FACE_FLAG_VAR_VADVANCE )
|
|
4197 | + {
|
|
4198 | + point_deltas_x[n_points - 2] = 0;
|
|
4199 | + point_deltas_y[n_points - 2] = 0;
|
|
4200 | + point_deltas_x[n_points - 1] = 0;
|
|
4201 | + point_deltas_y[n_points - 1] = 0;
|
|
4202 | + }
|
|
4203 | + |
|
4247 | 4204 | for ( i = 0; i < n_points; i++ )
|
4248 | 4205 | {
|
4249 | 4206 | unrounded[i].x += FT_fixedToFdot6( point_deltas_x[i] );
|
... | ... | @@ -4253,14 +4210,23 @@ |
4253 | 4210 | outline->points[i].y += FT_fixedToInt( point_deltas_y[i] );
|
4254 | 4211 | }
|
4255 | 4212 | |
4256 | - /* recalculate linear horizontal and vertical advances */
|
|
4257 | - /* if we don't have HVAR and VVAR, respectively */
|
|
4213 | + /* To avoid double adjustment of advance width or height, */
|
|
4214 | + /* adjust phantom points only if there is no HVAR or VVAR */
|
|
4215 | + /* support, respectively. */
|
|
4258 | 4216 | if ( !( face->variation_support & TT_FACE_FLAG_VAR_HADVANCE ) )
|
4217 | + {
|
|
4218 | + loader->pp1 = outline->points[n_points - 4];
|
|
4219 | + loader->pp2 = outline->points[n_points - 3];
|
|
4259 | 4220 | loader->linear = FT_PIX_ROUND( unrounded[n_points - 3].x -
|
4260 | 4221 | unrounded[n_points - 4].x ) / 64;
|
4222 | + }
|
|
4261 | 4223 | if ( !( face->variation_support & TT_FACE_FLAG_VAR_VADVANCE ) )
|
4224 | + {
|
|
4225 | + loader->pp3 = outline->points[n_points - 2];
|
|
4226 | + loader->pp4 = outline->points[n_points - 1];
|
|
4262 | 4227 | loader->vadvance = FT_PIX_ROUND( unrounded[n_points - 1].y -
|
4263 | 4228 | unrounded[n_points - 2].y ) / 64;
|
4229 | + }
|
|
4264 | 4230 | |
4265 | 4231 | Fail3:
|
4266 | 4232 | FT_FREE( point_deltas_x );
|
... | ... | @@ -363,8 +363,7 @@ FT_BEGIN_HEADER |
363 | 363 | FT_LOCAL( FT_Error )
|
364 | 364 | TT_Vary_Apply_Glyph_Deltas( TT_Loader loader,
|
365 | 365 | FT_Outline* outline,
|
366 | - FT_Vector* unrounded,
|
|
367 | - FT_UInt n_points );
|
|
366 | + FT_Vector* unrounded );
|
|
368 | 367 | |
369 | 368 | FT_LOCAL( FT_Error )
|
370 | 369 | tt_hadvance_adjust( TT_Face face,
|