13597b73bc6e3e169f1d360de80d77e6e0ab65e96reed@google.com/* 23597b73bc6e3e169f1d360de80d77e6e0ab65e96reed@google.com * Copyright 2013 Google Inc. 33597b73bc6e3e169f1d360de80d77e6e0ab65e96reed@google.com * 43597b73bc6e3e169f1d360de80d77e6e0ab65e96reed@google.com * Use of this source code is governed by a BSD-style license that can be 53597b73bc6e3e169f1d360de80d77e6e0ab65e96reed@google.com * found in the LICENSE file. 63597b73bc6e3e169f1d360de80d77e6e0ab65e96reed@google.com */ 73597b73bc6e3e169f1d360de80d77e6e0ab65e96reed@google.com 83597b73bc6e3e169f1d360de80d77e6e0ab65e96reed@google.com#include "SampleCode.h" 93597b73bc6e3e169f1d360de80d77e6e0ab65e96reed@google.com#include "SkView.h" 103597b73bc6e3e169f1d360de80d77e6e0ab65e96reed@google.com#include "SkLua.h" 113597b73bc6e3e169f1d360de80d77e6e0ab65e96reed@google.com#include "SkCanvas.h" 123597b73bc6e3e169f1d360de80d77e6e0ab65e96reed@google.com 133597b73bc6e3e169f1d360de80d77e6e0ab65e96reed@google.comextern "C" { 143597b73bc6e3e169f1d360de80d77e6e0ab65e96reed@google.com#include "lua.h" 153597b73bc6e3e169f1d360de80d77e6e0ab65e96reed@google.com#include "lualib.h" 163597b73bc6e3e169f1d360de80d77e6e0ab65e96reed@google.com#include "lauxlib.h" 173597b73bc6e3e169f1d360de80d77e6e0ab65e96reed@google.com} 183597b73bc6e3e169f1d360de80d77e6e0ab65e96reed@google.com 193597b73bc6e3e169f1d360de80d77e6e0ab65e96reed@google.comstatic const char gDrawName[] = "onDrawContent"; 203597b73bc6e3e169f1d360de80d77e6e0ab65e96reed@google.com 213597b73bc6e3e169f1d360de80d77e6e0ab65e96reed@google.comstatic const char gCode[] = "" 22fd3458750d92d9722e5760ddb99824e65455463creed@google.com "require \"math\" " 23fd3458750d92d9722e5760ddb99824e65455463creed@google.com "" 243597b73bc6e3e169f1d360de80d77e6e0ab65e96reed@google.com "local r = { left = 10, top = 10, right = 100, bottom = 80 } " 253597b73bc6e3e169f1d360de80d77e6e0ab65e96reed@google.com "local x = 0;" 263597b73bc6e3e169f1d360de80d77e6e0ab65e96reed@google.com "" 273597b73bc6e3e169f1d360de80d77e6e0ab65e96reed@google.com "local paint = Sk.newPaint();" 283597b73bc6e3e169f1d360de80d77e6e0ab65e96reed@google.com "paint:setAntiAlias(true);" 293597b73bc6e3e169f1d360de80d77e6e0ab65e96reed@google.com "" 30792bbd14c63f217f2de0e6b2f8df99acb1928eeamike@reedtribe.org "local image = Sk.loadImage('/skia/trunk/sailboat.jpg');" 31792bbd14c63f217f2de0e6b2f8df99acb1928eeamike@reedtribe.org "" 323597b73bc6e3e169f1d360de80d77e6e0ab65e96reed@google.com "local color = {a = 1, r = 1, g = 0, b = 0};" 333597b73bc6e3e169f1d360de80d77e6e0ab65e96reed@google.com "" 34fd3458750d92d9722e5760ddb99824e65455463creed@google.com "function rnd(range) " 35fd3458750d92d9722e5760ddb99824e65455463creed@google.com " return math.random() * range;" 36fd3458750d92d9722e5760ddb99824e65455463creed@google.com "end " 37fd3458750d92d9722e5760ddb99824e65455463creed@google.com "" 38fd3458750d92d9722e5760ddb99824e65455463creed@google.com "rndX = function () return rnd(640) end " 39fd3458750d92d9722e5760ddb99824e65455463creed@google.com "rndY = function () return rnd(480) end " 40fd3458750d92d9722e5760ddb99824e65455463creed@google.com "" 41fd3458750d92d9722e5760ddb99824e65455463creed@google.com "function draw_rand_path(canvas);" 42fd3458750d92d9722e5760ddb99824e65455463creed@google.com " if not path_paint then " 43fd3458750d92d9722e5760ddb99824e65455463creed@google.com " path_paint = Sk.newPaint();" 44fd3458750d92d9722e5760ddb99824e65455463creed@google.com " path_paint:setAntiAlias(true);" 45fd3458750d92d9722e5760ddb99824e65455463creed@google.com " end " 46fd3458750d92d9722e5760ddb99824e65455463creed@google.com " path_paint:setColor({a = 1, r = math.random(), g = math.random(), b = math.random() });" 47fd3458750d92d9722e5760ddb99824e65455463creed@google.com "" 48fd3458750d92d9722e5760ddb99824e65455463creed@google.com " local path = Sk.newPath();" 49fd3458750d92d9722e5760ddb99824e65455463creed@google.com " path:moveTo(rndX(), rndY());" 50fd3458750d92d9722e5760ddb99824e65455463creed@google.com " for i = 0, 50 do " 51fd3458750d92d9722e5760ddb99824e65455463creed@google.com " path:quadTo(rndX(), rndY(), rndX(), rndY());" 52fd3458750d92d9722e5760ddb99824e65455463creed@google.com " end " 53fd3458750d92d9722e5760ddb99824e65455463creed@google.com " canvas:drawPath(path, path_paint);" 54e6469f10c8f9340032797316fd06ee2f109255ffmike@reedtribe.org "" 55fb858245216dafee4de731fce4f0fa58c746d3e9mike@reedtribe.org " paint:setColor{a=1,r=0,g=0,b=1};" 56fb858245216dafee4de731fce4f0fa58c746d3e9mike@reedtribe.org " local align = { 'left', 'center', 'right' };" 57fb858245216dafee4de731fce4f0fa58c746d3e9mike@reedtribe.org " paint:setTextSize(30);" 58fb858245216dafee4de731fce4f0fa58c746d3e9mike@reedtribe.org " for k, v in next, align do " 59fb858245216dafee4de731fce4f0fa58c746d3e9mike@reedtribe.org " paint:setTextAlign(v);" 60fb858245216dafee4de731fce4f0fa58c746d3e9mike@reedtribe.org " canvas:drawText('Hamburgefons', 320, 200 + 30*k, paint);" 61fb858245216dafee4de731fce4f0fa58c746d3e9mike@reedtribe.org " end " 62fb858245216dafee4de731fce4f0fa58c746d3e9mike@reedtribe.org "end " 63fb858245216dafee4de731fce4f0fa58c746d3e9mike@reedtribe.org "" 64fb858245216dafee4de731fce4f0fa58c746d3e9mike@reedtribe.org "function onStartup() " 65fb858245216dafee4de731fce4f0fa58c746d3e9mike@reedtribe.org " local paint = Sk.newPaint();" 66fb858245216dafee4de731fce4f0fa58c746d3e9mike@reedtribe.org " paint:setColor{a=1, r=1, g=0, b=0};" 67fb858245216dafee4de731fce4f0fa58c746d3e9mike@reedtribe.org " local doc = Sk.newDocumentPDF('/skia/trunk/test.pdf');" 68fb858245216dafee4de731fce4f0fa58c746d3e9mike@reedtribe.org " local canvas = doc:beginPage(72*8.5, 72*11);" 69fb858245216dafee4de731fce4f0fa58c746d3e9mike@reedtribe.org " canvas:drawText('Hello Lua', 300, 300, paint);" 70fb858245216dafee4de731fce4f0fa58c746d3e9mike@reedtribe.org " doc:close();" 71fb858245216dafee4de731fce4f0fa58c746d3e9mike@reedtribe.org " doc = nil;" 72fd3458750d92d9722e5760ddb99824e65455463creed@google.com "end " 73fd3458750d92d9722e5760ddb99824e65455463creed@google.com "" 743597b73bc6e3e169f1d360de80d77e6e0ab65e96reed@google.com "function onDrawContent(canvas) " 75fd3458750d92d9722e5760ddb99824e65455463creed@google.com " draw_rand_path(canvas);" 763597b73bc6e3e169f1d360de80d77e6e0ab65e96reed@google.com " color.g = x / 100;" 773597b73bc6e3e169f1d360de80d77e6e0ab65e96reed@google.com " paint:setColor(color) " 783597b73bc6e3e169f1d360de80d77e6e0ab65e96reed@google.com " canvas:translate(x, 0);" 793597b73bc6e3e169f1d360de80d77e6e0ab65e96reed@google.com " canvas:drawOval(r, paint) " 803597b73bc6e3e169f1d360de80d77e6e0ab65e96reed@google.com " x = x + 1;" 81792bbd14c63f217f2de0e6b2f8df99acb1928eeamike@reedtribe.org " canvas:drawImage(image, x, r.bottom + 50, 0.5);" 823597b73bc6e3e169f1d360de80d77e6e0ab65e96reed@google.com " if x > 100 then x = 0 end;" 83fb858245216dafee4de731fce4f0fa58c746d3e9mike@reedtribe.org "end " 84fb858245216dafee4de731fce4f0fa58c746d3e9mike@reedtribe.org "" 85fb858245216dafee4de731fce4f0fa58c746d3e9mike@reedtribe.org "onStartup();"; 863597b73bc6e3e169f1d360de80d77e6e0ab65e96reed@google.com 873597b73bc6e3e169f1d360de80d77e6e0ab65e96reed@google.comclass LuaView : public SampleView { 883597b73bc6e3e169f1d360de80d77e6e0ab65e96reed@google.compublic: 893597b73bc6e3e169f1d360de80d77e6e0ab65e96reed@google.com LuaView() : fLua(NULL) {} 902d816ad36e806e5b1cf3c447e547829bbbe74fd1skia.committer@gmail.com 913597b73bc6e3e169f1d360de80d77e6e0ab65e96reed@google.com virtual ~LuaView() { 923597b73bc6e3e169f1d360de80d77e6e0ab65e96reed@google.com SkDELETE(fLua); 933597b73bc6e3e169f1d360de80d77e6e0ab65e96reed@google.com } 943597b73bc6e3e169f1d360de80d77e6e0ab65e96reed@google.com 953597b73bc6e3e169f1d360de80d77e6e0ab65e96reed@google.com lua_State* ensureLua() { 963597b73bc6e3e169f1d360de80d77e6e0ab65e96reed@google.com if (NULL == fLua) { 973597b73bc6e3e169f1d360de80d77e6e0ab65e96reed@google.com fLua = SkNEW(SkLua); 983597b73bc6e3e169f1d360de80d77e6e0ab65e96reed@google.com fLua->runCode(gCode); 993597b73bc6e3e169f1d360de80d77e6e0ab65e96reed@google.com } 1003597b73bc6e3e169f1d360de80d77e6e0ab65e96reed@google.com return fLua->get(); 1013597b73bc6e3e169f1d360de80d77e6e0ab65e96reed@google.com } 1023597b73bc6e3e169f1d360de80d77e6e0ab65e96reed@google.com 1033597b73bc6e3e169f1d360de80d77e6e0ab65e96reed@google.comprotected: 1043597b73bc6e3e169f1d360de80d77e6e0ab65e96reed@google.com virtual bool onQuery(SkEvent* evt) SK_OVERRIDE { 1053597b73bc6e3e169f1d360de80d77e6e0ab65e96reed@google.com if (SampleCode::TitleQ(*evt)) { 1063597b73bc6e3e169f1d360de80d77e6e0ab65e96reed@google.com SampleCode::TitleR(evt, "Lua"); 1073597b73bc6e3e169f1d360de80d77e6e0ab65e96reed@google.com return true; 1083597b73bc6e3e169f1d360de80d77e6e0ab65e96reed@google.com } 1093597b73bc6e3e169f1d360de80d77e6e0ab65e96reed@google.com SkUnichar uni; 1103597b73bc6e3e169f1d360de80d77e6e0ab65e96reed@google.com if (SampleCode::CharQ(*evt, &uni)) { 1113597b73bc6e3e169f1d360de80d77e6e0ab65e96reed@google.com } 1123597b73bc6e3e169f1d360de80d77e6e0ab65e96reed@google.com return this->INHERITED::onQuery(evt); 1133597b73bc6e3e169f1d360de80d77e6e0ab65e96reed@google.com } 1143597b73bc6e3e169f1d360de80d77e6e0ab65e96reed@google.com 1153597b73bc6e3e169f1d360de80d77e6e0ab65e96reed@google.com virtual void onDrawContent(SkCanvas* canvas) SK_OVERRIDE { 1163597b73bc6e3e169f1d360de80d77e6e0ab65e96reed@google.com lua_State* L = this->ensureLua(); 1173597b73bc6e3e169f1d360de80d77e6e0ab65e96reed@google.com 1183597b73bc6e3e169f1d360de80d77e6e0ab65e96reed@google.com lua_getglobal(L, gDrawName); 1193597b73bc6e3e169f1d360de80d77e6e0ab65e96reed@google.com if (!lua_isfunction(L, -1)) { 1203597b73bc6e3e169f1d360de80d77e6e0ab65e96reed@google.com int t = lua_type(L, -1); 1213597b73bc6e3e169f1d360de80d77e6e0ab65e96reed@google.com SkDebugf("--- expected %s function %d, ignoring.\n", gDrawName, t); 1223597b73bc6e3e169f1d360de80d77e6e0ab65e96reed@google.com lua_pop(L, 1); 1233597b73bc6e3e169f1d360de80d77e6e0ab65e96reed@google.com } else { 1243597b73bc6e3e169f1d360de80d77e6e0ab65e96reed@google.com // does it make sense to try to "cache" the lua version of this 1253597b73bc6e3e169f1d360de80d77e6e0ab65e96reed@google.com // canvas between draws? 1263597b73bc6e3e169f1d360de80d77e6e0ab65e96reed@google.com fLua->pushCanvas(canvas); 1273597b73bc6e3e169f1d360de80d77e6e0ab65e96reed@google.com if (lua_pcall(L, 1, 0, 0) != LUA_OK) { 1283597b73bc6e3e169f1d360de80d77e6e0ab65e96reed@google.com SkDebugf("lua err: %s\n", lua_tostring(L, -1)); 1293597b73bc6e3e169f1d360de80d77e6e0ab65e96reed@google.com } 1303597b73bc6e3e169f1d360de80d77e6e0ab65e96reed@google.com } 1313597b73bc6e3e169f1d360de80d77e6e0ab65e96reed@google.com // need a way for the lua-sample to tell us if they want animations... 1323597b73bc6e3e169f1d360de80d77e6e0ab65e96reed@google.com // hard-code it ON for now. 1333597b73bc6e3e169f1d360de80d77e6e0ab65e96reed@google.com this->inval(NULL); 1343597b73bc6e3e169f1d360de80d77e6e0ab65e96reed@google.com } 1353597b73bc6e3e169f1d360de80d77e6e0ab65e96reed@google.com 1363597b73bc6e3e169f1d360de80d77e6e0ab65e96reed@google.com virtual SkView::Click* onFindClickHandler(SkScalar x, SkScalar y, 1373597b73bc6e3e169f1d360de80d77e6e0ab65e96reed@google.com unsigned modi) SK_OVERRIDE { 1383597b73bc6e3e169f1d360de80d77e6e0ab65e96reed@google.com return this->INHERITED::onFindClickHandler(x, y, modi); 1393597b73bc6e3e169f1d360de80d77e6e0ab65e96reed@google.com } 1403597b73bc6e3e169f1d360de80d77e6e0ab65e96reed@google.com 1413597b73bc6e3e169f1d360de80d77e6e0ab65e96reed@google.com virtual bool onClick(Click* click) SK_OVERRIDE { 1423597b73bc6e3e169f1d360de80d77e6e0ab65e96reed@google.com return this->INHERITED::onClick(click); 1433597b73bc6e3e169f1d360de80d77e6e0ab65e96reed@google.com } 1443597b73bc6e3e169f1d360de80d77e6e0ab65e96reed@google.com 1453597b73bc6e3e169f1d360de80d77e6e0ab65e96reed@google.comprivate: 1463597b73bc6e3e169f1d360de80d77e6e0ab65e96reed@google.com SkLua* fLua; 1473597b73bc6e3e169f1d360de80d77e6e0ab65e96reed@google.com 1483597b73bc6e3e169f1d360de80d77e6e0ab65e96reed@google.com typedef SampleView INHERITED; 1493597b73bc6e3e169f1d360de80d77e6e0ab65e96reed@google.com}; 1503597b73bc6e3e169f1d360de80d77e6e0ab65e96reed@google.com 1513597b73bc6e3e169f1d360de80d77e6e0ab65e96reed@google.com////////////////////////////////////////////////////////////////////////////// 1523597b73bc6e3e169f1d360de80d77e6e0ab65e96reed@google.com 1533597b73bc6e3e169f1d360de80d77e6e0ab65e96reed@google.comstatic SkView* MyFactory() { return new LuaView; } 1543597b73bc6e3e169f1d360de80d77e6e0ab65e96reed@google.comstatic SkViewRegister reg(MyFactory); 155