In the current usecase it is a rect all time but that's just in this special use case.
I guess that rect clipping is the most common one so having an optimization for rects and a slow path for none rects might help. Tom Von meinem iPhone gesendet > Am 23.05.2014 um 23:35 schrieb Jim Graham <james.gra...@oracle.com>: > > 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 >>