+ const RenderStyle* computedStyle;
+ auto direction = toTextDirection(state().direction, &computedStyle);
+ bool override = computedStyle ? isOverride(computedStyle->unicodeBidi()) : false;
+
+ TextRun textRun(normalizedText, 0, 0, AllowTrailingExpansion, direction, override, true);
+ auto& font = fontProxy();
+ auto& fontMetrics = font.fontMetrics();
+
+ GlyphOverflow glyphOverflow;
+ glyphOverflow.computeBounds = true;
+ float fontWidth = font.width(textRun, &glyphOverflow);
+ metrics->setWidth(fontWidth);
+
+ FloatPoint offset = textOffset(fontWidth, direction);
+
+ metrics->setActualBoundingBoxAscent(glyphOverflow.top - offset.y());
+ metrics->setActualBoundingBoxDescent(glyphOverflow.bottom + offset.y());
+ metrics->setFontBoundingBoxAscent(fontMetrics.ascent() - offset.y());
+ metrics->setFontBoundingBoxDescent(fontMetrics.descent() + offset.y());
+ metrics->setEmHeightAscent(fontMetrics.ascent() - offset.y());
+ metrics->setEmHeightDescent(fontMetrics.descent() + offset.y());
+ metrics->setHangingBaseline(fontMetrics.ascent() - offset.y());
+ metrics->setAlphabeticBaseline(-offset.y());
+ metrics->setIdeographicBaseline(-fontMetrics.descent() - offset.y());
+
+ metrics->setActualBoundingBoxLeft(glyphOverflow.left - offset.x());
+ metrics->setActualBoundingBoxRight(fontWidth + glyphOverflow.right + offset.x());