Index: src/utils/SkLua.cpp |
diff --git a/src/utils/SkLua.cpp b/src/utils/SkLua.cpp |
index ba8a4c841ea73c9020155be53fbf9ff298e44cc5..57df014baaec1d357539c87bbeee3e97f6401111 100644 |
--- a/src/utils/SkLua.cpp |
+++ b/src/utils/SkLua.cpp |
@@ -16,6 +16,7 @@ |
#include "SkData.h" |
#include "SkDecodingImageGenerator.h" |
#include "SkDocument.h" |
+#include "SkGradientShader.h" |
#include "SkImage.h" |
#include "SkMatrix.h" |
#include "SkPaint.h" |
@@ -71,10 +72,11 @@ template <typename T> void push_obj(lua_State* L, const T& obj) { |
lua_setmetatable(L, -2); |
} |
-template <typename T> void push_ref(lua_State* L, T* ref) { |
+template <typename T> T* push_ref(lua_State* L, T* ref) { |
*(T**)lua_newuserdata(L, sizeof(T*)) = SkSafeRef(ref); |
luaL_getmetatable(L, get_mtname<T>()); |
lua_setmetatable(L, -2); |
+ return ref; |
} |
template <typename T> T* get_ref(lua_State* L, int index) { |
@@ -443,6 +445,11 @@ static int lcanvas_drawColor(lua_State* L) { |
return 0; |
} |
+static int lcanvas_drawPaint(lua_State* L) { |
+ get_ref<SkCanvas>(L, 1)->drawPaint(*get_obj<SkPaint>(L, 2)); |
+ return 0; |
+} |
+ |
static int lcanvas_drawRect(lua_State* L) { |
SkRect rect; |
get_ref<SkCanvas>(L, 1)->drawRect(*lua2rect(L, 2, &rect), |
@@ -646,8 +653,7 @@ static int lcanvas_newSurface(lua_State* L) { |
if (NULL == surface) { |
lua_pushnil(L); |
} else { |
- push_ref(L, surface); |
- surface->unref(); |
+ push_ref(L, surface)->unref(); |
} |
return 1; |
} |
@@ -660,6 +666,7 @@ static int lcanvas_gc(lua_State* L) { |
const struct luaL_Reg gSkCanvas_Methods[] = { |
{ "clear", lcanvas_clear }, |
{ "drawColor", lcanvas_drawColor }, |
+ { "drawPaint", lcanvas_drawPaint }, |
{ "drawRect", lcanvas_drawRect }, |
{ "drawOval", lcanvas_drawOval }, |
{ "drawCircle", lcanvas_drawCircle }, |
@@ -1012,6 +1019,12 @@ static int lpaint_getShader(lua_State* L) { |
return 0; |
} |
+static int lpaint_setShader(lua_State* L) { |
+ SkPaint* paint = get_obj<SkPaint>(L, 1); |
+ paint->setShader(get_ref<SkShader>(L, 2)); |
+ return 0; |
+} |
+ |
static int lpaint_getPathEffect(lua_State* L) { |
const SkPaint* paint = get_obj<SkPaint>(L, 1); |
SkPathEffect* pe = paint->getPathEffect(); |
@@ -1070,6 +1083,7 @@ static const struct luaL_Reg gSkPaint_Methods[] = { |
{ "getImageFilter", lpaint_getImageFilter }, |
{ "setImageFilter", lpaint_setImageFilter }, |
{ "getShader", lpaint_getShader }, |
+ { "setShader", lpaint_setShader }, |
{ "getPathEffect", lpaint_getPathEffect }, |
{ "__gc", lpaint_gc }, |
{ NULL, NULL } |
@@ -1564,8 +1578,7 @@ static int lsurface_newImageSnapshot(lua_State* L) { |
if (NULL == image) { |
lua_pushnil(L); |
} else { |
- push_ref(L, image); |
- image->unref(); |
+ push_ref(L, image)->unref(); |
} |
return 1; |
} |
@@ -1578,8 +1591,7 @@ static int lsurface_newSurface(lua_State* L) { |
if (NULL == surface) { |
lua_pushnil(L); |
} else { |
- push_ref(L, surface); |
- surface->unref(); |
+ push_ref(L, surface)->unref(); |
} |
return 1; |
} |
@@ -1635,8 +1647,7 @@ static int lpicturerecorder_endRecording(lua_State* L) { |
lua_pushnil(L); |
return 1; |
} |
- push_ref(L, pic); |
- pic->unref(); // lua is the only owner, so we unref ours |
+ push_ref(L, pic)->unref(); |
return 1; |
} |
@@ -1730,8 +1741,7 @@ static int lsk_newDocumentPDF(lua_State* L) { |
// do I need to push a nil on the stack and return 1? |
return 0; |
} else { |
- push_ref(L, doc); |
- doc->unref(); |
+ push_ref(L, doc)->unref(); |
return 1; |
} |
} |
@@ -1743,8 +1753,26 @@ static int lsk_newBlurImageFilter(lua_State* L) { |
if (NULL == imf) { |
lua_pushnil(L); |
} else { |
- push_ref(L, imf); |
- imf->unref(); |
+ push_ref(L, imf)->unref(); |
+ } |
+ return 1; |
+} |
+ |
+static int lsk_newLinearGradient(lua_State* L) { |
+ SkScalar x0 = lua2scalar_def(L, 1, 0); |
+ SkScalar y0 = lua2scalar_def(L, 2, 0); |
+ SkColor c0 = lua2color(L, 3); |
+ SkScalar x1 = lua2scalar_def(L, 4, 0); |
+ SkScalar y1 = lua2scalar_def(L, 5, 0); |
+ SkColor c1 = lua2color(L, 6); |
+ |
+ SkPoint pts[] = { { x0, y0 }, { x1, y1 } }; |
+ SkColor colors[] = { c0, c1 }; |
+ SkShader* s = SkGradientShader::CreateLinear(pts, colors, NULL, 2, SkShader::kClamp_TileMode); |
+ if (NULL == s) { |
+ lua_pushnil(L); |
+ } else { |
+ push_ref(L, s)->unref(); |
} |
return 1; |
} |
@@ -1792,8 +1820,7 @@ static int lsk_newTypeface(lua_State* L) { |
if (NULL == face) { |
face = SkTypeface::RefDefault(); |
} |
- push_ref(L, face); |
- face->unref(); |
+ push_ref(L, face)->unref(); |
return 1; |
} |
@@ -1805,8 +1832,7 @@ static int lsk_newRasterSurface(lua_State* L) { |
if (NULL == surface) { |
lua_pushnil(L); |
} else { |
- push_ref(L, surface); |
- surface->unref(); |
+ push_ref(L, surface)->unref(); |
} |
return 1; |
} |
@@ -1820,8 +1846,7 @@ static int lsk_loadImage(lua_State* L) { |
SkDecodingImageGenerator::Create(data, SkDecodingImageGenerator::Options())); |
if (image) { |
- push_ref(L, image); |
- image->unref(); |
+ push_ref(L, image)->unref(); |
return 1; |
} |
} |
@@ -1838,6 +1863,7 @@ static void register_Sk(lua_State* L) { |
setfield_function(L, "newDocumentPDF", lsk_newDocumentPDF); |
setfield_function(L, "loadImage", lsk_loadImage); |
setfield_function(L, "newBlurImageFilter", lsk_newBlurImageFilter); |
+ setfield_function(L, "newLinearGradient", lsk_newLinearGradient); |
setfield_function(L, "newMatrix", lsk_newMatrix); |
setfield_function(L, "newPaint", lsk_newPaint); |
setfield_function(L, "newPath", lsk_newPath); |