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" <bourges.laur...@gmail.com> 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/ > > "Drawing Parametric Curves Using Chebyshev Polynomials ": > 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 > >