1 |
|
2 |
|
3 | #include "CanvasPattern.h"
|
4 |
|
5 | #include "Canvas.h"
|
6 | #include "Image.h"
|
7 |
|
8 | using namespace v8;
|
9 |
|
10 | const cairo_user_data_key_t *pattern_repeat_key;
|
11 |
|
12 | Nan::Persistent<FunctionTemplate> Pattern::constructor;
|
13 |
|
14 |
|
15 |
|
16 |
|
17 |
|
18 | void
|
19 | Pattern::Initialize(Nan::ADDON_REGISTER_FUNCTION_ARGS_TYPE target) {
|
20 | Nan::HandleScope scope;
|
21 |
|
22 |
|
23 | Local<FunctionTemplate> ctor = Nan::New<FunctionTemplate>(Pattern::New);
|
24 | constructor.Reset(ctor);
|
25 | ctor->InstanceTemplate()->SetInternalFieldCount(1);
|
26 | ctor->SetClassName(Nan::New("CanvasPattern").ToLocalChecked());
|
27 |
|
28 | ctor->InstanceTemplate()->SetInternalFieldCount(1);
|
29 | ctor->SetClassName(Nan::New("CanvasPattern").ToLocalChecked());
|
30 |
|
31 |
|
32 | Local<Context> ctx = Nan::GetCurrentContext();
|
33 | Nan::Set(target,
|
34 | Nan::New("CanvasPattern").ToLocalChecked(),
|
35 | ctor->GetFunction(ctx).ToLocalChecked());
|
36 | }
|
37 |
|
38 |
|
39 |
|
40 |
|
41 |
|
42 | NAN_METHOD(Pattern::New) {
|
43 | if (!info.IsConstructCall()) {
|
44 | return Nan::ThrowTypeError("Class constructors cannot be invoked without 'new'");
|
45 | }
|
46 |
|
47 | cairo_surface_t *surface;
|
48 |
|
49 | Local<Object> obj = Nan::To<Object>(info[0]).ToLocalChecked();
|
50 |
|
51 |
|
52 | if (Nan::New(Image::constructor)->HasInstance(obj)) {
|
53 | Image *img = Nan::ObjectWrap::Unwrap<Image>(obj);
|
54 | if (!img->isComplete()) {
|
55 | return Nan::ThrowError("Image given has not completed loading");
|
56 | }
|
57 | surface = img->surface();
|
58 |
|
59 |
|
60 | } else if (Nan::New(Canvas::constructor)->HasInstance(obj)) {
|
61 | Canvas *canvas = Nan::ObjectWrap::Unwrap<Canvas>(obj);
|
62 | surface = canvas->surface();
|
63 |
|
64 | } else {
|
65 | return Nan::ThrowTypeError("Image or Canvas expected");
|
66 | }
|
67 | repeat_type_t repeat = REPEAT;
|
68 | if (0 == strcmp("no-repeat", *Nan::Utf8String(info[1]))) {
|
69 | repeat = NO_REPEAT;
|
70 | } else if (0 == strcmp("repeat-x", *Nan::Utf8String(info[1]))) {
|
71 | repeat = REPEAT_X;
|
72 | } else if (0 == strcmp("repeat-y", *Nan::Utf8String(info[1]))) {
|
73 | repeat = REPEAT_Y;
|
74 | }
|
75 | Pattern *pattern = new Pattern(surface, repeat);
|
76 | pattern->Wrap(info.This());
|
77 | info.GetReturnValue().Set(info.This());
|
78 | }
|
79 |
|
80 |
|
81 |
|
82 |
|
83 |
|
84 | Pattern::Pattern(cairo_surface_t *surface, repeat_type_t repeat) {
|
85 | _pattern = cairo_pattern_create_for_surface(surface);
|
86 | _repeat = repeat;
|
87 | cairo_pattern_set_user_data(_pattern, pattern_repeat_key, &_repeat, NULL);
|
88 | }
|
89 |
|
90 | repeat_type_t Pattern::get_repeat_type_for_cairo_pattern(cairo_pattern_t *pattern) {
|
91 | void *ud = cairo_pattern_get_user_data(pattern, pattern_repeat_key);
|
92 | return *reinterpret_cast<repeat_type_t*>(ud);
|
93 | }
|
94 |
|
95 |
|
96 |
|
97 |
|
98 |
|
99 | Pattern::~Pattern() {
|
100 | cairo_pattern_destroy(_pattern);
|
101 | }
|