git @ Cat's Eye Technologies DAM / master src / dam-download-image-button.js
master

Tree @master (Download .tar.gz)

dam-download-image-button.js @masterraw · history · blame

// SPDX-FileCopyrightText: Chris Pressey, the creator of this work, has dedicated it to the public domain.
// For more information, please refer to <https://unlicense.org/>
// SPDX-License-Identifier: Unlicense

/* dam-download-image-button.js version 0.2-????.?? */

(function() {
    function svgToPng(svg, callback) {
        /*
         * Draw an <svg> element on a (new, dedicated, hidden) canvas element, then
         * call the callback (which may then read the canvas contents as PNG.)
         *
         * The SVG needs either width and height attributes, or viewBox.
         * Some SVG features might render incorrectly or poorly, especially
         * external resources (such as fonts) (due to e.g. CORS)
         */

        const svgData = new XMLSerializer().serializeToString(svg);

        const blob = new Blob([svgData], { type: 'image/svg+xml;charset=utf-8' });
        const url = URL.createObjectURL(blob);

        const img = new Image();
        img.onload = function() {
            const canvas = document.createElement('canvas');
            canvas.width = svg.width.baseVal.value || svg.viewBox.baseVal.width;
            canvas.height = svg.height.baseVal.value || svg.viewBox.baseVal.height;
            console.log("canvas.width", canvas.width, "canvas.height", canvas.height);

            const ctx = canvas.getContext('2d');
            ctx.drawImage(img, 0, 0, canvas.width, canvas.height);

            URL.revokeObjectURL(url);
            callback(canvas);
        };
        img.src = url;
    }

    function downloadBlob(filename, blob) {
        const url = URL.createObjectURL(blob);
        const link = document.createElement('a');
        link.download = filename;
        link.href = url;
        link.click();
        URL.revokeObjectURL(url);
    };

    function makeDownloadImageButton(config) {
        var button = DAM.maker('button');

        var canvas = config.canvas;
        var svg = config.svg;
        var downloadAs = canvas ? 'png' : (config.downloadAs || 'svg');
        var label = config.label || "Download as " + downloadAs.toUpperCase();
        var basename = config.basename || (canvas ? "canvas" : "vector");

        return button(label, {
            onclick: function() {
                const timestamp = new Date().toISOString().slice(0, 19).replace(/[T:]/g, '-');

                if (svg) {
                    if (downloadAs === 'svg') {
                        const svgData = new XMLSerializer().serializeToString(svg);
                        downloadBlob(
                            basename + "-" + timestamp + ".svg",
                            new Blob([svgData], { type: 'image/svg+xml;charset=utf-8' })
                        );
                    } else if (downloadAs === 'png') {
                        svgToPng(svg, function(canvas) {
                            canvas.toBlob(function(blob) {
                                downloadBlob(basename + "-" + timestamp + ".png", blob);
                            }, 'image/png');
                        });
                    }
                } else if (canvas) {
                    canvas.toBlob(function(blob) {
                        downloadBlob(basename + "-" + timestamp + ".png", blob);
                    }, 'image/png');
                }
            }
        })
    }

    if (typeof module !== 'undefined') {
        module.exports = { makeDownloadImageButton: makeDownloadImageButton };
    } else if (typeof window !== 'undefined') {
        window.DAM = window.DAM || {};
        DAM.makeDownloadImageButton = makeDownloadImageButton;
    }
})();