sclass G22DataWrangler > Stages { settable BufferedImage inputImage; settable bool withDiagonals = true; settable int blurPixels = 1; // kilobytes per compressed image (pessimistic estimate // counting 2 bytes for each int) new TargetAndActual kilobytes; new TargetAndActual coveredPixelsPercentage; new TargetAndActual detailLevel; settable IPosterizer posterizer = new SinglePixelPosterizer(4); BufferedImage blurredImage; int maxLines; VectorOptimizedSSIList vectorizedSSIs, cutVectorizedSSIs; // We store the posterized image as Hi15 Hi15Image posterizedImage; FastRegions_Hi15Image regionMaker; L> regions; L initialSSIs, sortedSSIs, cutSSIs; TargetAndActual kb() { ret kilobytes; } double detailDivisor() { ret areaRoot(inputImage); } // choose number of colors for posterized image selfType colors(int colors) { int perChannel = iceil(cbrt(colors)); posterizer = new SinglePixelPosterizer(perChannel); this; } stage "Blur" { blurredImage = blurBufferedImage(blurPixels, inputImage); } stage "Posterize" { posterizedImage = new Hi15Image(posterizeBufferedImage(blurredImage, posterizer)); } stage "Regions" { regionMaker = new FastRegions_Hi15Image(posterizedImage); regionMaker.withDiagonals(withDiagonals); regions = regionMaker!; } stage "SSIs" { initialSSIs = new L; for (region : regions) initialSSIs.addAll(new G22_RegionToSSIs_v2(region).withDiagonals (withDiagonals)!); } stage "Sort SSIs" { sortedSSIs = biggestSSIsFirst(initialSSIs); } int initialSSILines() { ret totalSSILines(sortedSSIs); } stage "Cut SSI List" { maxLines = !detailLevel.hasTarget() ? Int.MAX_VALUE : iround(detailDivisor()*detailLevel.target()); cutSSIs = takeFirstNSSILines(maxLines, sortedSSIs); detailLevel.set(l(cutSSIs)/detailDivisor()); } stage "Vector-Optimize" { vectorizedSSIs = new VectorOptimizedSSIList(initialSSIs); } stage "Cut Vector-Optimized SSIs by file size" { int maxInts = !kilobytes.hasTarget() ? Int.MAX_VALUE : iround(kilobytes.target()*512); // assuming 16 bit ints var cutter = new CutListToBudget<>(ssi -> (double) ssi.sizeInInts(), maxInts, vectorizedSSIs); cutVectorizedSSIs = VectorOptimizedSSIList.alreadyOptimized(cutter!); kilobytes.set(totalSizeInInts(cutVectorizedSSIs)/512.0); } /* // take biggest ones, cut off at selected detail level optimizedSSIs <- VectorOptimizedSSIList alreadyOptimized < biggestSSIsFirst optimizedSSIs //print "optimizedSSIs" < l optimizedSSIs optimizedSSIs <- VectorOptimizedSSIList alreadyOptimized < takeFirstNSSILines maxLines optimizedSSIs //print "optimizedSSIs" < l optimizedSSIs // get stats keptLines <- totalSSILines optimizedSSIs vectorSSIs <- optimizedSSIs vectorSSIs ssis <- optimizedSSIs directSSIs totalSSIs <- l ssis directSSILines <- totalSSILines ssis vectorSSIPoints <- totalVectorSSIPoints vectorSSIs stats <- commaCombine list { resolution n2 totalLines "SSI line" n2_noPlural keptLines "kept" n2 optimizedSSIs "SSI" //n2 totalSSIs "Direct SSI" //n2 vectorSSIs "Vector SSI" n2 directSSILines "Direct SSI line" n2 vectorSSIPoints "Vector SSI point" } imageOut <- transparentImage resolution optimizedSSIs render imageOut infiller <- new ImageInfiller imageOut //infiller maxDepth 2 infiller unlimited infiller infillOpacity 254 //infiller eraseOriginalPixels imageOut <- infiller get imageOut <- renderImageOnBackground imageOut < Color black */ }