SkLuaCanvas.cpp revision 779bf8a99dc7f03e5c43b26d4b85d7920ce89aee
1/*
2 * Copyright 2013 Google Inc.
3 *
4 * Use of this source code is governed by a BSD-style license that can be
5 * found in the LICENSE file.
6 */
7
8#include "SkLuaCanvas.h"
9#include "SkLua.h"
10
11extern "C" {
12    #include "lua.h"
13    #include "lauxlib.h"
14}
15
16class AutoCallLua : public SkLua {
17public:
18    AutoCallLua(lua_State* L, const char func[], const char verb[]) : INHERITED(L) {
19        lua_getglobal(L, func);
20        if (!lua_isfunction(L, -1)) {
21            int t = lua_type(L, -1);
22            SkDebugf("--- expected function %d\n", t);
23        }
24
25        lua_newtable(L);
26        this->pushString(verb, "verb");
27    }
28
29    ~AutoCallLua() {
30        lua_State* L = this->get();
31        if (lua_pcall(L, 1, 0, 0) != LUA_OK) {
32            SkDebugf("lua err: %s\n", lua_tostring(L, -1));
33        }
34        lua_settop(L, -1);
35    }
36
37private:
38    typedef SkLua INHERITED;
39};
40
41#define AUTO_LUA(verb)  AutoCallLua lua(fL, fFunc.c_str(), verb)
42
43///////////////////////////////////////////////////////////////////////////////
44
45void SkLuaCanvas::pushThis() {
46    SkLua(fL).pushCanvas(this);
47}
48
49///////////////////////////////////////////////////////////////////////////////
50
51static SkBitmap make_bm(int width, int height) {
52    SkBitmap bm;
53    bm.setConfig(SkBitmap::kNo_Config, width, height);
54    return bm;
55}
56
57SkLuaCanvas::SkLuaCanvas(int width, int height, lua_State* L, const char func[])
58    : INHERITED(make_bm(width, height))
59    , fL(L)
60    , fFunc(func) {
61}
62
63SkLuaCanvas::~SkLuaCanvas() {}
64
65int SkLuaCanvas::save(SaveFlags flags) {
66    AUTO_LUA("save");
67    return this->INHERITED::save(flags);
68}
69
70int SkLuaCanvas::saveLayer(const SkRect* bounds, const SkPaint* paint,
71                             SaveFlags flags) {
72    AUTO_LUA("saveLayer");
73    if (bounds) {
74        lua.pushRect(*bounds, "bounds");
75    }
76    if (paint) {
77        lua.pushPaint(*paint, "paint");
78    }
79    return this->INHERITED::save(flags);
80}
81
82void SkLuaCanvas::restore() {
83    AUTO_LUA("restore");
84    this->INHERITED::restore();
85}
86
87bool SkLuaCanvas::translate(SkScalar dx, SkScalar dy) {
88    AUTO_LUA("translate");
89    lua.pushScalar(dx, "dx");
90    lua.pushScalar(dy, "dy");
91    return this->INHERITED::translate(dx, dy);
92}
93
94bool SkLuaCanvas::scale(SkScalar sx, SkScalar sy) {
95    AUTO_LUA("scale");
96    lua.pushScalar(sx, "sx");
97    lua.pushScalar(sy, "sy");
98    return this->INHERITED::scale(sx, sy);
99}
100
101bool SkLuaCanvas::rotate(SkScalar degrees) {
102    AUTO_LUA("rotate");
103    lua.pushScalar(degrees, "degrees");
104    return this->INHERITED::rotate(degrees);
105}
106
107bool SkLuaCanvas::skew(SkScalar kx, SkScalar ky) {
108    AUTO_LUA("skew");
109    lua.pushScalar(kx, "kx");
110    lua.pushScalar(ky, "ky");
111    return this->INHERITED::skew(kx, ky);
112}
113
114bool SkLuaCanvas::concat(const SkMatrix& matrix) {
115    AUTO_LUA("concat");
116    return this->INHERITED::concat(matrix);
117}
118
119void SkLuaCanvas::setMatrix(const SkMatrix& matrix) {
120    this->INHERITED::setMatrix(matrix);
121}
122
123bool SkLuaCanvas::clipRect(const SkRect& r, SkRegion::Op op, bool doAA) {
124    AUTO_LUA("clipRect");
125    lua.pushRect(r, "rect");
126    lua.pushBool(doAA, "aa");
127    return this->INHERITED::clipRect(r, op, doAA);
128}
129
130bool SkLuaCanvas::clipRRect(const SkRRect& rrect, SkRegion::Op op, bool doAA) {
131    AUTO_LUA("clipRRect");
132    lua.pushRRect(rrect, "rrect");
133    lua.pushBool(doAA, "aa");
134    return this->INHERITED::clipRRect(rrect, op, doAA);
135}
136
137bool SkLuaCanvas::clipPath(const SkPath& path, SkRegion::Op op, bool doAA) {
138    AUTO_LUA("clipPath");
139    lua.pushPath(path, "path");
140    lua.pushBool(doAA, "aa");
141    return this->INHERITED::clipPath(path, op, doAA);
142}
143
144bool SkLuaCanvas::clipRegion(const SkRegion& deviceRgn, SkRegion::Op op) {
145    AUTO_LUA("clipRegion");
146    return this->INHERITED::clipRegion(deviceRgn, op);
147}
148
149void SkLuaCanvas::drawPaint(const SkPaint& paint) {
150    AUTO_LUA("drawPaint");
151    lua.pushPaint(paint, "paint");
152}
153
154void SkLuaCanvas::drawPoints(PointMode mode, size_t count,
155                               const SkPoint pts[], const SkPaint& paint) {
156    AUTO_LUA("drawPoints");
157    lua.pushPaint(paint, "paint");
158}
159
160void SkLuaCanvas::drawOval(const SkRect& rect, const SkPaint& paint) {
161    AUTO_LUA("drawOval");
162    lua.pushRect(rect, "rect");
163    lua.pushPaint(paint, "paint");
164}
165
166void SkLuaCanvas::drawRect(const SkRect& rect, const SkPaint& paint) {
167    AUTO_LUA("drawRect");
168    lua.pushRect(rect, "rect");
169    lua.pushPaint(paint, "paint");
170}
171
172void SkLuaCanvas::drawRRect(const SkRRect& rrect, const SkPaint& paint) {
173    AUTO_LUA("drawRRect");
174    lua.pushRRect(rrect, "rrect");
175    lua.pushPaint(paint, "paint");
176}
177
178void SkLuaCanvas::drawPath(const SkPath& path, const SkPaint& paint) {
179    AUTO_LUA("drawPath");
180    lua.pushPath(path, "path");
181    lua.pushPaint(paint, "paint");
182}
183
184void SkLuaCanvas::drawBitmap(const SkBitmap& bitmap, SkScalar x, SkScalar y,
185                               const SkPaint* paint) {
186    AUTO_LUA("drawBitmap");
187    if (paint) {
188        lua.pushPaint(*paint, "paint");
189    }
190}
191
192void SkLuaCanvas::drawBitmapRectToRect(const SkBitmap& bitmap, const SkRect* src,
193                                   const SkRect& dst, const SkPaint* paint) {
194    AUTO_LUA("drawBitmapRectToRect");
195    if (paint) {
196        lua.pushPaint(*paint, "paint");
197    }
198}
199
200void SkLuaCanvas::drawBitmapMatrix(const SkBitmap& bitmap, const SkMatrix& m,
201                                     const SkPaint* paint) {
202    AUTO_LUA("drawBitmapMatrix");
203    if (paint) {
204        lua.pushPaint(*paint, "paint");
205    }
206}
207
208void SkLuaCanvas::drawSprite(const SkBitmap& bitmap, int x, int y,
209                               const SkPaint* paint) {
210    AUTO_LUA("drawSprite");
211    if (paint) {
212        lua.pushPaint(*paint, "paint");
213    }
214}
215
216void SkLuaCanvas::drawText(const void* text, size_t byteLength, SkScalar x,
217                             SkScalar y, const SkPaint& paint) {
218    AUTO_LUA("drawText");
219    lua.pushPaint(paint, "paint");
220}
221
222void SkLuaCanvas::drawPosText(const void* text, size_t byteLength,
223                                const SkPoint pos[], const SkPaint& paint) {
224    AUTO_LUA("drawPosText");
225    lua.pushPaint(paint, "paint");
226}
227
228void SkLuaCanvas::drawPosTextH(const void* text, size_t byteLength,
229                                 const SkScalar xpos[], SkScalar constY,
230                                 const SkPaint& paint) {
231    AUTO_LUA("drawPosTextH");
232    lua.pushPaint(paint, "paint");
233}
234
235void SkLuaCanvas::drawTextOnPath(const void* text, size_t byteLength,
236                                   const SkPath& path, const SkMatrix* matrix,
237                                   const SkPaint& paint) {
238    AUTO_LUA("drawTextOnPath");
239    lua.pushPath(path, "path");
240    lua.pushPaint(paint, "paint");
241}
242
243void SkLuaCanvas::drawPicture(SkPicture& picture) {
244    AUTO_LUA("drawPicture");
245    // call through so we can see the nested picture ops
246    this->INHERITED::drawPicture(picture);
247}
248
249void SkLuaCanvas::drawVertices(VertexMode vmode, int vertexCount,
250                                 const SkPoint vertices[], const SkPoint texs[],
251                                 const SkColor colors[], SkXfermode* xmode,
252                                 const uint16_t indices[], int indexCount,
253                                 const SkPaint& paint) {
254    AUTO_LUA("drawVertices");
255    lua.pushPaint(paint, "paint");
256}
257
258void SkLuaCanvas::drawData(const void* data, size_t length) {
259    AUTO_LUA("drawData");
260}
261