提交 af1fe60e 编写于 作者: C ceisserer

7105461: Large JTables are not rendered correctly with Xrender pipeline

Reviewed-by: flar, prr
上级 1cfe91bb
...@@ -27,7 +27,6 @@ package sun.java2d.xr; ...@@ -27,7 +27,6 @@ package sun.java2d.xr;
import java.awt.*; import java.awt.*;
import java.awt.geom.*; import java.awt.geom.*;
import sun.awt.SunToolkit; import sun.awt.SunToolkit;
import sun.java2d.SunGraphics2D; import sun.java2d.SunGraphics2D;
import sun.java2d.loops.*; import sun.java2d.loops.*;
...@@ -39,6 +38,9 @@ import sun.java2d.pipe.SpanIterator; ...@@ -39,6 +38,9 @@ import sun.java2d.pipe.SpanIterator;
import sun.java2d.pipe.ShapeSpanIterator; import sun.java2d.pipe.ShapeSpanIterator;
import sun.java2d.pipe.LoopPipe; import sun.java2d.pipe.LoopPipe;
import static sun.java2d.xr.XRUtils.clampToShort;
import static sun.java2d.xr.XRUtils.clampToUShort;
/** /**
* XRender provides only accalerated rectangles. To emulate higher "order" * XRender provides only accalerated rectangles. To emulate higher "order"
* geometry we have to pass everything else to DoPath/FillSpans. * geometry we have to pass everything else to DoPath/FillSpans.
...@@ -70,17 +72,16 @@ public class XRRenderer implements PixelDrawPipe, PixelFillPipe, ShapeDrawPipe { ...@@ -70,17 +72,16 @@ public class XRRenderer implements PixelDrawPipe, PixelFillPipe, ShapeDrawPipe {
public void drawLine(SunGraphics2D sg2d, int x1, int y1, int x2, int y2) { public void drawLine(SunGraphics2D sg2d, int x1, int y1, int x2, int y2) {
Region compClip = sg2d.getCompClip(); Region compClip = sg2d.getCompClip();
int transX1 = x1 + sg2d.transX; int transX1 = Region.clipAdd(x1, sg2d.transX);
int transY1 = y1 + sg2d.transY; int transY1 = Region.clipAdd(y1, sg2d.transY);
int transX2 = x2 + sg2d.transX; int transX2 = Region.clipAdd(x2, sg2d.transX);
int transY2 = y2 + sg2d.transY; int transY2 = Region.clipAdd(y2, sg2d.transY);
// Non clipped fast path // Non clipped fast path
if (compClip.contains(transX1, transY1) if (compClip.contains(transX1, transY1)
&& compClip.contains(transX2, transY2)) { && compClip.contains(transX2, transY2)) {
SunToolkit.awtLock();
try { try {
SunToolkit.awtLock();
validateSurface(sg2d); validateSurface(sg2d);
tileManager.addLine(transX1, transY1, transX2, transY2); tileManager.addLine(transX1, transY1, transX2, transY2);
tileManager.fillMask((XRSurfaceData) sg2d.surfaceData); tileManager.fillMask((XRSurfaceData) sg2d.surfaceData);
...@@ -115,20 +116,40 @@ public class XRRenderer implements PixelDrawPipe, PixelFillPipe, ShapeDrawPipe { ...@@ -115,20 +116,40 @@ public class XRRenderer implements PixelDrawPipe, PixelFillPipe, ShapeDrawPipe {
draw(sg2d, new Polygon(xpoints, ypoints, npoints)); draw(sg2d, new Polygon(xpoints, ypoints, npoints));
} }
public synchronized void fillRect(SunGraphics2D sg2d, public void fillRect(SunGraphics2D sg2d, int x, int y, int width, int height) {
int x, int y, int width, int height) { x = Region.clipAdd(x, sg2d.transX);
SunToolkit.awtLock(); y = Region.clipAdd(y, sg2d.transY);
try {
validateSurface(sg2d);
XRSurfaceData xrsd = (XRSurfaceData) sg2d.surfaceData; /*
* Limit x/y to signed short, width/height to unsigned short,
* to match the X11 coordinate limits for rectangles.
* Correct width/height in case x/y have been modified by clipping.
*/
if (x > Short.MAX_VALUE || y > Short.MAX_VALUE) {
return;
}
x += sg2d.transform.getTranslateX(); int x2 = Region.dimAdd(x, width);
y += sg2d.transform.getTranslateY(); int y2 = Region.dimAdd(y, height);
tileManager.addRect(x, y, width, height); if (x2 < Short.MIN_VALUE || y2 < Short.MIN_VALUE) {
tileManager.fillMask(xrsd); return;
}
x = clampToShort(x);
y = clampToShort(y);
width = clampToUShort(x2 - x);
height = clampToUShort(y2 - y);
if (width == 0 || height == 0) {
return;
}
SunToolkit.awtLock();
try {
validateSurface(sg2d);
tileManager.addRect(x, y, width, height);
tileManager.fillMask((XRSurfaceData) sg2d.surfaceData);
} finally { } finally {
SunToolkit.awtUnlock(); SunToolkit.awtUnlock();
} }
......
...@@ -255,7 +255,7 @@ public class XRUtils { ...@@ -255,7 +255,7 @@ public class XRUtils {
: (x < Short.MIN_VALUE ? Short.MIN_VALUE : x)); : (x < Short.MIN_VALUE ? Short.MIN_VALUE : x));
} }
public static short clampToUShort(int x) { public static int clampToUShort(int x) {
return (short) (x > 65535 ? 65535 : (x < 0) ? 0 : x); return (x > 65535 ? 65535 : (x < 0) ? 0 : x);
} }
} }
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册