123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105 |
- 'use strict';
- var hasSyncZlib = true;
- var zlib = require('zlib');
- var inflateSync = require('./sync-inflate');
- if (!zlib.deflateSync) {
- hasSyncZlib = false;
- }
- var SyncReader = require('./sync-reader');
- var FilterSync = require('./filter-parse-sync');
- var Parser = require('./parser');
- var bitmapper = require('./bitmapper');
- var 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');
- }
- var err;
- function handleError(_err_) {
- err = _err_;
- }
- var metaData;
- function handleMetaData(_metaData_) {
- metaData = _metaData_;
- }
- function handleTransColor(transColor) {
- metaData.transColor = transColor;
- }
- function handlePalette(palette) {
- metaData.palette = palette;
- }
- function handleSimpleTransparency() {
- metaData.alpha = true;
- }
- var gamma;
- function handleGamma(_gamma_) {
- gamma = _gamma_;
- }
- var inflateDataList = [];
- function handleInflateData(inflatedData) {
- inflateDataList.push(inflatedData);
- }
- var reader = new SyncReader(buffer);
- var 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
- var inflateData = Buffer.concat(inflateDataList);
- inflateDataList.length = 0;
- var inflatedData;
- if (metaData.interlace) {
- inflatedData = zlib.inflateSync(inflateData);
- }
- else {
- var rowSize = ((metaData.width * metaData.bpp * metaData.depth + 7) >> 3) + 1;
- var 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');
- }
- var unfilteredData = FilterSync.process(inflatedData, metaData);
- inflateData = null;
- var bitmapData = bitmapper.dataToBitMap(unfilteredData, metaData);
- unfilteredData = null;
- var normalisedBitmapData = formatNormaliser(bitmapData, metaData);
- metaData.data = normalisedBitmapData;
- metaData.gamma = gamma || 0;
- return metaData;
- };
|