moebius-web

web based ansi art editor

tools/fill.js


function fillTool(editor, palette) {
    "use strict";
    var currentColor;

    function colorChange(evt) {
        currentColor = evt.detail;
    }

    function simpleFill(blockX, blockY, targetColor) {
        var coord, block, queue, lastRowIndex;

        queue = [editor.getBlockCoord(blockX, blockY)];
        lastRowIndex = editor.height * 2 - 1;

        while (queue.length) {
            coord = queue.pop();
            block = editor.get(coord);
            if (block.isBlocky && ((coord.isUpperHalf && (block.upperBlockColor === targetColor)) || (coord.isLowerHalf && (block.lowerBlockColor === targetColor)))) {
                editor.setChunk(coord, currentColor);
                if (coord.blockX > 0) {
                    queue.push(editor.getBlockCoord(coord.blockX - 1, coord.blockY));
                }
                if (coord.blockX < 79) {
                    queue.push(editor.getBlockCoord(coord.blockX + 1, coord.blockY));
                }
                if (coord.blockX > 0) {
                    queue.push(editor.getBlockCoord(coord.blockX, coord.blockY - 1));
                }
                if (coord.blockX < lastRowIndex) {
                    queue.push(editor.getBlockCoord(coord.blockX, coord.blockY + 1));
                }
            }
        }
    }

    function canvasDown(evt) {
        var block, targetColor;
        block = editor.get(evt.detail);
        if (block.isBlocky) {
            targetColor = evt.detail.isUpperHalf ? block.upperBlockColor : block.lowerBlockColor;
            if (targetColor !== currentColor) {
                editor.takeUndoSnapshot();
                simpleFill(evt.detail.blockX, evt.detail.blockY, targetColor);
                editor.resolveConflicts(!evt.detail.altKey);
            }
        }
    }

    function init() {
        editor.canvas.addEventListener("canvasDown", canvasDown, false);
        palette.canvas.addEventListener("colorChange", colorChange, false);
        currentColor = palette.getCurrentColor();
        return true;
    }

    function remove() {
        editor.canvas.removeEventListener("canvasDown", canvasDown);
        palette.canvas.removeEventListener("colorChange", colorChange);
    }

    function toString() {
        return "Fill";
    }

    return {
        "init": init,
        "remove": remove,
        "toString": toString,
        "uid": "fill"
    };
}

Download

raw zip tar