RFR: 8280020: Underline and line-through not straight in WebView
Jay Bhaskar
duke at openjdk.java.net
Fri Feb 11 13:23:16 UTC 2022
On Thu, 10 Feb 2022 11:36:38 GMT, Jay Bhaskar <duke at openjdk.java.net> wrote:
> Issue: The end point of line in drawLinesForText , add thickness to the endPoint.y(). In this case origin which is start point and the end point would not be same, and line would be drawn not straight.
> Solution: Do not add thickness to the y position of end point of line.
> Start Point(x,y) ----------End Point(x + width, 0)
void GraphicsContextCG::drawLinesForText(const FloatPoint& point, float thickness, const DashArray& widths, bool printing, bool doubleLines, StrokeStyle strokeStyle)
{
if (!widths.size())
return;
Color localStrokeColor(strokeColor());
FloatRect bounds = computeLineBoundsAndAntialiasingModeForText(FloatRect(point, FloatSize(widths.last(), thickness)), printing, localStrokeColor);
if (bounds.isEmpty())
----------------------------------
computeLineBoundsAndAntialiasingModeForText this will return rect after considering thickness.
The TextDecorationPainter::paintTextDecoration..
FloatRect underlineBoundingBox = m_context.computeUnderlineBoundsForText(rect, m_isPrinting);
DashArray intersections = m_font.dashesForIntersectionsWithRect(textRun, textOrigin, underlineBoundingBox);
DashArray boundaries = translateIntersectionPointsToSkipInkBoundaries(intersections, underlineBoundingBox.height(), rect.width());
ASSERT(!(boundaries.size() % 2));
// We don't use underlineBoundingBox here because drawLinesForText() will run computeUnderlineBoundsForText() internally.
m_context.drawLinesForText(rect.location(), rect.height(), boundaries, m_isPrinting, style == TextDecorationStyle::Double, strokeStyle);
This is already calculating underlineBoundingBox and generates boundaries.
m_context.drawLinesForText(rect.location(), rect.height(), boundaries, m_isPrinting, style == TextDecorationStyle::Double, strokeStyle);
rect.height() is passed as thickness.
So, void GraphicsContextJava::drawLinesForText(const FloatPoint& origin, float thickness, const DashArray& widths, bool, bool, StrokeStyle stroke) {
if (paintingDisabled())
return;
for (const auto& width : widths) {
// This is a workaround for http://bugs.webkit.org/show_bug.cgi?id=15659
StrokeStyle savedStrokeStyle = strokeStyle();
setStrokeStyle(stroke);
// do not add thickness to y position of end point , as line should be straight to the origin
FloatPoint endPoint = origin + FloatPoint(width, 0);
drawLine(
IntPoint(origin.x(), origin.y()),
IntPoint(endPoint.x(), endPoint.y()));
setStrokeStyle(savedStrokeStyle);
}
}
To calculate end point , we should not add thickess to the end point. Let it draw with default thickness.
-------------
PR: https://git.openjdk.java.net/jfx/pull/731
More information about the openjfx-dev
mailing list