Hi Laurent,

Almost all of this is code comments with only 1 minor functional issue (Renderer.java, line 461).

NormalizingIterator.NearestPixel should probably be renamed NearestPixelQuarter to reflect its functionality (and RenderCtx.nPQPathIterator).

getNormalizing() - why not just return src for mode OFF? That way you don't even have to test in the calling function, though it does add an extra method call in the non-normalizing case, it simplifies the code - and hopefully the method is simple enough to be inlined.

Renderer.java, line 45: fractToInt() is never used.

Renderer.java, line 203: typo in comment -> 96K?

Renderer.java, line 379: Instead, mention that y values are already shifted by -0.5 in tosubpixy()? (The "note" comment makes it appear that that is work that is left to be done, but it is already done)

Renderer.java, line 461: What happens if x1_cor was already at VPC? The error should be 0, but you end up setting it to ERR_STEP_MAX.

Renderer.java, line 792: Do you need to copy ERR_STEP_MAX into a local? It is a statically initialized final int - that should already be a constant that gets copied into the code.

Renderer.java, line 1350-ish: mention in here somewhere that edgeMinMaxY values have already been adjusted by -0.5 in tosubpixy(), but edgeMinMaxX values have not yet been adjusted? (It took me a moment to realize that.)

CeilAndFloorTests - whoa, hex floating point literals? That's a new one for me... ;)

I'm guessing that p22 has 1 bit of fractional mantissa and p23 has no fractional mantissa digits?

                        ...jim

On 7/24/15 6:55 AM, Laurent Bourgès wrote:
Jim,
Did you have time to have a look to my last webrev ?

I made some improvements since on the cubic / quad breaking into lines
to use a proper norm instead of abs (ddx) or abs (ddy).
I tried the taxicab norm and now I use square = ddx * ddx + ddy * ddy.

Note: the test for quads was flawed:
Max (ddx, ddy) fails for negative values !

PS: I am now adjusting (lowering) the threshold to achieve better
quality without having too much performance loss.

I will be on vacation next week, but I may read emails but less often.

Cheers,
Laurent

Le 21 juil. 2015 23:33, "Laurent Bourgès" <[email protected]
<mailto:[email protected]>> a écrit :

    Jim,

    Here is the first webrev including the new rounding approach:
    http://cr.openjdk.java.net/~lbourges/marlin/marlin-s3.2/

    1. It is based on your fixed-point approach and use FloatMath
    ceil_int / floor_int for perfomance.
    I shift the subpixel y coordinates by - 0.5 in tosubpixy() as mentioned.

    2. I tested many variants (Unsafe / Safe) with many subtle changes
    and I am now satisfied by the code and its performance (only 1%
    slower than previous) but the quality is a lot better and very close
    to ductus.

    If you are interested by the Safe variant (int[] arrays) I can
    provide another webrev (2-3% slower) as I now use offsets as long
    variables.

    3. I finally understood the curve and quad AFD approach (reading the
    reference paper) and I reduced the initial step to lg=2 (instead or
    3 and 4).
    It is of course faster without any quality loss:
    - cubic step is adaptive (based on dx/dy ie pixel distance between
    points): in my tests, it was mainly doubling to reach to count=2 !
    - quad step can only be divided so I selected an higher step to let
    the algo reduce it if needed: in my tests, the initial step (lg=4)
    was very too precise generating lots of small segments ! It improved
    a lot the performance of the first 2 maps (see below)

    To conclude, the curve / quad decimation is not optimal as the step
    criteria is only constrained by |dx/dy| so it is appropriate to draw
    pixels (depending on the previous one) and maybe not to estimate the
    error between the segment and the real curve.

    That's why it is generating more or less segments independently to
    the distance error:
    I propose to study *later* other algorithms present in Pisces
    Flattener or AGG (adaptive subdivision) that can provide a good
    estimation of the min/max (error):

    
https://code.google.com/p/pisces-graphics/source/browse/trunk/src/pisces/d/Flattener.java?spec=svn24&r=24
    http://antigrain.com/research/adaptive_bezier/

    "DrawingParametric CurvesUsing ChebyshevPolynomials ":
    http://graphicsinterface.org/wp-content/uploads/gi1991-3.pdf

    Maybe you have some ideas on Renderer's curve subdivision
    implementation and how to tune it better ... or propose another
    algorithms ...

        >>>> - do you know if the breakCurveAndAddLines (quad or cubic) really 
takes
        >>>> into account the supersampling scale to generate only segments 
