1 |
|
2 |
|
3 | #pragma once
|
4 |
|
5 | #include "cairo.h"
|
6 | #include "Canvas.h"
|
7 | #include "color.h"
|
8 | #include "nan.h"
|
9 | #include <pango/pangocairo.h>
|
10 |
|
11 | typedef enum {
|
12 | TEXT_DRAW_PATHS,
|
13 | TEXT_DRAW_GLYPHS
|
14 | } canvas_draw_mode_t;
|
15 |
|
16 |
|
17 |
|
18 |
|
19 |
|
20 |
|
21 |
|
22 |
|
23 | typedef struct {
|
24 | rgba_t fill;
|
25 | rgba_t stroke;
|
26 | cairo_filter_t patternQuality;
|
27 | cairo_pattern_t *fillPattern;
|
28 | cairo_pattern_t *strokePattern;
|
29 | cairo_pattern_t *fillGradient;
|
30 | cairo_pattern_t *strokeGradient;
|
31 | float globalAlpha;
|
32 | short textAlignment;
|
33 | short textBaseline;
|
34 | rgba_t shadow;
|
35 | int shadowBlur;
|
36 | double shadowOffsetX;
|
37 | double shadowOffsetY;
|
38 | canvas_draw_mode_t textDrawingMode;
|
39 | PangoFontDescription *fontDescription;
|
40 | bool imageSmoothingEnabled;
|
41 | } canvas_state_t;
|
42 |
|
43 |
|
44 |
|
45 |
|
46 |
|
47 |
|
48 |
|
49 |
|
50 | typedef struct {
|
51 | float x;
|
52 | float y;
|
53 | float width;
|
54 | float height;
|
55 | } float_rectangle;
|
56 |
|
57 | void state_assign_fontFamily(canvas_state_t *state, const char *str);
|
58 |
|
59 | class Context2d: public Nan::ObjectWrap {
|
60 | public:
|
61 | short stateno;
|
62 | canvas_state_t *states[CANVAS_MAX_STATES];
|
63 | canvas_state_t *state;
|
64 | Context2d(Canvas *canvas);
|
65 | static Nan::Persistent<v8::Function> _DOMMatrix;
|
66 | static Nan::Persistent<v8::Function> _parseFont;
|
67 | static Nan::Persistent<v8::FunctionTemplate> constructor;
|
68 | static void Initialize(Nan::ADDON_REGISTER_FUNCTION_ARGS_TYPE target);
|
69 | static NAN_METHOD(New);
|
70 | static NAN_METHOD(SaveExternalModules);
|
71 | static NAN_METHOD(DrawImage);
|
72 | static NAN_METHOD(PutImageData);
|
73 | static NAN_METHOD(Save);
|
74 | static NAN_METHOD(Restore);
|
75 | static NAN_METHOD(Rotate);
|
76 | static NAN_METHOD(Translate);
|
77 | static NAN_METHOD(Scale);
|
78 | static NAN_METHOD(Transform);
|
79 | static NAN_METHOD(ResetTransform);
|
80 | static NAN_METHOD(SetTransform);
|
81 | static NAN_METHOD(IsPointInPath);
|
82 | static NAN_METHOD(BeginPath);
|
83 | static NAN_METHOD(ClosePath);
|
84 | static NAN_METHOD(AddPage);
|
85 | static NAN_METHOD(Clip);
|
86 | static NAN_METHOD(Fill);
|
87 | static NAN_METHOD(Stroke);
|
88 | static NAN_METHOD(FillText);
|
89 | static NAN_METHOD(StrokeText);
|
90 | static NAN_METHOD(SetFont);
|
91 | static NAN_METHOD(SetFillColor);
|
92 | static NAN_METHOD(SetStrokeColor);
|
93 | static NAN_METHOD(SetStrokePattern);
|
94 | static NAN_METHOD(SetTextAlignment);
|
95 | static NAN_METHOD(SetLineDash);
|
96 | static NAN_METHOD(GetLineDash);
|
97 | static NAN_METHOD(MeasureText);
|
98 | static NAN_METHOD(BezierCurveTo);
|
99 | static NAN_METHOD(QuadraticCurveTo);
|
100 | static NAN_METHOD(LineTo);
|
101 | static NAN_METHOD(MoveTo);
|
102 | static NAN_METHOD(FillRect);
|
103 | static NAN_METHOD(StrokeRect);
|
104 | static NAN_METHOD(ClearRect);
|
105 | static NAN_METHOD(Rect);
|
106 | static NAN_METHOD(Arc);
|
107 | static NAN_METHOD(ArcTo);
|
108 | static NAN_METHOD(Ellipse);
|
109 | static NAN_METHOD(GetImageData);
|
110 | static NAN_METHOD(CreateImageData);
|
111 | static NAN_METHOD(GetStrokeColor);
|
112 | static NAN_METHOD(CreatePattern);
|
113 | static NAN_METHOD(CreateLinearGradient);
|
114 | static NAN_METHOD(CreateRadialGradient);
|
115 | static NAN_GETTER(GetFormat);
|
116 | static NAN_GETTER(GetPatternQuality);
|
117 | static NAN_GETTER(GetImageSmoothingEnabled);
|
118 | static NAN_GETTER(GetGlobalCompositeOperation);
|
119 | static NAN_GETTER(GetGlobalAlpha);
|
120 | static NAN_GETTER(GetShadowColor);
|
121 | static NAN_GETTER(GetMiterLimit);
|
122 | static NAN_GETTER(GetLineCap);
|
123 | static NAN_GETTER(GetLineJoin);
|
124 | static NAN_GETTER(GetLineWidth);
|
125 | static NAN_GETTER(GetLineDashOffset);
|
126 | static NAN_GETTER(GetShadowOffsetX);
|
127 | static NAN_GETTER(GetShadowOffsetY);
|
128 | static NAN_GETTER(GetShadowBlur);
|
129 | static NAN_GETTER(GetAntiAlias);
|
130 | static NAN_GETTER(GetTextDrawingMode);
|
131 | static NAN_GETTER(GetQuality);
|
132 | static NAN_GETTER(GetCurrentTransform);
|
133 | static NAN_GETTER(GetFillStyle);
|
134 | static NAN_GETTER(GetStrokeStyle);
|
135 | static NAN_GETTER(GetFont);
|
136 | static NAN_GETTER(GetTextBaseline);
|
137 | static NAN_GETTER(GetTextAlign);
|
138 | static NAN_SETTER(SetPatternQuality);
|
139 | static NAN_SETTER(SetImageSmoothingEnabled);
|
140 | static NAN_SETTER(SetGlobalCompositeOperation);
|
141 | static NAN_SETTER(SetGlobalAlpha);
|
142 | static NAN_SETTER(SetShadowColor);
|
143 | static NAN_SETTER(SetMiterLimit);
|
144 | static NAN_SETTER(SetLineCap);
|
145 | static NAN_SETTER(SetLineJoin);
|
146 | static NAN_SETTER(SetLineWidth);
|
147 | static NAN_SETTER(SetLineDashOffset);
|
148 | static NAN_SETTER(SetShadowOffsetX);
|
149 | static NAN_SETTER(SetShadowOffsetY);
|
150 | static NAN_SETTER(SetShadowBlur);
|
151 | static NAN_SETTER(SetAntiAlias);
|
152 | static NAN_SETTER(SetTextDrawingMode);
|
153 | static NAN_SETTER(SetQuality);
|
154 | static NAN_SETTER(SetCurrentTransform);
|
155 | static NAN_SETTER(SetFillStyle);
|
156 | static NAN_SETTER(SetStrokeStyle);
|
157 | static NAN_SETTER(SetFont);
|
158 | static NAN_SETTER(SetTextBaseline);
|
159 | static NAN_SETTER(SetTextAlign);
|
160 | inline void setContext(cairo_t *ctx) { _context = ctx; }
|
161 | inline cairo_t *context(){ return _context; }
|
162 | inline Canvas *canvas(){ return _canvas; }
|
163 | inline bool hasShadow();
|
164 | void inline setSourceRGBA(rgba_t color);
|
165 | void inline setSourceRGBA(cairo_t *ctx, rgba_t color);
|
166 | void setTextPath(double x, double y);
|
167 | void blur(cairo_surface_t *surface, int radius);
|
168 | void shadow(void (fn)(cairo_t *cr));
|
169 | void shadowStart();
|
170 | void shadowApply();
|
171 | void savePath();
|
172 | void restorePath();
|
173 | void saveState();
|
174 | void restoreState();
|
175 | void inline setFillRule(v8::Local<v8::Value> value);
|
176 | void fill(bool preserve = false);
|
177 | void stroke(bool preserve = false);
|
178 | void save();
|
179 | void restore();
|
180 | void setFontFromState();
|
181 | void resetState(bool init = false);
|
182 | inline PangoLayout *layout(){ return _layout; }
|
183 |
|
184 | private:
|
185 | ~Context2d();
|
186 | void _resetPersistentHandles();
|
187 | v8::Local<v8::Value> _getFillColor();
|
188 | v8::Local<v8::Value> _getStrokeColor();
|
189 | void _setFillColor(v8::Local<v8::Value> arg);
|
190 | void _setFillPattern(v8::Local<v8::Value> arg);
|
191 | void _setStrokeColor(v8::Local<v8::Value> arg);
|
192 | void _setStrokePattern(v8::Local<v8::Value> arg);
|
193 | Nan::Persistent<v8::Value> _fillStyle;
|
194 | Nan::Persistent<v8::Value> _strokeStyle;
|
195 | Nan::Persistent<v8::Value> _font;
|
196 | Nan::Persistent<v8::Value> _textBaseline;
|
197 | Nan::Persistent<v8::Value> _textAlign;
|
198 | Canvas *_canvas;
|
199 | cairo_t *_context;
|
200 | cairo_path_t *_path;
|
201 | PangoLayout *_layout;
|
202 | };
|