diff options
| author | Jules Laplace <jules@okfoc.us> | 2014-12-12 00:05:37 -0500 |
|---|---|---|
| committer | Jules Laplace <jules@okfoc.us> | 2014-12-12 00:05:37 -0500 |
| commit | a0b65f2e1a81b6fec30b4c1c2b2764c8dbcd64a9 (patch) | |
| tree | be95e2ee25e68d4543216007fdb9cf4345ea5d3e /js | |
| parent | 4c7134419292002e1ff4c6b6100a7a9ec37ced43 (diff) | |
flood fill
Diffstat (limited to 'js')
| -rw-r--r-- | js/app.js | 2 | ||||
| -rw-r--r-- | js/draw.js | 43 | ||||
| -rw-r--r-- | js/lex.js | 10 | ||||
| -rw-r--r-- | js/ui/brush.js | 2 | ||||
| -rw-r--r-- | js/ui/canvas.js | 3 | ||||
| -rw-r--r-- | js/ui/controls.js | 12 |
6 files changed, 69 insertions, 3 deletions
@@ -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() @@ -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 })() @@ -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, |
