mirror of
https://github.com/danbulant/pngjs
synced 2026-06-19 06:21:13 +00:00
refactor parser-sync
This commit is contained in:
parent
1c817dbb9d
commit
735902ff9e
2 changed files with 81 additions and 70 deletions
|
|
@ -9,80 +9,102 @@ var bitmapper = require('./bitmapper');
|
|||
var formatNormaliser = require('./format-normaliser');
|
||||
|
||||
|
||||
var ParserSync = module.exports = function(buffer, options) {
|
||||
module.exports = function(buffer, options) {
|
||||
|
||||
var err;
|
||||
function handleError(_err_) {
|
||||
err = _err_;
|
||||
}
|
||||
|
||||
var data, bpp, width, height, depth, interlace;
|
||||
function createData(_width_, _height_, _bpp_, _depth_, _interlace_) {
|
||||
|
||||
bpp = _bpp_;
|
||||
width = _width_;
|
||||
height = _height_;
|
||||
depth = _depth_;
|
||||
interlace = _interlace_;
|
||||
|
||||
data = new Buffer(width * height * 4);
|
||||
|
||||
return data; // todo do not return
|
||||
}
|
||||
|
||||
var metaData;
|
||||
function handleMetaData(_metaData_) {
|
||||
metaData = _metaData_;
|
||||
}
|
||||
|
||||
var gamma;
|
||||
function handleGamma(_gamma_) {
|
||||
gamma = _gamma_;
|
||||
}
|
||||
|
||||
var inflateDataList = [];
|
||||
function handleInflateData(inflatedData) {
|
||||
inflateDataList.push(inflatedData);
|
||||
}
|
||||
|
||||
var reader = new SyncReader(buffer);
|
||||
|
||||
this._inflateDataList = [];
|
||||
this._parser = new Parser(options, {
|
||||
var parser = new Parser(options, {
|
||||
read: reader.read.bind(reader),
|
||||
error: this._handleError.bind(this),
|
||||
metadata: this._metaData.bind(this),
|
||||
gamma: this._gamma.bind(this),
|
||||
error: handleError,
|
||||
metadata: handleMetaData,
|
||||
gamma: handleGamma,
|
||||
finished: function() {
|
||||
//todo make optional
|
||||
},
|
||||
inflateData: this._inflateData.bind(this),
|
||||
createData: this._createData.bind(this)
|
||||
inflateData: handleInflateData,
|
||||
createData: createData
|
||||
});
|
||||
this._options = options;
|
||||
|
||||
this._parser.start();
|
||||
parser.start();
|
||||
reader.process();
|
||||
|
||||
if (err) {
|
||||
throw err;
|
||||
}
|
||||
|
||||
//join together the inflate datas
|
||||
var inflateData = Buffer.concat(this._inflateDataList);
|
||||
var inflateData = Buffer.concat(inflateDataList);
|
||||
inflateDataList.length = 0;
|
||||
|
||||
var data = zlib.inflateSync(inflateData);
|
||||
var inflatedData = zlib.inflateSync(inflateData);
|
||||
inflateData = null;
|
||||
|
||||
if (!data || !data.length) {
|
||||
if (!inflatedData || !inflatedData.length) {
|
||||
throw new Error('bad png - invalid inflate data response');
|
||||
}
|
||||
|
||||
data = FilterSync.process(
|
||||
data,
|
||||
this._width, this._height,
|
||||
this._bpp,
|
||||
this._depth,
|
||||
this._interlace,
|
||||
this._options
|
||||
var unfilteredData = FilterSync.process(
|
||||
inflatedData,
|
||||
width,
|
||||
height,
|
||||
bpp,
|
||||
depth,
|
||||
interlace,
|
||||
options
|
||||
);
|
||||
// todo do not store _data
|
||||
this._data = bitmapper.dataToBitMap(data, this._width, this._height,
|
||||
this._bpp,
|
||||
this._depth,
|
||||
this._interlace);
|
||||
inflateData = null;
|
||||
|
||||
this.data = formatNormaliser(this._data, {
|
||||
depth: this._depth, // TODO always store in this format
|
||||
width: this._width,
|
||||
height: this._height,
|
||||
colorType: this._parser._colorType,
|
||||
palette: this._parser._palette,
|
||||
transColor: this._parser._transColor });
|
||||
var bitmapData = bitmapper.dataToBitMap(unfilteredData, width, height,
|
||||
bpp,
|
||||
depth,
|
||||
interlace);
|
||||
unfilteredData = null;
|
||||
|
||||
var normalisedBitmapData = formatNormaliser(bitmapData, {
|
||||
depth: depth, // TODO always store in this format
|
||||
width: width,
|
||||
height: height,
|
||||
colorType: parser._colorType, //TODO event this
|
||||
palette: parser._palette,
|
||||
transColor: parser._transColor });
|
||||
|
||||
metaData.data = normalisedBitmapData;
|
||||
metaData.gamma = gamma || 0;
|
||||
|
||||
return metaData;
|
||||
};
|
||||
|
||||
ParserSync.prototype._handleError = function(err) {
|
||||
this.err = err;
|
||||
};
|
||||
|
||||
ParserSync.prototype._metaData = function(metaData) {
|
||||
this.metaData = metaData;
|
||||
};
|
||||
|
||||
ParserSync.prototype._gamma = function(gamma) {
|
||||
this.gamma = gamma;
|
||||
};
|
||||
|
||||
ParserSync.prototype._inflateData = function(data) {
|
||||
this._inflateDataList.push(data);
|
||||
};
|
||||
|
||||
ParserSync.prototype._createData = function(width, height, bpp, depth, interlace) {
|
||||
this._data = new Buffer(width * height * 4);
|
||||
this._bpp = bpp;
|
||||
this._width = width;
|
||||
this._height = height;
|
||||
this._depth = depth;
|
||||
this._interlace = interlace;
|
||||
return this._data; // todo do not return
|
||||
};
|
||||
|
|
|
|||
|
|
@ -1,21 +1,10 @@
|
|||
'use strict';
|
||||
|
||||
|
||||
var Parser = require('./parser-sync');
|
||||
var parse = require('./parser-sync');
|
||||
|
||||
|
||||
exports.read = function(buffer, options) {
|
||||
|
||||
var parser = new Parser(buffer, options || {});
|
||||
|
||||
if (parser.err) {
|
||||
throw parser.err;
|
||||
}
|
||||
|
||||
return {
|
||||
data: parser.data,
|
||||
width: parser._width,
|
||||
height: parser._height,
|
||||
gamma: parser.gamma || 0
|
||||
};
|
||||
return parse(buffer, options || {});
|
||||
};
|
||||
|
|
|
|||
Loading…
Reference in a new issue