You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
105 lines
2.5 KiB
105 lines
2.5 KiB
'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; |
|
};
|
|
|