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