From 735902ff9e74fede9fe39d455f6952d26edeffe9 Mon Sep 17 00:00:00 2001 From: Luke Page Date: Thu, 6 Aug 2015 19:46:30 +0100 Subject: [PATCH] refactor parser-sync --- lib/parser-sync.js | 136 ++++++++++++++++++++++++++------------------- lib/png-sync.js | 15 +---- 2 files changed, 81 insertions(+), 70 deletions(-) diff --git a/lib/parser-sync.js b/lib/parser-sync.js index 6b2bd9c..8667b5f 100644 --- a/lib/parser-sync.js +++ b/lib/parser-sync.js @@ -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 -}; diff --git a/lib/png-sync.js b/lib/png-sync.js index 8fde0bb..21405e6 100644 --- a/lib/png-sync.js +++ b/lib/png-sync.js @@ -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 || {}); };