UNPKG

6.59 kBtext/x-cView Raw
1// Copyright (c) 2010 LearnBoost <tj@learnboost.com>
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
11typedef enum {
12 TEXT_DRAW_PATHS,
13 TEXT_DRAW_GLYPHS
14} canvas_draw_mode_t;
15
16/*
17 * State struct.
18 *
19 * Used in conjunction with Save() / Restore() since
20 * cairo's gstate maintains only a single source pattern at a time.
21 */
22
23typedef 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 * Equivalent to a PangoRectangle but holds floats instead of ints
45 * (software pixels are stored here instead of pango units)
46 *
47 * Should be compatible with PANGO_ASCENT, PANGO_LBEARING, etc.
48 */
49
50typedef struct {
51 float x;
52 float y;
53 float width;
54 float height;
55} float_rectangle;
56
57void state_assign_fontFamily(canvas_state_t *state, const char *str);
58
59class 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};