summaryrefslogtreecommitdiff
path: root/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
parent4c7134419292002e1ff4c6b6100a7a9ec37ced43 (diff)
flood fill
Diffstat (limited to 'js')
-rw-r--r--js/app.js2
-rw-r--r--js/draw.js43
-rw-r--r--js/lex.js10
-rw-r--r--js/ui/brush.js2
-rw-r--r--js/ui/canvas.js3
-rw-r--r--js/ui/controls.js12
6 files changed, 69 insertions, 3 deletions
diff --git a/js/app.js b/js/app.js
index 6c234c0..ab2c1ab 100644
--- a/js/app.js
+++ b/js/app.js
@@ -3,6 +3,7 @@ var dragging = false
var drawing = false
var erasing = false
var selecting = false
+var filling = false
var focused
var canvas, tools, palette, controls, brush, mode, current_tool, current_canvas
@@ -28,7 +29,6 @@ function build () {
brush.build()
controls.grid.use()
- controls.select.use()
}
function bind () {
canvas.bind()
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
})()
diff --git a/js/lex.js b/js/lex.js
index 2dc1dd5..8c3b0f1 100644
--- a/js/lex.js
+++ b/js/lex.js
@@ -57,6 +57,11 @@ Lex.prototype.clone = function (lex){
this.opacity = lex.opacity
this.build()
}
+Lex.prototype.copy = function () {
+ var lex = new Lex (0,0)
+ lex.clone(this)
+ return lex
+}
Lex.prototype.erase = function (){
this.fg = colors.white
this.bg = colors.black
@@ -71,7 +76,10 @@ Lex.prototype.fill = function(fg, bg){
this.build()
}
Lex.prototype.eq = function(lex){
- return lex && this.fg == lex.fg && this.bg == lex.fg && this.char == lex.char
+ return lex && this.fg == lex.fg && this.bg == lex.bg && this.char == lex.char
+}
+Lex.prototype.ne = function(lex){
+ return ! this.eq(lex)
}
Lex.prototype.clear = function(){
this.bg = 1
diff --git a/js/ui/brush.js b/js/ui/brush.js
index c7cf583..50f6e07 100644
--- a/js/ui/brush.js
+++ b/js/ui/brush.js
@@ -68,8 +68,10 @@ var brush = (function(){
this.expand(-i)
}
+ brush.char = " "
brush.fg = 0
brush.bg = 1
+ brush.opacity = 1
return brush
diff --git a/js/ui/canvas.js b/js/ui/canvas.js
index c70b135..206cbee 100644
--- a/js/ui/canvas.js
+++ b/js/ui/canvas.js
@@ -29,6 +29,9 @@ var canvas = current_canvas = (function(){
else if (selecting) {
selection.down(e, lex, point)
}
+ else if (filling) {
+ draw.fill(brush, x, y)
+ }
lex.focus()
})
lex.span.addEventListener("mousemove", function(e){
diff --git a/js/ui/controls.js b/js/ui/controls.js
index 293cd1d..bbf93cc 100644
--- a/js/ui/controls.js
+++ b/js/ui/controls.js
@@ -7,6 +7,7 @@ var controls = (function(){
brush.generate = controls.circle.generate
brush.generate()
drawing = true
+ filling = false
selection.hide()
brush.modified = false
}
@@ -30,6 +31,7 @@ var controls = (function(){
brush.generate()
brush.modified = false
drawing = true
+ filling = false
selection.hide()
}
controls.square.generate = function(){
@@ -42,6 +44,7 @@ var controls = (function(){
brush.generate = controls.text.generate
brush.generate()
drawing = false
+ filling = false
selection.hide()
}
controls.text.generate = function(){
@@ -50,9 +53,15 @@ var controls = (function(){
controls.select = new Tool (select_el)
controls.select.use = function(){
drawing = false
+ filling = false
selection.show()
}
- controls.text.generate = function(){
+
+ controls.fill = new Tool (fill_el)
+ controls.fill.use = function(){
+ drawing = false
+ filling = true
+ selection.hide()
}
controls.clear = new Tool (clear_el)
@@ -137,6 +146,7 @@ var controls = (function(){
controls.square,
controls.circle,
controls.text,
+ controls.fill,
controls.select,
controls.clear,
controls.grid,