8147542: ClassCastException when repainting after display resolution change
Reviewed-by: prr, flar
Contributed-by: alexey.ushakov@jetbrains.com
--- a/jdk/src/java.desktop/unix/classes/sun/java2d/xr/XRPMBlitLoops.java Mon Jul 25 15:29:24 2016 +0530
+++ b/jdk/src/java.desktop/unix/classes/sun/java2d/xr/XRPMBlitLoops.java Mon Jul 25 10:36:12 2016 -0700
@@ -127,7 +127,11 @@
vImgSurfaceType = SurfaceType.IntArgbPre;
}
- if (vImg == null || vImg.getWidth() < w || vImg.getHeight() < h) {
+ if (vImg == null || vImg.getWidth() < w || vImg.getHeight() < h ||
+ // Sometimes we get volatile image of wrong dest surface type,
+ // so recreating it
+ !(vImg.getDestSurface() instanceof XRSurfaceData))
+ {
if (vImg != null) {
vImg.flush();
}
@@ -142,6 +146,11 @@
}
Blit swToSurfaceBlit = Blit.getFromCache(src.getSurfaceType(), CompositeType.SrcNoEa, vImgSurfaceType);
+
+ if (!(vImg.getDestSurface() instanceof XRSurfaceData)) {
+ throw new InvalidPipeException("wrong surface data type: " + vImg.getDestSurface());
+ }
+
XRSurfaceData vImgSurface = (XRSurfaceData) vImg.getDestSurface();
swToSurfaceBlit.Blit(src, vImgSurface, AlphaComposite.Src, null,
sx, sy, 0, 0, w, h);