JRE-859 TranslucentWindowPainter is not HiDPI-aware
diff --git a/src/windows/classes/sun/awt/windows/TranslucentWindowPainter.java b/src/windows/classes/sun/awt/windows/TranslucentWindowPainter.java
index ff06aa5..2212256 100644
--- a/src/windows/classes/sun/awt/windows/TranslucentWindowPainter.java
+++ b/src/windows/classes/sun/awt/windows/TranslucentWindowPainter.java
@@ -24,20 +24,19 @@
*/
package sun.awt.windows;
-import java.awt.AlphaComposite;
-import java.awt.Color;
-import java.awt.Graphics2D;
-import java.awt.GraphicsConfiguration;
-import java.awt.Image;
-import java.awt.Window;
+import java.awt.*;
+import java.awt.geom.AffineTransform;
import java.awt.image.BufferedImage;
import java.awt.image.DataBufferInt;
+import java.awt.image.Raster;
import java.awt.image.VolatileImage;
import java.security.AccessController;
import sun.awt.image.BufImgSurfaceData;
+import sun.awt.image.SunVolatileImage;
import sun.java2d.DestSurfaceProvider;
import sun.java2d.InvalidPipeException;
import sun.java2d.Surface;
+import sun.java2d.SurfaceData;
import sun.java2d.pipe.RenderQueue;
import sun.java2d.pipe.BufferedContext;
import sun.java2d.pipe.hw.AccelGraphicsConfig;
@@ -122,6 +121,13 @@
*/
public abstract void flush();
+ protected boolean checkScaleValid(Image image) {
+ if (!(image instanceof SunVolatileImage)) return true;
+ SurfaceData sd = (SurfaceData)((SunVolatileImage)image).getDestSurface();
+ AffineTransform tx = window.getGraphicsConfiguration().getDefaultTransform();
+ return tx.getScaleX() == sd.getDefaultScaleX() && tx.getScaleY() == sd.getDefaultScaleY();
+ }
+
/**
* Updates the window associated with the painter.
*
@@ -170,7 +176,7 @@
* method (VI, BI, regular Images).
*/
private static class BIWindowPainter extends TranslucentWindowPainter {
- private BufferedImage backBuffer;
+ private Image backBuffer;
protected BIWindowPainter(WWindowPeer peer) {
super(peer);
@@ -181,13 +187,21 @@
int w = window.getWidth();
int h = window.getHeight();
if (backBuffer == null ||
- backBuffer.getWidth() != w ||
- backBuffer.getHeight() != h)
+ backBuffer.getWidth(null) != w ||
+ backBuffer.getHeight(null) != h ||
+ !checkScaleValid(backBuffer))
{
flush();
- backBuffer = new BufferedImage(w, h, BufferedImage.TYPE_INT_ARGB_PRE);
+ // [tav] BufferedImage is not hidpi-aware, create a VolatileImage backed by a hidpi-aware BufImgSurfaceData
+// backBuffer = new BufferedImage(w, h, BufferedImage.TYPE_INT_ARGB_PRE);
+ GraphicsConfiguration gc = peer.getGraphicsConfiguration();
+ try {
+ backBuffer = gc.createCompatibleVolatileImage(w, h, new ImageCapabilities(false), TRANSLUCENT);
+ } catch (AWTException e) {
+ e.printStackTrace();
+ }
}
- return clear ? (BufferedImage)clearImage(backBuffer) : backBuffer;
+ return clear ? clearImage(backBuffer) : backBuffer;
}
@Override
@@ -208,12 +222,10 @@
// the image is probably lost, upload the data from the
// backup surface to avoid creating another heap-based
// image (the parent's buffer)
- int w = viBB.getWidth();
- int h = viBB.getHeight();
BufImgSurfaceData bisd = (BufImgSurfaceData)s;
- int data[] = ((DataBufferInt)bisd.getRaster(0,0,w,h).
- getDataBuffer()).getData();
- peer.updateWindowImpl(data, w, h);
+ Raster raster = bisd.getRaster(0,0, 0, 0);
+ int data[] = ((DataBufferInt)raster.getDataBuffer()).getData();
+ peer.updateWindowImpl(data, raster.getWidth(), raster.getHeight());
return true;
}
}
@@ -257,7 +269,8 @@
GraphicsConfiguration gc = peer.getGraphicsConfiguration();
if (viBB == null || viBB.getWidth() != w || viBB.getHeight() != h ||
- viBB.validate(gc) == IMAGE_INCOMPATIBLE)
+ viBB.validate(gc) == IMAGE_INCOMPATIBLE ||
+ !checkScaleValid(viBB))
{
flush();
@@ -303,8 +316,9 @@
if (bb instanceof DestSurfaceProvider) {
Surface s = ((DestSurfaceProvider)bb).getDestSurface();
if (s instanceof AccelSurface) {
- final int w = bb.getWidth(null);
- final int h = bb.getHeight(null);
+ Rectangle bounds = ((SurfaceData)s).getBounds();
+ final int w = bounds.width;
+ final int h = bounds.height;
final boolean arr[] = { false };
final AccelSurface as = (AccelSurface)s;
RenderQueue rq = as.getContext().getRenderQueue();