diff --git a/ChangeLog b/ChangeLog index ae04c2670..d9811d9da 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,13 @@ +2017-01-08 Werner Lemberg + + [truetype] Again some GX code shuffling. + + We need this later on for MVAR also. + + * src/truetype/ttgxvar.c (tt_hadvance_adjust): Split off computing + an item store variation delta into... + (ft_var_get_item_delta): ...new function. + 2017-01-08 Werner Lemberg [truetype] Adjust font variation flags for MVAR. diff --git a/src/truetype/ttgxvar.c b/src/truetype/ttgxvar.c index 40176ca9f..b012871a0 100644 --- a/src/truetype/ttgxvar.c +++ b/src/truetype/ttgxvar.c @@ -795,110 +795,38 @@ } - /*************************************************************************/ - /* */ - /* */ - /* tt_hadvance_adjust */ - /* */ - /* */ - /* Apply HVAR advance width adjustment of a given glyph. */ - /* */ - /* */ - /* gindex :: The glyph index. */ - /* */ - /* */ - /* face :: The font face. */ - /* */ - /* adelta :: Points to width value that gets modified. */ - /* */ - FT_LOCAL_DEF( FT_Error ) - tt_hadvance_adjust( TT_Face face, - FT_UInt gindex, - FT_Int *avalue ) + static FT_Int + ft_var_get_item_delta( TT_Face face, + GX_ItemVarStore itemStore, + FT_UInt outerIndex, + FT_UInt innerIndex ) { - FT_Error error = FT_Err_Ok; - GX_ItemVarData varData; + FT_Short* deltaSet; - FT_UInt master, j; - FT_Fixed netAdjustment = 0; /* accumulated adjustment */ - FT_Fixed scaledDelta; - FT_Short* deltaSet; - FT_Fixed delta; + FT_UInt master, j; + FT_Fixed netAdjustment = 0; /* accumulated adjustment */ + FT_Fixed scaledDelta; + FT_Fixed delta; - if ( !face->doblend || !face->blend ) - goto Exit; - - if ( !face->blend->hvar_loaded ) - { - /* initialize hvar table */ - face->blend->hvar_error = ft_var_load_hvar( face ); - } - - if ( !face->blend->hvar_checked ) - { - error = face->blend->hvar_error; - goto Exit; - } - - /* advance width adjustments are always present in an `HVAR' table, */ - /* so need to test for this capability */ - - if ( face->blend->hvar_table->widthMap.innerIndex ) - { - FT_UInt innerIndex, outerIndex; - - - if ( gindex >= face->blend->hvar_table->widthMap.mapCount ) - { - FT_TRACE2(( "gindex %d out of range\n", gindex )); - error = FT_THROW( Invalid_Argument ); - goto Exit; - } - - /* trust that HVAR parser has checked indices */ - outerIndex = face->blend->hvar_table->widthMap.outerIndex[gindex]; - innerIndex = face->blend->hvar_table->widthMap.innerIndex[gindex]; - varData = &face->blend->hvar_table->itemStore.varData[outerIndex]; - deltaSet = &varData->deltaSet[varData->regionIdxCount * innerIndex]; - } - else - { - /* no widthMap data; use glyph index as inner index instead */ - /* (and value 0 for outer index) */ - - varData = &face->blend->hvar_table->itemStore.varData[0]; - - if ( gindex >= varData->itemCount ) - { - FT_TRACE2(( "gindex %d out of range\n", gindex )); - error = FT_THROW( Invalid_Argument ); - goto Exit; - } - - deltaSet = &varData->deltaSet[varData->regionIdxCount * gindex]; - } - /* See pseudo code from `Font Variations Overview' */ /* in the OpenType specification. */ + varData = &itemStore->varData[outerIndex]; + deltaSet = &varData->deltaSet[varData->regionIdxCount * innerIndex]; + /* outer loop steps through master designs to be blended */ for ( master = 0; master < varData->regionIdxCount; master++ ) { FT_Fixed scalar = FT_FIXED_ONE; FT_UInt regionIndex = varData->regionIndices[master]; - GX_AxisCoords axis = face->blend - ->hvar_table - ->itemStore.varRegionList[regionIndex] - .axisList; + GX_AxisCoords axis = itemStore->varRegionList[regionIndex].axisList; /* inner loop steps through axes in this region */ - for ( j = 0; - j < face->blend->hvar_table->itemStore.axisCount; - j++, axis++ ) + for ( j = 0; j < itemStore->axisCount; j++, axis++ ) { FT_Fixed axisScalar; @@ -952,12 +880,96 @@ } /* per-region loop */ + return FT_fixedToInt( netAdjustment ); + } + + + /*************************************************************************/ + /* */ + /* */ + /* tt_hadvance_adjust */ + /* */ + /* */ + /* Apply HVAR advance width adjustment of a given glyph. */ + /* */ + /* */ + /* gindex :: The glyph index. */ + /* */ + /* */ + /* face :: The font face. */ + /* */ + /* adelta :: Points to width value that gets modified. */ + /* */ + FT_LOCAL_DEF( FT_Error ) + tt_hadvance_adjust( TT_Face face, + FT_UInt gindex, + FT_Int *avalue ) + { + FT_Error error = FT_Err_Ok; + FT_UInt innerIndex, outerIndex; + FT_Int delta; + + + if ( !face->doblend || !face->blend ) + goto Exit; + + if ( !face->blend->hvar_loaded ) + { + /* initialize hvar table */ + face->blend->hvar_error = ft_var_load_hvar( face ); + } + + if ( !face->blend->hvar_checked ) + { + error = face->blend->hvar_error; + goto Exit; + } + + /* advance width adjustments are always present in an `HVAR' table, */ + /* so need to test for this capability */ + + if ( face->blend->hvar_table->widthMap.innerIndex ) + { + if ( gindex >= face->blend->hvar_table->widthMap.mapCount ) + { + FT_TRACE2(( "gindex %d out of range\n", gindex )); + error = FT_THROW( Invalid_Argument ); + goto Exit; + } + + /* trust that HVAR parser has checked indices */ + outerIndex = face->blend->hvar_table->widthMap.outerIndex[gindex]; + innerIndex = face->blend->hvar_table->widthMap.innerIndex[gindex]; + } + else + { + GX_ItemVarData varData; + + + /* no widthMap data */ + outerIndex = 0; + innerIndex = gindex; + + varData = &face->blend->hvar_table->itemStore.varData[outerIndex]; + if ( gindex >= varData->itemCount ) + { + FT_TRACE2(( "gindex %d out of range\n", gindex )); + error = FT_THROW( Invalid_Argument ); + goto Exit; + } + } + + delta = ft_var_get_item_delta( face, + &face->blend->hvar_table->itemStore, + outerIndex, + innerIndex ); + /* apply the accumulated adjustment to derive the interpolated value */ FT_TRACE5(( "horizontal width %d adjusted by %d units (HVAR)\n", *avalue, - FT_fixedToInt( netAdjustment ) )); + delta )); - *avalue += FT_fixedToInt( netAdjustment ); + *avalue += delta; Exit: return error;