Are you clipping to an arbitrary path in all cases or just a rectangle? Unfortunately we only offer the arbitrary clip-to-current-path method that isn't optimized for basic rectangular clipping and it implements soft clipping.

There is an outstanding tweak that we added faster clipping support for WebNode and we need to start using it for Node.setClipNode(non-rectangle) and Canvas, but we haven't implemented that yet. (https://javafx-jira.kenai.com/browse/RT-30107) It basically is a direct "render this texture through that other texture as a clip" operation instead of the current code that runs it through some Blend effect filters. It would definitely improve your run times, but I'm not sure how much.

Even more savings could be had for rectangular clips if we provided some way to communicate them to the GC...

                        ...jim

On 5/23/14 11:47 AM, Tom Schindl wrote:
Hi,

Maybe as some of you might know I've been working since sometime on SWT
on JavaFX and to implement direct drawing operations we use JavaFX-Canvas.

I've today tried to run a heavy direct drawing grid implementation and
it performed very bad because it makes heavy use of clipping.

For a grid I've counted ~1500 clipping operations the library works
something like this:

boolean activeClip;
Canvas canvas = new Canvas();

public void setClipping(PathIterator pathIterator) {
   GraphicsContext gc = canvas.getGraphicsContext2D();
   if(activeClip) {
     gc.restore();
     activeClip= false;
   }

   if( pathIterator == null ) {
     return;
   }

   activeClip = true;
   float coords[] = new float[6];
   gc.save();
                gc.beginPath();
                
                float x = 0;
                float y = 0;
                
                
                gc.moveTo(0, 0);
                
                while( ! pathIterator.isDone() ) {
                        switch (pathIterator.currentSegment(coords)) {
                        case PathIterator.SEG_CLOSE:
                                gc.lineTo(x, y);
                                break;
                        case PathIterator.SEG_CUBICTO:
                                gc.bezierCurveTo(coords[0], coords[1], 
coords[2], coords[3],
coords[4], coords[5]);
                                break;
                        case PathIterator.SEG_LINETO:
                                gc.lineTo(coords[0], coords[1]);
                                break;
                        case PathIterator.SEG_MOVETO:
                                gc.moveTo(coords[0], coords[1]);
                                x = coords[0];
                                y = coords[1];
                                break;
                        case PathIterator.SEG_QUADTO:
                                gc.quadraticCurveTo(coords[0], coords[1], 
coords[2], coords[3]);
                                break;
                        default:
                                break;
                        }
                        pathIterator.next();
                }
                
                gc.clip();
                gc.closePath();
}

Am I doing something ultimately wrong, totally wrong? Has anyone an idea
how I would work around the problem?

Tom

Reply via email to