... |
... |
@@ -484,6 +484,16 @@ |
484
|
484
|
goto Exit;
|
485
|
485
|
}
|
486
|
486
|
|
|
487
|
+ /* new in OpenType 1.8.4: inner & outer index equal to 0xFFFF */
|
|
488
|
+ /* has a special meaning (i.e., no variation data for this item) */
|
|
489
|
+ if ( itemStore->dataCount == 0xFFFFU )
|
|
490
|
+ {
|
|
491
|
+ FT_TRACE2(( "ft_var_load_item_variation_store:"
|
|
492
|
+ " dataCount too large\n" ));
|
|
493
|
+ error = FT_THROW( Invalid_Table );
|
|
494
|
+ goto Exit;
|
|
495
|
+ }
|
|
496
|
+
|
487
|
497
|
/* make temporary copy of item variation data offsets; */
|
488
|
498
|
/* we will parse region list first, then come back */
|
489
|
499
|
if ( FT_QNEW_ARRAY( dataOffsetArray, itemStore->dataCount ) )
|
... |
... |
@@ -758,6 +768,16 @@ |
758
|
768
|
mapData = ( mapData << 8 ) | data;
|
759
|
769
|
}
|
760
|
770
|
|
|
771
|
+ /* new in OpenType 1.8.4 */
|
|
772
|
+ if ( mapData == 0xFFFFFFFFUL )
|
|
773
|
+ {
|
|
774
|
+ /* no variation data for this item */
|
|
775
|
+ map->outerIndex[i] = 0xFFFFU;
|
|
776
|
+ map->innerIndex[i] = 0xFFFFU;
|
|
777
|
+
|
|
778
|
+ continue;
|
|
779
|
+ }
|
|
780
|
+
|
761
|
781
|
outerIndex = mapData >> innerBitCount;
|
762
|
782
|
|
763
|
783
|
if ( outerIndex >= itemStore->dataCount )
|
... |
... |
@@ -1128,19 +1148,29 @@ |
1128
|
1148
|
}
|
1129
|
1149
|
}
|
1130
|
1150
|
|
1131
|
|
- delta = ft_var_get_item_delta( face,
|
1132
|
|
- &table->itemStore,
|
1133
|
|
- outerIndex,
|
1134
|
|
- innerIndex );
|
1135
|
|
-
|
1136
|
|
- FT_TRACE5(( "%s value %d adjusted by %d unit%s (%s)\n",
|
1137
|
|
- vertical ? "vertical height" : "horizontal width",
|
1138
|
|
- *avalue,
|
1139
|
|
- delta,
|
1140
|
|
- delta == 1 ? "" : "s",
|
1141
|
|
- vertical ? "VVAR" : "HVAR" ));
|
1142
|
|
-
|
1143
|
|
- *avalue += delta;
|
|
1151
|
+ /* new test introduced in OpenType 1.8.4 */
|
|
1152
|
+ if ( outerIndex == 0xFFFFU && innerIndex == 0xFFFFU )
|
|
1153
|
+ {
|
|
1154
|
+ FT_TRACE5(( "no adjustment to %s value %d\n",
|
|
1155
|
+ vertical ? "vertical height" : "horizontal width",
|
|
1156
|
+ *avalue ));
|
|
1157
|
+ }
|
|
1158
|
+ else
|
|
1159
|
+ {
|
|
1160
|
+ delta = ft_var_get_item_delta( face,
|
|
1161
|
+ &table->itemStore,
|
|
1162
|
+ outerIndex,
|
|
1163
|
+ innerIndex );
|
|
1164
|
+
|
|
1165
|
+ FT_TRACE5(( "%s value %d adjusted by %d unit%s (%s)\n",
|
|
1166
|
+ vertical ? "vertical height" : "horizontal width",
|
|
1167
|
+ *avalue,
|
|
1168
|
+ delta,
|
|
1169
|
+ delta == 1 ? "" : "s",
|
|
1170
|
+ vertical ? "VVAR" : "HVAR" ));
|
|
1171
|
+
|
|
1172
|
+ *avalue += delta;
|
|
1173
|
+ }
|
1144
|
1174
|
|
1145
|
1175
|
Exit:
|
1146
|
1176
|
return error;
|
... |
... |
@@ -1332,6 +1362,13 @@ |
1332
|
1362
|
value->outerIndex = FT_GET_USHORT();
|
1333
|
1363
|
value->innerIndex = FT_GET_USHORT();
|
1334
|
1364
|
|
|
1365
|
+ /* new in OpenType 1.8.4 */
|
|
1366
|
+ if ( value->outerIndex == 0xFFFFU && value->innerIndex == 0xFFFFU )
|
|
1367
|
+ {
|
|
1368
|
+ /* no variation data for this item */
|
|
1369
|
+ continue;
|
|
1370
|
+ }
|
|
1371
|
+
|
1335
|
1372
|
if ( value->outerIndex >= itemStore->dataCount ||
|
1336
|
1373
|
value->innerIndex >= itemStore->varData[value->outerIndex]
|
1337
|
1374
|
.itemCount )
|
... |
... |
@@ -1422,6 +1459,13 @@ |
1422
|
1459
|
FT_Int delta;
|
1423
|
1460
|
|
1424
|
1461
|
|
|
1462
|
+ /* new test introduced in OpenType 1.8.4 */
|
|
1463
|
+ if ( value->outerIndex == 0xFFFFU && value->innerIndex == 0xFFFFU )
|
|
1464
|
+ {
|
|
1465
|
+ /* no variation data for this item */
|
|
1466
|
+ continue;
|
|
1467
|
+ }
|
|
1468
|
+
|
1425
|
1469
|
delta = ft_var_get_item_delta( face,
|
1426
|
1470
|
&blend->mvar_table->itemStore,
|
1427
|
1471
|
value->outerIndex,
|