|
|
"use strict";
|
|
|
|
|
|
// const {asBuffer, asDownload, asZipDownload, atScale, options} = require('./io')
|
|
|
import io from "./io";
|
|
|
const { asBuffer, asDownload, asZipDownload, atScale, options } = io;
|
|
|
//
|
|
|
// Browser equivalents of the skia-canvas convenience initializers and polyfills for
|
|
|
// the Canvas object’s newPage & export methods
|
|
|
//
|
|
|
|
|
|
const _toURL_ = Symbol.for("toDataURL");
|
|
|
|
|
|
const loadImage = src =>
|
|
|
new Promise((onload, onerror) =>
|
|
|
Object.assign(new Image(), {
|
|
|
crossOrigin: "Anonymous",
|
|
|
onload,
|
|
|
onerror,
|
|
|
src
|
|
|
})
|
|
|
);
|
|
|
|
|
|
class Canvas {
|
|
|
constructor(width, height) {
|
|
|
// alert(1)
|
|
|
let elt = document.createElement("canvas"),
|
|
|
pages = [];
|
|
|
|
|
|
Object.defineProperty(elt, "async", {
|
|
|
value: true,
|
|
|
writable: false,
|
|
|
enumerable: true
|
|
|
});
|
|
|
|
|
|
for (var [prop, get] of Object.entries({
|
|
|
png: () => asBuffer(elt, "image/png"),
|
|
|
jpg: () => asBuffer(elt, "image/jpeg"),
|
|
|
pages: () => pages.concat(elt).map(c => c.getContext("2d"))
|
|
|
}))
|
|
|
Object.defineProperty(elt, prop, { get });
|
|
|
|
|
|
return Object.assign(elt, {
|
|
|
width,
|
|
|
height,
|
|
|
|
|
|
newPage(...size) {
|
|
|
var { width, height } = elt,
|
|
|
page = Object.assign(document.createElement("canvas"), {
|
|
|
width,
|
|
|
height
|
|
|
});
|
|
|
page.getContext("2d").drawImage(elt, 0, 0);
|
|
|
pages.push(page);
|
|
|
|
|
|
var [width, height] = size.length ? size : [width, height];
|
|
|
return Object.assign(elt, { width, height }).getContext("2d");
|
|
|
},
|
|
|
|
|
|
saveAs(filename, args) {
|
|
|
args = typeof args == "number" ? { quality: args } : args;
|
|
|
let opts = options(this.pages, { filename, ...args }),
|
|
|
{ pattern, padding, mime, quality, matte, density, archive } = opts,
|
|
|
pages = atScale(opts.pages, density);
|
|
|
return padding == undefined
|
|
|
? asDownload(pages[0], mime, quality, matte, filename)
|
|
|
: asZipDownload(
|
|
|
pages,
|
|
|
mime,
|
|
|
quality,
|
|
|
matte,
|
|
|
archive,
|
|
|
pattern,
|
|
|
padding
|
|
|
);
|
|
|
},
|
|
|
|
|
|
toBuffer(extension = "png", args = {}) {
|
|
|
args = typeof args == "number" ? { quality: args } : args;
|
|
|
let opts = options(this.pages, { extension, ...args }),
|
|
|
{ mime, quality, matte, pages, density } = opts,
|
|
|
canvas = atScale(pages, density, matte)[0];
|
|
|
return asBuffer(canvas, mime, quality, matte);
|
|
|
},
|
|
|
|
|
|
[_toURL_]: elt.toDataURL.bind(elt),
|
|
|
toDataURL(extension = "png", args = {}) {
|
|
|
args = typeof args == "number" ? { quality: args } : args;
|
|
|
let opts = options(this.pages, { extension, ...args }),
|
|
|
{ mime, quality, matte, pages, density } = opts,
|
|
|
canvas = atScale(pages, density, matte)[0],
|
|
|
url = canvas[canvas === elt ? _toURL_ : "toDataURL"](mime, quality);
|
|
|
return Promise.resolve(url);
|
|
|
}
|
|
|
});
|
|
|
}
|
|
|
}
|
|
|
|
|
|
const {
|
|
|
CanvasRenderingContext2D,
|
|
|
CanvasGradient,
|
|
|
CanvasPattern,
|
|
|
Image,
|
|
|
ImageData,
|
|
|
Path2D,
|
|
|
DOMMatrix,
|
|
|
DOMRect,
|
|
|
DOMPoint
|
|
|
} = window;
|
|
|
|
|
|
// module.exports = {
|
|
|
// Canvas,
|
|
|
// loadImage,
|
|
|
// CanvasRenderingContext2D,
|
|
|
// CanvasGradient,
|
|
|
// CanvasPattern,
|
|
|
// Image,
|
|
|
// ImageData,
|
|
|
// Path2D,
|
|
|
// DOMMatrix,
|
|
|
// DOMRect,
|
|
|
// DOMPoint
|
|
|
// };
|
|
|
|
|
|
const obj = {
|
|
|
Canvas,
|
|
|
loadImage,
|
|
|
CanvasRenderingContext2D,
|
|
|
CanvasGradient,
|
|
|
CanvasPattern,
|
|
|
Image,
|
|
|
ImageData,
|
|
|
Path2D,
|
|
|
DOMMatrix,
|
|
|
DOMRect,
|
|
|
DOMPoint
|
|
|
};
|
|
|
export default obj;
|