!7 !include early #1033506 // Compact Module Include Gazelle V module GazelleScreenCam > DynEnabled { int screenNr; transient ImageSurface imageSurface; transient new ScreenCamStream images; transient new BWIntegralImageStream integralImages; transient new SourceTriggeredStream scaledAndPosterizedImages; transient new DoubleFPSCounter fpsCounter; transient int fps; start { images.directlyFeedInto(integralImages); integralImages.onNewElement(ii -> scaledAndPosterizedImages.newElement( posterizeBWImage_withMeta(8, scaledBWImageFromBWIntegralImage_withMeta(100, ii)))); scaledAndPosterizedImages.onNewElement(img -> { fpsCounter.inc(); setField(fps := ifloor(fpsCounter!)); imageSurface?.setImage(img); }); // 20 Hz is enough for everyone dm_doEvery(1000/20, r { if (enabled) images.step(); }); } visualize { var vis = centerAndSouth( withMargin(jscroll_centered(imageSurface = pixelatedImageSurface().setAutoZoomToDisplay(true))), super.visualize()); addControl(dm_fieldLabelWithLabel fps()); ret vis; } }