--- old/src/macosx/classes/sun/lwawt/LWWindowPeer.java 2013-04-08 16:14:32.783118500 +0400 +++ new/src/macosx/classes/sun/lwawt/LWWindowPeer.java 2013-04-08 16:14:32.604108300 +0400 @@ -580,17 +580,16 @@ setBounds(x, y, w, h, SET_BOUNDS, false, false); // Second, update the graphics config and surface data - checkIfOnNewScreen(); - if (resized) { + final boolean isNewDevice = updateGraphicsDevice(); + if (resized || isNewDevice) { replaceSurfaceData(); - flushOnscreenGraphics(); } // Third, COMPONENT_MOVED/COMPONENT_RESIZED/PAINT events if (moved || invalid) { handleMove(x, y, true); } - if (resized || invalid) { + if (resized || invalid || isNewDevice) { handleResize(w, h, true); repaintPeer(); } @@ -610,7 +609,7 @@ } if (!isTextured()) { if (g instanceof SunGraphics2D) { - SG2DConstraint((SunGraphics2D) g, getRegion()); + ((SunGraphics2D) g).constrain(0, 0, w, h, getRegion()); } g.setColor(getBackground()); g.fillRect(0, 0, w, h); @@ -922,7 +921,7 @@ } // If window's graphics config is changed from the app code, the // config correspond to the same device as before; when the window - // is moved by user, graphicsDevice is updated in checkIfOnNewScreen(). + // is moved by user, graphicsDevice is updated in notifyReshape(). // In either case, there's nothing to do with screenOn here graphicsConfig = gc; } @@ -930,11 +929,14 @@ return true; } - private void checkIfOnNewScreen() { + /** + * Returns true if the GraphicsDevice has been changed, false otherwise. + */ + public boolean updateGraphicsDevice() { GraphicsDevice newGraphicsDevice = platformWindow.getGraphicsDevice(); synchronized (getStateLock()) { if (graphicsDevice == newGraphicsDevice) { - return; + return false; } graphicsDevice = newGraphicsDevice; } @@ -942,13 +944,14 @@ // TODO: DisplayChangedListener stuff final GraphicsConfiguration newGC = newGraphicsDevice.getDefaultConfiguration(); - if (!setGraphicsConfig(newGC)) return; + if (!setGraphicsConfig(newGC)) return false; SunToolkit.executeOnEventHandlerThread(getTarget(), new Runnable() { public void run() { AWTAccessor.getComponentAccessor().setGraphicsConfiguration(getTarget(), newGC); } }); + return true; } /* @@ -983,6 +986,7 @@ oldData.flush(); } } + flushOnscreenGraphics(); } private void blitSurfaceData(final SurfaceData src, final SurfaceData dst) { @@ -990,14 +994,15 @@ if (src != dst && src != null && dst != null && !(dst instanceof NullSurfaceData) && !(src instanceof NullSurfaceData) - && src.getSurfaceType().equals(dst.getSurfaceType())) { - final Rectangle size = getSize(); + && src.getSurfaceType().equals(dst.getSurfaceType()) + && src.getDefaultScale() == dst.getDefaultScale()) { + final Rectangle size = src.getBounds(); final Blit blit = Blit.locate(src.getSurfaceType(), CompositeType.Src, dst.getSurfaceType()); if (blit != null) { - blit.Blit(src, dst, AlphaComposite.Src, - getRegion(), 0, 0, 0, 0, size.width, size.height); + blit.Blit(src, dst, AlphaComposite.Src, null, 0, 0, 0, 0, + size.width, size.height); } } }