RosettaCodeData/Task/Bitmap-Flood-fill/D/bitmap-flood-fill.d

30 lines
843 B
D
Raw Permalink Normal View History

2013-04-10 16:57:12 -07:00
import std.array, bitmap;
void floodFill(Color)(Image!Color img, in uint x, in uint y,
in Color color)
2015-02-20 00:35:01 -05:00
/*pure*/ nothrow in {
2013-04-10 16:57:12 -07:00
assert (y < img.ny && x < img.nx);
} body {
immutable target = img[x, y];
static struct Pos { uint x, y; }
auto stack = [Pos(x, y)];
while (!stack.empty) {
immutable p = stack.back;
2014-04-02 16:56:35 +00:00
stack.popBack;
2013-04-10 16:57:12 -07:00
if (p.y < img.ny && p.x < img.nx && img[p.x, p.y] == target) {
img[p.x, p.y] = color;
2014-04-02 16:56:35 +00:00
stack.assumeSafeAppend;
stack ~= [Pos(p.x, p.y + 1), Pos(p.x, p.y - 1),
Pos(p.x + 1, p.y), Pos(p.x - 1, p.y)];
2013-04-10 16:57:12 -07:00
}
}
}
void main() {
2015-02-20 00:35:01 -05:00
Image!RGB img;
loadPPM6(img, "unfilled_circ.ppm");
2013-04-10 16:57:12 -07:00
img.floodFill(200, 200, RGB(127, 0, 0));
2014-04-02 16:56:35 +00:00
img.savePPM6("unfilled_circ_flooded.ppm");
2013-04-10 16:57:12 -07:00
}