[OpenJDK 2D-Dev] Review Reqeust for Bug 100068 - SunGraphics2D exposes a reference to itself while non fully initialised

Jim Graham Jim.A.Graham at Sun.COM
Thu Jul 9 20:23:22 UTC 2009


Hi Mario,

Mario Torre wrote:
> So here is the deal. I'm going back to the original plan to fix the 
> issue, this time without accessors. I'll just invalidate the loops and 
> revalidate them elsewhere. The question that still remains is when to 
> re-validate the loops? My idea is to make the pipes that use the loops 
> to tell this themselves, so we cover future problems if we're going to 
> refactor this stuff more. I'm going to work on this a bit this week, of 
> course, if you already planned some direction, just tell me (maybe I 
> wait your reply this time :)

And I'll try to give it in a timely fashion.  ;-)

I think it would be nice to have the pipes manage the need for the 
loops, but it could be touchy to try to work this into the logic in some 
of the spaghetti validate methods.  (I'm not recommending against it, 
just warning you to keep an eye out for if you start rat-holing trying 
to get that to work.)

A couple of ways I can see this working (in order of my estimation of 
performance impact, low to high):

- pipe interfaces implement a new interface "LoopBasedPipes" which has 
no methods, it is just a "marker" interface.  The test in validate() 
just uses instanceof in this case which might be faster than an 
interface method dispatch (actually, it almost certainly would be).

- pipe interfaces add "public boolean needsLoops()" which requires an 
interface method call per pipe.

- pipe interfaces add "public void setup(SG2D)" and they add the loops 
if they are null (loops are set to null on invalidate), but this would 
require lots of "if null" checks and the implementation would be pretty 
much the same everywhere.  Validate would have to call the setup on 
every pipe before it returns.

To test if you've impacted performance I don't think we have any test 
cases that measure this particular code path.  I would use a test case 
that does something cheap to induce a revalidate, like:

      setRH(AA_ON)
      // No need to render, just use it to invalidate
      setRH(AA_OFF)
      // Now that the AA is set back to the fast mode,
      // render something tiny
      fillRect(1x1)

in a tight loop.  If there is a cheaper attribute to tweak to cause 
invalidations that would be better - I think the AA hint is trapped and 
just sets a field internally, but maybe setting a Composite rule back 
and forth might be even cheaper.  Simply changing the color would not 
tend to cause an invalidate (though changing it from solid to 
translucent might, but the pixel value would have to be revalidated as 
well).

			...jim



More information about the 2d-dev mailing list