static L areasColoredOneOf(Color... color) { ret areasColoredOneOf(shootScreen(), color); } static int areasColoredOneOf_g = 3; static L areasColoredOneOf(RGBImage img, int... color) { ret areasColoredOneOf(img, mapToArrayOfType(Color.class, f toColor, asList(color))); } static L areasColoredOneOf(int... color) { ret areasColoredOneOf(mapToArrayOfType(Color.class, f toColor, asList(color))); } static L areasColoredOneOf(RGBImage img, Color... color) { ret areasColoredOneOf(img, areasColoredOneOf_g, color); } static L areasColoredOneOf(RGBImage img, int g, Color... color) { int w = img.w(), h = img.h(); int gw = w/g, gh = h/g; new BitSet grid; int[] intColors = mapToIntArray(func(Color c) -> Int { c.getRGB() & 0xFFFFFF }, color); int overlap = 0; for (int gy = 0; gy <= h- g; gy += g) next: for (int gx = 0; gx <= w- g; gx += g) { float min = 1, max = 0; int y2 = min(h, gy + g + overlap); int x2 = min(w, gx + g + overlap); if (rgbAllPixelsInAreaEqualToOneOf(img, gx, gy, x2, y2, intColors)) grid.set((gy / g) * gw + (gx / g)); } L clips = floodFillGrid(grid, gw, gh, g); //print(n(clips, "areas") + " found for color " + new RGB(color) + ": " + struct(clips)); ret clips; }