[truetype] Handle inner/outer index values 0xFFFF/0xFFFF.
This was introduced in OpenType 1.8.4. * src/truetype/ttgxvar.c (ft_var_load_delta_set_index_mapping, tt_hvadvance_adjust, ft_var_load_mvar, tt_apply_mvar): Handle special inner/outer index values. (ft_var_load_item_variation_store): Add test. Fixes #1154.
This commit is contained in:
parent
e8ebfe988b
commit
5d49473f85
|
@ -484,6 +484,16 @@
|
||||||
goto Exit;
|
goto Exit;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* new in OpenType 1.8.4: inner & outer index equal to 0xFFFF */
|
||||||
|
/* has a special meaning (i.e., no variation data for this item) */
|
||||||
|
if ( itemStore->dataCount == 0xFFFFU )
|
||||||
|
{
|
||||||
|
FT_TRACE2(( "ft_var_load_item_variation_store:"
|
||||||
|
" dataCount too large\n" ));
|
||||||
|
error = FT_THROW( Invalid_Table );
|
||||||
|
goto Exit;
|
||||||
|
}
|
||||||
|
|
||||||
/* make temporary copy of item variation data offsets; */
|
/* make temporary copy of item variation data offsets; */
|
||||||
/* we will parse region list first, then come back */
|
/* we will parse region list first, then come back */
|
||||||
if ( FT_QNEW_ARRAY( dataOffsetArray, itemStore->dataCount ) )
|
if ( FT_QNEW_ARRAY( dataOffsetArray, itemStore->dataCount ) )
|
||||||
|
@ -758,6 +768,16 @@
|
||||||
mapData = ( mapData << 8 ) | data;
|
mapData = ( mapData << 8 ) | data;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* new in OpenType 1.8.4 */
|
||||||
|
if ( mapData == 0xFFFFFFFFUL )
|
||||||
|
{
|
||||||
|
/* no variation data for this item */
|
||||||
|
map->outerIndex[i] = 0xFFFFU;
|
||||||
|
map->innerIndex[i] = 0xFFFFU;
|
||||||
|
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
outerIndex = mapData >> innerBitCount;
|
outerIndex = mapData >> innerBitCount;
|
||||||
|
|
||||||
if ( outerIndex >= itemStore->dataCount )
|
if ( outerIndex >= itemStore->dataCount )
|
||||||
|
@ -1128,19 +1148,29 @@
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
delta = ft_var_get_item_delta( face,
|
/* new test introduced in OpenType 1.8.4 */
|
||||||
&table->itemStore,
|
if ( outerIndex == 0xFFFFU && innerIndex == 0xFFFFU )
|
||||||
outerIndex,
|
{
|
||||||
innerIndex );
|
FT_TRACE5(( "no adjustment to %s value %d\n",
|
||||||
|
vertical ? "vertical height" : "horizontal width",
|
||||||
|
*avalue ));
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
delta = ft_var_get_item_delta( face,
|
||||||
|
&table->itemStore,
|
||||||
|
outerIndex,
|
||||||
|
innerIndex );
|
||||||
|
|
||||||
FT_TRACE5(( "%s value %d adjusted by %d unit%s (%s)\n",
|
FT_TRACE5(( "%s value %d adjusted by %d unit%s (%s)\n",
|
||||||
vertical ? "vertical height" : "horizontal width",
|
vertical ? "vertical height" : "horizontal width",
|
||||||
*avalue,
|
*avalue,
|
||||||
delta,
|
delta,
|
||||||
delta == 1 ? "" : "s",
|
delta == 1 ? "" : "s",
|
||||||
vertical ? "VVAR" : "HVAR" ));
|
vertical ? "VVAR" : "HVAR" ));
|
||||||
|
|
||||||
*avalue += delta;
|
*avalue += delta;
|
||||||
|
}
|
||||||
|
|
||||||
Exit:
|
Exit:
|
||||||
return error;
|
return error;
|
||||||
|
@ -1332,6 +1362,13 @@
|
||||||
value->outerIndex = FT_GET_USHORT();
|
value->outerIndex = FT_GET_USHORT();
|
||||||
value->innerIndex = FT_GET_USHORT();
|
value->innerIndex = FT_GET_USHORT();
|
||||||
|
|
||||||
|
/* new in OpenType 1.8.4 */
|
||||||
|
if ( value->outerIndex == 0xFFFFU && value->innerIndex == 0xFFFFU )
|
||||||
|
{
|
||||||
|
/* no variation data for this item */
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
if ( value->outerIndex >= itemStore->dataCount ||
|
if ( value->outerIndex >= itemStore->dataCount ||
|
||||||
value->innerIndex >= itemStore->varData[value->outerIndex]
|
value->innerIndex >= itemStore->varData[value->outerIndex]
|
||||||
.itemCount )
|
.itemCount )
|
||||||
|
@ -1422,6 +1459,13 @@
|
||||||
FT_Int delta;
|
FT_Int delta;
|
||||||
|
|
||||||
|
|
||||||
|
/* new test introduced in OpenType 1.8.4 */
|
||||||
|
if ( value->outerIndex == 0xFFFFU && value->innerIndex == 0xFFFFU )
|
||||||
|
{
|
||||||
|
/* no variation data for this item */
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
delta = ft_var_get_item_delta( face,
|
delta = ft_var_get_item_delta( face,
|
||||||
&blend->mvar_table->itemStore,
|
&blend->mvar_table->itemStore,
|
||||||
value->outerIndex,
|
value->outerIndex,
|
||||||
|
|
Loading…
Reference in New Issue