needed
        >>>> and no more ?
        >>>
        >>>
        >>> I don't remember.  I'd have to read the code and figure it out.
        >>
        >>
        >> Thanks, it seems there are some thresholds BND... but I am unable to
        >> find out what it is related to ?
        >
        >
        > I'd have to research that as well.  I briefly understood them when I reviewed 
the code and I was able to fine-tune them once when we had failures in the FX version, but 
they are essentially a variant of "epsilon" but related to the adaptive 
subdivision algorithm so I mostly just treated them as tuning parameters - an accuracy vs. 
time tradeoff.

        It seems these values are 32 (quad) and 8 (curve) so it seems
        related to the scaling factor = 8. It would be great to express
        this dependency in the constants.


    Cheers,
    Laurent

    PS: Benchmark results with OpenJDK9 (after/before):


    New OpenJDK9 tests:
    mardi 21 juillet 2015, 22:53:05 (UTC+0200)

    TEST results:
    Test                                             Threads    Ops
    Med    Pct95    Avg    StdDev    Min    Max    TotalOps    [ms/op]
    dc_boulder_2013-13-30-06-13-17.ser               1    105
    99.323    99.710    99.372    0.181    99.148    100.230    105
    dc_boulder_2013-13-30-06-13-17.ser               2    210
    100.390    100.669    100.407    0.135    100.151    101.080    210
    dc_boulder_2013-13-30-06-13-17.ser               4    420
    101.404    101.903    101.471    1.100    100.530    121.952    420
    dc_boulder_2013-13-30-06-13-20.ser               1    204
    50.945    51.125    50.905    0.183    50.400    51.403    204
    dc_boulder_2013-13-30-06-13-20.ser               2    408
    52.005    52.207    52.005    0.125    51.538    52.419    408
    dc_boulder_2013-13-30-06-13-20.ser               4    816
    52.615    52.979    52.658    0.766    51.925    72.766    816
    dc_shp_alllayers_2013-00-30-07-00-43.ser         1    254
    41.029    41.408    41.023    0.240    40.628    41.717    254
    dc_shp_alllayers_2013-00-30-07-00-43.ser         2    508
    41.609    42.037    41.619    0.243    41.153    42.360    508
    dc_shp_alllayers_2013-00-30-07-00-43.ser         4    1016
    42.371    42.701    42.418    0.680    41.722    63.057    1016
    dc_shp_alllayers_2013-00-30-07-00-47.ser         1    25
    784.913    786.240    784.909    0.821    783.040    786.625    25
    dc_shp_alllayers_2013-00-30-07-00-47.ser         2    50
    787.773    789.291    787.699    1.208    785.225    789.820    50
    dc_shp_alllayers_2013-00-30-07-00-47.ser         4    100
    787.382    790.768    787.992    3.168    783.223    805.677    100
    dc_spearfish_2013-11-30-06-11-15.ser             1    808
    13.012    13.247    13.051    0.098    12.992    13.545    808
    dc_spearfish_2013-11-30-06-11-15.ser             2    1616
    13.046    13.168    13.065    0.079    13.003    13.568    1616
    dc_spearfish_2013-11-30-06-11-15.ser             4    3232
    13.047    13.244    13.081    0.302    13.002    29.082    3232
    dc_spearfish_2013-11-30-06-11-19.ser             1    1585
    6.632    6.733    6.648    0.053    6.619    6.979    1585
    dc_spearfish_2013-11-30-06-11-19.ser             2    3170
    6.644    6.744    6.658    0.053    6.621    6.996    3170
    dc_spearfish_2013-11-30-06-11-19.ser             4    6340
    6.641    6.754    6.663    0.234    6.619    22.091    6340
    dc_topp:states_2013-11-30-06-11-06.ser           1    841
    12.556    12.668    12.572    0.060    12.458    12.759    841
    dc_topp:states_2013-11-30-06-11-06.ser           2    1682
    12.505    12.614    12.523    0.059    12.395    12.749    1682
    dc_topp:states_2013-11-30-06-11-06.ser           4    3364
    12.528    12.643    12.575    0.821    12.411    45.321    3364
    dc_topp:states_2013-11-30-06-11-07.ser           1    1355
    7.721    7.781    7.705    0.058    7.568    7.950    1355
    dc_topp:states_2013-11-30-06-11-07.ser           2    2710
    7.720    7.764    7.701    0.056    7.561    7.876    2710
    dc_topp:states_2013-11-30-06-11-07.ser           4    5420
    7.729    7.799    7.721    0.237    7.565    24.055    5420
    test_z_625k.ser                                  1    63
    165.148    165.499    165.208    0.200    164.967    166.228    63
    test_z_625k.ser                                  2    126
    166.309    166.458    166.319    0.075    166.169    166.604    126
    test_z_625k.ser                                  4    252
    167.391    168.287    167.599    1.352    166.501    188.421    252

    Scores:
    Tests    27    9    9    9
    Threads    4    1    2    4
    Pct95    132.313    131.601    132.328    133.009


    B/ Previous OpenJDK9 tests:
    vendredi 19 juin 2015, 23:37:44 (UTC+0200)

    TEST results:
    Test                                             Threads    Ops
    Med    Pct95    Avg    StdDev    Min    Max    TotalOps    [ms/op]
    dc_boulder_2013-13-30-06-13-17.ser               1    94
    111.198    111.351    111.199    0.101    110.993    111.483    94
    dc_boulder_2013-13-30-06-13-17.ser               2    188
    112.305    112.532    112.324    0.120    112.086    112.883    188
    dc_boulder_2013-13-30-06-13-17.ser               4    376
    113.469    113.640    113.439    0.200    112.499    115.244    376
    dc_boulder_2013-13-30-06-13-20.ser               1    187
    55.177    55.432    55.191    0.143    54.960    55.902    187
    dc_boulder_2013-13-30-06-13-20.ser               2    374
    56.192    56.443    56.194    0.146    55.860    56.709    374
    dc_boulder_2013-13-30-06-13-20.ser               4    748
    57.034    57.259    57.046    0.127    56.669    58.219    748
    dc_shp_alllayers_2013-00-30-07-00-43.ser         1    244
    42.747    43.124    42.780    0.151    42.549    43.374    244
    dc_shp_alllayers_2013-00-30-07-00-43.ser         2    488
    43.256    43.520    43.278    0.134    42.992    43.929    488
    dc_shp_alllayers_2013-00-30-07-00-43.ser         4    976
    44.137    44.581    44.228    1.927    42.911    89.464    976
    dc_shp_alllayers_2013-00-30-07-00-47.ser         1    25
    765.628    766.016    765.629    0.195    765.233    766.170    25
    dc_shp_alllayers_2013-00-30-07-00-47.ser         2    50
    772.097    772.824    771.872    0.797    769.439    773.263    50
    dc_shp_alllayers_2013-00-30-07-00-47.ser         4    100
    769.742    770.547    770.285    2.738    768.929    784.274    100
    dc_spearfish_2013-11-30-06-11-15.ser             1    822
    12.675    12.748    12.685    0.039    12.648    13.445    822
    dc_spearfish_2013-11-30-06-11-15.ser             2    1644
    12.686    12.746    12.692    0.035    12.651    13.474    1644
    dc_spearfish_2013-11-30-06-11-15.ser             4    3288
    12.702    12.768    12.710    0.051    12.659    15.153    3288
    dc_spearfish_2013-11-30-06-11-19.ser             1    1604
    6.545    6.611    6.554    0.027    6.523    6.810    1604
    dc_spearfish_2013-11-30-06-11-19.ser             2    3208
    6.550    6.613    6.557    0.026    6.527    6.816    3208
    dc_spearfish_2013-11-30-06-11-19.ser             4    6416
    6.556    6.627    6.564    0.028    6.531    6.967    6416
    dc_topp:states_2013-11-30-06-11-06.ser           1    876
    12.004    12.083    11.995    0.064    11.861    12.583    876
    dc_topp:states_2013-11-30-06-11-06.ser           2    1752
    12.005    12.082    11.995    0.061    11.837    12.173    1752
    dc_topp:states_2013-11-30-06-11-06.ser           4    3504
    11.992    12.085    11.997    0.078    11.852    13.553    3504
    dc_topp:states_2013-11-30-06-11-07.ser           1    1446
    7.266    7.343    7.252    0.066    7.120    7.903    1446
    dc_topp:states_2013-11-30-06-11-07.ser           2    2892
    7.277    7.350    7.264    0.062    7.120    7.444    2892
    dc_topp:states_2013-11-30-06-11-07.ser           4    5784
    7.276    7.347    7.263    0.069    7.116    9.590    5784
    test_z_625k.ser                                  1    62
    166.409    166.693    166.430    0.158    166.098    166.865    62
    test_z_625k.ser                                  2    124
    167.600    167.801    167.610    0.107    167.412    167.906    124
    test_z_625k.ser                                  4    248
    168.970    169.217    168.979    0.188    168.510    170.056    248

    Scores:
    Tests    27    9    9    9
    Threads    4    1    2    4
    Pct95    132.125    131.267    132.435    132.675

Reply via email to