Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(204)

Side by Side Diff: src/utils/SkLuaCanvas.cpp

Issue 15563013: add SkPath as real lua object (Closed) Base URL: https://skia.googlecode.com/svn/trunk
Patch Set: Created 7 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « no previous file | tools/lua/scrape.lua » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 /* 1 /*
2 * Copyright 2013 Google Inc. 2 * Copyright 2013 Google Inc.
3 * 3 *
4 * Use of this source code is governed by a BSD-style license that can be 4 * Use of this source code is governed by a BSD-style license that can be
5 * found in the LICENSE file. 5 * found in the LICENSE file.
6 */ 6 */
7 7
8 #include "SkLuaCanvas.h" 8 #include "SkLuaCanvas.h"
9 #include "SkRRect.h" 9 #include "SkRRect.h"
10 10
(...skipping 19 matching lines...) Expand all
30 30
31 // sets [1]...[count] in the table on the top of the stack 31 // sets [1]...[count] in the table on the top of the stack
32 static void setfield_arrayf(lua_State* L, const SkScalar array[], int count) { 32 static void setfield_arrayf(lua_State* L, const SkScalar array[], int count) {
33 for (int i = 0; i < count; ++i) { 33 for (int i = 0; i < count; ++i) {
34 lua_pushnumber(L, SkScalarToDouble(i + 1)); // key 34 lua_pushnumber(L, SkScalarToDouble(i + 1)); // key
35 lua_pushnumber(L, SkScalarToDouble(array[i])); // value 35 lua_pushnumber(L, SkScalarToDouble(array[i])); // value
36 lua_settable(L, -3); 36 lua_settable(L, -3);
37 } 37 }
38 } 38 }
39 39
40 static void setfield_rect(lua_State* L, const char key[], const SkRect& r) { 40 static void push_rect(lua_State* L, const SkRect& r) {
41 lua_newtable(L); 41 lua_newtable(L);
42 setfield_number(L, "left", r.fLeft); 42 setfield_number(L, "left", r.fLeft);
43 setfield_number(L, "top", r.fTop); 43 setfield_number(L, "top", r.fTop);
44 setfield_number(L, "right", r.fRight); 44 setfield_number(L, "right", r.fRight);
45 setfield_number(L, "bottom", r.fBottom); 45 setfield_number(L, "bottom", r.fBottom);
46 }
47
48 static void setfield_rect(lua_State* L, const char key[], const SkRect& r) {
49 push_rect(L, r);
46 lua_setfield(L, -2, key); 50 lua_setfield(L, -2, key);
47 } 51 }
48 52
49 static const char* rrect_type(const SkRRect& rr) { 53 static const char* rrect_type(const SkRRect& rr) {
50 switch (rr.getType()) { 54 switch (rr.getType()) {
51 case SkRRect::kUnknown_Type: return "unknown"; 55 case SkRRect::kUnknown_Type: return "unknown";
52 case SkRRect::kEmpty_Type: return "empty"; 56 case SkRRect::kEmpty_Type: return "empty";
53 case SkRRect::kRect_Type: return "rect"; 57 case SkRRect::kRect_Type: return "rect";
54 case SkRRect::kOval_Type: return "oval"; 58 case SkRRect::kOval_Type: return "oval";
55 case SkRRect::kSimple_Type: return "simple"; 59 case SkRRect::kSimple_Type: return "simple";
(...skipping 109 matching lines...) Expand 10 before | Expand all | Expand 10 after
165 { "__gc", lcanvas_gc }, 169 { "__gc", lcanvas_gc },
166 { NULL, NULL } 170 { NULL, NULL }
167 }; 171 };
168 172
169 static void ensure_canvas_metatable(lua_State* L) { 173 static void ensure_canvas_metatable(lua_State* L) {
170 static bool gOnce; 174 static bool gOnce;
171 if (gOnce) { 175 if (gOnce) {
172 return; 176 return;
173 } 177 }
174 gOnce = true; 178 gOnce = true;
175 179
176 luaL_newmetatable(L, gCanvasMetaTableName); 180 luaL_newmetatable(L, gCanvasMetaTableName);
177 lua_pushvalue(L, -1); 181 lua_pushvalue(L, -1);
178 lua_setfield(L, -2, "__index"); 182 lua_setfield(L, -2, "__index");
179 183
180 luaL_setfuncs(L, gLuaCanvasMethods, 0); 184 luaL_setfuncs(L, gLuaCanvasMethods, 0);
181 lua_settop(L, -2); // pop off the meta-table 185 lua_settop(L, -2); // pop off the meta-table
182 } 186 }
183 187
188 ///////////////////////////////////////////////////////////////////////////////
189
190 static const char gPathMetaTableName[] = "SkPath_MetaTable";
191
192 static int lpath_getBounds(lua_State* L) {
193 SkPath* p = (SkPath*)luaL_checkudata(L, 1, gPathMetaTableName);
194 push_rect(L, p->getBounds());
195 return 1;
196 }
197
198 static int lpath_isEmpty(lua_State* L) {
199 SkPath* p = (SkPath*)luaL_checkudata(L, 1, gPathMetaTableName);
200 lua_pushboolean(L, p->isEmpty());
201 return 1;
202 }
203
204 static int lpath_isRect(lua_State* L) {
205 SkPath* p = (SkPath*)luaL_checkudata(L, 1, gPathMetaTableName);
206 SkRect r;
207 bool pred = p->isRect(&r);
208 int ret_count = 1;
209 lua_pushboolean(L, pred);
210 if (pred) {
211 push_rect(L, r);
212 ret_count += 1;
213 }
214 return ret_count;
215 }
216
217 static const char* dir2string(SkPath::Direction dir) {
218 static const char* gStr[] = {
219 "unknown", "cw", "ccw"
220 };
221 SkASSERT((unsigned)dir < SK_ARRAY_COUNT(gStr));
222 return gStr[dir];
223 }
224
225 static int lpath_isNestedRects(lua_State* L) {
226 SkPath* p = (SkPath*)luaL_checkudata(L, 1, gPathMetaTableName);
227 SkRect rects[2];
228 SkPath::Direction dirs[2];
229 bool pred = p->isNestedRects(rects, dirs);
230 int ret_count = 1;
231 lua_pushboolean(L, pred);
232 if (pred) {
233 push_rect(L, rects[0]);
234 push_rect(L, rects[1]);
235 lua_pushstring(L, dir2string(dirs[0]));
236 lua_pushstring(L, dir2string(dirs[0]));
237 ret_count += 4;
238 }
239 return ret_count;
240 return 1;
241 }
242
243 static int lpath_gc(lua_State* L) {
244 SkPath* p = (SkPath*)luaL_checkudata(L, 1, gPathMetaTableName);
245 p->~SkPath();
246 return 0;
247 }
248
249 static const struct luaL_Reg gLuaPathMethods[] = {
250 { "getBounds", lpath_getBounds },
251 { "isEmpty", lpath_isEmpty },
252 { "isRect", lpath_isRect },
253 { "isNestedRects", lpath_isNestedRects },
254 { "__gc", lpath_gc },
255 { NULL, NULL }
256 };
257
258 static void ensure_path_metatable(lua_State* L) {
259 static bool gOnce;
260 if (gOnce) {
261 return;
262 }
263 gOnce = true;
264
265 luaL_newmetatable(L, gPathMetaTableName);
266 lua_pushvalue(L, -1);
267 lua_setfield(L, -2, "__index");
268
269 luaL_setfuncs(L, gLuaPathMethods, 0);
270 lua_settop(L, -2); // pop off the meta-table
271 }
272
273 static void push_path(lua_State* L, const SkPath& src) {
274 ensure_path_metatable(L);
275
276 SkPath* path = (SkPath*)lua_newuserdata(L, sizeof(SkPath));
277 new (path) SkPath(src);
278
279 luaL_getmetatable(L, gPathMetaTableName);
280 lua_setmetatable(L, -2);
281 }
282
283 static void setfield_path(lua_State* L, const char key[], const SkPath& path) {
284 push_path(L, path);
285 lua_setfield(L, -2, key);
286 }
287
288 ///////////////////////////////////////////////////////////////////////////////
289
184 void SkLuaCanvas::pushThis() { 290 void SkLuaCanvas::pushThis() {
185 ensure_canvas_metatable(fL); 291 ensure_canvas_metatable(fL);
186 292
187 SkCanvas** canvasPtr = (SkCanvas**)lua_newuserdata(fL, sizeof(SkCanvas*)); 293 SkCanvas** canvasPtr = (SkCanvas**)lua_newuserdata(fL, sizeof(SkCanvas*));
188 luaL_getmetatable(fL, gCanvasMetaTableName); 294 luaL_getmetatable(fL, gCanvasMetaTableName);
189 lua_setmetatable(fL, -2); 295 lua_setmetatable(fL, -2);
190 296
191 this->ref(); 297 this->ref();
192 *canvasPtr = this; 298 *canvasPtr = this;
193 } 299 }
(...skipping 81 matching lines...) Expand 10 before | Expand all | Expand 10 after
275 381
276 bool SkLuaCanvas::clipRRect(const SkRRect& rrect, SkRegion::Op op, bool doAA) { 382 bool SkLuaCanvas::clipRRect(const SkRRect& rrect, SkRegion::Op op, bool doAA) {
277 AUTO_LUA("clipRRect"); 383 AUTO_LUA("clipRRect");
278 setfield_rrect(fL, "rrect", rrect); 384 setfield_rrect(fL, "rrect", rrect);
279 setfield_bool(fL, "aa", doAA); 385 setfield_bool(fL, "aa", doAA);
280 return this->INHERITED::clipRRect(rrect, op, doAA); 386 return this->INHERITED::clipRRect(rrect, op, doAA);
281 } 387 }
282 388
283 bool SkLuaCanvas::clipPath(const SkPath& path, SkRegion::Op op, bool doAA) { 389 bool SkLuaCanvas::clipPath(const SkPath& path, SkRegion::Op op, bool doAA) {
284 AUTO_LUA("clipPath"); 390 AUTO_LUA("clipPath");
391 setfield_path(fL, "path", path);
285 setfield_bool(fL, "aa", doAA); 392 setfield_bool(fL, "aa", doAA);
286 return this->INHERITED::clipPath(path, op, doAA); 393 return this->INHERITED::clipPath(path, op, doAA);
287 } 394 }
288 395
289 bool SkLuaCanvas::clipRegion(const SkRegion& deviceRgn, SkRegion::Op op) { 396 bool SkLuaCanvas::clipRegion(const SkRegion& deviceRgn, SkRegion::Op op) {
290 AUTO_LUA("clipRegion"); 397 AUTO_LUA("clipRegion");
291 return this->INHERITED::clipRegion(deviceRgn, op); 398 return this->INHERITED::clipRegion(deviceRgn, op);
292 } 399 }
293 400
294 void SkLuaCanvas::drawPaint(const SkPaint& paint) { 401 void SkLuaCanvas::drawPaint(const SkPaint& paint) {
(...skipping 20 matching lines...) Expand all
315 } 422 }
316 423
317 void SkLuaCanvas::drawRRect(const SkRRect& rrect, const SkPaint& paint) { 424 void SkLuaCanvas::drawRRect(const SkRRect& rrect, const SkPaint& paint) {
318 AUTO_LUA("drawRRect"); 425 AUTO_LUA("drawRRect");
319 setfield_rrect(fL, "rrect", rrect); 426 setfield_rrect(fL, "rrect", rrect);
320 setfield_paint(fL, paint); 427 setfield_paint(fL, paint);
321 } 428 }
322 429
323 void SkLuaCanvas::drawPath(const SkPath& path, const SkPaint& paint) { 430 void SkLuaCanvas::drawPath(const SkPath& path, const SkPaint& paint) {
324 AUTO_LUA("drawPath"); 431 AUTO_LUA("drawPath");
325 setfield_rect(fL, "bounds", path.getBounds()); 432 setfield_path(fL, "path", path);
326 setfield_bool(fL, "isRect", path.isRect(NULL));
327 setfield_bool(fL, "isOval", path.isOval(NULL));
328 setfield_paint(fL, paint); 433 setfield_paint(fL, paint);
329 } 434 }
330 435
331 void SkLuaCanvas::drawBitmap(const SkBitmap& bitmap, SkScalar x, SkScalar y, 436 void SkLuaCanvas::drawBitmap(const SkBitmap& bitmap, SkScalar x, SkScalar y,
332 const SkPaint* paint) { 437 const SkPaint* paint) {
333 AUTO_LUA("drawBitmap"); 438 AUTO_LUA("drawBitmap");
334 if (paint) { 439 if (paint) {
335 setfield_paint(fL, *paint, kImage_PaintUsage); 440 setfield_paint(fL, *paint, kImage_PaintUsage);
336 } 441 }
337 } 442 }
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after
376 const SkScalar xpos[], SkScalar constY, 481 const SkScalar xpos[], SkScalar constY,
377 const SkPaint& paint) { 482 const SkPaint& paint) {
378 AUTO_LUA("drawPosTextH"); 483 AUTO_LUA("drawPosTextH");
379 setfield_paint(fL, paint, kText_PaintUsage); 484 setfield_paint(fL, paint, kText_PaintUsage);
380 } 485 }
381 486
382 void SkLuaCanvas::drawTextOnPath(const void* text, size_t byteLength, 487 void SkLuaCanvas::drawTextOnPath(const void* text, size_t byteLength,
383 const SkPath& path, const SkMatrix* matrix, 488 const SkPath& path, const SkMatrix* matrix,
384 const SkPaint& paint) { 489 const SkPaint& paint) {
385 AUTO_LUA("drawTextOnPath"); 490 AUTO_LUA("drawTextOnPath");
491 setfield_path(fL, "path", path);
386 setfield_paint(fL, paint, kText_PaintUsage); 492 setfield_paint(fL, paint, kText_PaintUsage);
387 } 493 }
388 494
389 void SkLuaCanvas::drawPicture(SkPicture& picture) { 495 void SkLuaCanvas::drawPicture(SkPicture& picture) {
390 AUTO_LUA("drawPicture"); 496 AUTO_LUA("drawPicture");
391 // call through so we can see the nested picture ops 497 // call through so we can see the nested picture ops
392 this->INHERITED::drawPicture(picture); 498 this->INHERITED::drawPicture(picture);
393 } 499 }
394 500
395 void SkLuaCanvas::drawVertices(VertexMode vmode, int vertexCount, 501 void SkLuaCanvas::drawVertices(VertexMode vmode, int vertexCount,
396 const SkPoint vertices[], const SkPoint texs[], 502 const SkPoint vertices[], const SkPoint texs[],
397 const SkColor colors[], SkXfermode* xmode, 503 const SkColor colors[], SkXfermode* xmode,
398 const uint16_t indices[], int indexCount, 504 const uint16_t indices[], int indexCount,
399 const SkPaint& paint) { 505 const SkPaint& paint) {
400 AUTO_LUA("drawVertices"); 506 AUTO_LUA("drawVertices");
401 setfield_paint(fL, paint); 507 setfield_paint(fL, paint);
402 } 508 }
403 509
404 void SkLuaCanvas::drawData(const void* data, size_t length) { 510 void SkLuaCanvas::drawData(const void* data, size_t length) {
405 AUTO_LUA("drawData"); 511 AUTO_LUA("drawData");
406 } 512 }
OLDNEW
« no previous file with comments | « no previous file | tools/lua/scrape.lua » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698