sclass G22ShapeCollectorPanel { settable G22Utils g22utils; new MouseInComponentMonitor mouseMonitor; PicturesByMD5 pics; void init { if (pics != null) ret; pics = new PicturesByMD5(g22utils.projectFile("Images")); pics.extension(".qoi"); } cbOn <- jcheckbox "On" true cbFreezeOnHover <- jcheckbox "Freeze on hover" true looselyBindLiveValueToCheckBox (liveProjectVar "Freeze on hover") cbFreezeOnHover colorsSpinner <- jListSpinner < dropFirst < firstNCubes 16 looselyBindLiveValueToSpinner (liveProjectVar "colors") colorsSpinner blurSpinner <- jSpinner 0 0 99 looselyBindLiveValueToSpinner (liveProjectVar "blur") blurSpinner lblStats <- rightAlignedLabel anim <- new JMaxSpeedAnimation anim renderFrame < IF0 { if || (not (isChecked cbOn)) (&& (isChecked cbFreezeOnHover) (mouseMonitor get)) { sleepSeconds 0.1; ret null } inputImage <- shootLeftScreenHalf qoiData <- functionTimings, get "QOI compress" < IF0 -> toQOI inputImage recompressedImage <- inputImage // QOI is lossless, so same image qoiMD5 <- md5 qoiData wrangler <- new G22DataWrangler wrangler timings < functionTimings wrangler inputImage recompressedImage wrangler colors < intFromSpinner colorsSpinner wrangler blur < intFromSpinner blurSpinner wrangler stepUntilStage < wrangler regionsStage setTransientProjectVar "Last wrangler" wrangler qoiSize <- l qoiData setText lblStats < joinWithComma list { anim fps nRegions < wrangler regions concat "QOI: " (str_toK qoiSize) concat "Hash: " < takeFirst 3 qoiMD5 concat "Saved: " < yesNo_short < pics has qoiMD5 } void saveImage() { pics.put(qoiMD5, qoiData); } toBufferedImage < wrangler posterizedImage } cachedVisualize { mouseMonitor.init(anim.imageSurface()); ret northAndCenterWithMargins( jCenteredSection(" Visual Controls ", vstackWithSpacing( jcenteredline(cbOn, cbFreezeOnHover), jcenteredline( jCenteredSection("Colors", colorsSpinner), jCenteredSection("Blur", blurSpinner) ))), centerAndSouthWithMargin( jCenteredSection(" What I See ", anim), centerAndEastWithMargin(lblStats, jThreadedButton("Save image", -> save))) ); } }