Fwd: Re: Marlin-Renderer and JavaFX

Kevin Rushforth kevin.rushforth at oracle.com
Fri Nov 4 15:21:02 UTC 2016

Hi Jim,

Thanks for the summary. We should proceed as you outlined. Can you file 
a new RFE (Enhancement) to integrate Marlin into JavaFX as an optional 
rasterizer (disabled by default) so we have a clean JBS issue to use for 
the JDK 9 feature extension request, rather than using JDK-8092373? You 
can assign the RFE to Laurent. It can be linked to the Java2D/Marlin JEP 
and to JDK-8092373.

Laurent: Since there are multiple reasons for submitting the Path2D fix 
as a separate bug fix, please file a new bug for this, linking it to the 
equivalent Java2D bug and also to the new RFE that Jim will file.


-- Kevin

Jim Graham wrote:
> There are basically 2 isolated changes to the existing code base and 
> then a set of added source files.
> The first change is to use Marlin if the appropriate property is 
> specified, and those changes are very localized and easy to verify 
> that they won't hurt anything.
> The second change is to modify the growth pattern of Path2D.  While 
> these changes are live in AWT already and have already been code 
> reviewed, it would probably be better to submit them as a separate FX 
> fix if they are only performance oriented and not strictly required 
> for Marlin to function.  That way we compartmentalize anything that 
> could possibly result in a regression into a separate bugid so we 
> don't have to pull everything if someone complains that the new growth 
> pattern is having negative consequences for their app.  I doubt that 
> will happen, but it is simple enough to break them into 2 separate 
> fixes so it couldn't hurt to do that.
> After that, this just boils down to adding a bunch of code that has 
> already been vetted elsewhere and a small and simple change to use it 
> only optionally and conditionally, which is a very low risk fix.
> That would take this change from "no obvious drawbacks" to "obviously 
> no drawbacks" (or, more precisely, one "obviously no drawbacks" fix 
> and one related "no obvious drawbacks" fix)...
>             ...jim
> On 11/2/2016 2:54 PM, Laurent Bourgès wrote:
>> Jim,
>> Here is an updated patch for MarlinFX:
>> http://cr.openjdk.java.net/~lbourges/marlinFX/marlinFX-s02-ofx9/
>> I made big improvements: MarlinFX is now "feature-complete":
>> - Added MarlinAlphaConsumer & MarlinRenderer interfaces to define new
>> methods on AlphaConsumer and common methods between AA & noAA renderers
>> - Renderer: fixed cubic dec/inc lengths (like openpisces) + use 
>> optimized
>> copyAlphas from MarlinAlphaConsumer (with block flag optimization 
>> derived
>> from former MarlinCache)
>> - RendererNoAA: optimized Renderer for non-antialiasing (tested OK)
>> - Dasher & Stroker: backported changes from openpisces (small dash 
>> phase &
>> refined cubic / quad mitters)
>> - Added MarlinPrismUtils & MarlinRasterizer classes to wrap the Marlin
>> renderer as a JavaFX ShapeRasterizer and implement the 
>> MarlinAlphaConsumer
>> efficiently (mimics former MarlinCache ie support the block flag
>> optimization); MarlinPrismUtils performs properly NaN / Infinity
>> coordinates filtering and use the same pipeline stages (delta / invDelta
>> transformers for Dasher/Stroker) like in the MarlinRenderingEngine
>> - Thread safety: MarlinRasterizer completely thread-safe (for future
>> multi-threaded rendering) using ReentrantContext...
>> - Modified (OpenJFX) ShapeUtil to use the MarlinRasterizer instead of 
>> the
>> OpenPiscesRasterizer class (use -Dsun.javafx.marlin=true to enable
>> Marlin-FX)
>> - Fixed Path2D growing algorithm (like java2d)
>> So MarlinFX is 13K LOC (few unused classes could be removed soon) and 
>> only
>> few lines are added in ShapeUtil to switch MarlinFX ON:
>>         if (PrismSettings.doNativePisces) {
>>             shapeRasterizer = new NativePiscesRasterizer();
>>         } else {
>> *            // TODO: move that new setting into PrismSettings:
>> // Enable Marlin-FX by setting -Dsun.javafx.marlin=true            if
>> (MarlinProperties.isMarlinEnabled()) {
>> System.out.println("Marlin-FX[" + Version.getVersion() + "]
>> enabled.");                shapeRasterizer = new
>> MarlinRasterizer();            } else {*                
>> shapeRasterizer =
>> new OpenPiscesRasterizer();
>> *            }*        }
>> So the OpenPisces classes are totally left unchanged and MarlinFX is 
>> just
>> added as another rasterizer and is enabled with the following settings:
>> -Dsun.javafx.marlin=true and -Dprism.nativepisces=false
>> Of course, we could adapt these few lines to satisfy your requirements
>> (system properties ...); please tell me what you prefer.
>> I tested this new release with DemoFX, Guimark HTML5, Ensemble8 and
>> everything is working fine.
>> Does it look acceptable as a low risk RFE ?
>> Finally what do you prefer for OpenJDK9 integration ?
>> - as a new javafx rasterizer (like the provided marlinFX patch)
>> - or as a javafx wrapper using OpenJDK9's marlin renderer (java2d) ?
>> I wonder if it would be better to create another JavaFX ShapeRasterizer
>> that wraps OpenJDK9 Marlin (java2d) to minimize the code duplication 
>> but it
>> will add some complexity in the marlin renderer (itself) to introduce 
>> the
>> AlphaConsumer interface...
>> I can make separate patches for all these changes concerning jfx 
>> Path2D or
>> Marlin changes for OpenJDK9 first, then MarlinFX.
>> PS: MarlinFX is based on my (internal) Marlin-renderer 0.7.5 (a bit
>> different than OpenJDK9's Marlin as it is compatible with jdk 1.8) so I
>> will synchronize both branches to provide soon MarlinFX9 patches 
>> closer to
>> OpenJDK9's Marlin renderer if we are going to work on its integration.
>> PS2: I will also work on another MarlinFX variant not using Unsafe 
>> but only
>> plain arrays to evaluate the performance loss (small) that could 
>> simplify
>> the integration with Jigsaw ...
>> So I made a big step forward, and I am looking forward your feedback,
>> Cheers,
>> Laurent

More information about the openjfx-dev mailing list