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();