png-async
Version:
A simple and non-blocking PNG encoder / decoder.
118 lines • 4.35 kB
JavaScript
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
const stream = require("stream");
const Parser = require("./parser");
const Packer = require("./packer");
var EDeflateStrategy;
(function (EDeflateStrategy) {
EDeflateStrategy[EDeflateStrategy["DEFAULT_STRATEGY"] = 0] = "DEFAULT_STRATEGY";
EDeflateStrategy[EDeflateStrategy["FILTERED"] = 1] = "FILTERED";
EDeflateStrategy[EDeflateStrategy["HUFFMAN_ONLY"] = 2] = "HUFFMAN_ONLY";
EDeflateStrategy[EDeflateStrategy["RLE"] = 3] = "RLE";
EDeflateStrategy[EDeflateStrategy["FIXED"] = 4] = "FIXED";
})(EDeflateStrategy = exports.EDeflateStrategy || (exports.EDeflateStrategy = {}));
var EFilterType;
(function (EFilterType) {
EFilterType[EFilterType["Auto"] = -1] = "Auto";
EFilterType[EFilterType["None"] = 0] = "None";
EFilterType[EFilterType["Sub"] = 1] = "Sub";
EFilterType[EFilterType["Up"] = 2] = "Up";
EFilterType[EFilterType["Average"] = 3] = "Average";
EFilterType[EFilterType["Paeth"] = 4] = "Paeth";
})(EFilterType = exports.EFilterType || (exports.EFilterType = {}));
function createImage(option) {
return new Image(option);
}
exports.createImage = createImage;
class Image extends stream.Duplex {
constructor(option = {}) {
super();
this.width = option.width || 0;
this.height = option.height || 0;
if (this.width > 0 && this.height > 0) {
this.data = Buffer.alloc(4 * this.width * this.height);
if (option.fill) {
this.data.fill(0);
}
}
else {
this.data = null;
}
this.gamma = 0;
this.writable = true;
this._parser = new Parser(option || {});
this._parser.on("error", this.emit.bind(this, "error"));
this._parser.on("close", this._handleClose.bind(this));
this._parser.on("metadata", this._metadata.bind(this));
this._parser.on("gamma", this._gamma.bind(this));
this._parser.on("parsed", (data) => {
this.data = data;
this.emit("parsed", data);
});
this._packer = new Packer(option);
this._packer.on("data", this.emit.bind(this, "data"));
this._packer.on("end", this.emit.bind(this, "end"));
this._packer.on("close", this._handleClose.bind(this));
this._packer.on("error", this.emit.bind(this, "error"));
}
pack() {
setImmediate(() => {
this._packer.pack(this.data, this.width, this.height);
this.readable = true;
});
return this;
}
parse(data, callback) {
if (callback) {
let onParsed = null, onError = null;
this.once("parsed", onParsed = (data) => {
this.removeListener("error", onError);
this.data = data;
callback(null, this);
});
this.once("error", onError = (err) => {
this.removeListener("parsed", onParsed);
callback(err, null);
});
}
this.end(data);
return this;
}
_write(data, encoding, callback) {
return this._parser._write(data, encoding, callback);
}
end(data) {
return this._parser.end(data);
}
bitblt(dst, sx, sy, w, h, dx, dy) {
if (sx > this.width || sy > this.height || sx + w > this.width || sy + h > this.height) {
throw new Error("bitblt reading outside image");
}
if (dx > dst.width || dy > dst.height || dx + w > dst.width || dy + h > dst.height) {
throw new Error("bitblt writing outside image");
}
for (let y = 0; y < h; y++) {
this.data.copy(dst.data, ((dy + y) * dst.width + dx) << 2, ((sy + y) * this.width + sx) << 2, ((sy + y) * this.width + sx + w) << 2);
}
return this;
}
_read() {
}
_metadata(metadata) {
this.width = metadata.width;
this.height = metadata.height;
this.data = metadata.data;
delete metadata.data;
this.emit("metadata", metadata);
}
_gamma(gamma) {
this.gamma = gamma;
}
_handleClose() {
if (!this._parser.writable && !this._packer.readable) {
this.emit("close");
}
}
}
exports.Image = Image;
//# sourceMappingURL=index.js.map