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