123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108 |
- "use strict";
- let hasSyncZlib = true;
- let zlib = require("zlib");
- let inflateSync = require("./sync-inflate");
- if (!zlib.deflateSync) {
- hasSyncZlib = false;
- }
- let SyncReader = require("./sync-reader");
- let FilterSync = require("./filter-parse-sync");
- let Parser = require("./parser");
- let bitmapper = require("./bitmapper");
- let formatNormaliser = require("./format-normaliser");
- module.exports = function (buffer, options) {
- if (!hasSyncZlib) {
- throw new Error(
- "To use the sync capability of this library in old node versions, please pin pngjs to v2.3.0"
- );
- }
- let err;
- function handleError(_err_) {
- err = _err_;
- }
- let metaData;
- function handleMetaData(_metaData_) {
- metaData = _metaData_;
- }
- function handleTransColor(transColor) {
- metaData.transColor = transColor;
- }
- function handlePalette(palette) {
- metaData.palette = palette;
- }
- function handleSimpleTransparency() {
- metaData.alpha = true;
- }
- let gamma;
- function handleGamma(_gamma_) {
- gamma = _gamma_;
- }
- let inflateDataList = [];
- function handleInflateData(inflatedData) {
- inflateDataList.push(inflatedData);
- }
- let reader = new SyncReader(buffer);
- let parser = new Parser(options, {
- read: reader.read.bind(reader),
- error: handleError,
- metadata: handleMetaData,
- gamma: handleGamma,
- palette: handlePalette,
- transColor: handleTransColor,
- inflateData: handleInflateData,
- simpleTransparency: handleSimpleTransparency,
- });
- parser.start();
- reader.process();
- if (err) {
- throw err;
- }
- //join together the inflate datas
- let inflateData = Buffer.concat(inflateDataList);
- inflateDataList.length = 0;
- let inflatedData;
- if (metaData.interlace) {
- inflatedData = zlib.inflateSync(inflateData);
- } else {
- let rowSize =
- ((metaData.width * metaData.bpp * metaData.depth + 7) >> 3) + 1;
- let imageSize = rowSize * metaData.height;
- inflatedData = inflateSync(inflateData, {
- chunkSize: imageSize,
- maxLength: imageSize,
- });
- }
- inflateData = null;
- if (!inflatedData || !inflatedData.length) {
- throw new Error("bad png - invalid inflate data response");
- }
- let unfilteredData = FilterSync.process(inflatedData, metaData);
- inflateData = null;
- let bitmapData = bitmapper.dataToBitMap(unfilteredData, metaData);
- unfilteredData = null;
- let normalisedBitmapData = formatNormaliser(bitmapData, metaData);
- metaData.data = normalisedBitmapData;
- metaData.gamma = gamma || 0;
- return metaData;
- };
|