From d34139b02b83752ebb2ba58b67a8693d1e36b93e Mon Sep 17 00:00:00 2001 From: basvanmeurs Date: Tue, 25 Sep 2018 21:56:29 +0200 Subject: [PATCH 1/6] add raw image support --- src/Image.cc | 20 ++++++++++++++++++++ src/Image.h | 1 + test/image.test.js | 8 ++++++++ 3 files changed, 29 insertions(+) diff --git a/src/Image.cc b/src/Image.cc index a5d30cc56..156d59417 100644 --- a/src/Image.cc +++ b/src/Image.cc @@ -61,6 +61,7 @@ Image::Initialize(Nan::ADDON_REGISTER_FUNCTION_ARGS_TYPE target) { SetProtoAccessor(proto, Nan::New("height").ToLocalChecked(), GetHeight, SetHeight, ctor); SetProtoAccessor(proto, Nan::New("naturalWidth").ToLocalChecked(), GetNaturalWidth, NULL, ctor); SetProtoAccessor(proto, Nan::New("naturalHeight").ToLocalChecked(), GetNaturalHeight, NULL, ctor); + SetProtoAccessor(proto, Nan::New("rawData").ToLocalChecked(), GetRawData, NULL, ctor); Nan::SetMethod(proto, "getSource", GetSource); Nan::SetMethod(proto, "setSource", SetSource); @@ -189,6 +190,25 @@ NAN_METHOD(Image::GetSource){ info.GetReturnValue().Set(Nan::New(img->filename ? img->filename : "").ToLocalChecked()); } +/* + * Get raw data. + */ +NAN_GETTER(Image::GetRawData) { + Image *img = Nan::ObjectWrap::Unwrap(info.This()); + if (img->_surface) { + // Return raw ARGB data -- just a memcpy() + cairo_surface_t *surface = img->_surface; + cairo_surface_flush(surface); + const unsigned char *data = cairo_image_surface_get_data(surface); + unsigned int nBytes = img->width * img->height * 4; + Local buf = Nan::CopyBuffer(reinterpret_cast(data), nBytes).ToLocalChecked(); + info.GetReturnValue().Set(buf); + } else { + info.GetReturnValue().Set(Nan::Undefined()); + } + return; +} + /* * Clean up assets and variables. */ diff --git a/src/Image.h b/src/Image.h index 6c0dd49c9..dbd5ced09 100644 --- a/src/Image.h +++ b/src/Image.h @@ -56,6 +56,7 @@ class Image: public Nan::ObjectWrap { static NAN_SETTER(SetHeight); static NAN_METHOD(GetSource); static NAN_METHOD(SetSource); + static NAN_GETTER(GetRawData); inline uint8_t *data(){ return cairo_image_surface_get_data(_surface); } inline int stride(){ return cairo_image_surface_get_stride(_surface); } static int isPNG(uint8_t *data); diff --git a/test/image.test.js b/test/image.test.js index 138b1c70f..01605e010 100644 --- a/test/image.test.js +++ b/test/image.test.js @@ -81,6 +81,14 @@ describe('Image', function () { }) }) + it('returns raw image data', function() { + var img = new Image(); + img.src = png_clock; + var buf = img.rawData; + assert.ok(buf instanceof Buffer); + assert.strictEqual(409600, img.rawData.length); + }); + it('calls Image#onload multiple times', function () { return loadImage(png_clock).then((img) => { let onloadCalled = 0 From b207234151bb9764353e900aaf26790aed641cf9 Mon Sep 17 00:00:00 2001 From: basvanmeurs Date: Thu, 11 Oct 2018 15:32:13 +0200 Subject: [PATCH 2/6] Merge branch 'master' of https://github.com/Automattic/node-canvas Conflicts: test/image.test.js --- src/Image.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Image.cc b/src/Image.cc index 156d59417..1c152dad0 100644 --- a/src/Image.cc +++ b/src/Image.cc @@ -200,7 +200,7 @@ NAN_GETTER(Image::GetRawData) { cairo_surface_t *surface = img->_surface; cairo_surface_flush(surface); const unsigned char *data = cairo_image_surface_get_data(surface); - unsigned int nBytes = img->width * img->height * 4; + unsigned int nBytes = cairo_image_surface_get_stride(surface) * img->height Local buf = Nan::CopyBuffer(reinterpret_cast(data), nBytes).ToLocalChecked(); info.GetReturnValue().Set(buf); } else { From 6e12069bfe8603fe0bc5f35b6495442021d57853 Mon Sep 17 00:00:00 2001 From: basvanmeurs Date: Thu, 24 Jan 2019 13:06:55 +0100 Subject: [PATCH 3/6] fix(syntax error) --- src/Image.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Image.cc b/src/Image.cc index 1c152dad0..6c076e988 100644 --- a/src/Image.cc +++ b/src/Image.cc @@ -200,7 +200,7 @@ NAN_GETTER(Image::GetRawData) { cairo_surface_t *surface = img->_surface; cairo_surface_flush(surface); const unsigned char *data = cairo_image_surface_get_data(surface); - unsigned int nBytes = cairo_image_surface_get_stride(surface) * img->height + unsigned int nBytes = cairo_image_surface_get_stride(surface) * img->height; Local buf = Nan::CopyBuffer(reinterpret_cast(data), nBytes).ToLocalChecked(); info.GetReturnValue().Set(buf); } else { From 4c85d9be0fbb9573430885d225910d740a7c7c78 Mon Sep 17 00:00:00 2001 From: basvanmeurs Date: Thu, 24 Jan 2019 13:16:13 +0100 Subject: [PATCH 4/6] merged with master --- src/Image.cc | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/src/Image.cc b/src/Image.cc index ca2649803..a8d016b24 100644 --- a/src/Image.cc +++ b/src/Image.cc @@ -61,6 +61,7 @@ Image::Initialize(Nan::ADDON_REGISTER_FUNCTION_ARGS_TYPE target) { SetProtoAccessor(proto, Nan::New("naturalWidth").ToLocalChecked(), GetNaturalWidth, NULL, ctor); SetProtoAccessor(proto, Nan::New("naturalHeight").ToLocalChecked(), GetNaturalHeight, NULL, ctor); SetProtoAccessor(proto, Nan::New("dataMode").ToLocalChecked(), GetDataMode, SetDataMode, ctor); + SetProtoAccessor(proto, Nan::New("rawData").ToLocalChecked(), GetRawData, NULL, ctor); ctor->Set(Nan::New("MODE_IMAGE").ToLocalChecked(), Nan::New(DATA_IMAGE)); ctor->Set(Nan::New("MODE_MIME").ToLocalChecked(), Nan::New(DATA_MIME)); @@ -185,6 +186,25 @@ NAN_METHOD(Image::GetSource){ info.GetReturnValue().Set(Nan::New(img->filename ? img->filename : "").ToLocalChecked()); } +/* + * Get raw data. + */ +NAN_GETTER(Image::GetRawData) { + Image *img = Nan::ObjectWrap::Unwrap(info.This()); + if (img->_surface) { + // Return raw ARGB data -- just a memcpy() + cairo_surface_t *surface = img->_surface; + cairo_surface_flush(surface); + const unsigned char *data = cairo_image_surface_get_data(surface); + unsigned int nBytes = cairo_image_surface_get_stride(surface) * img->height; + Local buf = Nan::CopyBuffer(reinterpret_cast(data), nBytes).ToLocalChecked(); + info.GetReturnValue().Set(buf); + } else { + info.GetReturnValue().Set(Nan::Undefined()); + } + return; +} + /* * Clean up assets and variables. */ From 2ca831519234d9cd7929d426cba0a89883450d6a Mon Sep 17 00:00:00 2001 From: basvanmeurs Date: Thu, 24 Jan 2019 13:18:28 +0100 Subject: [PATCH 5/6] cleanup(test): cleanup image.test.js --- test/image.test.js | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/test/image.test.js b/test/image.test.js index f62e2d26a..c015f84d9 100644 --- a/test/image.test.js +++ b/test/image.test.js @@ -115,12 +115,12 @@ describe('Image', function () { }) it('returns raw image data', function() { - var img = new Image(); - img.src = png_clock; - var buf = img.rawData; - assert.ok(buf instanceof Buffer); - assert.strictEqual(409600, img.rawData.length); - }); + const img = new Image(); + img.src = png_clock; + const buf = img.rawData; + assert.ok(buf instanceof Buffer); + assert.strictEqual(buf.length, 409600); + }) it('calls Image#onload multiple times', function () { return loadImage(png_clock).then((img) => { From 5dae310df49c9151ee3907eed990ee1bdf2e2c26 Mon Sep 17 00:00:00 2001 From: basvanmeurs Date: Tue, 26 Feb 2019 11:14:22 +0100 Subject: [PATCH 6/6] fix(build): force build instead of using prebuilt packages --- package.json | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/package.json b/package.json index 4631aa33e..78dd1dc26 100644 --- a/package.json +++ b/package.json @@ -28,8 +28,7 @@ "pretest": "standard examples/*.js test/server.js test/public/*.js benchmarks/run.js lib/context2d.js util/has_lib.js browser.js index.js && node-gyp build", "test": "mocha test/*.test.js", "pretest-server": "node-gyp build", - "test-server": "node test/server.js", - "install": "node-pre-gyp install --fallback-to-build" + "test-server": "node test/server.js" }, "binary": { "module_name": "canvas",