[gvar] Optimize by applying deltas in batches

Shows up to 7% speedup in one of my benchmarks.

One test fails by one rounding issue. To be updated.
pull/4205/head
Behdad Esfahbod 2 years ago
parent 491aa572ce
commit 20454eaa39
  1. 22
      src/hb-ot-var-gvar-table.hh

@ -280,7 +280,7 @@ struct gvar
auto orig_points = orig_points_vec.as_array ();
contour_point_vector_t deltas_vec; /* flag is used to indicate referenced point */
if (unlikely (!deltas_vec.resize (points.length, false))) return false;
if (unlikely (!deltas_vec.resize (points.length))) return false;
auto deltas = deltas_vec.as_array ();
hb_vector_t<unsigned> end_points;
@ -294,6 +294,7 @@ struct gvar
hb_vector_t<unsigned int> private_indices;
hb_vector_t<int> x_deltas;
hb_vector_t<int> y_deltas;
bool flush = false;
do
{
float scalar = iterator.current_tuple->calculate_scalar (coords, num_coords, shared_tuples);
@ -318,7 +319,16 @@ struct gvar
if (unlikely (!y_deltas.resize (num_deltas, false))) return false;
if (unlikely (!GlyphVariationData::unpack_deltas (p, y_deltas, end))) return false;
hb_memset (deltas.arrayZ, 0, deltas.get_size ());
if (!apply_to_all)
{
if (flush)
{
for (unsigned int i = 0; i < points.length; i++)
points.arrayZ[i].translate (deltas.arrayZ[i]);
flush = false;
}
hb_memset (deltas.arrayZ, 0, deltas.get_size ());
}
unsigned ref_points = 0;
if (scalar != 1.0f)
@ -398,12 +408,14 @@ struct gvar
}
}
/* apply specified / inferred deltas to points */
for (unsigned int i = 0; i < points.length; i++)
points.arrayZ[i].translate (deltas.arrayZ[i]);
flush = true;
} while (iterator.move_to_next ());
if (flush)
for (unsigned int i = 0; i < points.length; i++)
points.arrayZ[i].translate (deltas.arrayZ[i]);
return true;
}

Loading…
Cancel
Save