summaryrefslogtreecommitdiff
path: root/js/draw.js
diff options
context:
space:
mode:
authorJules Laplace <jules@okfoc.us>2014-12-12 00:05:37 -0500
committerJules Laplace <jules@okfoc.us>2014-12-12 00:05:37 -0500
commita0b65f2e1a81b6fec30b4c1c2b2764c8dbcd64a9 (patch)
treebe95e2ee25e68d4543216007fdb9cf4345ea5d3e /js/draw.js
parent4c7134419292002e1ff4c6b6100a7a9ec37ced43 (diff)
flood fill
Diffstat (limited to 'js/draw.js')
-rw-r--r--js/draw.js43
1 files changed, 43 insertions, 0 deletions
diff --git a/js/draw.js b/js/draw.js
index 8a12467..6bf55bd 100644
--- a/js/draw.js
+++ b/js/draw.js
@@ -51,6 +51,48 @@ var draw = (function(){
}
})
}
+
+ function fill (lex, x, y) {
+ var q = [ [x,y] ]
+ var target = canvas.aa[y][x].copy()
+ var n, w = 0, e = 0, j = 0
+ var kk = 0
+ // gets into a weird infinite loop if we don't break here.. :\
+ if (target.eq(lex)) { return }
+ LOOP: while (q.length) {
+ n = q.shift()
+ if (canvas.aa[n[1]][n[0]].ne(target)) {
+ continue LOOP
+ }
+ w = e = n[0]
+ j = n[1]
+ WEST: while (w > 0) {
+ if (canvas.aa[j][w-1].eq(target)) {
+ w = w-1
+ }
+ else {
+ break WEST
+ }
+ }
+ EAST: while (e < canvas.w-1) {
+ if (canvas.aa[j][e+1].eq(target)) {
+ e = e+1
+ }
+ else {
+ break EAST
+ }
+ }
+ for (var i = w; i <= e; i++) {
+ canvas.aa[j][i].clone(lex)
+ if (j > 0 && canvas.aa[j-1][i].eq(target)) {
+ q.push([ i, j-1 ])
+ }
+ if (j < canvas.h-1 && canvas.aa[j+1][i].eq(target)) {
+ q.push([ i, j+1 ])
+ }
+ }
+ }
+ }
var draw = {}
draw.down = down
@@ -58,6 +100,7 @@ var draw = (function(){
draw.stamp = stamp
draw.line = line
draw.point = point
+ draw.fill = fill
return draw
})()