RFR: 8284184: Crash in GraphicsContextJava::drawLinesForText on https://us.yahoo.com/

Jay Bhaskar jbhaskar at openjdk.java.net
Sat Apr 2 14:27:47 UTC 2022


On Sat, 2 Apr 2022 08:29:43 GMT, Jay Bhaskar <jbhaskar at openjdk.org> wrote:

> Issue: Floating point overflow , when making end point for line drawing as FloatPoint endPoint = startPoint + FloatPoint(widths.last(), 0);
> Solution: traverse widths to calculate end point and increment start point.

The TextDecorationPainter class is responsible to call GraphicsContextJava::drawLinesForText. Before that GraphicsContextJava::drawLinesForText the TextDecorationPainter class compute the rect based on the text decoration style, text origin.

Before calling     GraphicsContextJava::drawLinesForText, The TextDecorationPainter class creates arrays of intersection points from rect.
       // using DashArray = Vector<DashArrayElement>;
        DashArray boundaries = translateIntersectionPointsToSkipInkBoundaries(intersections, underlineBoundingBox.height(), rect.width());


  m_context.drawLinesForText(rect.location(), rect.height(), boundaries, m_isPrinting, style == TextDecorationStyle::Double, strokeStyle);

So following code as fix

for (const auto& width : widths) {
        FloatPoint endPoint = startPoint + FloatPoint(width, 0);
        drawLine(
            IntPoint(startPoint.x(), startPoint.y()),
            IntPoint(endPoint.x(), endPoint.y()));
        startPoint = endPoint;
    }
avoid arithmetic overflow as in previous fix we were calculating end point FloatPoint endPoint = startPoint + FloatPoint(widths.last(), 0);

I have tested all style of line drawing , continuous , dashes , overflow  and underline , it is working well with the recent fix.

-------------

PR: https://git.openjdk.java.net/jfx/pull/765


More information about the openjfx-dev mailing list