// Path: src/main/java/com/sun/marlin/stats/Histogram.java
// public final class Histogram extends StatLong {
// 
//     static final int BUCKET = 2;
//     static final int MAX = 20;
//     static final int LAST = MAX - 1;
//     static final int[] STEPS = new int[MAX];
// 
//     static {
//             STEPS[0] = 0;
//             STEPS[1] = 1;
// 
//             for (int i = 2; i < MAX; i++) {
//                 STEPS[i] = STEPS[i - 1] * BUCKET;
//             }
//     }
// 
//     static int bucket(int val) {
//         for (int i = 1; i < MAX; i++) {
//             if (val < STEPS[i]) {
//                 return i - 1;
//             }
//         }
//         return LAST;
//     }
// 
//     private final StatLong[] stats = new StatLong[MAX];
// 
//     public Histogram(final String name) {
//         super(name);
//         for (int i = 0; i < MAX; i++) {
//             stats[i] = new StatLong(String.format("%5s .. %5s", STEPS[i],
//                                     ((i + 1 < MAX) ? STEPS[i + 1] : "~")));
//         }
//     }
// 
//     @Override
//     public void reset() {
//         super.reset();
//         for (int i = 0; i < MAX; i++) {
//             stats[i].reset();
//         }
//     }
// 
//     @Override
//     public void add(int val) {
//         super.add(val);
//         stats[bucket(val)].add(val);
//     }
// 
//     @Override
//     public void add(long val) {
//         add((int) val);
//     }
// 
//     @Override
//     public String toString() {
//         final StringBuilder sb = new StringBuilder(2048);
//         super.toString(sb).append(" { ");
// 
//         for (int i = 0; i < MAX; i++) {
//             if (stats[i].count != 0l) {
//                 sb.append("\n        ").append(stats[i].toString());
//             }
//         }
// 
//         return sb.append(" }").toString();
//     }
// }
// 
// Path: src/main/java/com/sun/marlin/stats/StatLong.java
// public class StatLong {
// 
//     public final String name;
//     public long count = 0l;
//     public long sum = 0l;
//     public long min = Integer.MAX_VALUE;
//     public long max = Integer.MIN_VALUE;
// 
//     public StatLong(final String name) {
//         this.name = name;
//     }
// 
//     public void reset() {
//         count = 0l;
//         sum = 0l;
//         min = Integer.MAX_VALUE;
//         max = Integer.MIN_VALUE;
//     }
// 
//     public void add(final int val) {
//         count++;
//         sum += val;
//         if (val < min) {
//             min = val;
//         }
//         if (val > max) {
//             max = val;
//         }
//     }
// 
//     public void add(final long val) {
//         count++;
//         sum += val;
//         if (val < min) {
//             min = val;
//         }
//         if (val > max) {
//             max = val;
//         }
//     }
// 
//     @Override
//     public String toString() {
//         return toString(new StringBuilder(128)).toString();
//     }
// 
//     public final StringBuilder toString(final StringBuilder sb) {
//         sb.append(name).append('[').append(count);
//         sb.append("] sum: ").append(sum).append(" avg: ");
//         sb.append(trimTo3Digits(((double) sum) / count));
//         sb.append(" [").append(min).append(" | ").append(max).append("]");
//         return sb;
//     }
// 
//     /**
//      * Adjust the given double value to keep only 3 decimal digits
//      *
//      * @param value value to adjust
//      * @return double value with only 3 decimal digits
//      */
//     public static double trimTo3Digits(final double value) {
//         return ((long) (1e3d * value)) / 1e3d;
//     }
// }


