提交 33489928 编写于 作者: E Ebrahim Byagowi 提交者: Behdad Esfahbod

[avar] Implement inverse map, unmap

上级 981f5a54
...@@ -49,9 +49,10 @@ struct AxisValueMap ...@@ -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 ...@@ -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> ...@@ -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 ...@@ -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 ...@@ -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);
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册