Tileset Maker v2

by phyreman

HTML

<script src="https://cdn.rawgit.com/eligrey/FileSaver.js/master/FileSaver.min.js"></script>
<script src="https://rawgit.com/eligrey/Blob.js/master/Blob.js"></script>
<script src="https://rawgit.com/eligrey/canvas-toBlob.js/master/canvas-toBlob.js"></script>
<ul>
    <li>
        <label for="tWidth">Tile Width:</label>
        <input id="tWidth" type="number" min="2" step="1" value="16" />
    </li>
    <li>
        <label for="tHeight">Tile Height:</label>
        <input id="tHeight" type="number" min="2" step="1" value="16" />
    </li>
</ul>
<hr>
<div id="dropzone">Drop Image Here</div>
<canvas id="source"></canvas>
<canvas id="work"></canvas>
<canvas id="current"></canvas>
<canvas id="black"></canvas>
<canvas id="dest"></canvas>
<hr>
<img id="tileset"/>

CSS

#dropzone {
    border: 2px dashed black;
    border-radius: 5px;
    height: 300px;
    text-align: center;
    width: 350px;
    display: -webkit-box;
    margin-left: auto;
    margin-right: auto;
    -webkit-box-orient: vertical;
    -webkit-box-pack: center;
}
canvas {
    display: none;
    width: 0px;
}
img {
    clear: right;
}
label {
    display: inline-block;
    width: 75px;
}
input {
    width: 55px;
}

JavaScript

var source = new Image(),
    get = function (id) {
        'use strict';
        return document.getElementById(id);
    },
    makeWorker = function(script) {
        'use strict';
        var URL = window.URL || window.webkitURL,
            Blob = Blob || window.Blob,
            Worker = window.Worker;

        if (!URL || !Blob || !Worker || !script) {
            return null;
        }

        return new Worker(URL.createObjectURL(new Blob([script])));
    },
    dropzone = get('dropzone'),
    filename, black,
    tmx = '<?xml version="1.0" encoding="UTF-8"?>\r\n<map version="1.0" orientation="orthogonal" width="',
    blackCanvas = get('black'),
    sourceCanvas = get('source'),
    workCanvas = get('work'),
    currentCanvas = get('current'),
    destCanvas = get('dest'),
    blackContext = blackCanvas.getContext("2d"),
    sourceContext = sourceCanvas.getContext("2d"),
    workContext = workCanvas.getContext("2d"),
    currentContext = currentCanvas.getContext("2d"),
    destContext = destCanvas.getContext("2d");

// Implement image drop-in
dropzone.addEventListener('drop', function (e) {
    'use strict';
    var reader = new FileReader();
    e.preventDefault();
    reader.onload = function (evt) {
        source.src = evt.target.result;
    };
    
    filename = e.dataTransfer.files[0].name;
    reader.readAsDataURL(e.dataTransfer.files[0]);
}, false);
dropzone.addEventListener('dragover', function (e) {
    'use strict';
    e.preventDefault();
}, false);
get('tileset').addEventListener('click', function (e) {
    'use strict';
    saveAs(new Blob([tmx], {type: "text/plain;charset=utf-8"}), filename.split('.')[0] + ".tmx");
    destCanvas.toBlob(function(blob){
        saveAs(blob, filename.split('.')[0]+"-Tileset.png");
    });
}, false);

source.onload = function () {
    'use strict';
    var i = 0,
        t,
        x,
        y,
        w = source.width,
        h = source.height,
        tileWidth = get('tWidth').value,
        tileHeight...