{
const MathValueRecord* correctionHeight = mathValueRecords;
const MathValueRecord* kernValue = mathValueRecords + heightCount;
- // The description of the MathKern table is a ambiguous, but interpreting
- // "between the two heights found at those indexes" for 0 < i < len as
- //
- // correctionHeight[i-1] < correction_height <= correctionHeight[i]
- //
- // makes the result consistent with the limit cases and we can just use the
- // binary search algorithm of std::upper_bound:
- unsigned int count = heightCount;
+ int sign = font->y_scale < 0 ? -1 : +1;
+
+ /* The description of the MathKern table is a ambiguous, but interpreting
+ * "between the two heights found at those indexes" for 0 < i < len as
+ *
+ * correctionHeight[i-1] < correction_height <= correctionHeight[i]
+ *
+ * makes the result consistent with the limit cases and we can just use the
+ * binary search algorithm of std::upper_bound:
+ */
unsigned int i = 0;
- while (count > 0) {
+ unsigned int count = heightCount;
+ while (count > 0)
+ {
unsigned int half = count / 2;
- hb_position_t height =
- correctionHeight[i + half].get_y_value(font, this);
- if (height < correction_height) {
+ hb_position_t height = correctionHeight[i + half].get_y_value(font, this);
+ if (sign * height < sign * correction_height)
+ {
i += half + 1;
count -= half + 1;
} else
MathValueRecord mathValueRecords[VAR]; /* Array of correction heights at
* which the kern value changes.
* Sorted by the height value in
- * design units. */
- /* Array of kern values corresponding
- * to heights. */
+ * design units (heightCount entries),
+ * Followed by:
+ * Array of kern values corresponding
+ * to heights. (heightCount+1 entries).
+ */
public:
DEFINE_SIZE_ARRAY (2, mathValueRecords);