Warning: session_start(): open(/var/lib/php/sessions/sess_8suu8ph0g2nkvhkklgo1ufkj31, O_RDWR) failed: No space left on device (28) in /var/www/tb-usercake/models/config.php on line 51
Warning: session_start(): Failed to read session data: files (path: /var/lib/php/sessions) in /var/www/tb-usercake/models/config.php on line 51
// TODO: different sorting methods, e.g. "widest SSIs"
sclass G22DataWrangler > Stages is IHasChangeListeners {
event change;
settable BufferedImage inputImage;
settable bool withDiagonals = true;
settableWithVar int blur = 1; // in pixels
// kilobytes per compressed image (pessimistic estimate
// counting 2 bytes for each int)
settable TargetAndActual kilobytes = new(250.0);
settable new TargetAndActual coveredPixelsPercentage;
settable new TargetAndActual detailLevel;
settable bool vectorize = true;
settable bool allowPartialSSIs = true;
settable SortMode sortMode = SortMode.compressibility;
enum SortMode { compressibility, pixels }
settable IPosterizer posterizer = new SinglePixelPosterizer(4);
BufferedImage blurredImage;
int maxLines, maxInts;
L extends AbstractSSI> currentSSIs; // ssis at current stage
L initialSSIs;
AbstractSSIList sortedSSIs, cutSSIs,
vectorizedSSIs, cutVectorizedSSIs;
CutListToBudget cutter;
// We store the posterized image as Hi15
Hi15Image posterizedImage;
FastRegions_Hi15Image regionMaker;
L> regions;
selfType kb(TargetAndActual kb) { ret kilobytes(kb); }
TargetAndActual kb() { ret kilobytes; }
WidthAndHeight resolution() {
ret imageSize(inputImage);
}
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(blur, 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)!);
currentSSIs = initialSSIs;
}
int initialSSILines() {
ret totalSSILines(initialSSIs);
}
stage "Vector-Optimize" {
currentSSIs = vectorizedSSIs = vectorize
? new VectorOptimizedSSIList(currentSSIs)
: new GeneralSSIList(currentSSIs);
}
stage "Sort SSIs" {
if (sortMode == SortMode.compressibility)
sortedSSIs = sortedDesc(currentSSIs, (a, b) -> {
int x = cmp(a.compressibility(), b.compressibility());
if (x != 0) ret x;
ret cmp(a.numberOfPixels(), b.numberOfPixels());
});
else if (sortMode == SortMode.pixels)
sortedSSIs = new AbstractSSIList(biggestSSIsFirst(currentSSIs));
else
fail("Unknown sort mode");
currentSSIs = sortedSSIs;
}
stage "Cut SSI List by detail level" {
maxLines = !detailLevel.hasTarget() ? Int.MAX_VALUE
: iround(detailDivisor()*detailLevel.target());
currentSSIs = cutSSIs = takeFirstNSSILines(maxLines, currentSSIs);
detailLevel.set(l(cutSSIs)/detailDivisor());
}
stage "Cut Vector-Optimized SSIs by file size" {
maxInts = !kilobytes.hasTarget() ? Int.MAX_VALUE
: iround(kilobytes.target()*512); // assuming 16 bit ints
cutter = new CutListToBudget(ssi -> (double) ssi.sizeInInts(), maxInts, currentSSIs);
if (allowPartialSSIs)
cutter.allowPartial((ssi, budget) -> ssi.reduceToInts(iround(budget)));
currentSSIs = cutVectorizedSSIs = new GeneralSSIList(cutter!);
kilobytes.set(totalSizeInInts(cutVectorizedSSIs)/512.0);
}
}