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
|
/**************************************************************************
|
|