Skip to content
Open
Show file tree
Hide file tree
Changes from 5 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ project adheres to [Semantic Versioning](http://semver.org/).
==================
### Changed
### Added
* support nodejs worker
### Fixed
* Stringify CanvasGradient, CanvasPattern and ImageData like browsers do. (#1639, #1646)
* Add missing include for `toupper`.
Expand Down
23 changes: 16 additions & 7 deletions src/Canvas.cc
Original file line number Diff line number Diff line change
Expand Up @@ -38,7 +38,7 @@
using namespace v8;
using namespace std;

Nan::Persistent<FunctionTemplate> Canvas::constructor;
const char *Canvas::ctor_name = "Canvas";

std::vector<FontFace> font_face_list;

Expand All @@ -52,9 +52,8 @@ Canvas::Initialize(Nan::ADDON_REGISTER_FUNCTION_ARGS_TYPE target) {

// Constructor
Local<FunctionTemplate> ctor = Nan::New<FunctionTemplate>(Canvas::New);
constructor.Reset(ctor);
ctor->InstanceTemplate()->SetInternalFieldCount(1);
ctor->SetClassName(Nan::New("Canvas").ToLocalChecked());
ctor->SetClassName(Nan::New(ctor_name).ToLocalChecked());

// Prototype
Local<ObjectTemplate> proto = ctor->PrototypeTemplate();
Expand Down Expand Up @@ -83,7 +82,7 @@ Canvas::Initialize(Nan::ADDON_REGISTER_FUNCTION_ARGS_TYPE target) {

Local<Context> ctx = Nan::GetCurrentContext();
Nan::Set(target,
Nan::New("Canvas").ToLocalChecked(),
Nan::New(ctor_name).ToLocalChecked(),
ctor->GetFunction(ctx).ToLocalChecked());
}

Expand Down Expand Up @@ -114,9 +113,19 @@ NAN_METHOD(Canvas::New) {
backend = new ImageBackend(width, height);
}
else if (info[0]->IsObject()) {
if (Nan::New(ImageBackend::constructor)->HasInstance(info[0]) ||
Nan::New(PdfBackend::constructor)->HasInstance(info[0]) ||
Nan::New(SvgBackend::constructor)->HasInstance(info[0])) {
Local<Object> backends_obj = getFromExports("Backends").As<Object>();
Local<Function> image_backend = Nan::Get(backends_obj, Nan::New<String>(ImageBackend::ctor_name).ToLocalChecked())
.ToLocalChecked()
.As<Function>();
Local<Function> pdf_backend = Nan::Get(backends_obj, Nan::New<String>(PdfBackend::ctor_name).ToLocalChecked())
.ToLocalChecked()
.As<Function>();
Local<Function> svg_backend = Nan::Get(backends_obj, Nan::New<String>(SvgBackend::ctor_name).ToLocalChecked())
.ToLocalChecked()
.As<Function>();
if (info[0]->InstanceOf(Nan::GetCurrentContext(), image_backend).FromJust() ||
info[0]->InstanceOf(Nan::GetCurrentContext(), pdf_backend).FromJust() ||
info[0]->InstanceOf(Nan::GetCurrentContext(), svg_backend).FromJust()) {
backend = Nan::ObjectWrap::Unwrap<Backend>(Nan::To<Object>(info[0]).ToLocalChecked());
}else{
return Nan::ThrowTypeError("Invalid arguments");
Expand Down
2 changes: 1 addition & 1 deletion src/Canvas.h
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,7 @@ class FontFace {

class Canvas: public Nan::ObjectWrap {
public:
static Nan::Persistent<v8::FunctionTemplate> constructor;
static const char *ctor_name;
static void Initialize(Nan::ADDON_REGISTER_FUNCTION_ARGS_TYPE target);
static NAN_METHOD(New);
static NAN_METHOD(ToBuffer);
Expand Down
7 changes: 3 additions & 4 deletions src/CanvasGradient.cc
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@

using namespace v8;

Nan::Persistent<FunctionTemplate> Gradient::constructor;
const char *Gradient::ctor_name = "CanvasGradient";

/*
* Initialize CanvasGradient.
Expand All @@ -19,15 +19,14 @@ Gradient::Initialize(Nan::ADDON_REGISTER_FUNCTION_ARGS_TYPE target) {

// Constructor
Local<FunctionTemplate> ctor = Nan::New<FunctionTemplate>(Gradient::New);
constructor.Reset(ctor);
ctor->InstanceTemplate()->SetInternalFieldCount(1);
ctor->SetClassName(Nan::New("CanvasGradient").ToLocalChecked());
ctor->SetClassName(Nan::New(ctor_name).ToLocalChecked());

// Prototype
Nan::SetPrototypeMethod(ctor, "addColorStop", AddColorStop);
Local<Context> ctx = Nan::GetCurrentContext();
Nan::Set(target,
Nan::New("CanvasGradient").ToLocalChecked(),
Nan::New(ctor_name).ToLocalChecked(),
ctor->GetFunction(ctx).ToLocalChecked());
}

Expand Down
3 changes: 2 additions & 1 deletion src/CanvasGradient.h
Original file line number Diff line number Diff line change
Expand Up @@ -5,10 +5,11 @@
#include <nan.h>
#include <v8.h>
#include <cairo.h>
#include <map>

class Gradient: public Nan::ObjectWrap {
public:
static Nan::Persistent<v8::FunctionTemplate> constructor;
static const char *ctor_name;
static void Initialize(Nan::ADDON_REGISTER_FUNCTION_ARGS_TYPE target);
static NAN_METHOD(New);
static NAN_METHOD(AddColorStop);
Expand Down
28 changes: 18 additions & 10 deletions src/CanvasPattern.cc
Original file line number Diff line number Diff line change
Expand Up @@ -2,15 +2,15 @@

#include "CanvasPattern.h"

#include "Util.h"
#include "Canvas.h"
#include "Image.h"

using namespace v8;

const cairo_user_data_key_t *pattern_repeat_key;

Nan::Persistent<FunctionTemplate> Pattern::constructor;
Nan::Persistent<Function> Pattern::_DOMMatrix;
const char *Pattern::ctor_name = "CanvasPattern";
const char *Pattern::dom_matrix_name = "CanvasPattern_DOMMatrix";

/*
* Initialize CanvasPattern.
Expand All @@ -22,14 +22,13 @@ Pattern::Initialize(Nan::ADDON_REGISTER_FUNCTION_ARGS_TYPE target) {

// Constructor
Local<FunctionTemplate> ctor = Nan::New<FunctionTemplate>(Pattern::New);
constructor.Reset(ctor);
ctor->InstanceTemplate()->SetInternalFieldCount(1);
ctor->SetClassName(Nan::New("CanvasPattern").ToLocalChecked());
ctor->SetClassName(Nan::New(ctor_name).ToLocalChecked());
Nan::SetPrototypeMethod(ctor, "setTransform", SetTransform);

// Prototype
Local<Context> ctx = Nan::GetCurrentContext();
Nan::Set(target, Nan::New("CanvasPattern").ToLocalChecked(), ctor->GetFunction(ctx).ToLocalChecked());
Nan::Set(target, Nan::New(ctor_name).ToLocalChecked(), ctor->GetFunction(ctx).ToLocalChecked());
Nan::Set(target, Nan::New("CanvasPatternInit").ToLocalChecked(), Nan::New<Function>(SaveExternalModules));
}

Expand All @@ -38,7 +37,13 @@ Pattern::Initialize(Nan::ADDON_REGISTER_FUNCTION_ARGS_TYPE target) {
*/

NAN_METHOD(Pattern::SaveExternalModules) {
_DOMMatrix.Reset(Nan::To<Function>(info[0]).ToLocalChecked());
Local<String> DOMMatrixName = Nan::New<String>("CanvasPattern_DOMMatrix").ToLocalChecked();
Local<Object> exports = Nan::Get(Nan::GetCurrentContext()->Global(), Nan::New<String>("__node_canvas").ToLocalChecked())
.ToLocalChecked()
.As<Object>();

Nan::Set(exports, DOMMatrixName, Nan::To<Function>(info[0]).ToLocalChecked());
// _DOMMatrix.Reset(Nan::To<Function>(info[0]).ToLocalChecked());
}

/*
Expand All @@ -53,17 +58,19 @@ NAN_METHOD(Pattern::New) {
cairo_surface_t *surface;

Local<Object> obj = Nan::To<Object>(info[0]).ToLocalChecked();
Local<Function> canvas_ctor = getFromExports(Canvas::ctor_name).As<Function>();
Local<Function> image_ctor = getFromExports(Image::ctor_name).As<Function>();

// Image
if (Nan::New(Image::constructor)->HasInstance(obj)) {
if (obj->InstanceOf(Nan::GetCurrentContext(), image_ctor).FromJust()) {
Image *img = Nan::ObjectWrap::Unwrap<Image>(obj);
if (!img->isComplete()) {
return Nan::ThrowError("Image given has not completed loading");
}
surface = img->surface();

// Canvas
} else if (Nan::New(Canvas::constructor)->HasInstance(obj)) {
} else if (obj->InstanceOf(Nan::GetCurrentContext(), canvas_ctor).FromJust()) {
Canvas *canvas = Nan::ObjectWrap::Unwrap<Canvas>(obj);
surface = canvas->surface();
// Invalid
Expand Down Expand Up @@ -92,7 +99,8 @@ NAN_METHOD(Pattern::SetTransform) {
Local<Object> mat = Nan::To<Object>(info[0]).ToLocalChecked();

#if NODE_MAJOR_VERSION >= 8
if (!mat->InstanceOf(ctx, _DOMMatrix.Get(Isolate::GetCurrent())).ToChecked()) {
Local<Function> _DOMMatrix = getFromExports(dom_matrix_name).As<Function>();
if (!mat->InstanceOf(ctx, _DOMMatrix).ToChecked()) {
return Nan::ThrowTypeError("Expected DOMMatrix");
}
#endif
Expand Down
4 changes: 2 additions & 2 deletions src/CanvasPattern.h
Original file line number Diff line number Diff line change
Expand Up @@ -21,8 +21,8 @@ extern const cairo_user_data_key_t *pattern_repeat_key;

class Pattern: public Nan::ObjectWrap {
public:
static Nan::Persistent<v8::FunctionTemplate> constructor;
static Nan::Persistent<v8::Function> _DOMMatrix;
static const char *ctor_name;
static const char *dom_matrix_name;
static void Initialize(Nan::ADDON_REGISTER_FUNCTION_ARGS_TYPE target);
static NAN_METHOD(New);
static NAN_METHOD(SaveExternalModules);
Expand Down
Loading