[glyf/path-builder] Optimize scaling code

Scale each point once upon entry to function.

This makes our shape fetching code as fast as FreeType for all
benchmark cases now.
This commit is contained in:
Behdad Esfahbod 2022-06-26 16:26:17 -06:00
parent 36dd5d32fb
commit cf57f04ddb
1 changed files with 16 additions and 16 deletions

View File

@ -42,13 +42,13 @@ struct path_builder_t
void consume_point (const contour_point_t &point) void consume_point (const contour_point_t &point)
{ {
bool is_on_curve = point.flag & glyf_impl::SimpleGlyph::FLAG_ON_CURVE; bool is_on_curve = point.flag & glyf_impl::SimpleGlyph::FLAG_ON_CURVE;
optional_point_t p (point.x, point.y); optional_point_t p (font->em_fscalef_x (point.x), font->em_fscalef_y (point.y));
if (!first_oncurve) if (!first_oncurve)
{ {
if (is_on_curve) if (is_on_curve)
{ {
first_oncurve = p; first_oncurve = p;
draw_session->move_to (font->em_fscalef_x (p.x), font->em_fscalef_y (p.y)); draw_session->move_to (p.x, p.y);
} }
else else
{ {
@ -57,7 +57,7 @@ struct path_builder_t
optional_point_t mid = first_offcurve.lerp (p, .5f); optional_point_t mid = first_offcurve.lerp (p, .5f);
first_oncurve = mid; first_oncurve = mid;
last_offcurve = p; last_offcurve = p;
draw_session->move_to (font->em_fscalef_x (mid.x), font->em_fscalef_y (mid.y)); draw_session->move_to (mid.x, mid.y);
} }
else else
first_offcurve = p; first_offcurve = p;
@ -69,22 +69,22 @@ struct path_builder_t
{ {
if (is_on_curve) if (is_on_curve)
{ {
draw_session->quadratic_to (font->em_fscalef_x (last_offcurve.x), font->em_fscalef_y (last_offcurve.y), draw_session->quadratic_to (last_offcurve.x, last_offcurve.y,
font->em_fscalef_x (p.x), font->em_fscalef_y (p.y)); p.x, p.y);
last_offcurve = optional_point_t (); last_offcurve = optional_point_t ();
} }
else else
{ {
optional_point_t mid = last_offcurve.lerp (p, .5f); optional_point_t mid = last_offcurve.lerp (p, .5f);
draw_session->quadratic_to (font->em_fscalef_x (last_offcurve.x), font->em_fscalef_y (last_offcurve.y), draw_session->quadratic_to (last_offcurve.x, last_offcurve.y,
font->em_fscalef_x (mid.x), font->em_fscalef_y (mid.y)); mid.x, mid.y);
last_offcurve = p; last_offcurve = p;
} }
} }
else else
{ {
if (is_on_curve) if (is_on_curve)
draw_session->line_to (font->em_fscalef_x (p.x), font->em_fscalef_y (p.y)); draw_session->line_to (p.x, p.y);
else else
last_offcurve = p; last_offcurve = p;
} }
@ -95,23 +95,23 @@ struct path_builder_t
if (first_offcurve && last_offcurve) if (first_offcurve && last_offcurve)
{ {
optional_point_t mid = last_offcurve.lerp (first_offcurve, .5f); optional_point_t mid = last_offcurve.lerp (first_offcurve, .5f);
draw_session->quadratic_to (font->em_fscalef_x (last_offcurve.x), font->em_fscalef_y (last_offcurve.y), draw_session->quadratic_to (last_offcurve.x, last_offcurve.y,
font->em_fscalef_x (mid.x), font->em_fscalef_y (mid.y)); mid.x, mid.y);
last_offcurve = optional_point_t (); last_offcurve = optional_point_t ();
/* now check the rest */ /* now check the rest */
} }
if (first_offcurve && first_oncurve) if (first_offcurve && first_oncurve)
draw_session->quadratic_to (font->em_fscalef_x (first_offcurve.x), font->em_fscalef_y (first_offcurve.y), draw_session->quadratic_to (first_offcurve.x, first_offcurve.y,
font->em_fscalef_x (first_oncurve.x), font->em_fscalef_y (first_oncurve.y)); first_oncurve.x, first_oncurve.y);
else if (last_offcurve && first_oncurve) else if (last_offcurve && first_oncurve)
draw_session->quadratic_to (font->em_fscalef_x (last_offcurve.x), font->em_fscalef_y (last_offcurve.y), draw_session->quadratic_to (last_offcurve.x, last_offcurve.y,
font->em_fscalef_x (first_oncurve.x), font->em_fscalef_y (first_oncurve.y)); first_oncurve.x, first_oncurve.y);
else if (first_oncurve) else if (first_oncurve)
draw_session->line_to (font->em_fscalef_x (first_oncurve.x), font->em_fscalef_y (first_oncurve.y)); draw_session->line_to (first_oncurve.x, first_oncurve.y);
else if (first_offcurve) else if (first_offcurve)
{ {
float x = font->em_fscalef_x (first_offcurve.x), y = font->em_fscalef_x (first_offcurve.y); float x = first_offcurve.x, y = first_offcurve.y;
draw_session->move_to (x, y); draw_session->move_to (x, y);
draw_session->quadratic_to (x, y, x, y); draw_session->quadratic_to (x, y, x, y);
} }