Index: src/utils/SkLuaCanvas.cpp |
diff --git a/src/utils/SkLuaCanvas.cpp b/src/utils/SkLuaCanvas.cpp |
index fc43514e462decbc3122b791eb3530a042069890..d5c169805ec3a04bbdf1f61cc59ce66d3e92adba 100644 |
--- a/src/utils/SkLuaCanvas.cpp |
+++ b/src/utils/SkLuaCanvas.cpp |
@@ -37,12 +37,16 @@ static void setfield_arrayf(lua_State* L, const SkScalar array[], int count) { |
} |
} |
-static void setfield_rect(lua_State* L, const char key[], const SkRect& r) { |
+static void push_rect(lua_State* L, const SkRect& r) { |
lua_newtable(L); |
setfield_number(L, "left", r.fLeft); |
setfield_number(L, "top", r.fTop); |
setfield_number(L, "right", r.fRight); |
setfield_number(L, "bottom", r.fBottom); |
+} |
+ |
+static void setfield_rect(lua_State* L, const char key[], const SkRect& r) { |
+ push_rect(L, r); |
lua_setfield(L, -2, key); |
} |
@@ -172,15 +176,117 @@ static void ensure_canvas_metatable(lua_State* L) { |
return; |
} |
gOnce = true; |
- |
+ |
luaL_newmetatable(L, gCanvasMetaTableName); |
lua_pushvalue(L, -1); |
lua_setfield(L, -2, "__index"); |
- |
+ |
luaL_setfuncs(L, gLuaCanvasMethods, 0); |
lua_settop(L, -2); // pop off the meta-table |
} |
+/////////////////////////////////////////////////////////////////////////////// |
+ |
+static const char gPathMetaTableName[] = "SkPath_MetaTable"; |
+ |
+static int lpath_getBounds(lua_State* L) { |
+ SkPath* p = (SkPath*)luaL_checkudata(L, 1, gPathMetaTableName); |
+ push_rect(L, p->getBounds()); |
+ return 1; |
+} |
+ |
+static int lpath_isEmpty(lua_State* L) { |
+ SkPath* p = (SkPath*)luaL_checkudata(L, 1, gPathMetaTableName); |
+ lua_pushboolean(L, p->isEmpty()); |
+ return 1; |
+} |
+ |
+static int lpath_isRect(lua_State* L) { |
+ SkPath* p = (SkPath*)luaL_checkudata(L, 1, gPathMetaTableName); |
+ SkRect r; |
+ bool pred = p->isRect(&r); |
+ int ret_count = 1; |
+ lua_pushboolean(L, pred); |
+ if (pred) { |
+ push_rect(L, r); |
+ ret_count += 1; |
+ } |
+ return ret_count; |
+} |
+ |
+static const char* dir2string(SkPath::Direction dir) { |
+ static const char* gStr[] = { |
+ "unknown", "cw", "ccw" |
+ }; |
+ SkASSERT((unsigned)dir < SK_ARRAY_COUNT(gStr)); |
+ return gStr[dir]; |
+} |
+ |
+static int lpath_isNestedRects(lua_State* L) { |
+ SkPath* p = (SkPath*)luaL_checkudata(L, 1, gPathMetaTableName); |
+ SkRect rects[2]; |
+ SkPath::Direction dirs[2]; |
+ bool pred = p->isNestedRects(rects, dirs); |
+ int ret_count = 1; |
+ lua_pushboolean(L, pred); |
+ if (pred) { |
+ push_rect(L, rects[0]); |
+ push_rect(L, rects[1]); |
+ lua_pushstring(L, dir2string(dirs[0])); |
+ lua_pushstring(L, dir2string(dirs[0])); |
+ ret_count += 4; |
+ } |
+ return ret_count; |
+ return 1; |
+} |
+ |
+static int lpath_gc(lua_State* L) { |
+ SkPath* p = (SkPath*)luaL_checkudata(L, 1, gPathMetaTableName); |
+ p->~SkPath(); |
+ return 0; |
+} |
+ |
+static const struct luaL_Reg gLuaPathMethods[] = { |
+ { "getBounds", lpath_getBounds }, |
+ { "isEmpty", lpath_isEmpty }, |
+ { "isRect", lpath_isRect }, |
+ { "isNestedRects", lpath_isNestedRects }, |
+ { "__gc", lpath_gc }, |
+ { NULL, NULL } |
+}; |
+ |
+static void ensure_path_metatable(lua_State* L) { |
+ static bool gOnce; |
+ if (gOnce) { |
+ return; |
+ } |
+ gOnce = true; |
+ |
+ luaL_newmetatable(L, gPathMetaTableName); |
+ lua_pushvalue(L, -1); |
+ lua_setfield(L, -2, "__index"); |
+ |
+ luaL_setfuncs(L, gLuaPathMethods, 0); |
+ lua_settop(L, -2); // pop off the meta-table |
+} |
+ |
+static void push_path(lua_State* L, const SkPath& src) { |
+ ensure_path_metatable(L); |
+ |
+ SkPath* path = (SkPath*)lua_newuserdata(L, sizeof(SkPath)); |
+ new (path) SkPath(src); |
+ |
+ luaL_getmetatable(L, gPathMetaTableName); |
+ lua_setmetatable(L, -2); |
+} |
+ |
+static void setfield_path(lua_State* L, const char key[], const SkPath& path) { |
+ push_path(L, path); |
+ lua_setfield(L, -2, key); |
+} |
+ |
+/////////////////////////////////////////////////////////////////////////////// |
+ |
void SkLuaCanvas::pushThis() { |
ensure_canvas_metatable(fL); |
@@ -282,6 +388,7 @@ bool SkLuaCanvas::clipRRect(const SkRRect& rrect, SkRegion::Op op, bool doAA) { |
bool SkLuaCanvas::clipPath(const SkPath& path, SkRegion::Op op, bool doAA) { |
AUTO_LUA("clipPath"); |
+ setfield_path(fL, "path", path); |
setfield_bool(fL, "aa", doAA); |
return this->INHERITED::clipPath(path, op, doAA); |
} |
@@ -322,9 +429,7 @@ void SkLuaCanvas::drawRRect(const SkRRect& rrect, const SkPaint& paint) { |
void SkLuaCanvas::drawPath(const SkPath& path, const SkPaint& paint) { |
AUTO_LUA("drawPath"); |
- setfield_rect(fL, "bounds", path.getBounds()); |
- setfield_bool(fL, "isRect", path.isRect(NULL)); |
- setfield_bool(fL, "isOval", path.isOval(NULL)); |
+ setfield_path(fL, "path", path); |
setfield_paint(fL, paint); |
} |
@@ -383,6 +488,7 @@ void SkLuaCanvas::drawTextOnPath(const void* text, size_t byteLength, |
const SkPath& path, const SkMatrix* matrix, |
const SkPaint& paint) { |
AUTO_LUA("drawTextOnPath"); |
+ setfield_path(fL, "path", path); |
setfield_paint(fL, paint, kText_PaintUsage); |
} |