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

Unified 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 side-by-side diff with in-line comments
Download patch
« no previous file with comments | « no previous file | tools/lua/scrape.lua » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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);
}
« 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