Warning: session_start(): open(/var/lib/php/sessions/sess_s0f1sbi64hg9lu1u7cmllj2jog, 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
!7
!include early #1033506 // Compact Module Include Gazelle V
module GazelleScreenCam > DynEnabled {
int screenNr;
int pixelRows = 100, colors = 8;
transient ImageSurface isPosterized, isRegions;
transient new ScreenCamStream images;
transient new BWIntegralImageStream integralImages;
transient new SourceTriggeredStream scaledAndPosterizedImages;
transient new DoubleFPSCounter fpsCounter;
transient int fps;
transient ScreenSelectorRadioButtons screenSelector;
transient new RollingAverage remainingMSPerFrame;
transient int remainingMS;
start {
images.directlyFeedInto(integralImages);
integralImages.onNewElement(ii ->
scaledAndPosterizedImages.newElement(
posterizeBWImage_withMeta(colors,
scaledBWImageFromBWIntegralImage_withMeta(pixelRows, ii))));
scaledAndPosterizedImages.onNewElement(img -> {
fpsCounter.inc();
setField(fps := iround(fpsCounter!));
isPosterized?.setImage(img);
floodFill(img);
});
// 20 Hz is enough for everyone
dm_doEvery(1000/20, r {
if (enabled) {
Timestamp deadline = tsNowPlusMS(1000/20);
images.useScreen(screenNr);
images.step();
long remaining = deadline.minus(tsNow());
remainingMSPerFrame.add(remaining);
setField(remainingMS := iround(remainingMSPerFrame!));
}
});
}
visualize {
screenSelector = new ScreenSelectorRadioButtons(dm_fieldLiveValue screenNr());
isPosterized = pixelatedImageSurface().setAutoZoomToDisplay(true);
var vis = centerAndSouth(
withMargin(jscroll_centered(isPosterized)),
vstackWithSpacing(
super.visualize(),
withMargin(jRightAlignedLine(
dm_fieldLabelWithLabel fps(),
dm_fieldLabelWithLabel remainingMS("Remaining ms")
))));
addControl(screenSelector);
addControl(withLabelToTheRight("p", dm_spinner pixelRows(1, 500)));
addControl(withLabelToTheRight("colors @", dm_spinner colors(2, 256));
ret vis;
}
void floodFill(BWImage img) {
FloodFillBWImage ff = new(img);
ff.tolerance(0);
ff.startAt(randomPt(img));
stepAll(ff);
isRegions?.setImage(bitMatrixToBufferedImage(ff.visited);
}
}