import com.sun.javafx.geom.PathConsumer2D;
import java.util.Arrays;
import com.sun.marlin.stats.Histogram;
import com.sun.marlin.stats.StatLong;

        // types capacity = edges count (4096)
        private static final int INITIAL_TYPES_COUNT = INITIAL_EDGES_COUNT;

        float[] curves;
        int end;
        byte[] curveTypes;
        int numCurves;

        // curves ref (dirty)
        final FloatArrayCache.Reference curves_ref;
        // curveTypes ref (dirty)
        final ByteArrayCache.Reference curveTypes_ref;

        // used marks (stats only)
        int curveTypesUseMark;
        int curvesUseMark;

        private final StatLong stat_polystack_types;
        private final StatLong stat_polystack_curves;
        private final Histogram hist_polystack_curves;
        private final StatLong stat_array_polystack_curves;
        private final StatLong stat_array_polystack_curveTypes;

        PolyStack(final RendererContext rdrCtx) {
            this(rdrCtx, null, null, null, null, null);
        }

        PolyStack(final RendererContext rdrCtx,
                  final StatLong stat_polystack_types,
// Path: src/main/java/com/sun/marlin/stats/Histogram.java
// public final class Histogram extends StatLong {
// 
//     static final int BUCKET = 2;
//     static final int MAX = 20;
//     static final int LAST = MAX - 1;
//     static final int[] STEPS = new int[MAX];
// 
//     static {
//             STEPS[0] = 0;
//             STEPS[1] = 1;
// 
//             for (int i = 2; i < MAX; i++) {
//                 STEPS[i] = STEPS[i - 1] * BUCKET;
//             }
//     }
// 
//     static int bucket(int val) {
//         for (int i = 1; i < MAX; i++) {
//             if (val < STEPS[i]) {
//                 return i - 1;
//             }
//         }
//         return LAST;
//     }
// 
//     private final StatLong[] stats = new StatLong[MAX];
// 
//     public Histogram(final String name) {
//         super(name);
//         for (int i = 0; i < MAX; i++) {
//             stats[i] = new StatLong(String.format("%5s .. %5s", STEPS[i],
//                                     ((i + 1 < MAX) ? STEPS[i + 1] : "~")));
//         }
//     }
// 
//     @Override
//     public void reset() {
//         super.reset();
//         for (int i = 0; i < MAX; i++) {
//             stats[i].reset();
//         }
//     }
// 
//     @Override
//     public void add(int val) {
//         super.add(val);
//         stats[bucket(val)].add(val);
//     }
// 
//     @Override
//     public void add(long val) {
//         add((int) val);
//     }
// 
//     @Override
//     public String toString() {
//         final StringBuilder sb = new StringBuilder(2048);
//         super.toString(sb).append(" { ");
// 
//         for (int i = 0; i < MAX; i++) {
//             if (stats[i].count != 0l) {
//                 sb.append("\n        ").append(stats[i].toString());
//             }
//         }
// 
//         return sb.append(" }").toString();
//     }
// }
// 
// Path: src/main/java/com/sun/marlin/stats/StatLong.java
// public class StatLong {
// 
//     public final String name;
//     public long count = 0l;
//     public long sum = 0l;
//     public long min = Integer.MAX_VALUE;
//     public long max = Integer.MIN_VALUE;
// 
//     public StatLong(final String name) {
//         this.name = name;
//     }
// 
//     public void reset() {
//         count = 0l;
//         sum = 0l;
//         min = Integer.MAX_VALUE;
//         max = Integer.MIN_VALUE;
//     }
// 
//     public void add(final int val) {
//         count++;
//         sum += val;
//         if (val < min) {
//             min = val;
//         }
//         if (val > max) {
//             max = val;
//         }
//     }
// 
//     public void add(final long val) {
//         count++;
//         sum += val;
//         if (val < min) {
//             min = val;
//         }
//         if (val > max) {
//             max = val;
//         }
//     }
// 
//     @Override
//     public String toString() {
//         return toString(new StringBuilder(128)).toString();
//     }
// 
//     public final StringBuilder toString(final StringBuilder sb) {
//         sb.append(name).append('[').append(count);
//         sb.append("] sum: ").append(sum).append(" avg: ");
//         sb.append(trimTo3Digits(((double) sum) / count));
//         sb.append(" [").append(min).append(" | ").append(max).append("]");
//         return sb;
//     }
// 
//     /**
//      * Adjust the given double value to keep only 3 decimal digits
//      *
//      * @param value value to adjust
//      * @return double value with only 3 decimal digits
//      */
//     public static double trimTo3Digits(final double value) {
//         return ((long) (1e3d * value)) / 1e3d;
//     }
// }


// Path: src/main/java/com/sun/marlin/Helpers.java
import com.sun.javafx.geom.PathConsumer2D;
import java.util.Arrays;
import com.sun.marlin.stats.Histogram;
import com.sun.marlin.stats.StatLong;


        // types capacity = edges count (4096)
        private static final int INITIAL_TYPES_COUNT = INITIAL_EDGES_COUNT;

        float[] curves;
        int end;
        byte[] curveTypes;
        int numCurves;

        // curves ref (dirty)
        final FloatArrayCache.Reference curves_ref;
        // curveTypes ref (dirty)
        final ByteArrayCache.Reference curveTypes_ref;

        // used marks (stats only)
        int curveTypesUseMark;
        int curvesUseMark;

        private final StatLong stat_polystack_types;
        private final StatLong stat_polystack_curves;
        private final Histogram hist_polystack_curves;
        private final StatLong stat_array_polystack_curves;
        private final StatLong stat_array_polystack_curveTypes;

        PolyStack(final RendererContext rdrCtx) {
            this(rdrCtx, null, null, null, null, null);
        }

        PolyStack(final RendererContext rdrCtx,
                  final StatLong stat_polystack_types,
                  final StatLong stat_polystack_curves,