On Wed, 7 Jun 2023 17:15:50 GMT, Jeremy <[email protected]> wrote:

> # Problem Summary
> 
> For non-opaque windows, Window#paint calls `gg.fillRect(0, 0, getWidth(), 
> getHeight())` before `super.paint(g)`.
> 
> This can cause flickering on Mac, and the flickering seems to have gotten 
> much worse in recent JVMs. (See movie attachments to original ticket.)
> 
> # Discussion
> 
> This is my 2nd PR for this ticket. The original is 
> [here](https://github.com/openjdk/jdk/pull/12993); that proposed change was 
> IMO more invasive/scarier. It was auto-closed after 8 weeks of inactivity, 
> and I'd rather offer this PR instead.
> 
> In that previous discussion Alan Snyder framed the core problem as a "lack of 
> synchronization" (see [comment 
> here](https://github.com/openjdk/jdk/pull/12993#issuecomment-1467528061)). If 
> the monitor refreshes/flushes after we've called `fillRect` *but before we 
> finish `super.paint`*: it makes sense that we'd see a flicker.
> 
> I agree with Alan, but I think the problem can also be framed as a 
> mixing-Swing-with-AWT issue. (Which IMO will involve an easier fix.)
> 
> This PR is a low-risk change (relative to the previous PR) that intercepts 
> calls to repaint a Window that is also RootPaneContainer. Now we'll redirect 
> those calls to paint the JRootPane instead. This means we'll exclusively 
> paint within Swing's/RepaintManager's double-buffered architecture, so we 
> bypass the risky call to `fillRect` on the screen's Graphics2D. (And this 
> change occurs within RepaintManager, so we're clearly already in Swing's 
> architecture.)
> 
> So with this change: we paint everything to the double-buffer, and the *only 
> time* we paint to the Window's Graphics2D is when have set up a 
> AlphaComposite.Src and replace its contents with our buffer's contents.
> 
> # Tests
> 
> This PR includes a new test for 8303950 itself. This is pretty 
> self-explanatory: we repaint a trivial animation for a few seconds and use 
> the Robot to see if a pixel is the expected color.
> 
> This PR also includes a test called `bug8303950_legacyWindowPaintBehavior` 
> that creates a grid of 4 windows with varying opacity/backgrounds:
> 
> <img width="805" alt="image" 
> src="https://github.com/openjdk/jdk/assets/7669569/497c21a0-ed18-413f-a5c7-3ea146644fd6";>
> 
> I was surprised by how these windows rendered, but I don't think that's worth 
> debating here. This test simply makes sure that we preserve this preexisting 
> behavior. The broad "rules" appear to be:
> 1. If a JComponent identifies as opaque (see `JComponent.isOpaque`) then the 
> JComponent's background is used. (In this case: that's the opaque green top 
> two windows.) T...

This pull request has been closed without being integrated.

-------------

PR: https://git.openjdk.org/jdk/pull/14363

Reply via email to