RFR: 7001973: java/awt/Graphics2D/CopyAreaOOB.java fails
Masanori Yano
myano at openjdk.java.net
Thu Sep 30 08:43:30 UTC 2021
On Wed, 29 Sep 2021 00:42:01 GMT, Sergey Bylokhov <serb at openjdk.org> wrote:
> Do you know why we post it twice? It does not seem right, since we repaint all content in the apps like Netbeans/Idea and it is quite a heavyweight operation.
Because SurfaceData is judged to be lost when 1st getGraphics() is called on 1st PaintEvent processing.
https://github.com/openjdk/jdk/blob/master/src/java.desktop/windows/classes/sun/java2d/d3d/D3DScreenUpdateManager.java#L478
I traced PaintEvent, then I got following stacktrace.
breakpoint hit: "Thread=AWT-EventQueue-0", java.awt.event.PaintEvent.<init>()、line=106 bci=0
[1] java.awt.event.PaintEvent.<init> (PaintEvent.java:106)
[2] sun.awt.PaintEventDispatcher.createPaintEvent (PaintEventDispatcher.java:80)
[3] sun.awt.windows.WComponentPeer.postPaintIfNecessary (WComponentPeer.java:892)
[4] sun.awt.windows.WComponentPeer.handlePaint (WComponentPeer.java:886)
[5] sun.java2d.d3d.D3DScreenUpdateManager.repaintPeerTarget (D3DScreenUpdateManager.java:283)
[6] sun.java2d.d3d.D3DScreenUpdateManager.validate (D3DScreenUpdateManager.java:492)
[7] sun.java2d.d3d.D3DScreenUpdateManager.createGraphics (D3DScreenUpdateManager.java:260)
[8] sun.awt.windows.WComponentPeer.getGraphics (WComponentPeer.java:646)
[9] java.awt.Component.getGraphics (Component.java:3,128)
[10] sun.awt.RepaintArea.paint (RepaintArea.java:227)
[11] sun.awt.windows.WComponentPeer.handleEvent (WComponentPeer.java:371)
[12] java.awt.Component.dispatchEventImpl (Component.java:5,056)
[13] java.awt.Container.dispatchEventImpl (Container.java:2,325)
[14] java.awt.Window.dispatchEventImpl (Window.java:2,775)
[15] java.awt.Component.dispatchEvent (Component.java:4,827)
[16] java.awt.EventQueue.dispatchEventImpl (EventQueue.java:772)
[17] java.awt.EventQueue$4.run (EventQueue.java:721)
[18] java.awt.EventQueue$4.run (EventQueue.java:715)
[19] java.security.AccessController.executePrivileged (AccessController.java:753)
[20] java.security.AccessController.doPrivileged (AccessController.java:391)
[21] java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege (ProtectionDomain.java:85)
[22] java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege (ProtectionDomain.java:95)
[23] java.awt.EventQueue$5.run (EventQueue.java:745)
[24] java.awt.EventQueue$5.run (EventQueue.java:743)
[25] java.security.AccessController.executePrivileged (AccessController.java:753)
[26] java.security.AccessController.doPrivileged (AccessController.java:391)
[27] java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege (ProtectionDomain.java:85)
[28] java.awt.EventQueue.dispatchEvent (EventQueue.java:742)
[29] java.awt.EventDispatchThread.pumpOneEventForFilters (EventDispatchThread.java:203)
[30] java.awt.EventDispatchThread.pumpEventsForFilter (EventDispatchThread.java:124)
[31] java.awt.EventDispatchThread.pumpEventsForHierarchy (EventDispatchThread.java:113)
[32] java.awt.EventDispatchThread.pumpEvents (EventDispatchThread.java:109)
[33] java.awt.EventDispatchThread.pumpEvents (EventDispatchThread.java:101)
[34] java.awt.EventDispatchThread.run (EventDispatchThread.java:90)
AWT-EventQueue-0[1] > >
At 1st PaintEvent is processing, RepaintArea calls getGraphics(), then D3DScreenUpdateManager finally calls new PaintEvent().
So, 2nd PaintEvent is posted and invoked later on EDT.
-------------
PR: https://git.openjdk.java.net/jdk/pull/5491
More information about the client-libs-dev
mailing list