From 8204bbefa86361eb5d25055e3ed28d520237ee06 Mon Sep 17 00:00:00 2001 From: Tj Holowaychuk Date: Wed, 27 Oct 2010 11:10:30 -0700 Subject: [PATCH 1/3] Added Canvas::Error() --- src/canvas.cc | 15 +++++++++++---- src/canvas.h | 1 + 2 files changed, 12 insertions(+), 4 deletions(-) diff --git a/src/canvas.cc b/src/canvas.cc index 4af6355..e80d13c 100644 --- a/src/canvas.cc +++ b/src/canvas.cc @@ -86,10 +86,8 @@ Canvas::StreamPNG(const Arguments &args) { Canvas *canvas = ObjectWrap::Unwrap(args.This()); closure_t closure; closure.fn = Handle::Cast(args[0]); - cairo_surface_write_to_png_stream(canvas->getSurface(), writeToBuffer, &closure); - Handle argv[2]; - argv[0] = Null(); - argv[1] = Integer::New(0); + cairo_status_t status = cairo_surface_write_to_png_stream(canvas->getSurface(), writeToBuffer, &closure); + Handle argv[2] = { Null(), Integer::New(0) }; closure.fn->Call(Context::GetCurrent()->Global(), 2, argv); return Undefined(); } @@ -110,6 +108,15 @@ Canvas::~Canvas() { cairo_surface_destroy(_surface); } +/* + * Construct an Error from the given cairo status. + */ + +Handle +Canvas::Error(cairo_status_t status) { + return Exception::Error(String::New(cairo_status_to_string(status))); +} + /* * Save a PNG at the given path. */ diff --git a/src/canvas.h b/src/canvas.h index bdf0d5b..c8a2e16 100644 --- a/src/canvas.h +++ b/src/canvas.h @@ -52,6 +52,7 @@ class Canvas: public node::ObjectWrap { static Handle New(const Arguments &args); static Handle SavePNG(const Arguments &args); static Handle StreamPNG(const Arguments &args); + static Handle Error(cairo_status_t status); inline cairo_surface_t *getSurface(){ return _surface; } static void blur(cairo_surface_t *surface, int radius); Canvas(int width, int height); From 6e4a4fc1b200be72a5f3f2a88e068048ab596150 Mon Sep 17 00:00:00 2001 From: Tj Holowaychuk Date: Wed, 27 Oct 2010 11:16:10 -0700 Subject: [PATCH 2/3] streamPNG sig is now (err, buf, len) --- lib/pngstream.js | 6 ++++-- src/canvas.cc | 19 ++++++++++--------- 2 files changed, 14 insertions(+), 11 deletions(-) diff --git a/lib/pngstream.js b/lib/pngstream.js index 1966ea8..274b4f0 100644 --- a/lib/pngstream.js +++ b/lib/pngstream.js @@ -37,8 +37,10 @@ var PNGStream = module.exports = function PNGStream(canvas) { var self = this; this.canvas = canvas; process.nextTick(function(){ - canvas.streamPNG(function(chunk, len){ - if (len) { + canvas.streamPNG(function(err, chunk, len){ + if (err) { + self.emit('error', err); + } else if (len) { self.emit('data', chunk, len); } else { self.emit('end'); diff --git a/src/canvas.cc b/src/canvas.cc index e80d13c..f7e9b52 100644 --- a/src/canvas.cc +++ b/src/canvas.cc @@ -61,14 +61,11 @@ Canvas::New(const Arguments &args) { static cairo_status_t writeToBuffer(void *c, const uint8_t *data, unsigned len) { closure_t *closure = (closure_t *) c; - Handle argv[2]; Buffer *buf = Buffer::New(len); memcpy(buf->data(), data, len); - argv[0] = buf->handle_; - argv[1] = Integer::New(len); - closure->fn->Call(Context::GetCurrent()->Global(), 2, argv); + Handle argv[3] = { Null(), buf->handle_, Integer::New(len) }; + closure->fn->Call(Context::GetCurrent()->Global(), 3, argv); // TODO: CAIRO_STATUS_NO_MEMORY - // TODO: leak return CAIRO_STATUS_SUCCESS; } @@ -79,16 +76,20 @@ writeToBuffer(void *c, const uint8_t *data, unsigned len) { Handle Canvas::StreamPNG(const Arguments &args) { HandleScope scope; - // TODO: error handling - // TODO: nonblocking + // TODO: async if (!args[0]->IsFunction()) return ThrowException(Exception::TypeError(String::New("callback function required"))); Canvas *canvas = ObjectWrap::Unwrap(args.This()); closure_t closure; closure.fn = Handle::Cast(args[0]); cairo_status_t status = cairo_surface_write_to_png_stream(canvas->getSurface(), writeToBuffer, &closure); - Handle argv[2] = { Null(), Integer::New(0) }; - closure.fn->Call(Context::GetCurrent()->Global(), 2, argv); + if (status) { + Handle argv[1] = { Canvas::Error(status) }; + closure.fn->Call(Context::GetCurrent()->Global(), 1, argv); + } else { + Handle argv[3] = { Null(), Null(), Integer::New(0) }; + closure.fn->Call(Context::GetCurrent()->Global(), 3, argv); + } return Undefined(); } From d89dd26d1a1341e03510b3ac95c493b82d3bf4cc Mon Sep 17 00:00:00 2001 From: Tj Holowaychuk Date: Wed, 27 Oct 2010 11:17:36 -0700 Subject: [PATCH 3/3] Comment --- src/canvas.cc | 1 - 1 file changed, 1 deletion(-) diff --git a/src/canvas.cc b/src/canvas.cc index f7e9b52..b5f1c0b 100644 --- a/src/canvas.cc +++ b/src/canvas.cc @@ -65,7 +65,6 @@ writeToBuffer(void *c, const uint8_t *data, unsigned len) { memcpy(buf->data(), data, len); Handle argv[3] = { Null(), buf->handle_, Integer::New(len) }; closure->fn->Call(Context::GetCurrent()->Global(), 3, argv); - // TODO: CAIRO_STATUS_NO_MEMORY return CAIRO_STATUS_SUCCESS; }