diff options
author | reed@google.com <reed@google.com@2bbb7eff-a529-9590-31e7-b0007b416f81> | 2013-05-22 20:12:50 +0000 |
---|---|---|
committer | reed@google.com <reed@google.com@2bbb7eff-a529-9590-31e7-b0007b416f81> | 2013-05-22 20:12:50 +0000 |
commit | 3597b73bc6e3e169f1d360de80d77e6e0ab65e96 (patch) | |
tree | 8d5b8e905d7642fa3891bda2b38d2bd49ce521ac /samplecode/SampleLua.cpp | |
parent | be1d02e52862f8afa5a4056f66d0eacb4f16e6fd (diff) |
expand SkLua to handle creation of its own State
add lua sample
BUG=
R=robertphillips@google.com
Review URL: https://codereview.chromium.org/15742009
git-svn-id: http://skia.googlecode.com/svn/trunk@9247 2bbb7eff-a529-9590-31e7-b0007b416f81
Diffstat (limited to 'samplecode/SampleLua.cpp')
-rw-r--r-- | samplecode/SampleLua.cpp | 110 |
1 files changed, 110 insertions, 0 deletions
diff --git a/samplecode/SampleLua.cpp b/samplecode/SampleLua.cpp new file mode 100644 index 0000000000..263138bf6b --- /dev/null +++ b/samplecode/SampleLua.cpp @@ -0,0 +1,110 @@ +/* + * Copyright 2013 Google Inc. + * + * Use of this source code is governed by a BSD-style license that can be + * found in the LICENSE file. + */ + +#include "SampleCode.h" +#include "SkView.h" +#include "SkLua.h" +#include "SkCanvas.h" + +extern "C" { +#include "lua.h" +#include "lualib.h" +#include "lauxlib.h" +} + +static const char gDrawName[] = "onDrawContent"; + +static const char gCode[] = "" + "local r = { left = 10, top = 10, right = 100, bottom = 80 } " + "local x = 0;" + "" + "local paint = Sk.newPaint();" + "paint:setAntiAlias(true);" + "" + "local color = {a = 1, r = 1, g = 0, b = 0};" + "" + "function onDrawContent(canvas) " + " color.g = x / 100;" + " paint:setColor(color) " + " canvas:translate(x, 0);" + " canvas:drawOval(r, paint) " + " x = x + 1;" + " if x > 100 then x = 0 end;" + "end"; + +class LuaView : public SampleView { +public: + LuaView() : fLua(NULL) {} + + virtual ~LuaView() { + SkDELETE(fLua); + } + + lua_State* ensureLua() { + if (NULL == fLua) { + fLua = SkNEW(SkLua); + fLua->runCode(gCode); + } + return fLua->get(); + } + +protected: + virtual bool onQuery(SkEvent* evt) SK_OVERRIDE { + if (SampleCode::TitleQ(*evt)) { + SampleCode::TitleR(evt, "Lua"); + return true; + } + SkUnichar uni; + if (SampleCode::CharQ(*evt, &uni)) { + switch (uni) { + default: + break; + } + } + return this->INHERITED::onQuery(evt); + } + + virtual void onDrawContent(SkCanvas* canvas) SK_OVERRIDE { + lua_State* L = this->ensureLua(); + + lua_getglobal(L, gDrawName); + if (!lua_isfunction(L, -1)) { + int t = lua_type(L, -1); + SkDebugf("--- expected %s function %d, ignoring.\n", gDrawName, t); + lua_pop(L, 1); + } else { + // does it make sense to try to "cache" the lua version of this + // canvas between draws? + fLua->pushCanvas(canvas); + if (lua_pcall(L, 1, 0, 0) != LUA_OK) { + SkDebugf("lua err: %s\n", lua_tostring(L, -1)); + } + } + // need a way for the lua-sample to tell us if they want animations... + // hard-code it ON for now. + this->inval(NULL); + } + + virtual SkView::Click* onFindClickHandler(SkScalar x, SkScalar y, + unsigned modi) SK_OVERRIDE { + return this->INHERITED::onFindClickHandler(x, y, modi); + } + + virtual bool onClick(Click* click) SK_OVERRIDE { + return this->INHERITED::onClick(click); + } + +private: + SkLua* fLua; + + typedef SampleView INHERITED; +}; + +////////////////////////////////////////////////////////////////////////////// + +static SkView* MyFactory() { return new LuaView; } +static SkViewRegister reg(MyFactory); |