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, flags; highest = getHighestRow(input); output = new Uint8Array((input.length / 3 * 2) + 11); flags = editor.noblink ? 8 : 0; output.set(new Uint8Array([88, 66, 73, 78, 26, 80, 0, highest, 0, 16, flags]), 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, blink, currentFg, currentBg, currentBold, currentBlink, 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, currentBlink = 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 (bg > 7) { // blink = true; // bg = bg - 8; // } else { // blink = false; // } // if ((currentBold && !bold) || (currentBlink && !blink)) { // attribs.push([48]); // currentFg = 7; // currentBg = 0; // currentBold = false; // currentBlink = false; // } // if (bold && !currentBold) { // attribs.push([49]); // currentBold = true; // } // if (blink && !currentBlink) { // attribs.push([53]); // currentBlink = true; // } // 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" }; } AnsiEditController.addTool(saveTool, "tools-left");