summaryrefslogtreecommitdiff
path: root/Build/source/libs/freetype2/freetype-src/src/cff/cffload.c
diff options
context:
space:
mode:
Diffstat (limited to 'Build/source/libs/freetype2/freetype-src/src/cff/cffload.c')
-rw-r--r--Build/source/libs/freetype2/freetype-src/src/cff/cffload.c77
1 files changed, 34 insertions, 43 deletions
diff --git a/Build/source/libs/freetype2/freetype-src/src/cff/cffload.c b/Build/source/libs/freetype2/freetype-src/src/cff/cffload.c
index af79082e98c..979fd45f6ca 100644
--- a/Build/source/libs/freetype2/freetype-src/src/cff/cffload.c
+++ b/Build/source/libs/freetype2/freetype-src/src/cff/cffload.c
@@ -4,7 +4,7 @@
*
* OpenType and CFF data/program tables loader (body).
*
- * Copyright (C) 1996-2023 by
+ * Copyright (C) 1996-2024 by
* David Turner, Robert Wilhelm, and Werner Lemberg.
*
* This file is part of the FreeType project, and may only be used,
@@ -1202,17 +1202,21 @@
{
CFF_AxisCoords* axis = &region->axisList[j];
- FT_Int16 start14, peak14, end14;
+ FT_Int start, peak, end;
- if ( FT_READ_SHORT( start14 ) ||
- FT_READ_SHORT( peak14 ) ||
- FT_READ_SHORT( end14 ) )
+ if ( FT_READ_SHORT( start ) ||
+ FT_READ_SHORT( peak ) ||
+ FT_READ_SHORT( end ) )
goto Exit;
- axis->startCoord = FT_fdot14ToFixed( start14 );
- axis->peakCoord = FT_fdot14ToFixed( peak14 );
- axis->endCoord = FT_fdot14ToFixed( end14 );
+ /* immediately tag invalid ranges with special peak = 0 */
+ if ( ( start < 0 && end > 0 ) || start > peak || peak > end )
+ peak = 0;
+
+ axis->startCoord = FT_fdot14ToFixed( start );
+ axis->peakCoord = FT_fdot14ToFixed( peak );
+ axis->endCoord = FT_fdot14ToFixed( end );
}
}
@@ -1379,10 +1383,10 @@
/* opcode in both CFF and CFF2 DICTs. See `cff_parse_num' for */
/* decode of this, which rounds to an integer. */
*subFont->blend_top++ = 255;
- *subFont->blend_top++ = (FT_Byte)( sum >> 24 );
- *subFont->blend_top++ = (FT_Byte)( sum >> 16 );
- *subFont->blend_top++ = (FT_Byte)( sum >> 8 );
- *subFont->blend_top++ = (FT_Byte)sum;
+ *subFont->blend_top++ = (FT_Byte)( (FT_UInt32)sum >> 24 );
+ *subFont->blend_top++ = (FT_Byte)( (FT_UInt32)sum >> 16 );
+ *subFont->blend_top++ = (FT_Byte)( (FT_UInt32)sum >> 8 );
+ *subFont->blend_top++ = (FT_Byte)( (FT_UInt32)sum );
}
/* leave only numBlends results on parser stack */
@@ -1495,44 +1499,31 @@
for ( j = 0; j < lenNDV; j++ )
{
CFF_AxisCoords* axis = &varRegion->axisList[j];
- FT_Fixed axisScalar;
-
-
- /* compute the scalar contribution of this axis; */
- /* ignore invalid ranges */
- if ( axis->startCoord > axis->peakCoord ||
- axis->peakCoord > axis->endCoord )
- axisScalar = FT_FIXED_ONE;
- else if ( axis->startCoord < 0 &&
- axis->endCoord > 0 &&
- axis->peakCoord != 0 )
- axisScalar = FT_FIXED_ONE;
- /* peak of 0 means ignore this axis */
- else if ( axis->peakCoord == 0 )
- axisScalar = FT_FIXED_ONE;
+ /* compute the scalar contribution of this axis */
+ /* with peak of 0 used for invalid axes */
+ if ( axis->peakCoord == NDV[j] ||
+ axis->peakCoord == 0 )
+ continue;
/* ignore this region if coords are out of range */
- else if ( NDV[j] < axis->startCoord ||
- NDV[j] > axis->endCoord )
- axisScalar = 0;
-
- /* calculate a proportional factor */
- else
+ else if ( NDV[j] <= axis->startCoord ||
+ NDV[j] >= axis->endCoord )
{
- if ( NDV[j] == axis->peakCoord )
- axisScalar = FT_FIXED_ONE;
- else if ( NDV[j] < axis->peakCoord )
- axisScalar = FT_DivFix( NDV[j] - axis->startCoord,
- axis->peakCoord - axis->startCoord );
- else
- axisScalar = FT_DivFix( axis->endCoord - NDV[j],
- axis->endCoord - axis->peakCoord );
+ blend->BV[master] = 0;
+ break;
}
- /* take product of all the axis scalars */
- blend->BV[master] = FT_MulFix( blend->BV[master], axisScalar );
+ /* adjust proportionally */
+ else if ( NDV[j] < axis->peakCoord )
+ blend->BV[master] = FT_MulDiv( blend->BV[master],
+ NDV[j] - axis->startCoord,
+ axis->peakCoord - axis->startCoord );
+ else /* NDV[j] > axis->peakCoord ) */
+ blend->BV[master] = FT_MulDiv( blend->BV[master],
+ axis->endCoord - NDV[j],
+ axis->endCoord - axis->peakCoord );
}
FT_TRACE4(( ", %f ",