freetype-commit
[Top][All Lists]
Advanced

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

[Git][freetype/freetype][master] [sfnt, truetype] Add `size_reset` to `M


From: Werner Lemberg (@wl)
Subject: [Git][freetype/freetype][master] [sfnt, truetype] Add `size_reset` to `MetricsVariations`.
Date: Tue, 11 Apr 2023 08:21:23 +0000

Werner Lemberg pushed to branch master at FreeType / FreeType

Commits:

  • e78e2d29
    by Ben Wagner at 2023-04-11T10:20:58+02:00
    [sfnt, truetype] Add `size_reset` to `MetricsVariations`.
    
    This is a generalization of commit
    
    ```
    commit e6699596af5c5d6f0ae0ea06e19df87dce088df8
    Author: Werner Lemberg <wl@gnu.org>
    Date:   Thu Feb 2 11:38:04 2017 +0100
    
        [truetype] Fix MVAR post-action handling.
    ```
    
    It is also possible for plain `CFF ` style fonts to contain an `fvar` and
    `MVAR` table and use `cff_metrics_adjust`.  `tt_size_reset` should only be
    called with `TT_Size` and never with `CFF_Size`.
    
    Allow the "metrics-variations" service to specify the correct function (if
    any) to reset `FT_Size`s after adjusting metrics.
    
    * src/truetype/ttobjs.c (tt_size_reset): Split off some functionality
    into...
    (tt_size_reset_height): ... this new function.
    
    * src/truetype/ttdriver.c (tt_service_metrics_variations): Add
    `size_reset`.
    (tt_size_select, tt_size_request): Updated.
    
    * src/truetype/ttobjs.h: Updated.
    
    * include/freetype/internal/services/svmetric.h (MetricsVariations): Add
    `size_reset`.
    (FT_DEFINE_SERVICE_METRICSVARIATIONSREC): Updated.
    
    * include/freetype/internal/tttypes.h (TT_FaceRec_): Rename `var` to
    `tt_var` and add `face_var`.
    
    * src/cff/cffdrivr.c (cff_service_metrics_variations): Add `size_reset`.
    (cff_hadvance_adjust, cff_metrics_adjust): Updated.
    
    * src/cff/cffobjs.c (cff_face_init): Use `face_var`.
    
    * src/sfnt/sfobjs.c (sfnt_init_face): Initialize `face_var`.
    
    * src/sfnt/ttmtx.c (tt_face_get_metrics): Use `tt_var`.
    
    * src/truetype/ttgxvar.c (tt_size_reset_iterator): Renamed to...
    (ft_size_reset_iterator): ... this new function.
    Call `size_reset`.
    (tt_apply_mvar): Pass `size_reset` to `ft_size_reset_iterator`.
    
    Fixes #1211
    

10 changed files:

Changes:

  • include/freetype/internal/services/svmetric.h
    ... ... @@ -77,6 +77,9 @@ FT_BEGIN_HEADER
    77 77
       typedef void
    
    78 78
       (*FT_Metrics_Adjust_Func)( FT_Face  face );
    
    79 79
     
    
    80
    +  typedef void
    
    81
    +  (*FT_Size_Reset_Func)( FT_Size  size );
    
    82
    +
    
    80 83
     
    
    81 84
       FT_DEFINE_SERVICE( MetricsVariations )
    
    82 85
       {
    
    ... ... @@ -90,6 +93,7 @@ FT_BEGIN_HEADER
    90 93
         FT_VOrg_Adjust_Func      vorg_adjust;
    
    91 94
     
    
    92 95
         FT_Metrics_Adjust_Func   metrics_adjust;
    
    96
    +    FT_Size_Reset_Func       size_reset;
    
    93 97
       };
    
    94 98
     
    
    95 99
     
    
    ... ... @@ -101,7 +105,8 @@ FT_BEGIN_HEADER
    101 105
                                                     tsb_adjust_,       \
    
    102 106
                                                     bsb_adjust_,       \
    
    103 107
                                                     vorg_adjust_,      \
    
    104
    -                                                metrics_adjust_  ) \
    
    108
    +                                                metrics_adjust_,   \
    
    109
    +                                                size_reset_      ) \
    
    105 110
       static const FT_Service_MetricsVariationsRec  class_ =           \
    
    106 111
       {                                                                \
    
    107 112
         hadvance_adjust_,                                              \
    
    ... ... @@ -111,7 +116,8 @@ FT_BEGIN_HEADER
    111 116
         tsb_adjust_,                                                   \
    
    112 117
         bsb_adjust_,                                                   \
    
    113 118
         vorg_adjust_,                                                  \
    
    114
    -    metrics_adjust_                                                \
    
    119
    +    metrics_adjust_,                                               \
    
    120
    +    size_reset_                                                    \
    
    115 121
       };
    
    116 122
     
    
    117 123
       /* */
    

  • include/freetype/internal/tttypes.h
    ... ... @@ -1455,8 +1455,14 @@ FT_BEGIN_HEADER
    1455 1455
         void*                 mm;
    
    1456 1456
     
    
    1457 1457
         /* a typeless pointer to the FT_Service_MetricsVariationsRec table */
    
    1458
    -    /* used to handle the HVAR, VVAR, and MVAR OpenType tables         */
    
    1459
    -    void*                 var;
    
    1458
    +    /* used to handle the HVAR, VVAR, and MVAR OpenType tables by the  */
    
    1459
    +    /* "truetype" driver                                               */
    
    1460
    +    void*                 tt_var;
    
    1461
    +
    
    1462
    +    /* a typeless pointer to the FT_Service_MetricsVariationsRec table */
    
    1463
    +    /* used to handle the HVAR, VVAR, and MVAR OpenType tables by this */
    
    1464
    +    /* TT_Face's driver                                                */
    
    1465
    +    void*                 face_var;
    
    1460 1466
     #endif
    
    1461 1467
     
    
    1462 1468
         /* a typeless pointer to the PostScript Aux service */
    

  • src/cff/cffdrivr.c
    ... ... @@ -1046,7 +1046,8 @@
    1046 1046
                            FT_UInt   gindex,
    
    1047 1047
                            FT_Int   *avalue )
    
    1048 1048
       {
    
    1049
    -    FT_Service_MetricsVariations  var = (FT_Service_MetricsVariations)face->var;
    
    1049
    +    FT_Service_MetricsVariations
    
    1050
    +      var = (FT_Service_MetricsVariations)face->tt_var;
    
    1050 1051
     
    
    1051 1052
     
    
    1052 1053
         return var->hadvance_adjust( FT_FACE( face ), gindex, avalue );
    
    ... ... @@ -1056,7 +1057,8 @@
    1056 1057
       static void
    
    1057 1058
       cff_metrics_adjust( CFF_Face  face )
    
    1058 1059
       {
    
    1059
    -    FT_Service_MetricsVariations  var = (FT_Service_MetricsVariations)face->var;
    
    1060
    +    FT_Service_MetricsVariations
    
    1061
    +      var = (FT_Service_MetricsVariations)face->tt_var;
    
    1060 1062
     
    
    1061 1063
     
    
    1062 1064
         var->metrics_adjust( FT_FACE( face ) );
    
    ... ... @@ -1075,7 +1077,8 @@
    1075 1077
         (FT_BSB_Adjust_Func)     NULL,                   /* bsb_adjust      */
    
    1076 1078
         (FT_VOrg_Adjust_Func)    NULL,                   /* vorg_adjust     */
    
    1077 1079
     
    
    1078
    -    (FT_Metrics_Adjust_Func) cff_metrics_adjust      /* metrics_adjust  */
    
    1080
    +    (FT_Metrics_Adjust_Func) cff_metrics_adjust,     /* metrics_adjust  */
    
    1081
    +    (FT_Size_Reset_Func)     NULL                    /* size_reset      */
    
    1079 1082
       )
    
    1080 1083
     #endif
    
    1081 1084
     
    

  • src/cff/cffobjs.c
    ... ... @@ -719,8 +719,10 @@
    719 719
     
    
    720 720
     #ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT
    
    721 721
           {
    
    722
    -        FT_Service_MultiMasters       mm  = (FT_Service_MultiMasters)face->mm;
    
    723
    -        FT_Service_MetricsVariations  var = (FT_Service_MetricsVariations)face->var;
    
    722
    +        FT_Service_MultiMasters
    
    723
    +          mm = (FT_Service_MultiMasters)face->mm;
    
    724
    +        FT_Service_MetricsVariations
    
    725
    +          var = (FT_Service_MetricsVariations)face->face_var;
    
    724 726
     
    
    725 727
             FT_UInt  instance_index = (FT_UInt)face_index >> 16;
    
    726 728
     
    

  • src/sfnt/sfobjs.c
    ... ... @@ -534,17 +534,23 @@
    534 534
                                             0 );
    
    535 535
         }
    
    536 536
     
    
    537
    -    if ( !face->var )
    
    537
    +    if ( !face->tt_var )
    
    538 538
         {
    
    539 539
           /* we want the metrics variations interface */
    
    540 540
           /* from the `truetype' module only          */
    
    541 541
           FT_Module  tt_module = FT_Get_Module( library, "truetype" );
    
    542 542
     
    
    543 543
     
    
    544
    -      face->var = ft_module_get_service( tt_module,
    
    545
    -                                         FT_SERVICE_ID_METRICS_VARIATIONS,
    
    546
    -                                         0 );
    
    544
    +      face->tt_var = ft_module_get_service( tt_module,
    
    545
    +                                            FT_SERVICE_ID_METRICS_VARIATIONS,
    
    546
    +                                            0 );
    
    547 547
         }
    
    548
    +
    
    549
    +    if ( !face->face_var )
    
    550
    +      face->face_var = ft_module_get_service(
    
    551
    +                         &face->root.driver->root,
    
    552
    +                         FT_SERVICE_ID_METRICS_VARIATIONS,
    
    553
    +                         0 );
    
    548 554
     #endif
    
    549 555
     
    
    550 556
         FT_TRACE2(( "SFNT driver\n" ));
    

  • src/sfnt/ttmtx.c
    ... ... @@ -239,7 +239,7 @@
    239 239
     
    
    240 240
     #ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT
    
    241 241
         FT_Service_MetricsVariations  var =
    
    242
    -      (FT_Service_MetricsVariations)face->var;
    
    242
    +      (FT_Service_MetricsVariations)face->tt_var;
    
    243 243
     #endif
    
    244 244
     
    
    245 245
     
    

  • src/truetype/ttdriver.c
    ... ... @@ -316,7 +316,7 @@
    316 316
           /* use the scaled metrics, even when tt_size_reset fails */
    
    317 317
           FT_Select_Metrics( size->face, strike_index );
    
    318 318
     
    
    319
    -      tt_size_reset( ttsize, 0 ); /* ignore return value */
    
    319
    +      tt_size_reset( ttsize ); /* ignore return value */
    
    320 320
         }
    
    321 321
         else
    
    322 322
         {
    
    ... ... @@ -377,7 +377,7 @@
    377 377
     
    
    378 378
         if ( FT_IS_SCALABLE( size->face ) )
    
    379 379
         {
    
    380
    -      error = tt_size_reset( ttsize, 0 );
    
    380
    +      error = tt_size_reset( ttsize );
    
    381 381
     
    
    382 382
     #ifdef TT_USE_BYTECODE_INTERPRETER
    
    383 383
           /* for the `MPS' bytecode instruction we need the point size */
    
    ... ... @@ -559,7 +559,8 @@
    559 559
         (FT_BSB_Adjust_Func)     NULL,                   /* bsb_adjust      */
    
    560 560
         (FT_VOrg_Adjust_Func)    NULL,                   /* vorg_adjust     */
    
    561 561
     
    
    562
    -    (FT_Metrics_Adjust_Func) tt_apply_mvar           /* metrics_adjust  */
    
    562
    +    (FT_Metrics_Adjust_Func) tt_apply_mvar,          /* metrics_adjust  */
    
    563
    +    (FT_Size_Reset_Func)     tt_size_reset_height    /* size_reset      */
    
    563 564
       )
    
    564 565
     
    
    565 566
     #endif /* TT_CONFIG_OPTION_GX_VAR_SUPPORT */
    

  • src/truetype/ttgxvar.c
    ... ... @@ -1462,15 +1462,14 @@
    1462 1462
     
    
    1463 1463
     
    
    1464 1464
       static FT_Error
    
    1465
    -  tt_size_reset_iterator( FT_ListNode  node,
    
    1465
    +  ft_size_reset_iterator( FT_ListNode  node,
    
    1466 1466
                               void*        user )
    
    1467 1467
       {
    
    1468
    -    TT_Size  size = (TT_Size)node->data;
    
    1469
    -
    
    1470
    -    FT_UNUSED( user );
    
    1468
    +    FT_Size                       size = (FT_Size)node->data;
    
    1469
    +    FT_Service_MetricsVariations  var  = (FT_Service_MetricsVariations)user;
    
    1471 1470
     
    
    1472 1471
     
    
    1473
    -    tt_size_reset( size, 1 );
    
    1472
    +    var->size_reset( size );
    
    1474 1473
     
    
    1475 1474
         return FT_Err_Ok;
    
    1476 1475
       }
    
    ... ... @@ -1543,6 +1542,9 @@
    1543 1542
     
    
    1544 1543
         /* adjust all derived values */
    
    1545 1544
         {
    
    1545
    +      FT_Service_MetricsVariations  var =
    
    1546
    +        (FT_Service_MetricsVariations)face->face_var;
    
    1547
    +
    
    1546 1548
           FT_Face  root = &face->root;
    
    1547 1549
     
    
    1548 1550
           /*
    
    ... ... @@ -1584,11 +1586,12 @@
    1584 1586
                                       face->postscript.underlineThickness / 2;
    
    1585 1587
           root->underline_thickness = face->postscript.underlineThickness;
    
    1586 1588
     
    
    1587
    -      /* iterate over all FT_Size objects and call `tt_size_reset' */
    
    1588
    -      /* to propagate the metrics changes                          */
    
    1589
    -      FT_List_Iterate( &root->sizes_list,
    
    1590
    -                       tt_size_reset_iterator,
    
    1591
    -                       NULL );
    
    1589
    +      /* iterate over all FT_Size objects and call `var->size_reset' */
    
    1590
    +      /* to propagate the metrics changes                            */
    
    1591
    +      if ( var && var->size_reset )
    
    1592
    +        FT_List_Iterate( &root->sizes_list,
    
    1593
    +                         ft_size_reset_iterator,
    
    1594
    +                         (void*)var );
    
    1592 1595
         }
    
    1593 1596
       }
    
    1594 1597
     
    

  • src/truetype/ttobjs.c
    ... ... @@ -1338,39 +1338,25 @@
    1338 1338
       /**************************************************************************
    
    1339 1339
        *
    
    1340 1340
        * @Function:
    
    1341
    -   *   tt_size_reset
    
    1341
    +   *   tt_size_reset_height
    
    1342 1342
        *
    
    1343 1343
        * @Description:
    
    1344
    -   *   Reset a TrueType size when resolutions and character dimensions
    
    1345
    -   *   have been changed.
    
    1344
    +   *   Recompute a TrueType size's ascender, descender, and height
    
    1345
    +   *   when resolutions and character dimensions have been changed.
    
    1346
    +   *   Used for variation fonts as an iterator function.
    
    1346 1347
        *
    
    1347 1348
        * @Input:
    
    1348 1349
        *   size ::
    
    1349 1350
        *     A handle to the target size object.
    
    1350
    -   *
    
    1351
    -   *   only_height ::
    
    1352
    -   *     Only recompute ascender, descender, and height;
    
    1353
    -   *     this flag is used for variation fonts where
    
    1354
    -   *     `tt_size_reset' is used as an iterator function.
    
    1355 1351
        */
    
    1356 1352
       FT_LOCAL_DEF( FT_Error )
    
    1357
    -  tt_size_reset( TT_Size  size,
    
    1358
    -                 FT_Bool  only_height )
    
    1353
    +  tt_size_reset_height( TT_Size  size )
    
    1359 1354
       {
    
    1360
    -    TT_Face           face;
    
    1361
    -    FT_Size_Metrics*  size_metrics;
    
    1362
    -
    
    1363
    -
    
    1364
    -    face = (TT_Face)size->root.face;
    
    1365
    -
    
    1366
    -    /* nothing to do for CFF2 */
    
    1367
    -    if ( face->is_cff2 )
    
    1368
    -      return FT_Err_Ok;
    
    1355
    +    TT_Face           face         = (TT_Face)size->root.face;
    
    1356
    +    FT_Size_Metrics*  size_metrics = &size->hinted_metrics;
    
    1369 1357
     
    
    1370 1358
         size->ttmetrics.valid = FALSE;
    
    1371 1359
     
    
    1372
    -    size_metrics = &size->hinted_metrics;
    
    1373
    -
    
    1374 1360
         /* copy the result from base layer */
    
    1375 1361
         *size_metrics = size->root.metrics;
    
    1376 1362
     
    
    ... ... @@ -1397,12 +1383,34 @@
    1397 1383
     
    
    1398 1384
         size->ttmetrics.valid = TRUE;
    
    1399 1385
     
    
    1400
    -    if ( only_height )
    
    1401
    -    {
    
    1402
    -      /* we must not recompute the scaling values here since       */
    
    1403
    -      /* `tt_size_reset' was already called (with _only_height_ = 0) */
    
    1404
    -      return FT_Err_Ok;
    
    1405
    -    }
    
    1386
    +    return FT_Err_Ok;
    
    1387
    +  }
    
    1388
    +
    
    1389
    +
    
    1390
    +  /**************************************************************************
    
    1391
    +   *
    
    1392
    +   * @Function:
    
    1393
    +   *   tt_size_reset
    
    1394
    +   *
    
    1395
    +   * @Description:
    
    1396
    +   *   Reset a TrueType size when resolutions and character dimensions
    
    1397
    +   *   have been changed.
    
    1398
    +   *
    
    1399
    +   * @Input:
    
    1400
    +   *   size ::
    
    1401
    +   *     A handle to the target size object.
    
    1402
    +   */
    
    1403
    +  FT_LOCAL_DEF( FT_Error )
    
    1404
    +  tt_size_reset( TT_Size  size )
    
    1405
    +  {
    
    1406
    +    FT_Error          error;
    
    1407
    +    TT_Face           face         = (TT_Face)size->root.face;
    
    1408
    +    FT_Size_Metrics*  size_metrics = &size->hinted_metrics;
    
    1409
    +
    
    1410
    +
    
    1411
    +    error = tt_size_reset_height( size );
    
    1412
    +    if ( error )
    
    1413
    +      return error;
    
    1406 1414
     
    
    1407 1415
         if ( face->header.Flags & 8 )
    
    1408 1416
         {
    

  • src/truetype/ttobjs.h
    ... ... @@ -391,8 +391,10 @@ FT_BEGIN_HEADER
    391 391
     #endif /* TT_USE_BYTECODE_INTERPRETER */
    
    392 392
     
    
    393 393
       FT_LOCAL( FT_Error )
    
    394
    -  tt_size_reset( TT_Size  size,
    
    395
    -                 FT_Bool  only_height );
    
    394
    +  tt_size_reset_height( TT_Size  size );
    
    395
    +
    
    396
    +  FT_LOCAL( FT_Error )
    
    397
    +  tt_size_reset( TT_Size  size );
    
    396 398
     
    
    397 399
     
    
    398 400
       /**************************************************************************
    


  • reply via email to

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