freetype-commit
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Git][freetype/freetype][master] 2 commits: [truetype/GX] Clean up phant


From: Alexei Podtelezhnikov (@apodtele)
Subject: [Git][freetype/freetype][master] 2 commits: [truetype/GX] Clean up phantom point adjustment.
Date: Sun, 19 Jun 2022 03:25:06 +0000

Alexei Podtelezhnikov pushed to branch master at FreeType / FreeType

Commits:

  • 705f4161
    by Alexei Podtelezhnikov at 2022-06-18T23:02:26-04:00
    [truetype/GX] Clean up phantom point adjustment.
    
    This moves phantom point and advance variation adjustment next to
    calculations. The logic stays the same, HVAR and VVAR take priority.
    
    * src/truetype/ttgload.c (load_truetype_glyph): Move it from here...
    * src/truetype/ttgxvar.c (TT_Vary_Apply_Glyph_Deltas): ... to here
    and check for HVAR and VVAR presence outside the main loop.
    
  • 47103b2f
    by Alexei Podtelezhnikov at 2022-06-18T23:09:17-04:00
    [truetype] Clean up phantom point accounting.
    
    This formalizes that the phantom points appended in the outline
    do not increase its point count, nor are they tagged or included
    in any additional contours.  Only their coordinates are stored.
    They are counted in the glyph zone, however.
    
    * src/truetype/ttgxvar.c (TT_Vary_Apply_Glyph_Deltas): Infer `n_points`
    from the outline size plus four phantom points.
    * src/truetype/ttgxvar.h (TT_Vary_Apply_Glyph_Deltas): Remove this
    argument.
    * src/truetype/ttgload.c (tt_prepare_zone): Add phantom four.
    (TT_Process_Simple_Glyph, load_truetype_glyph): Update all callers.
    

3 changed files:

Changes:

  • src/truetype/ttgload.c
    ... ... @@ -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 );
    

  • src/truetype/ttgxvar.c
    ... ... @@ -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 );
    

  • src/truetype/ttgxvar.h
    ... ... @@ -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,
    


  • reply via email to

    [Prev in Thread] Current Thread [Next in Thread]