NOTICE: By continued use of this site you understand and agree to the binding Terms of Service and Privacy Policy.
// ==UserScript== // @name Piskel Beadsprite Export // @namespace https://github.com/sopelt // @version 1.1.1 // @description Add an export option for beadsprite use-cases. // @author Simon Opelt // @license MIT // @copyright 2018, Simon Opelt // @homepageURL https://github.com/sopelt/piskel-beadsprite // @match https://www.piskelapp.com/p/* // @require https://cdnjs.cloudflare.com/ajax/libs/jspdf/1.3.5/jspdf.min.js#sha256=YHd/E8OX5o5GcqyHHas3xH3i7aP8z8KmMrL3WLMJfIY= // @grant none // ==/UserScript== function beadspriteExport() { // var includeAllFrames = $('#beadspriteExportIncludeAllFrames').is(":checked"); var includeColorCount = $('#beadspriteExportIncludeColorCount').is(":checked"); var flipMirror = $('#beadspriteExportFlipMirror').is(":checked"); var frameIndex = pskl.app.piskelController.getCurrentFrameIndex(); var frameCount = pskl.app.piskelController.getFrameCount(); var name = pskl.app.piskelController.getPiskel().getDescriptor().name; var fileName = `${name}.pdf`; if (frameCount > 1) { fileName = `${name}.${frameIndex + 1}.pdf`; } var mergedImage = pskl.app.piskelController.renderFrameAt(frameIndex, true); var mergedFrame = pskl.utils.FrameUtils.createFromImage(mergedImage); if (flipMirror) { pskl.tools.transform.TransformUtils.flip(mergedFrame, pskl.tools.transform.TransformUtils.VERTICAL); } var doc = new jsPDF(); if (frameCount > 1) { doc.text(`${name} ${frameIndex + 1}`, 15, 15); } else { doc.text(name, 15, 15); } var d = 5; var offsetX = 25; var offsetY = 35; var pegR = 0.5; var pearlR = 1.5; doc.setDrawColor(220); doc.setFillColor(220); var margin = 10; var borderWidth = (mergedFrame.width - 1) * d + 2 * margin; var borderHeight = (mergedFrame.height - 1) * d + 2 * margin; doc.lines([[borderWidth, 0], [0, borderHeight], [-borderWidth, 0], [0, -borderHeight]], offsetX - margin, offsetY - margin); for (var i = 0; i < mergedFrame.width; i++) for (var j = 0; j < mergedFrame.height; j++) { doc.circle(offsetX + i * d, offsetY + j * d, pegR, 'F'); } for (var k = 0; k < mergedFrame.width; k++) for (var l = 0; l < mergedFrame.height; l++) { var pixel = mergedFrame.getPixel(k, l); if (pixel) { doc.setLineWidth(0.8); var r = pixel & 0xff; var g = pixel >> 8 & 0xff; var b = pixel >> 16 & 0xff; doc.setDrawColor(r, g, b); doc.circle(offsetX + k * d, offsetY + l * d, pearlR, 'S'); doc.setDrawColor(230); doc.setLineWidth(0.1); doc.circle(offsetX + k * d, offsetY + l * d, pearlR + 0.35, 'S'); doc.circle(offsetX + k * d, offsetY + l * d, pearlR - 0.35, 'S'); } } if (includeColorCount) { doc.addPage(); var offset = 15; //offsetX + mergedFrame.height * d + 3 * margin; doc.text("Colors", 15, offset); var count = {}; for (var px of mergedFrame.pixels) { if (px === 0) { continue; } else if (count[px]) { count[px]++; } else { count[px] = 1; } } var currentColors = window.pskl.app.currentColorsService.getCurrentColors(); for (var c in count) { count[window.pskl.utils.intToHex(c)] = { count: count[c], pixel: c }; } doc.setFontSize(11); var n = 0; for (var c in currentColors) { var pixel = count[currentColors[c]].pixel; var r = pixel & 0xff; var g = pixel >> 8 & 0xff; var b = pixel >> 16 & 0xff; doc.setFillColor(r, g, b); doc.setDrawColor(230); doc.setLineWidth(0.1); doc.rect(15, offset + 12 + 10 * n, 3.5, 3.5, 'FD'); doc.text(currentColors[c].toUpperCase(), 25, offset + 15 + 10 * n); doc.text(`${count[currentColors[c]].count}`, 45, offset + 15 + 10 * n); n++; } } doc.save(fileName); } function beadspriteSetupUI() { var panel = $('div.export-panel-misc'); var section = ` <div class="export-panel-section" style="padding-bottom: 5px"> <span class="highlight">Export as beadsprite PDF: </span> <!--<div class="checkbox-container" style="margin: 5px 0;"> <input id="beadspriteExportIncludeAllFrames" class="zip-split-layers-checkbox checkbox-fix" type="checkbox"> <label for="beadspriteExportIncludeAllFrames">Export all frames</label> </div>--> <div class="checkbox-container" style="margin: 5px 0;"> <input id="beadspriteExportIncludeColorCount" class="zip-split-layers-checkbox checkbox-fix" type="checkbox"> <label for="beadspriteExportIncludeColorCount">Include color count</label> </div> <div class="checkbox-container" style="margin: 5px 0;"> <input id="beadspriteExportFlipMirror" class="zip-split-layers-checkbox checkbox-fix" type="checkbox"> <label for="beadspriteExportFlipMirror">Mirror/flip</label> </div> <button type="button" class="button button-primary selected-frame-download-button" id="beadspritePDFExport">Download</button> </div>`; panel.append($.parseHTML(section)); $('#beadspritePDFExport').on("click", beadspriteExport); } var beadspriteSetupInterval = setInterval(beadspriteSetup, 200); function beadspriteSetup() { if (window.pskl && window.pskl.controller && window.pskl.controller.settings && window.pskl.controller.settings.exportimage && window.pskl.controller.settings.exportimage.MiscExportController && window.pskl.controller.settings.exportimage.MiscExportController.prototype) { clearInterval(beadspriteSetupInterval); var miscProto = window.pskl.controller.settings.exportimage.MiscExportController.prototype; var bkpInit = miscProto.init; miscProto.init = function () { bkpInit.apply(this, arguments); $.publish("MISC-PANEL-INITIALIZED"); }; $.subscribe("MISC-PANEL-INITIALIZED", beadspriteSetupUI); } }