// S&P, then regions sclass Gazelle22_ImageToRegions { BufferedImage inputImage; Decolorizer decolorizer; // null for simple decolorization BWIntegralImage ii; SnPSettings snpSettings; BWImage posterized; BWImage_FastRegions regions; Map, Double> scoredRegions; FunctionTimings timings; *(FunctionTimings *timings, BufferedImage *inputImage, SnPSettings *snpSettings) {} run { timings.do(decolorizer != null ? "bwIntegralImage w/decolorizer" : "bwIntegralImage", -> ii = bwIntegralImage_withMeta(inputImage, decolorizer)); timings.do("scaleAndPosterize", -> posterized = scaleAndPosterize(ii, snpSettings)); regions = new BWImage_FastRegions(posterized); regions.collectBounds(); timings.do("Regions", regions); } // information about original screenshot if available ScreenShotMeta screenShotMeta() { ret optCast ScreenShotMeta(getMetaSrc(inputImage)); } Pt coordinatesFromScreen(Pt p) { var meta = screenShotMeta(); if (meta == null) null; var r = meta.bounds; if (!r.contains(p)) null; p = translatePt(p, -r.x, -r.y); ret scalePt(p, doubleRatio(snpSettings.pixelRows, r.h)); } Pt coordinatesToScreen(Pt p) { var meta = screenShotMeta(); if (meta == null) null; var r = meta.bounds; ret translatePt(r.x, r.y, scalePt(p, doubleRatio(r.h, snpSettings.pixelRows))); } }