Hi,

As an experiment I've now written a SWT-GC implementation using a
BufferedImage & Graphics2D and transfering the pixels over to JavaFX and
the performance is as it is with native SWT.

I always thought Canvas works similar to Image and one only draws pixels
- looks like that is not the case, having a dep in my application
java.awt is not what I'm aiming at but without acceptable performance in
conjunction with clipping it looks like i have to go this route :-(

Tom

On 23.05.14 23:57, Tom Schindl wrote:
> 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
>>>

Reply via email to