Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(788)

Unified Diff: third_party/WebKit/Source/modules/canvas2d/CanvasRenderingContext2D.cpp

Issue 2392033002: Correcting text baseline for tiny fonts (Closed)
Patch Set: Rebaseline. Created 4 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: third_party/WebKit/Source/modules/canvas2d/CanvasRenderingContext2D.cpp
diff --git a/third_party/WebKit/Source/modules/canvas2d/CanvasRenderingContext2D.cpp b/third_party/WebKit/Source/modules/canvas2d/CanvasRenderingContext2D.cpp
index f2fa9f7fa472bea7b7ff7d3d04b4eb6cc8b56776..0a711eced0a571625370ce4fb8287be3535a2be4 100644
--- a/third_party/WebKit/Source/modules/canvas2d/CanvasRenderingContext2D.cpp
+++ b/third_party/WebKit/Source/modules/canvas2d/CanvasRenderingContext2D.cpp
@@ -756,20 +756,22 @@ TextMetrics* CanvasRenderingContext2D::measureText(const String& text) {
true);
// x direction
- metrics->setWidth(font.width(textRun));
- metrics->setActualBoundingBoxLeft(-textBounds.x());
- metrics->setActualBoundingBoxRight(textBounds.maxX());
+ metrics->setWidth(SkScalarRoundToInt(font.width(textRun)));
+ metrics->setActualBoundingBoxLeft(SkScalarRoundToInt(-textBounds.x()));
+ metrics->setActualBoundingBoxRight(SkScalarRoundToInt(textBounds.maxX()));
// y direction
const FontMetrics& fontMetrics = font.getFontMetrics();
- const float ascent = fontMetrics.floatAscent();
- const float descent = fontMetrics.floatDescent();
- const float baselineY = getFontBaseline(fontMetrics);
+ const float ascent = fontMetrics.ascent();
+ const float descent = fontMetrics.descent();
+ const float baselineY = SkScalarRoundToInt(getFontBaseline(fontMetrics));
metrics->setFontBoundingBoxAscent(ascent - baselineY);
metrics->setFontBoundingBoxDescent(descent + baselineY);
- metrics->setActualBoundingBoxAscent(-textBounds.y() - baselineY);
- metrics->setActualBoundingBoxDescent(textBounds.maxY() + baselineY);
+ metrics->setActualBoundingBoxAscent(SkScalarRoundToInt(-textBounds.y()) -
+ baselineY);
+ metrics->setActualBoundingBoxDescent(SkScalarRoundToInt(textBounds.maxY()) +
+ baselineY);
// Note : top/bottom and ascend/descend are currently the same, so there's no
// difference between the EM box's top and bottom and the font's ascend and
@@ -865,6 +867,7 @@ void CanvasRenderingContext2D::drawTextInternal(
FloatRect(location.x() - fontMetrics.height() / 2,
location.y() - fontMetrics.ascent() - fontMetrics.lineGap(),
width + fontMetrics.height(), fontMetrics.lineSpacing());
+
if (paintType == CanvasRenderingContext2DState::StrokePaintType)
inflateStrokeRect(textRunPaintInfo.bounds);
@@ -898,22 +901,22 @@ const Font& CanvasRenderingContext2D::accessFont() {
return state().font();
}
-int CanvasRenderingContext2D::getFontBaseline(
+float CanvasRenderingContext2D::getFontBaseline(
const FontMetrics& fontMetrics) const {
switch (state().getTextBaseline()) {
case TopTextBaseline:
- return fontMetrics.ascent();
+ return fontMetrics.floatAscent();
eae 2016/10/04 20:43:11 In CanvasRenderingContext2D::measureText you chang
zakerinasab1 2016/10/06 20:02:52 Fixed.
case HangingTextBaseline:
// According to
// http://wiki.apache.org/xmlgraphics-fop/LineLayout/AlignmentHandling
// "FOP (Formatting Objects Processor) puts the hanging baseline at 80% of
// the ascender height"
- return (fontMetrics.ascent() * 4) / 5;
+ return (fontMetrics.floatAscent() * 4.0) / 5.0;
case BottomTextBaseline:
case IdeographicTextBaseline:
- return -fontMetrics.descent();
+ return -fontMetrics.floatDescent();
case MiddleTextBaseline:
- return -fontMetrics.descent() + fontMetrics.height() / 2;
+ return -fontMetrics.floatDescent() + fontMetrics.height() / 2.0;
case AlphabeticTextBaseline:
default:
// Do nothing.

Powered by Google App Engine
This is Rietveld 408576698