UNPKG

2.73 kBtext/x-cView Raw
1// Copyright (c) 2010 LearnBoost <tj@learnboost.com>
2
3#include "CanvasPattern.h"
4
5#include "Canvas.h"
6#include "Image.h"
7
8using namespace v8;
9
10const cairo_user_data_key_t *pattern_repeat_key;
11
12Nan::Persistent<FunctionTemplate> Pattern::constructor;
13
14/*
15 * Initialize CanvasPattern.
16 */
17
18void
19Pattern::Initialize(Nan::ADDON_REGISTER_FUNCTION_ARGS_TYPE target) {
20 Nan::HandleScope scope;
21
22 // Constructor
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 // Prototype
32 Local<Context> ctx = Nan::GetCurrentContext();
33 Nan::Set(target,
34 Nan::New("CanvasPattern").ToLocalChecked(),
35 ctor->GetFunction(ctx).ToLocalChecked());
36}
37
38/*
39 * Initialize a new CanvasPattern.
40 */
41
42NAN_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 // Image
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 // Canvas
60 } else if (Nan::New(Canvas::constructor)->HasInstance(obj)) {
61 Canvas *canvas = Nan::ObjectWrap::Unwrap<Canvas>(obj);
62 surface = canvas->surface();
63 // Invalid
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 * Initialize pattern.
82 */
83
84Pattern::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
90repeat_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 * Destroy the pattern.
97 */
98
99Pattern::~Pattern() {
100 cairo_pattern_destroy(_pattern);
101}