|
|
@ -49,9 +49,10 @@ struct AxisValueMap |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
public: |
|
|
|
public: |
|
|
|
F2DOT14 fromCoord; /* A normalized coordinate value obtained using
|
|
|
|
F2DOT14 coords[2]; |
|
|
|
* default normalization. */ |
|
|
|
// F2DOT14 fromCoord; /* A normalized coordinate value obtained using
|
|
|
|
F2DOT14 toCoord; /* The modified, normalized coordinate value. */ |
|
|
|
// * default normalization. */
|
|
|
|
|
|
|
|
// F2DOT14 toCoord; /* The modified, normalized coordinate value. */
|
|
|
|
|
|
|
|
|
|
|
|
public: |
|
|
|
public: |
|
|
|
DEFINE_SIZE_STATIC (4); |
|
|
|
DEFINE_SIZE_STATIC (4); |
|
|
@ -59,12 +60,13 @@ struct AxisValueMap |
|
|
|
|
|
|
|
|
|
|
|
struct SegmentMaps : ArrayOf<AxisValueMap> |
|
|
|
struct SegmentMaps : ArrayOf<AxisValueMap> |
|
|
|
{ |
|
|
|
{ |
|
|
|
int map (int value) const |
|
|
|
int map (int value, unsigned int from_stride = 0, unsigned int to_stide = 1) const |
|
|
|
{ |
|
|
|
{ |
|
|
|
/* The following special-cases are not part of OpenType, which requires
|
|
|
|
/* The following special-cases are not part of OpenType, which requires
|
|
|
|
* that at least -1, 0, and +1 must be mapped. But we include these as |
|
|
|
* that at least -1, 0, and +1 must be mapped. But we include these as |
|
|
|
* part of a better error recovery scheme. */ |
|
|
|
* part of a better error recovery scheme. */ |
|
|
|
|
|
|
|
#define fromCoord coords[from_stride] |
|
|
|
|
|
|
|
#define toCoord coords[to_stide] |
|
|
|
if (len < 2) |
|
|
|
if (len < 2) |
|
|
|
{ |
|
|
|
{ |
|
|
|
if (!len) |
|
|
|
if (!len) |
|
|
@ -91,8 +93,12 @@ struct SegmentMaps : ArrayOf<AxisValueMap> |
|
|
|
return arrayZ[i-1].toCoord + |
|
|
|
return arrayZ[i-1].toCoord + |
|
|
|
((arrayZ[i].toCoord - arrayZ[i-1].toCoord) * |
|
|
|
((arrayZ[i].toCoord - arrayZ[i-1].toCoord) * |
|
|
|
(value - arrayZ[i-1].fromCoord) + denom/2) / denom; |
|
|
|
(value - arrayZ[i-1].fromCoord) + denom/2) / denom; |
|
|
|
|
|
|
|
#undef toCoord |
|
|
|
|
|
|
|
#undef fromCoord |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
int unmap (int value) const { return map (value, 1, 0); } |
|
|
|
|
|
|
|
|
|
|
|
public: |
|
|
|
public: |
|
|
|
DEFINE_SIZE_ARRAY (2, *this); |
|
|
|
DEFINE_SIZE_ARRAY (2, *this); |
|
|
|
}; |
|
|
|
}; |
|
|
@ -133,6 +139,18 @@ struct avar |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
void unmap_coords (int *coords, unsigned int coords_length) const |
|
|
|
|
|
|
|
{ |
|
|
|
|
|
|
|
unsigned int count = hb_min (coords_length, axisCount); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
const SegmentMaps *map = &firstAxisSegmentMaps; |
|
|
|
|
|
|
|
for (unsigned int i = 0; i < count; i++) |
|
|
|
|
|
|
|
{ |
|
|
|
|
|
|
|
coords[i] = map->unmap (coords[i]); |
|
|
|
|
|
|
|
map = &StructAfter<SegmentMaps> (*map); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
protected: |
|
|
|
protected: |
|
|
|
FixedVersion<>version; /* Version of the avar table
|
|
|
|
FixedVersion<>version; /* Version of the avar table
|
|
|
|
* initially set to 0x00010000u */ |
|
|
|
* initially set to 0x00010000u */ |
|
|
@ -140,7 +158,7 @@ struct avar |
|
|
|
HBUINT16 axisCount; /* The number of variation axes in the font. This
|
|
|
|
HBUINT16 axisCount; /* The number of variation axes in the font. This
|
|
|
|
* must be the same number as axisCount in the |
|
|
|
* must be the same number as axisCount in the |
|
|
|
* 'fvar' table. */ |
|
|
|
* 'fvar' table. */ |
|
|
|
SegmentMaps firstAxisSegmentMaps; |
|
|
|
SegmentMaps firstAxisSegmentMaps; |
|
|
|
|
|
|
|
|
|
|
|
public: |
|
|
|
public: |
|
|
|
DEFINE_SIZE_MIN (8); |
|
|
|
DEFINE_SIZE_MIN (8); |
|
|
|