Index: src/utils/SkLua.cpp |
diff --git a/src/utils/SkLua.cpp b/src/utils/SkLua.cpp |
index b12e3e9bdc357a36ebbf77925865c7600c3f5b5b..baddb1a19c0c2d88cc7eb53b39cd6e67b3ac9ba0 100644 |
--- a/src/utils/SkLua.cpp |
+++ b/src/utils/SkLua.cpp |
@@ -163,6 +163,46 @@ static void setfield_function(lua_State* L, |
lua_setfield(L, -2, key); |
} |
+static int lua2int_def(lua_State* L, int index, int defaultValue) { |
+ if (lua_isnumber(L, index)) { |
+ return (int)lua_tonumber(L, index); |
+ } else { |
+ return defaultValue; |
+ } |
+} |
+ |
+static SkScalar lua2scalar(lua_State* L, int index) { |
+ SkASSERT(lua_isnumber(L, index)); |
+ return SkLuaToScalar(lua_tonumber(L, index)); |
+} |
+ |
+static SkScalar lua2scalar_def(lua_State* L, int index, SkScalar defaultValue) { |
+ if (lua_isnumber(L, index)) { |
+ return SkLuaToScalar(lua_tonumber(L, index)); |
+ } else { |
+ return defaultValue; |
+ } |
+} |
+ |
+static SkScalar getarray_scalar(lua_State* L, int stackIndex, int arrayIndex) { |
+ SkASSERT(lua_istable(L, stackIndex)); |
+ lua_rawgeti(L, stackIndex, arrayIndex); |
+ |
+ SkScalar value = lua2scalar(L, -1); |
+ lua_pop(L, 1); |
+ return value; |
+} |
+ |
+static void getarray_scalars(lua_State* L, int stackIndex, SkScalar dst[], int count) { |
+ for (int i = 0; i < count; ++i) { |
+ dst[i] = getarray_scalar(L, stackIndex, i + 1); |
+ } |
+} |
+ |
+static void getarray_points(lua_State* L, int stackIndex, SkPoint pts[], int count) { |
+ getarray_scalars(L, stackIndex, &pts[0].fX, count * 2); |
+} |
+ |
static void setarray_number(lua_State* L, int index, double value) { |
lua_pushnumber(L, value); |
lua_rawseti(L, -2, index); |
@@ -360,32 +400,11 @@ void SkLua::pushClipStackElement(const SkClipStack::Element& element, const char |
/////////////////////////////////////////////////////////////////////////////// |
/////////////////////////////////////////////////////////////////////////////// |
-static int lua2int_def(lua_State* L, int index, int defaultValue) { |
- if (lua_isnumber(L, index)) { |
- return (int)lua_tonumber(L, index); |
- } else { |
- return defaultValue; |
- } |
-} |
- |
-static SkScalar lua2scalar(lua_State* L, int index) { |
- SkASSERT(lua_isnumber(L, index)); |
- return SkLuaToScalar(lua_tonumber(L, index)); |
-} |
- |
-static SkScalar lua2scalar_def(lua_State* L, int index, SkScalar defaultValue) { |
- if (lua_isnumber(L, index)) { |
- return SkLuaToScalar(lua_tonumber(L, index)); |
- } else { |
- return defaultValue; |
- } |
-} |
- |
static SkScalar getfield_scalar(lua_State* L, int index, const char key[]) { |
SkASSERT(lua_istable(L, index)); |
lua_pushstring(L, key); |
lua_gettable(L, index); |
- |
+ |
SkScalar value = lua2scalar(L, -1); |
lua_pop(L, 1); |
return value; |
@@ -452,8 +471,9 @@ static int lcanvas_drawPaint(lua_State* L) { |
static int lcanvas_drawRect(lua_State* L) { |
SkRect rect; |
- get_ref<SkCanvas>(L, 1)->drawRect(*lua2rect(L, 2, &rect), |
- *get_obj<SkPaint>(L, 3)); |
+ lua2rect(L, 2, &rect); |
+ const SkPaint* paint = get_obj<SkPaint>(L, 3); |
+ get_ref<SkCanvas>(L, 1)->drawRect(rect, *paint); |
return 0; |
} |
@@ -519,6 +539,32 @@ static int lcanvas_drawImageRect(lua_State* L) { |
return 0; |
} |
+static int lcanvas_drawPatch(lua_State* L) { |
+ SkPoint cubics[12]; |
+ SkColor colorStorage[4]; |
+ SkPoint texStorage[4]; |
+ |
+ const SkColor* colors = NULL; |
+ const SkPoint* texs = NULL; |
+ |
+ getarray_points(L, 2, cubics, 12); |
+ |
+ colorStorage[0] = SK_ColorRED; |
+ colorStorage[1] = SK_ColorGREEN; |
+ colorStorage[2] = SK_ColorBLUE; |
+ colorStorage[3] = SK_ColorGRAY; |
+ |
+ if (lua_isnil(L, 4)) { |
+ colors = colorStorage; |
+ } else { |
+ getarray_points(L, 4, texStorage, 4); |
+ texs = texStorage; |
+ } |
+ |
+ get_ref<SkCanvas>(L, 1)->drawPatch(cubics, colors, texs, NULL, *get_obj<SkPaint>(L, 5)); |
+ return 0; |
+} |
+ |
static int lcanvas_drawPath(lua_State* L) { |
get_ref<SkCanvas>(L, 1)->drawPath(*get_obj<SkPath>(L, 2), |
*get_obj<SkPaint>(L, 3)); |
@@ -662,7 +708,7 @@ static int lcanvas_concat(lua_State* L) { |
static int lcanvas_newSurface(lua_State* L) { |
int width = lua2int_def(L, 2, 0); |
- int height = lua2int_def(L, 2, 0); |
+ int height = lua2int_def(L, 3, 0); |
SkImageInfo info = SkImageInfo::MakeN32Premul(width, height); |
SkSurface* surface = get_ref<SkCanvas>(L, 1)->newSurface(info); |
if (NULL == surface) { |
@@ -687,6 +733,7 @@ const struct luaL_Reg gSkCanvas_Methods[] = { |
{ "drawCircle", lcanvas_drawCircle }, |
{ "drawImage", lcanvas_drawImage }, |
{ "drawImageRect", lcanvas_drawImageRect }, |
+ { "drawPatch", lcanvas_drawPatch }, |
{ "drawPath", lcanvas_drawPath }, |
{ "drawPicture", lcanvas_drawPicture }, |
{ "drawText", lcanvas_drawText }, |
@@ -881,6 +928,19 @@ static int lpaint_getHinting(lua_State* L) { |
return 1; |
} |
+static int lpaint_getFilterLevel(lua_State* L) { |
+ SkLua(L).pushU32(get_obj<SkPaint>(L, 1)->getFilterLevel()); |
+ return 1; |
+} |
+ |
+static int lpaint_setFilterLevel(lua_State* L) { |
+ int level = lua2int_def(L, 2, -1); |
+ if (level >= 0 && level <= 3) { |
+ get_obj<SkPaint>(L, 1)->setFilterLevel((SkPaint::FilterLevel)level); |
+ } |
+ return 0; |
+} |
+ |
static int lpaint_getFontID(lua_State* L) { |
SkTypeface* face = get_obj<SkPaint>(L, 1)->getTypeface(); |
SkLua(L).pushU32(SkTypeface::UniqueID(face)); |
@@ -1072,6 +1132,8 @@ static const struct luaL_Reg gSkPaint_Methods[] = { |
{ "setAntiAlias", lpaint_setAntiAlias }, |
{ "isDither", lpaint_isDither }, |
{ "setDither", lpaint_setDither }, |
+ { "getFilterLevel", lpaint_getFilterLevel }, |
+ { "setFilterLevel", lpaint_setFilterLevel }, |
{ "isUnderlineText", lpaint_isUnderlineText }, |
{ "isStrikeThruText", lpaint_isStrikeThruText }, |
{ "isFakeBoldText", lpaint_isFakeBoldText }, |
@@ -1279,6 +1341,19 @@ static int lmatrix_getTranslateY(lua_State* L) { |
return 1; |
} |
+static int lmatrix_invert(lua_State* L) { |
+ lua_pushboolean(L, get_obj<SkMatrix>(L, 1)->invert(get_obj<SkMatrix>(L, 2))); |
+ return 1; |
+} |
+ |
+static int lmatrix_mapXY(lua_State* L) { |
+ SkPoint pt = { lua2scalar(L, 2), lua2scalar(L, 3) }; |
+ get_obj<SkMatrix>(L, 1)->mapPoints(&pt, &pt, 1); |
+ lua_pushnumber(L, pt.x()); |
+ lua_pushnumber(L, pt.y()); |
+ return 2; |
+} |
+ |
static int lmatrix_setRectToRect(lua_State* L) { |
SkMatrix* matrix = get_obj<SkMatrix>(L, 1); |
SkRect srcR, dstR; |
@@ -1317,6 +1392,8 @@ static const struct luaL_Reg gSkMatrix_Methods[] = { |
{ "getTranslateX", lmatrix_getTranslateX }, |
{ "getTranslateY", lmatrix_getTranslateY }, |
{ "setRectToRect", lmatrix_setRectToRect }, |
+ { "invert", lmatrix_invert }, |
+ { "mapXY", lmatrix_mapXY }, |
{ NULL, NULL } |
}; |
@@ -1563,6 +1640,14 @@ static int limage_height(lua_State* L) { |
return 1; |
} |
+static int limage_newShader(lua_State* L) { |
+ SkShader::TileMode tmode = SkShader::kClamp_TileMode; |
+ const SkMatrix* localM = NULL; |
+ SkAutoTUnref<SkShader> shader(get_ref<SkImage>(L, 1)->newShader(tmode, tmode, localM)); |
+ push_ref(L, shader.get()); |
+ return 1; |
+} |
+ |
static int limage_gc(lua_State* L) { |
get_ref<SkImage>(L, 1)->unref(); |
return 0; |
@@ -1571,6 +1656,7 @@ static int limage_gc(lua_State* L) { |
static const struct luaL_Reg gSkImage_Methods[] = { |
{ "width", limage_width }, |
{ "height", limage_height }, |
+ { "newShader", limage_newShader }, |
{ "__gc", limage_gc }, |
{ NULL, NULL } |
}; |