From 1e19b7ec10d78ab03ef42fc5c29d3e9a8c1b2f6f Mon Sep 17 00:00:00 2001 From: Tj Holowaychuk Date: Thu, 7 Oct 2010 18:42:29 -0700 Subject: [PATCH] Added PNGStream test --- lib/canvas.js | 14 +++++++++++++- src/canvas.cc | 1 + test/canvas.test.js | 46 +++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 60 insertions(+), 1 deletion(-) diff --git a/lib/canvas.js b/lib/canvas.js index fa11b17..29f8d3e 100644 --- a/lib/canvas.js +++ b/lib/canvas.js @@ -14,7 +14,8 @@ var canvas = require('../build/default/canvas') , Canvas = canvas.Canvas , Context2d = canvas.CanvasRenderingContext2d , CanvasGradient = canvas.CanvasGradient - , cairoVersion = canvas.cairoVersion; + , cairoVersion = canvas.cairoVersion + , PNGStream = require('./pngstream'); /** * Export `Canvas` as the module. @@ -126,6 +127,17 @@ Canvas.prototype.getContext = function(contextId){ } }; +/** + * Create a `PNGStream` for `this` canvas. + * + * @return {PNGStream} + * @api public + */ + +Canvas.prototype.createPNGStream = function(){ + return new PNGStream(this); +}; + /** * Add `color` stop at the given `offset`. * diff --git a/src/canvas.cc b/src/canvas.cc index 05c6091..3d7d8b8 100644 --- a/src/canvas.cc +++ b/src/canvas.cc @@ -72,6 +72,7 @@ Handle Canvas::StreamPNG(const Arguments &args) { HandleScope scope; // TODO: error handling + // TODO: nonblocking if (!args[0]->IsFunction()) return ThrowException(Exception::TypeError(String::New("callback function required"))); Canvas *canvas = ObjectWrap::Unwrap(args.This()); diff --git a/test/canvas.test.js b/test/canvas.test.js index 4a73f17..e768177 100644 --- a/test/canvas.test.js +++ b/test/canvas.test.js @@ -14,6 +14,10 @@ function hash(val) { function assertChecksum(canvas, path, checksum, msg) { canvas.savePNG(path); + assertChecksumOf(canvas, path, checksum, msg); +} + +function assertChecksumOf(canvas, path, checksum, msg) { fs.readFile(path, function(err, buf){ assert.equal(hash(buf), checksum, msg); }); @@ -499,5 +503,47 @@ module.exports = { assert.ok(ctx.isPointInPath(60,110)); assert.ok(!ctx.isPointInPath(70,110)); assert.ok(!ctx.isPointInPath(50,120)); + }, + + 'test PNGStream': function(assert, beforeExit){ + var canvas = new Canvas(320, 320) + , ctx = canvas.getContext('2d') + , path = __dirname + '/images/pngstream.png' + , called = 0; + + ctx.strokeStyle = 'rgba(0,0,0,0.5)'; + ctx.strokeRect(0,0,320,320); + + ctx.fillStyle = 'rgba(0,0,0,0.02)'; + var steps = 200; + while (steps--) { + ctx.fillRect( + 160 - (steps / 2) + , 160 - (steps / 2) + , steps + , steps + ); + } + + var out = fs.createWriteStream(path) + , stream = canvas.createPNGStream(); + + out.on('close', function(){ + assertChecksumOf( + canvas + , path + , '04f2e1b4338de2d7451194cba7d29970' + , 'PNGStream failed'); + }); + + stream.on('data', function(chunk){ out.write(chunk); }); + stream.on('end', function(){ + ++called; + out.end(); + }); + + beforeExit(function(){ + assert.equal(1, called); + }); } } \ No newline at end of file