Two fixes to avar mapping
1. Handle segment with two entries correctly,
2. Fix rounding math. Ouch!
Fixes https://github.com/behdad/harfbuzz/issues/521
diff --git a/src/hb-ot-var-avar-table.hh b/src/hb-ot-var-avar-table.hh
index ace0f5f..464cf35 100644
--- a/src/hb-ot-var-avar-table.hh
+++ b/src/hb-ot-var-avar-table.hh
@@ -57,8 +57,13 @@
* that at least -1, 0, and +1 must be mapped. But we include these as
* part of a better error recovery scheme. */
- if (!len)
- return value;
+ if (len < 2)
+ {
+ if (!len)
+ return value;
+ else /* len == 1*/
+ return value - array[0].fromCoord + array[0].toCoord;
+ }
if (value <= array[0].fromCoord)
return value - array[0].fromCoord + array[0].toCoord;
@@ -76,8 +81,8 @@
int denom = array[i].fromCoord - array[i-1].fromCoord;
return array[i-1].toCoord +
- (array[i].toCoord - array[i-1].toCoord) *
- (value - array[i-1].fromCoord + denom/2) / denom;
+ ((array[i].toCoord - array[i-1].toCoord) *
+ (value - array[i-1].fromCoord) + denom/2) / denom;
}
DEFINE_SIZE_ARRAY (2, array);