diff --git a/CHANGELOG.md b/CHANGELOG.md index 73ad0b00b..e1620230d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -10,6 +10,7 @@ project adheres to [Semantic Versioning](http://semver.org/). ### Changed ### Added ### Fixed +* TextBaseline `top`, `middle` and `hanging` did not align with javascript canvas api 3.0.0 ================== diff --git a/src/CanvasRenderingContext2d.cc b/src/CanvasRenderingContext2d.cc index 56e68d899..d33282beb 100644 --- a/src/CanvasRenderingContext2d.cc +++ b/src/CanvasRenderingContext2d.cc @@ -2479,20 +2479,34 @@ inline double getBaselineAdjustment(PangoLayout* layout, short baseline) { PangoRectangle logical_rect; pango_layout_line_get_extents(pango_layout_get_line(layout, 0), NULL, &logical_rect); - double scale = 1.0 / PANGO_SCALE; - double ascent = scale * pango_layout_get_baseline(layout); - double descent = scale * logical_rect.height - ascent; + double ascent = pango_layout_get_baseline(layout); + double descent = logical_rect.height - ascent; + + double adjustment; switch (baseline) { case TEXT_BASELINE_ALPHABETIC: - return ascent; + adjustment = ascent; + break; case TEXT_BASELINE_MIDDLE: - return (ascent + descent) / 2.0; + adjustment = logical_rect.height / 2.0 + (logical_rect.height - ascent) / 2.0; + break; case TEXT_BASELINE_BOTTOM: - return ascent + descent; + adjustment = ascent + descent; + break; + case TEXT_BASELINE_TOP: + adjustment = descent; + break; + case TEXT_BASELINE_HANGING: + adjustment = 1.5 * descent; + break; + case TEXT_BASELINE_IDEOGRAPHIC: + adjustment = (ascent + logical_rect.height) / 2.0; + break; default: return 0; } + return 1.0 / PANGO_SCALE * adjustment; } /*