tools/save.js
function saveTool(editor, toolbar) {
"use strict";
function toDataURL(bytes) {
return "data:application/octet-stream;base64," + btoa(String.fromCharCode.apply(null, bytes));
}
function getHighestRow(input) {
var inputIndex, highest;
highest = 26;
for (inputIndex = 0; inputIndex < input.length; inputIndex += 3) {
if (input[inputIndex]) {
highest = Math.max(Math.ceil(inputIndex / 240), highest);
}
}
return highest;
}
// function toBinFormat(input) {
// var output, inputIndex, outputIndex, highest, end;
// highest = getHighestRow(input);
// output = new Uint8Array((input.length / 3 * 2) + 11);
// output.set(new Uint8Array([88, 66, 73, 78, 26, 80, 0, highest, 0, 16, 0]), 0);
// for (inputIndex = 0, outputIndex = 11, end = highest * 80 * 3; inputIndex < end; inputIndex += 3, outputIndex += 2) {
// output[outputIndex] = input[inputIndex];
// output[outputIndex + 1] = input[inputIndex + 1] + (input[inputIndex + 2] << 4);
// }
// return output;
// }
function toANSFormat(input) {
var highest, inputIndex, end, charCode, fg, bg, bold, currentFg, currentBg, currentBold, attribs, attribIndex, output;
function ansiColor(binColor) {
switch (binColor) {
case 1:
return 4;
case 3:
return 6;
case 4:
return 1;
case 6:
return 3;
default:
return binColor;
}
}
highest = getHighestRow(input);
output = [27, 91, 48, 109];
for (inputIndex = 0, end = highest * 80 * 3, currentFg = 7, currentBg = 0, currentBold = false; inputIndex < end; inputIndex += 3) {
attribs = [];
charCode = input[inputIndex];
fg = input[inputIndex + 1];
bg = input[inputIndex + 2];
if (fg > 7) {
bold = true;
fg = fg - 8;
} else {
bold = false;
}
if (bold !== currentBold) {
if (bold) {
attribs.push([49]);
currentBold = true;
} else {
attribs.push([48]);
currentFg = 7;
currentBg = 0;
currentBold = false;
}
}
if (fg !== currentFg) {
attribs.push([51, 48 + ansiColor(fg)]);
currentFg = fg;
}
if (bg !== currentBg) {
attribs.push([52, 48 + ansiColor(bg)]);
currentBg = bg;
}
if (attribs.length) {
output.push(27, 91);
for (attribIndex = 0; attribIndex < attribs.length; ++attribIndex) {
output = output.concat(attribs[attribIndex]);
if (attribIndex !== attribs.length - 1) {
output.push(59);
} else {
output.push(109);
}
}
}
output.push(charCode);
}
return new Uint8Array(output);
}
function init() {
var modal;
function dismiss() {
modal.remove();
editor.startListening();
toolbar.startListening();
}
modal = modalBox();
modal.addButton("download", {"textContent": "Download ansiedit.ans", "href": toDataURL(toANSFormat(editor.image)), "onclick": dismiss, "download": "ansiedit.ans"});
// modal.addButton("download", {"textContent": "Download ansiedit.xb", "href": toDataURL(toBinFormat(editor.image)), "onclick": dismiss, "download": "ansiedit.xb"});
modal.addButton("cancel", {"textContent": "Cancel", "href": "#", "onclick": function (evt) {
evt.preventDefault();
dismiss();
}});
editor.stopListening();
toolbar.stopListening();
modal.init();
return false;
}
function toString() {
return "Save";
}
return {
"init": init,
"toString": toString,
"uid": "save"
};
}