174ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com/*
274ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com * Copyright 2013 Google Inc.
374ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com *
474ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com * Use of this source code is governed by a BSD-style license that can be
574ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com * found in the LICENSE file.
674ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com */
774ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com
874ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com#include "SkLua.h"
94ebe3821888d550d8a8b89341ec251ba942f0225bsalomon@google.com
104ebe3821888d550d8a8b89341ec251ba942f0225bsalomon@google.com#if SK_SUPPORT_GPU
114ebe3821888d550d8a8b89341ec251ba942f0225bsalomon@google.com#include "GrReducedClip.h"
124ebe3821888d550d8a8b89341ec251ba942f0225bsalomon@google.com#endif
134ebe3821888d550d8a8b89341ec251ba942f0225bsalomon@google.com
1474ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com#include "SkCanvas.h"
15792bbd14c63f217f2de0e6b2f8df99acb1928eeamike@reedtribe.org#include "SkData.h"
16fb858245216dafee4de731fce4f0fa58c746d3e9mike@reedtribe.org#include "SkDocument.h"
17792bbd14c63f217f2de0e6b2f8df99acb1928eeamike@reedtribe.org#include "SkImage.h"
18792bbd14c63f217f2de0e6b2f8df99acb1928eeamike@reedtribe.org#include "SkMatrix.h"
1974ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com#include "SkPaint.h"
2074ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com#include "SkPath.h"
215fdc983f58098e5c9fbdbedc7719f87e5efa4d31reed@google.com#include "SkPixelRef.h"
2274ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com#include "SkRRect.h"
2374ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com#include "SkString.h"
24e3823fd901674e22269637a669ac2b3e2667dc9creed@google.com#include "SkTypeface.h"
2574ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com
2674ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.comextern "C" {
273597b73bc6e3e169f1d360de80d77e6e0ab65e96reed@google.com    #include "lua.h"
283597b73bc6e3e169f1d360de80d77e6e0ab65e96reed@google.com    #include "lualib.h"
293597b73bc6e3e169f1d360de80d77e6e0ab65e96reed@google.com    #include "lauxlib.h"
303597b73bc6e3e169f1d360de80d77e6e0ab65e96reed@google.com}
313597b73bc6e3e169f1d360de80d77e6e0ab65e96reed@google.com
32fd3458750d92d9722e5760ddb99824e65455463creed@google.com// return the metatable name for a given class
333597b73bc6e3e169f1d360de80d77e6e0ab65e96reed@google.comtemplate <typename T> const char* get_mtname();
34fd3458750d92d9722e5760ddb99824e65455463creed@google.com#define DEF_MTNAME(T)                           \
35fd3458750d92d9722e5760ddb99824e65455463creed@google.com    template <> const char* get_mtname<T>() {   \
36fd3458750d92d9722e5760ddb99824e65455463creed@google.com        return #T "_LuaMetaTableName";          \
37fd3458750d92d9722e5760ddb99824e65455463creed@google.com    }
38fd3458750d92d9722e5760ddb99824e65455463creed@google.com
39fd3458750d92d9722e5760ddb99824e65455463creed@google.comDEF_MTNAME(SkCanvas)
40fb858245216dafee4de731fce4f0fa58c746d3e9mike@reedtribe.orgDEF_MTNAME(SkDocument)
41792bbd14c63f217f2de0e6b2f8df99acb1928eeamike@reedtribe.orgDEF_MTNAME(SkImage)
42fd3458750d92d9722e5760ddb99824e65455463creed@google.comDEF_MTNAME(SkMatrix)
43fd3458750d92d9722e5760ddb99824e65455463creed@google.comDEF_MTNAME(SkRRect)
44fd3458750d92d9722e5760ddb99824e65455463creed@google.comDEF_MTNAME(SkPath)
45fd3458750d92d9722e5760ddb99824e65455463creed@google.comDEF_MTNAME(SkPaint)
461301bf3abfe355f9aadd53d5dbf04926013231bacommit-bot@chromium.orgDEF_MTNAME(SkPathEffect)
475fdc983f58098e5c9fbdbedc7719f87e5efa4d31reed@google.comDEF_MTNAME(SkShader)
48e6469f10c8f9340032797316fd06ee2f109255ffmike@reedtribe.orgDEF_MTNAME(SkTypeface)
493597b73bc6e3e169f1d360de80d77e6e0ab65e96reed@google.com
503597b73bc6e3e169f1d360de80d77e6e0ab65e96reed@google.comtemplate <typename T> T* push_new(lua_State* L) {
513597b73bc6e3e169f1d360de80d77e6e0ab65e96reed@google.com    T* addr = (T*)lua_newuserdata(L, sizeof(T));
523597b73bc6e3e169f1d360de80d77e6e0ab65e96reed@google.com    new (addr) T;
533597b73bc6e3e169f1d360de80d77e6e0ab65e96reed@google.com    luaL_getmetatable(L, get_mtname<T>());
543597b73bc6e3e169f1d360de80d77e6e0ab65e96reed@google.com    lua_setmetatable(L, -2);
553597b73bc6e3e169f1d360de80d77e6e0ab65e96reed@google.com    return addr;
5674ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com}
5774ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com
5874ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.comtemplate <typename T> void push_obj(lua_State* L, const T& obj) {
5974ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com    new (lua_newuserdata(L, sizeof(T))) T(obj);
603597b73bc6e3e169f1d360de80d77e6e0ab65e96reed@google.com    luaL_getmetatable(L, get_mtname<T>());
6174ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com    lua_setmetatable(L, -2);
6274ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com}
6374ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com
6474ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.comtemplate <typename T> void push_ref(lua_State* L, T* ref) {
6577887af13f1f0a2e349155f74e6b5ded6aafe179commit-bot@chromium.org    *(T**)lua_newuserdata(L, sizeof(T*)) = SkSafeRef(ref);
663597b73bc6e3e169f1d360de80d77e6e0ab65e96reed@google.com    luaL_getmetatable(L, get_mtname<T>());
6774ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com    lua_setmetatable(L, -2);
6874ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com}
6974ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com
7074ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.comtemplate <typename T> T* get_ref(lua_State* L, int index) {
713597b73bc6e3e169f1d360de80d77e6e0ab65e96reed@google.com    return *(T**)luaL_checkudata(L, index, get_mtname<T>());
7274ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com}
7374ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com
7474ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.comtemplate <typename T> T* get_obj(lua_State* L, int index) {
753597b73bc6e3e169f1d360de80d77e6e0ab65e96reed@google.com    return (T*)luaL_checkudata(L, index, get_mtname<T>());
7674ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com}
7774ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com
7888c9ec968f682ebcc4ec13fe76f4d24d1e05633breed@google.comstatic bool lua2bool(lua_State* L, int index) {
7988c9ec968f682ebcc4ec13fe76f4d24d1e05633breed@google.com    return !!lua_toboolean(L, index);
8088c9ec968f682ebcc4ec13fe76f4d24d1e05633breed@google.com}
8188c9ec968f682ebcc4ec13fe76f4d24d1e05633breed@google.com
8274ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com///////////////////////////////////////////////////////////////////////////////
8374ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com
843597b73bc6e3e169f1d360de80d77e6e0ab65e96reed@google.comSkLua::SkLua(const char termCode[]) : fTermCode(termCode), fWeOwnL(true) {
853597b73bc6e3e169f1d360de80d77e6e0ab65e96reed@google.com    fL = luaL_newstate();
863597b73bc6e3e169f1d360de80d77e6e0ab65e96reed@google.com    luaL_openlibs(fL);
873597b73bc6e3e169f1d360de80d77e6e0ab65e96reed@google.com    SkLua::Load(fL);
883597b73bc6e3e169f1d360de80d77e6e0ab65e96reed@google.com}
893597b73bc6e3e169f1d360de80d77e6e0ab65e96reed@google.com
903597b73bc6e3e169f1d360de80d77e6e0ab65e96reed@google.comSkLua::SkLua(lua_State* L) : fL(L), fWeOwnL(false) {}
913597b73bc6e3e169f1d360de80d77e6e0ab65e96reed@google.com
923597b73bc6e3e169f1d360de80d77e6e0ab65e96reed@google.comSkLua::~SkLua() {
933597b73bc6e3e169f1d360de80d77e6e0ab65e96reed@google.com    if (fWeOwnL) {
943597b73bc6e3e169f1d360de80d77e6e0ab65e96reed@google.com        if (fTermCode.size() > 0) {
953597b73bc6e3e169f1d360de80d77e6e0ab65e96reed@google.com            lua_getglobal(fL, fTermCode.c_str());
963597b73bc6e3e169f1d360de80d77e6e0ab65e96reed@google.com            if (lua_pcall(fL, 0, 0, 0) != LUA_OK) {
973597b73bc6e3e169f1d360de80d77e6e0ab65e96reed@google.com                SkDebugf("lua err: %s\n", lua_tostring(fL, -1));
983597b73bc6e3e169f1d360de80d77e6e0ab65e96reed@google.com            }
993597b73bc6e3e169f1d360de80d77e6e0ab65e96reed@google.com        }
1003597b73bc6e3e169f1d360de80d77e6e0ab65e96reed@google.com        lua_close(fL);
1013597b73bc6e3e169f1d360de80d77e6e0ab65e96reed@google.com    }
1023597b73bc6e3e169f1d360de80d77e6e0ab65e96reed@google.com}
1033597b73bc6e3e169f1d360de80d77e6e0ab65e96reed@google.com
1043597b73bc6e3e169f1d360de80d77e6e0ab65e96reed@google.combool SkLua::runCode(const char code[]) {
1053597b73bc6e3e169f1d360de80d77e6e0ab65e96reed@google.com    int err = luaL_loadstring(fL, code) || lua_pcall(fL, 0, 0, 0);
1063597b73bc6e3e169f1d360de80d77e6e0ab65e96reed@google.com    if (err) {
10773d9f1c65114ba638637152605b0f03e871271damike@reedtribe.org        SkDebugf("--- lua failed: %s\n", lua_tostring(fL, -1));
1083597b73bc6e3e169f1d360de80d77e6e0ab65e96reed@google.com        return false;
1093597b73bc6e3e169f1d360de80d77e6e0ab65e96reed@google.com    }
1103597b73bc6e3e169f1d360de80d77e6e0ab65e96reed@google.com    return true;
1113597b73bc6e3e169f1d360de80d77e6e0ab65e96reed@google.com}
1123597b73bc6e3e169f1d360de80d77e6e0ab65e96reed@google.com
1133597b73bc6e3e169f1d360de80d77e6e0ab65e96reed@google.combool SkLua::runCode(const void* code, size_t size) {
1143597b73bc6e3e169f1d360de80d77e6e0ab65e96reed@google.com    SkString str((const char*)code, size);
1153597b73bc6e3e169f1d360de80d77e6e0ab65e96reed@google.com    return this->runCode(str.c_str());
1163597b73bc6e3e169f1d360de80d77e6e0ab65e96reed@google.com}
1173597b73bc6e3e169f1d360de80d77e6e0ab65e96reed@google.com
1183597b73bc6e3e169f1d360de80d77e6e0ab65e96reed@google.com///////////////////////////////////////////////////////////////////////////////
1193597b73bc6e3e169f1d360de80d77e6e0ab65e96reed@google.com
1203597b73bc6e3e169f1d360de80d77e6e0ab65e96reed@google.com#define CHECK_SETFIELD(key) do if (key) lua_setfield(fL, -2, key); while (0)
1213597b73bc6e3e169f1d360de80d77e6e0ab65e96reed@google.com
12229563879168ed58a8295520fbb4381d0ceff9f2freed@google.comstatic void setfield_bool_if(lua_State* L, const char key[], bool pred) {
12329563879168ed58a8295520fbb4381d0ceff9f2freed@google.com    if (pred) {
12429563879168ed58a8295520fbb4381d0ceff9f2freed@google.com        lua_pushboolean(L, true);
12529563879168ed58a8295520fbb4381d0ceff9f2freed@google.com        lua_setfield(L, -2, key);
12629563879168ed58a8295520fbb4381d0ceff9f2freed@google.com    }
12729563879168ed58a8295520fbb4381d0ceff9f2freed@google.com}
12829563879168ed58a8295520fbb4381d0ceff9f2freed@google.com
12974ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.comstatic void setfield_string(lua_State* L, const char key[], const char value[]) {
13074ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com    lua_pushstring(L, value);
13174ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com    lua_setfield(L, -2, key);
13274ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com}
13374ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com
13474ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.comstatic void setfield_number(lua_State* L, const char key[], double value) {
13574ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com    lua_pushnumber(L, value);
13674ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com    lua_setfield(L, -2, key);
13774ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com}
13874ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com
1392815c19c4d52f0fb522e21d1938d63e01c039124humper@google.comstatic void setfield_boolean(lua_State* L, const char key[], bool value) {
1402815c19c4d52f0fb522e21d1938d63e01c039124humper@google.com    lua_pushboolean(L, value);
1412815c19c4d52f0fb522e21d1938d63e01c039124humper@google.com    lua_setfield(L, -2, key);
1422815c19c4d52f0fb522e21d1938d63e01c039124humper@google.com}
1432815c19c4d52f0fb522e21d1938d63e01c039124humper@google.com
14473d9f1c65114ba638637152605b0f03e871271damike@reedtribe.orgstatic void setfield_scalar(lua_State* L, const char key[], SkScalar value) {
14573d9f1c65114ba638637152605b0f03e871271damike@reedtribe.org    setfield_number(L, key, SkScalarToLua(value));
14673d9f1c65114ba638637152605b0f03e871271damike@reedtribe.org}
14773d9f1c65114ba638637152605b0f03e871271damike@reedtribe.org
1483597b73bc6e3e169f1d360de80d77e6e0ab65e96reed@google.comstatic void setfield_function(lua_State* L,
1493597b73bc6e3e169f1d360de80d77e6e0ab65e96reed@google.com                              const char key[], lua_CFunction value) {
1503597b73bc6e3e169f1d360de80d77e6e0ab65e96reed@google.com    lua_pushcfunction(L, value);
1513597b73bc6e3e169f1d360de80d77e6e0ab65e96reed@google.com    lua_setfield(L, -2, key);
15274ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com}
15374ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com
154e3823fd901674e22269637a669ac2b3e2667dc9creed@google.comstatic void setarray_number(lua_State* L, int index, double value) {
155e3823fd901674e22269637a669ac2b3e2667dc9creed@google.com    lua_pushnumber(L, value);
156e3823fd901674e22269637a669ac2b3e2667dc9creed@google.com    lua_rawseti(L, -2, index);
157e3823fd901674e22269637a669ac2b3e2667dc9creed@google.com}
158e3823fd901674e22269637a669ac2b3e2667dc9creed@google.com
1594d803a976c25ed582b02f8c42cd91c82e9d1ea84commit-bot@chromium.orgstatic void setarray_scalar(lua_State* L, int index, SkScalar value) {
1604d803a976c25ed582b02f8c42cd91c82e9d1ea84commit-bot@chromium.org    setarray_number(L, index, SkScalarToLua(value));
1614d803a976c25ed582b02f8c42cd91c82e9d1ea84commit-bot@chromium.org}
1624d803a976c25ed582b02f8c42cd91c82e9d1ea84commit-bot@chromium.org
16374ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.comvoid SkLua::pushBool(bool value, const char key[]) {
16474ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com    lua_pushboolean(fL, value);
16574ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com    CHECK_SETFIELD(key);
16674ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com}
16774ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com
16874ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.comvoid SkLua::pushString(const char str[], const char key[]) {
16974ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com    lua_pushstring(fL, str);
17074ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com    CHECK_SETFIELD(key);
17174ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com}
17274ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com
173e3823fd901674e22269637a669ac2b3e2667dc9creed@google.comvoid SkLua::pushString(const char str[], size_t length, const char key[]) {
174e3823fd901674e22269637a669ac2b3e2667dc9creed@google.com    // TODO: how to do this w/o making a copy?
175e3823fd901674e22269637a669ac2b3e2667dc9creed@google.com    SkString s(str, length);
176e3823fd901674e22269637a669ac2b3e2667dc9creed@google.com    lua_pushstring(fL, s.c_str());
177e3823fd901674e22269637a669ac2b3e2667dc9creed@google.com    CHECK_SETFIELD(key);
178e3823fd901674e22269637a669ac2b3e2667dc9creed@google.com}
179e3823fd901674e22269637a669ac2b3e2667dc9creed@google.com
18074ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.comvoid SkLua::pushString(const SkString& str, const char key[]) {
18174ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com    lua_pushstring(fL, str.c_str());
18274ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com    CHECK_SETFIELD(key);
18374ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com}
18474ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com
18574ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.comvoid SkLua::pushColor(SkColor color, const char key[]) {
18674ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com    lua_newtable(fL);
18774ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com    setfield_number(fL, "a", SkColorGetA(color) / 255.0);
18874ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com    setfield_number(fL, "r", SkColorGetR(color) / 255.0);
18974ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com    setfield_number(fL, "g", SkColorGetG(color) / 255.0);
19074ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com    setfield_number(fL, "b", SkColorGetB(color) / 255.0);
19174ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com    CHECK_SETFIELD(key);
19274ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com}
19374ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com
194e3823fd901674e22269637a669ac2b3e2667dc9creed@google.comvoid SkLua::pushU32(uint32_t value, const char key[]) {
195e3823fd901674e22269637a669ac2b3e2667dc9creed@google.com    lua_pushnumber(fL, (double)value);
196e3823fd901674e22269637a669ac2b3e2667dc9creed@google.com    CHECK_SETFIELD(key);
197e3823fd901674e22269637a669ac2b3e2667dc9creed@google.com}
198e3823fd901674e22269637a669ac2b3e2667dc9creed@google.com
19974ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.comvoid SkLua::pushScalar(SkScalar value, const char key[]) {
20074ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com    lua_pushnumber(fL, SkScalarToLua(value));
20174ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com    CHECK_SETFIELD(key);
20274ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com}
20374ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com
204e3823fd901674e22269637a669ac2b3e2667dc9creed@google.comvoid SkLua::pushArrayU16(const uint16_t array[], int count, const char key[]) {
205e3823fd901674e22269637a669ac2b3e2667dc9creed@google.com    lua_newtable(fL);
206e3823fd901674e22269637a669ac2b3e2667dc9creed@google.com    for (int i = 0; i < count; ++i) {
207e3823fd901674e22269637a669ac2b3e2667dc9creed@google.com        // make it base-1 to match lua convention
208e3823fd901674e22269637a669ac2b3e2667dc9creed@google.com        setarray_number(fL, i + 1, (double)array[i]);
209e3823fd901674e22269637a669ac2b3e2667dc9creed@google.com    }
210e3823fd901674e22269637a669ac2b3e2667dc9creed@google.com    CHECK_SETFIELD(key);
211e3823fd901674e22269637a669ac2b3e2667dc9creed@google.com}
212e3823fd901674e22269637a669ac2b3e2667dc9creed@google.com
2131301bf3abfe355f9aadd53d5dbf04926013231bacommit-bot@chromium.orgvoid SkLua::pushArrayPoint(const SkPoint array[], int count, const char key[]) {
2141301bf3abfe355f9aadd53d5dbf04926013231bacommit-bot@chromium.org    lua_newtable(fL);
2151301bf3abfe355f9aadd53d5dbf04926013231bacommit-bot@chromium.org    for (int i = 0; i < count; ++i) {
2161301bf3abfe355f9aadd53d5dbf04926013231bacommit-bot@chromium.org        // make it base-1 to match lua convention
2171301bf3abfe355f9aadd53d5dbf04926013231bacommit-bot@chromium.org        lua_newtable(fL);
2181301bf3abfe355f9aadd53d5dbf04926013231bacommit-bot@chromium.org        this->pushScalar(array[i].fX, "x");
2191301bf3abfe355f9aadd53d5dbf04926013231bacommit-bot@chromium.org        this->pushScalar(array[i].fY, "y");
2201301bf3abfe355f9aadd53d5dbf04926013231bacommit-bot@chromium.org        lua_rawseti(fL, -2, i + 1);
2211301bf3abfe355f9aadd53d5dbf04926013231bacommit-bot@chromium.org    }
2221301bf3abfe355f9aadd53d5dbf04926013231bacommit-bot@chromium.org    CHECK_SETFIELD(key);
2231301bf3abfe355f9aadd53d5dbf04926013231bacommit-bot@chromium.org}
2241301bf3abfe355f9aadd53d5dbf04926013231bacommit-bot@chromium.org
2254d803a976c25ed582b02f8c42cd91c82e9d1ea84commit-bot@chromium.orgvoid SkLua::pushArrayScalar(const SkScalar array[], int count, const char key[]) {
2264d803a976c25ed582b02f8c42cd91c82e9d1ea84commit-bot@chromium.org    lua_newtable(fL);
2274d803a976c25ed582b02f8c42cd91c82e9d1ea84commit-bot@chromium.org    for (int i = 0; i < count; ++i) {
2284d803a976c25ed582b02f8c42cd91c82e9d1ea84commit-bot@chromium.org        // make it base-1 to match lua convention
2294d803a976c25ed582b02f8c42cd91c82e9d1ea84commit-bot@chromium.org        setarray_scalar(fL, i + 1, array[i]);
2304d803a976c25ed582b02f8c42cd91c82e9d1ea84commit-bot@chromium.org    }
2314d803a976c25ed582b02f8c42cd91c82e9d1ea84commit-bot@chromium.org    CHECK_SETFIELD(key);
2324d803a976c25ed582b02f8c42cd91c82e9d1ea84commit-bot@chromium.org}
2334d803a976c25ed582b02f8c42cd91c82e9d1ea84commit-bot@chromium.org
23474ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.comvoid SkLua::pushRect(const SkRect& r, const char key[]) {
23574ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com    lua_newtable(fL);
23673d9f1c65114ba638637152605b0f03e871271damike@reedtribe.org    setfield_scalar(fL, "left", r.fLeft);
23773d9f1c65114ba638637152605b0f03e871271damike@reedtribe.org    setfield_scalar(fL, "top", r.fTop);
23873d9f1c65114ba638637152605b0f03e871271damike@reedtribe.org    setfield_scalar(fL, "right", r.fRight);
23973d9f1c65114ba638637152605b0f03e871271damike@reedtribe.org    setfield_scalar(fL, "bottom", r.fBottom);
24074ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com    CHECK_SETFIELD(key);
24174ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com}
24274ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com
24374ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.comvoid SkLua::pushRRect(const SkRRect& rr, const char key[]) {
24474ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com    push_obj(fL, rr);
24574ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com    CHECK_SETFIELD(key);
24674ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com}
24774ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com
2484d803a976c25ed582b02f8c42cd91c82e9d1ea84commit-bot@chromium.orgvoid SkLua::pushDash(const SkPathEffect::DashInfo& info, const char key[]) {
2494d803a976c25ed582b02f8c42cd91c82e9d1ea84commit-bot@chromium.org    lua_newtable(fL);
2504d803a976c25ed582b02f8c42cd91c82e9d1ea84commit-bot@chromium.org    setfield_scalar(fL, "phase", info.fPhase);
2514d803a976c25ed582b02f8c42cd91c82e9d1ea84commit-bot@chromium.org    this->pushArrayScalar(info.fIntervals, info.fCount, "intervals");
2524d803a976c25ed582b02f8c42cd91c82e9d1ea84commit-bot@chromium.org    CHECK_SETFIELD(key);
2534d803a976c25ed582b02f8c42cd91c82e9d1ea84commit-bot@chromium.org}
2544d803a976c25ed582b02f8c42cd91c82e9d1ea84commit-bot@chromium.org
2554d803a976c25ed582b02f8c42cd91c82e9d1ea84commit-bot@chromium.org
25674ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.comvoid SkLua::pushMatrix(const SkMatrix& matrix, const char key[]) {
25774ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com    push_obj(fL, matrix);
25874ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com    CHECK_SETFIELD(key);
25974ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com}
26074ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com
26174ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.comvoid SkLua::pushPaint(const SkPaint& paint, const char key[]) {
26274ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com    push_obj(fL, paint);
26374ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com    CHECK_SETFIELD(key);
26474ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com}
26574ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com
26674ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.comvoid SkLua::pushPath(const SkPath& path, const char key[]) {
26774ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com    push_obj(fL, path);
26874ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com    CHECK_SETFIELD(key);
26974ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com}
27074ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com
27174ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.comvoid SkLua::pushCanvas(SkCanvas* canvas, const char key[]) {
27274ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com    push_ref(fL, canvas);
27374ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com    CHECK_SETFIELD(key);
27474ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com}
27574ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com
2765cc25359c62c83c356c3a30572a05ac9647daa55commit-bot@chromium.orgstatic const char* element_type(SkClipStack::Element::Type type) {
2775cc25359c62c83c356c3a30572a05ac9647daa55commit-bot@chromium.org    switch (type) {
2785cc25359c62c83c356c3a30572a05ac9647daa55commit-bot@chromium.org        case SkClipStack::Element::kEmpty_Type:
2795cc25359c62c83c356c3a30572a05ac9647daa55commit-bot@chromium.org            return "empty";
2805cc25359c62c83c356c3a30572a05ac9647daa55commit-bot@chromium.org        case SkClipStack::Element::kRect_Type:
2815cc25359c62c83c356c3a30572a05ac9647daa55commit-bot@chromium.org            return "rect";
2825cc25359c62c83c356c3a30572a05ac9647daa55commit-bot@chromium.org        case SkClipStack::Element::kRRect_Type:
2835cc25359c62c83c356c3a30572a05ac9647daa55commit-bot@chromium.org            return "rrect";
2845cc25359c62c83c356c3a30572a05ac9647daa55commit-bot@chromium.org        case SkClipStack::Element::kPath_Type:
2855cc25359c62c83c356c3a30572a05ac9647daa55commit-bot@chromium.org            return "path";
2865cc25359c62c83c356c3a30572a05ac9647daa55commit-bot@chromium.org    }
2875cc25359c62c83c356c3a30572a05ac9647daa55commit-bot@chromium.org    return "unknown";
2885cc25359c62c83c356c3a30572a05ac9647daa55commit-bot@chromium.org}
2895cc25359c62c83c356c3a30572a05ac9647daa55commit-bot@chromium.org
2905cc25359c62c83c356c3a30572a05ac9647daa55commit-bot@chromium.orgstatic const char* region_op(SkRegion::Op op) {
2915cc25359c62c83c356c3a30572a05ac9647daa55commit-bot@chromium.org    switch (op) {
2925cc25359c62c83c356c3a30572a05ac9647daa55commit-bot@chromium.org        case SkRegion::kDifference_Op:
2935cc25359c62c83c356c3a30572a05ac9647daa55commit-bot@chromium.org            return "difference";
2945cc25359c62c83c356c3a30572a05ac9647daa55commit-bot@chromium.org        case SkRegion::kIntersect_Op:
2955cc25359c62c83c356c3a30572a05ac9647daa55commit-bot@chromium.org            return "intersect";
2965cc25359c62c83c356c3a30572a05ac9647daa55commit-bot@chromium.org        case SkRegion::kUnion_Op:
2975cc25359c62c83c356c3a30572a05ac9647daa55commit-bot@chromium.org            return "union";
2985cc25359c62c83c356c3a30572a05ac9647daa55commit-bot@chromium.org        case SkRegion::kXOR_Op:
2995cc25359c62c83c356c3a30572a05ac9647daa55commit-bot@chromium.org            return "xor";
3005cc25359c62c83c356c3a30572a05ac9647daa55commit-bot@chromium.org        case SkRegion::kReverseDifference_Op:
3015cc25359c62c83c356c3a30572a05ac9647daa55commit-bot@chromium.org            return "reverse-difference";
3025cc25359c62c83c356c3a30572a05ac9647daa55commit-bot@chromium.org        case SkRegion::kReplace_Op:
3035cc25359c62c83c356c3a30572a05ac9647daa55commit-bot@chromium.org            return "replace";
3045cc25359c62c83c356c3a30572a05ac9647daa55commit-bot@chromium.org    }
3055cc25359c62c83c356c3a30572a05ac9647daa55commit-bot@chromium.org    return "unknown";
3065cc25359c62c83c356c3a30572a05ac9647daa55commit-bot@chromium.org}
3075cc25359c62c83c356c3a30572a05ac9647daa55commit-bot@chromium.org
3085cc25359c62c83c356c3a30572a05ac9647daa55commit-bot@chromium.orgvoid SkLua::pushClipStack(const SkClipStack& stack, const char* key) {
3095cc25359c62c83c356c3a30572a05ac9647daa55commit-bot@chromium.org    lua_newtable(fL);
3105cc25359c62c83c356c3a30572a05ac9647daa55commit-bot@chromium.org    SkClipStack::B2TIter iter(stack);
3115cc25359c62c83c356c3a30572a05ac9647daa55commit-bot@chromium.org    const SkClipStack::Element* element;
3125cc25359c62c83c356c3a30572a05ac9647daa55commit-bot@chromium.org    int i = 0;
3135cc25359c62c83c356c3a30572a05ac9647daa55commit-bot@chromium.org    while (NULL != (element = iter.next())) {
3144ebe3821888d550d8a8b89341ec251ba942f0225bsalomon@google.com        this->pushClipStackElement(*element);
3155cc25359c62c83c356c3a30572a05ac9647daa55commit-bot@chromium.org        lua_rawseti(fL, -2, ++i);
3165cc25359c62c83c356c3a30572a05ac9647daa55commit-bot@chromium.org    }
3175cc25359c62c83c356c3a30572a05ac9647daa55commit-bot@chromium.org    CHECK_SETFIELD(key);
3185cc25359c62c83c356c3a30572a05ac9647daa55commit-bot@chromium.org}
3195cc25359c62c83c356c3a30572a05ac9647daa55commit-bot@chromium.org
3204ebe3821888d550d8a8b89341ec251ba942f0225bsalomon@google.comvoid SkLua::pushClipStackElement(const SkClipStack::Element& element, const char* key) {
3214ebe3821888d550d8a8b89341ec251ba942f0225bsalomon@google.com    lua_newtable(fL);
3224ebe3821888d550d8a8b89341ec251ba942f0225bsalomon@google.com    SkClipStack::Element::Type type = element.getType();
3234ebe3821888d550d8a8b89341ec251ba942f0225bsalomon@google.com    this->pushString(element_type(type), "type");
3244ebe3821888d550d8a8b89341ec251ba942f0225bsalomon@google.com    switch (type) {
3254ebe3821888d550d8a8b89341ec251ba942f0225bsalomon@google.com        case SkClipStack::Element::kEmpty_Type:
3264ebe3821888d550d8a8b89341ec251ba942f0225bsalomon@google.com            break;
3274ebe3821888d550d8a8b89341ec251ba942f0225bsalomon@google.com        case SkClipStack::Element::kRect_Type:
3284ebe3821888d550d8a8b89341ec251ba942f0225bsalomon@google.com            this->pushRect(element.getRect(), "rect");
3294ebe3821888d550d8a8b89341ec251ba942f0225bsalomon@google.com            break;
3304ebe3821888d550d8a8b89341ec251ba942f0225bsalomon@google.com        case SkClipStack::Element::kRRect_Type:
3314ebe3821888d550d8a8b89341ec251ba942f0225bsalomon@google.com            this->pushRRect(element.getRRect(), "rrect");
3324ebe3821888d550d8a8b89341ec251ba942f0225bsalomon@google.com            break;
3334ebe3821888d550d8a8b89341ec251ba942f0225bsalomon@google.com        case SkClipStack::Element::kPath_Type:
3344ebe3821888d550d8a8b89341ec251ba942f0225bsalomon@google.com            this->pushPath(element.getPath(), "path");
3354ebe3821888d550d8a8b89341ec251ba942f0225bsalomon@google.com            break;
3364ebe3821888d550d8a8b89341ec251ba942f0225bsalomon@google.com    }
3374ebe3821888d550d8a8b89341ec251ba942f0225bsalomon@google.com    this->pushString(region_op(element.getOp()), "op");
3384ebe3821888d550d8a8b89341ec251ba942f0225bsalomon@google.com    this->pushBool(element.isAA(), "aa");
3394ebe3821888d550d8a8b89341ec251ba942f0225bsalomon@google.com    CHECK_SETFIELD(key);
3404ebe3821888d550d8a8b89341ec251ba942f0225bsalomon@google.com}
3414ebe3821888d550d8a8b89341ec251ba942f0225bsalomon@google.com
3424ebe3821888d550d8a8b89341ec251ba942f0225bsalomon@google.com
34374ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com///////////////////////////////////////////////////////////////////////////////
34474ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com///////////////////////////////////////////////////////////////////////////////
34574ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com
34674ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.comstatic SkScalar lua2scalar(lua_State* L, int index) {
34774ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com    SkASSERT(lua_isnumber(L, index));
34874ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com    return SkLuaToScalar(lua_tonumber(L, index));
34974ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com}
35074ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com
3511d32cc67f77d3fac29db574d79c7dff93e035259mike@reedtribe.orgstatic SkScalar lua2scalar_def(lua_State* L, int index, SkScalar defaultValue) {
3521d32cc67f77d3fac29db574d79c7dff93e035259mike@reedtribe.org    if (lua_isnumber(L, index)) {
3531d32cc67f77d3fac29db574d79c7dff93e035259mike@reedtribe.org        return SkLuaToScalar(lua_tonumber(L, index));
3541d32cc67f77d3fac29db574d79c7dff93e035259mike@reedtribe.org    } else {
3551d32cc67f77d3fac29db574d79c7dff93e035259mike@reedtribe.org        return defaultValue;
3561d32cc67f77d3fac29db574d79c7dff93e035259mike@reedtribe.org    }
3571d32cc67f77d3fac29db574d79c7dff93e035259mike@reedtribe.org}
3581d32cc67f77d3fac29db574d79c7dff93e035259mike@reedtribe.org
35974ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.comstatic SkScalar getfield_scalar(lua_State* L, int index, const char key[]) {
36074ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com    SkASSERT(lua_istable(L, index));
36174ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com    lua_pushstring(L, key);
36274ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com    lua_gettable(L, index);
363370c534c19f0faa0d60b3cac2e77886b53535c8fskia.committer@gmail.com
36474ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com    SkScalar value = lua2scalar(L, -1);
36574ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com    lua_pop(L, 1);
36674ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com    return value;
36774ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com}
36874ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com
36973d9f1c65114ba638637152605b0f03e871271damike@reedtribe.orgstatic SkScalar getfield_scalar_default(lua_State* L, int index, const char key[], SkScalar def) {
37073d9f1c65114ba638637152605b0f03e871271damike@reedtribe.org    SkASSERT(lua_istable(L, index));
37173d9f1c65114ba638637152605b0f03e871271damike@reedtribe.org    lua_pushstring(L, key);
37273d9f1c65114ba638637152605b0f03e871271damike@reedtribe.org    lua_gettable(L, index);
373370c534c19f0faa0d60b3cac2e77886b53535c8fskia.committer@gmail.com
37473d9f1c65114ba638637152605b0f03e871271damike@reedtribe.org    SkScalar value;
37573d9f1c65114ba638637152605b0f03e871271damike@reedtribe.org    if (lua_isnil(L, -1)) {
37673d9f1c65114ba638637152605b0f03e871271damike@reedtribe.org        value = def;
37773d9f1c65114ba638637152605b0f03e871271damike@reedtribe.org    } else {
37873d9f1c65114ba638637152605b0f03e871271damike@reedtribe.org        value = lua2scalar(L, -1);
37973d9f1c65114ba638637152605b0f03e871271damike@reedtribe.org    }
38073d9f1c65114ba638637152605b0f03e871271damike@reedtribe.org    lua_pop(L, 1);
38173d9f1c65114ba638637152605b0f03e871271damike@reedtribe.org    return value;
38273d9f1c65114ba638637152605b0f03e871271damike@reedtribe.org}
38373d9f1c65114ba638637152605b0f03e871271damike@reedtribe.org
38474ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.comstatic U8CPU unit2byte(SkScalar x) {
38574ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com    if (x <= 0) {
38674ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com        return 0;
38774ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com    } else if (x >= 1) {
38874ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com        return 255;
38974ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com    } else {
39074ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com        return SkScalarRoundToInt(x * 255);
39174ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com    }
39274ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com}
39374ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com
39474ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.comstatic SkColor lua2color(lua_State* L, int index) {
39574ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com    return SkColorSetARGB(unit2byte(getfield_scalar(L, index, "a")),
39674ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com                          unit2byte(getfield_scalar(L, index, "r")),
39774ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com                          unit2byte(getfield_scalar(L, index, "g")),
39874ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com                          unit2byte(getfield_scalar(L, index, "b")));
39974ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com}
40074ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com
40174ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.comstatic SkRect* lua2rect(lua_State* L, int index, SkRect* rect) {
40273d9f1c65114ba638637152605b0f03e871271damike@reedtribe.org    rect->set(getfield_scalar_default(L, index, "left", 0),
40373d9f1c65114ba638637152605b0f03e871271damike@reedtribe.org              getfield_scalar_default(L, index, "top", 0),
40474ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com              getfield_scalar(L, index, "right"),
40574ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com              getfield_scalar(L, index, "bottom"));
40674ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com    return rect;
40774ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com}
40874ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com
40974ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.comstatic int lcanvas_drawColor(lua_State* L) {
41074ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com    get_ref<SkCanvas>(L, 1)->drawColor(lua2color(L, 2));
41174ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com    return 0;
41274ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com}
41374ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com
41474ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.comstatic int lcanvas_drawRect(lua_State* L) {
41574ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com    SkRect rect;
41674ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com    get_ref<SkCanvas>(L, 1)->drawRect(*lua2rect(L, 2, &rect),
41774ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com                                      *get_obj<SkPaint>(L, 3));
41874ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com    return 0;
41974ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com}
42074ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com
42174ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.comstatic int lcanvas_drawOval(lua_State* L) {
42274ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com    SkRect rect;
42374ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com    get_ref<SkCanvas>(L, 1)->drawOval(*lua2rect(L, 2, &rect),
42474ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com                                      *get_obj<SkPaint>(L, 3));
42574ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com    return 0;
42674ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com}
42774ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com
42874ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.comstatic int lcanvas_drawCircle(lua_State* L) {
42974ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com    get_ref<SkCanvas>(L, 1)->drawCircle(lua2scalar(L, 2),
43074ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com                                        lua2scalar(L, 3),
43174ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com                                        lua2scalar(L, 4),
43274ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com                                        *get_obj<SkPaint>(L, 5));
43374ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com    return 0;
43474ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com}
43574ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com
436792bbd14c63f217f2de0e6b2f8df99acb1928eeamike@reedtribe.orgstatic int lcanvas_drawImage(lua_State* L) {
437792bbd14c63f217f2de0e6b2f8df99acb1928eeamike@reedtribe.org    SkCanvas* canvas = get_ref<SkCanvas>(L, 1);
438792bbd14c63f217f2de0e6b2f8df99acb1928eeamike@reedtribe.org    SkImage* image = get_ref<SkImage>(L, 2);
439792bbd14c63f217f2de0e6b2f8df99acb1928eeamike@reedtribe.org    if (NULL == image) {
440792bbd14c63f217f2de0e6b2f8df99acb1928eeamike@reedtribe.org        return 0;
441792bbd14c63f217f2de0e6b2f8df99acb1928eeamike@reedtribe.org    }
442792bbd14c63f217f2de0e6b2f8df99acb1928eeamike@reedtribe.org    SkScalar x = lua2scalar(L, 3);
443792bbd14c63f217f2de0e6b2f8df99acb1928eeamike@reedtribe.org    SkScalar y = lua2scalar(L, 4);
444792bbd14c63f217f2de0e6b2f8df99acb1928eeamike@reedtribe.org
445792bbd14c63f217f2de0e6b2f8df99acb1928eeamike@reedtribe.org    SkPaint paint;
446792bbd14c63f217f2de0e6b2f8df99acb1928eeamike@reedtribe.org    const SkPaint* paintPtr = NULL;
447792bbd14c63f217f2de0e6b2f8df99acb1928eeamike@reedtribe.org    if (lua_isnumber(L, 5)) {
448792bbd14c63f217f2de0e6b2f8df99acb1928eeamike@reedtribe.org        paint.setAlpha(SkScalarRoundToInt(lua2scalar(L, 5) * 255));
449792bbd14c63f217f2de0e6b2f8df99acb1928eeamike@reedtribe.org        paintPtr = &paint;
450792bbd14c63f217f2de0e6b2f8df99acb1928eeamike@reedtribe.org    }
451792bbd14c63f217f2de0e6b2f8df99acb1928eeamike@reedtribe.org    image->draw(canvas, x, y, paintPtr);
452792bbd14c63f217f2de0e6b2f8df99acb1928eeamike@reedtribe.org    return 0;
453792bbd14c63f217f2de0e6b2f8df99acb1928eeamike@reedtribe.org}
454792bbd14c63f217f2de0e6b2f8df99acb1928eeamike@reedtribe.org
455fd3458750d92d9722e5760ddb99824e65455463creed@google.comstatic int lcanvas_drawPath(lua_State* L) {
456fd3458750d92d9722e5760ddb99824e65455463creed@google.com    get_ref<SkCanvas>(L, 1)->drawPath(*get_obj<SkPath>(L, 2),
457fd3458750d92d9722e5760ddb99824e65455463creed@google.com                                      *get_obj<SkPaint>(L, 3));
458fd3458750d92d9722e5760ddb99824e65455463creed@google.com    return 0;
459fd3458750d92d9722e5760ddb99824e65455463creed@google.com}
460fd3458750d92d9722e5760ddb99824e65455463creed@google.com
461e6469f10c8f9340032797316fd06ee2f109255ffmike@reedtribe.orgstatic int lcanvas_drawText(lua_State* L) {
462e6469f10c8f9340032797316fd06ee2f109255ffmike@reedtribe.org    if (lua_gettop(L) < 5) {
463e6469f10c8f9340032797316fd06ee2f109255ffmike@reedtribe.org        return 0;
464e6469f10c8f9340032797316fd06ee2f109255ffmike@reedtribe.org    }
465e6469f10c8f9340032797316fd06ee2f109255ffmike@reedtribe.org
466e6469f10c8f9340032797316fd06ee2f109255ffmike@reedtribe.org    if (lua_isstring(L, 2) && lua_isnumber(L, 3) && lua_isnumber(L, 4)) {
467e6469f10c8f9340032797316fd06ee2f109255ffmike@reedtribe.org        size_t len;
468e6469f10c8f9340032797316fd06ee2f109255ffmike@reedtribe.org        const char* text = lua_tolstring(L, 2, &len);
469e6469f10c8f9340032797316fd06ee2f109255ffmike@reedtribe.org        get_ref<SkCanvas>(L, 1)->drawText(text, len,
470e6469f10c8f9340032797316fd06ee2f109255ffmike@reedtribe.org                                          lua2scalar(L, 3), lua2scalar(L, 4),
471e6469f10c8f9340032797316fd06ee2f109255ffmike@reedtribe.org                                          *get_obj<SkPaint>(L, 5));
472e6469f10c8f9340032797316fd06ee2f109255ffmike@reedtribe.org    }
473e6469f10c8f9340032797316fd06ee2f109255ffmike@reedtribe.org    return 0;
474e6469f10c8f9340032797316fd06ee2f109255ffmike@reedtribe.org}
475e6469f10c8f9340032797316fd06ee2f109255ffmike@reedtribe.org
47674ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.comstatic int lcanvas_getSaveCount(lua_State* L) {
47774ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com    lua_pushnumber(L, get_ref<SkCanvas>(L, 1)->getSaveCount());
47874ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com    return 1;
47974ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com}
48074ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com
48174ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.comstatic int lcanvas_getTotalMatrix(lua_State* L) {
48274ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com    SkLua(L).pushMatrix(get_ref<SkCanvas>(L, 1)->getTotalMatrix());
48374ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com    return 1;
48474ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com}
48574ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com
4865cc25359c62c83c356c3a30572a05ac9647daa55commit-bot@chromium.orgstatic int lcanvas_getClipStack(lua_State* L) {
4875cc25359c62c83c356c3a30572a05ac9647daa55commit-bot@chromium.org    SkLua(L).pushClipStack(*get_ref<SkCanvas>(L, 1)->getClipStack());
4885cc25359c62c83c356c3a30572a05ac9647daa55commit-bot@chromium.org    return 1;
4895cc25359c62c83c356c3a30572a05ac9647daa55commit-bot@chromium.org}
4905cc25359c62c83c356c3a30572a05ac9647daa55commit-bot@chromium.org
4914ebe3821888d550d8a8b89341ec251ba942f0225bsalomon@google.comint SkLua::lcanvas_getReducedClipStack(lua_State* L) {
4924ebe3821888d550d8a8b89341ec251ba942f0225bsalomon@google.com#if SK_SUPPORT_GPU
4934ebe3821888d550d8a8b89341ec251ba942f0225bsalomon@google.com    const SkCanvas* canvas = get_ref<SkCanvas>(L, 1);
4944ebe3821888d550d8a8b89341ec251ba942f0225bsalomon@google.com    SkISize layerSize = canvas->getTopLayerSize();
4954ebe3821888d550d8a8b89341ec251ba942f0225bsalomon@google.com    SkIPoint layerOrigin = canvas->getTopLayerOrigin();
4964ebe3821888d550d8a8b89341ec251ba942f0225bsalomon@google.com    SkIRect queryBounds = SkIRect::MakeXYWH(layerOrigin.fX, layerOrigin.fY,
4974ebe3821888d550d8a8b89341ec251ba942f0225bsalomon@google.com                                            layerSize.fWidth, layerSize.fHeight);
4984ebe3821888d550d8a8b89341ec251ba942f0225bsalomon@google.com
4994ebe3821888d550d8a8b89341ec251ba942f0225bsalomon@google.com    GrReducedClip::ElementList elements;
5004ebe3821888d550d8a8b89341ec251ba942f0225bsalomon@google.com    GrReducedClip::InitialState initialState;
5014ebe3821888d550d8a8b89341ec251ba942f0225bsalomon@google.com    int32_t genID;
5024ebe3821888d550d8a8b89341ec251ba942f0225bsalomon@google.com    SkIRect resultBounds;
5034ebe3821888d550d8a8b89341ec251ba942f0225bsalomon@google.com
5044ebe3821888d550d8a8b89341ec251ba942f0225bsalomon@google.com    const SkClipStack& stack = *canvas->getClipStack();
5054ebe3821888d550d8a8b89341ec251ba942f0225bsalomon@google.com
5064ebe3821888d550d8a8b89341ec251ba942f0225bsalomon@google.com    GrReducedClip::ReduceClipStack(stack,
5074ebe3821888d550d8a8b89341ec251ba942f0225bsalomon@google.com                                   queryBounds,
5084ebe3821888d550d8a8b89341ec251ba942f0225bsalomon@google.com                                   &elements,
5094ebe3821888d550d8a8b89341ec251ba942f0225bsalomon@google.com                                   &genID,
5104ebe3821888d550d8a8b89341ec251ba942f0225bsalomon@google.com                                   &initialState,
5114ebe3821888d550d8a8b89341ec251ba942f0225bsalomon@google.com                                   &resultBounds,
5124ebe3821888d550d8a8b89341ec251ba942f0225bsalomon@google.com                                   NULL);
5134ebe3821888d550d8a8b89341ec251ba942f0225bsalomon@google.com
5144ebe3821888d550d8a8b89341ec251ba942f0225bsalomon@google.com    GrReducedClip::ElementList::Iter iter(elements);
5154ebe3821888d550d8a8b89341ec251ba942f0225bsalomon@google.com    int i = 0;
5164ebe3821888d550d8a8b89341ec251ba942f0225bsalomon@google.com    lua_newtable(L);
5174ebe3821888d550d8a8b89341ec251ba942f0225bsalomon@google.com    while(NULL != iter.get()) {
5184ebe3821888d550d8a8b89341ec251ba942f0225bsalomon@google.com        SkLua(L).pushClipStackElement(*iter.get());
5194ebe3821888d550d8a8b89341ec251ba942f0225bsalomon@google.com        iter.next();
5204ebe3821888d550d8a8b89341ec251ba942f0225bsalomon@google.com        lua_rawseti(L, -2, ++i);
5214ebe3821888d550d8a8b89341ec251ba942f0225bsalomon@google.com    }
5224ebe3821888d550d8a8b89341ec251ba942f0225bsalomon@google.com    // Currently this only returns the element list to lua, not the initial state or result bounds.
5234ebe3821888d550d8a8b89341ec251ba942f0225bsalomon@google.com    // It could return these as additional items on the lua stack.
5244ebe3821888d550d8a8b89341ec251ba942f0225bsalomon@google.com    return 1;
5254ebe3821888d550d8a8b89341ec251ba942f0225bsalomon@google.com#else
5264ebe3821888d550d8a8b89341ec251ba942f0225bsalomon@google.com    return 0;
5274ebe3821888d550d8a8b89341ec251ba942f0225bsalomon@google.com#endif
5284ebe3821888d550d8a8b89341ec251ba942f0225bsalomon@google.com}
5294ebe3821888d550d8a8b89341ec251ba942f0225bsalomon@google.com
530fb858245216dafee4de731fce4f0fa58c746d3e9mike@reedtribe.orgstatic int lcanvas_save(lua_State* L) {
531fb858245216dafee4de731fce4f0fa58c746d3e9mike@reedtribe.org    lua_pushinteger(L, get_ref<SkCanvas>(L, 1)->save());
532fb858245216dafee4de731fce4f0fa58c746d3e9mike@reedtribe.org    return 1;
533fb858245216dafee4de731fce4f0fa58c746d3e9mike@reedtribe.org}
534fb858245216dafee4de731fce4f0fa58c746d3e9mike@reedtribe.org
535fb858245216dafee4de731fce4f0fa58c746d3e9mike@reedtribe.orgstatic int lcanvas_restore(lua_State* L) {
536fb858245216dafee4de731fce4f0fa58c746d3e9mike@reedtribe.org    get_ref<SkCanvas>(L, 1)->restore();
537fb858245216dafee4de731fce4f0fa58c746d3e9mike@reedtribe.org    return 0;
538fb858245216dafee4de731fce4f0fa58c746d3e9mike@reedtribe.org}
539fb858245216dafee4de731fce4f0fa58c746d3e9mike@reedtribe.org
5401d32cc67f77d3fac29db574d79c7dff93e035259mike@reedtribe.orgstatic int lcanvas_scale(lua_State* L) {
5411d32cc67f77d3fac29db574d79c7dff93e035259mike@reedtribe.org    SkScalar sx = lua2scalar_def(L, 2, 1);
5421d32cc67f77d3fac29db574d79c7dff93e035259mike@reedtribe.org    SkScalar sy = lua2scalar_def(L, 3, sx);
5431d32cc67f77d3fac29db574d79c7dff93e035259mike@reedtribe.org    get_ref<SkCanvas>(L, 1)->scale(sx, sy);
5441d32cc67f77d3fac29db574d79c7dff93e035259mike@reedtribe.org    return 0;
5451d32cc67f77d3fac29db574d79c7dff93e035259mike@reedtribe.org}
5461d32cc67f77d3fac29db574d79c7dff93e035259mike@reedtribe.org
5473597b73bc6e3e169f1d360de80d77e6e0ab65e96reed@google.comstatic int lcanvas_translate(lua_State* L) {
5481d32cc67f77d3fac29db574d79c7dff93e035259mike@reedtribe.org    SkScalar tx = lua2scalar_def(L, 2, 0);
5491d32cc67f77d3fac29db574d79c7dff93e035259mike@reedtribe.org    SkScalar ty = lua2scalar_def(L, 3, 0);
5501d32cc67f77d3fac29db574d79c7dff93e035259mike@reedtribe.org    get_ref<SkCanvas>(L, 1)->translate(tx, ty);
5511d32cc67f77d3fac29db574d79c7dff93e035259mike@reedtribe.org    return 0;
5521d32cc67f77d3fac29db574d79c7dff93e035259mike@reedtribe.org}
5531d32cc67f77d3fac29db574d79c7dff93e035259mike@reedtribe.org
5541d32cc67f77d3fac29db574d79c7dff93e035259mike@reedtribe.orgstatic int lcanvas_rotate(lua_State* L) {
5551d32cc67f77d3fac29db574d79c7dff93e035259mike@reedtribe.org    SkScalar degrees = lua2scalar_def(L, 2, 0);
5561d32cc67f77d3fac29db574d79c7dff93e035259mike@reedtribe.org    get_ref<SkCanvas>(L, 1)->rotate(degrees);
5573597b73bc6e3e169f1d360de80d77e6e0ab65e96reed@google.com    return 0;
5583597b73bc6e3e169f1d360de80d77e6e0ab65e96reed@google.com}
5593597b73bc6e3e169f1d360de80d77e6e0ab65e96reed@google.com
56074ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.comstatic int lcanvas_gc(lua_State* L) {
56174ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com    get_ref<SkCanvas>(L, 1)->unref();
56274ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com    return 0;
56374ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com}
56474ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com
5654ebe3821888d550d8a8b89341ec251ba942f0225bsalomon@google.comconst struct luaL_Reg gSkCanvas_Methods[] = {
56674ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com    { "drawColor", lcanvas_drawColor },
56774ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com    { "drawRect", lcanvas_drawRect },
56874ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com    { "drawOval", lcanvas_drawOval },
56974ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com    { "drawCircle", lcanvas_drawCircle },
570792bbd14c63f217f2de0e6b2f8df99acb1928eeamike@reedtribe.org    { "drawImage", lcanvas_drawImage },
571fd3458750d92d9722e5760ddb99824e65455463creed@google.com    { "drawPath", lcanvas_drawPath },
572e6469f10c8f9340032797316fd06ee2f109255ffmike@reedtribe.org    { "drawText", lcanvas_drawText },
57374ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com    { "getSaveCount", lcanvas_getSaveCount },
57474ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com    { "getTotalMatrix", lcanvas_getTotalMatrix },
5755cc25359c62c83c356c3a30572a05ac9647daa55commit-bot@chromium.org    { "getClipStack", lcanvas_getClipStack },
5764ebe3821888d550d8a8b89341ec251ba942f0225bsalomon@google.com#if SK_SUPPORT_GPU
5774ebe3821888d550d8a8b89341ec251ba942f0225bsalomon@google.com    { "getReducedClipStack", SkLua::lcanvas_getReducedClipStack },
5784ebe3821888d550d8a8b89341ec251ba942f0225bsalomon@google.com#endif
579fb858245216dafee4de731fce4f0fa58c746d3e9mike@reedtribe.org    { "save", lcanvas_save },
580fb858245216dafee4de731fce4f0fa58c746d3e9mike@reedtribe.org    { "restore", lcanvas_restore },
5811d32cc67f77d3fac29db574d79c7dff93e035259mike@reedtribe.org    { "scale", lcanvas_scale },
5823597b73bc6e3e169f1d360de80d77e6e0ab65e96reed@google.com    { "translate", lcanvas_translate },
5831d32cc67f77d3fac29db574d79c7dff93e035259mike@reedtribe.org    { "rotate", lcanvas_rotate },
58474ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com    { "__gc", lcanvas_gc },
58574ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com    { NULL, NULL }
58674ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com};
58774ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com
58874ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com///////////////////////////////////////////////////////////////////////////////
58974ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com
590fb858245216dafee4de731fce4f0fa58c746d3e9mike@reedtribe.orgstatic int ldocument_beginPage(lua_State* L) {
591fb858245216dafee4de731fce4f0fa58c746d3e9mike@reedtribe.org    const SkRect* contentPtr = NULL;
592fb858245216dafee4de731fce4f0fa58c746d3e9mike@reedtribe.org    push_ref(L, get_ref<SkDocument>(L, 1)->beginPage(lua2scalar(L, 2),
593fb858245216dafee4de731fce4f0fa58c746d3e9mike@reedtribe.org                                                     lua2scalar(L, 3),
594fb858245216dafee4de731fce4f0fa58c746d3e9mike@reedtribe.org                                                     contentPtr));
595fb858245216dafee4de731fce4f0fa58c746d3e9mike@reedtribe.org    return 1;
596fb858245216dafee4de731fce4f0fa58c746d3e9mike@reedtribe.org}
597fb858245216dafee4de731fce4f0fa58c746d3e9mike@reedtribe.org
598fb858245216dafee4de731fce4f0fa58c746d3e9mike@reedtribe.orgstatic int ldocument_endPage(lua_State* L) {
599fb858245216dafee4de731fce4f0fa58c746d3e9mike@reedtribe.org    get_ref<SkDocument>(L, 1)->endPage();
600fb858245216dafee4de731fce4f0fa58c746d3e9mike@reedtribe.org    return 0;
601fb858245216dafee4de731fce4f0fa58c746d3e9mike@reedtribe.org}
602fb858245216dafee4de731fce4f0fa58c746d3e9mike@reedtribe.org
603fb858245216dafee4de731fce4f0fa58c746d3e9mike@reedtribe.orgstatic int ldocument_close(lua_State* L) {
604fb858245216dafee4de731fce4f0fa58c746d3e9mike@reedtribe.org    get_ref<SkDocument>(L, 1)->close();
605fb858245216dafee4de731fce4f0fa58c746d3e9mike@reedtribe.org    return 0;
606fb858245216dafee4de731fce4f0fa58c746d3e9mike@reedtribe.org}
607fb858245216dafee4de731fce4f0fa58c746d3e9mike@reedtribe.org
608fb858245216dafee4de731fce4f0fa58c746d3e9mike@reedtribe.orgstatic int ldocument_gc(lua_State* L) {
609fb858245216dafee4de731fce4f0fa58c746d3e9mike@reedtribe.org    get_ref<SkDocument>(L, 1)->unref();
610fb858245216dafee4de731fce4f0fa58c746d3e9mike@reedtribe.org    return 0;
611fb858245216dafee4de731fce4f0fa58c746d3e9mike@reedtribe.org}
612fb858245216dafee4de731fce4f0fa58c746d3e9mike@reedtribe.org
613fb858245216dafee4de731fce4f0fa58c746d3e9mike@reedtribe.orgstatic const struct luaL_Reg gSkDocument_Methods[] = {
614fb858245216dafee4de731fce4f0fa58c746d3e9mike@reedtribe.org    { "beginPage", ldocument_beginPage },
615fb858245216dafee4de731fce4f0fa58c746d3e9mike@reedtribe.org    { "endPage", ldocument_endPage },
616fb858245216dafee4de731fce4f0fa58c746d3e9mike@reedtribe.org    { "close", ldocument_close },
617fb858245216dafee4de731fce4f0fa58c746d3e9mike@reedtribe.org    { "__gc", ldocument_gc },
618fb858245216dafee4de731fce4f0fa58c746d3e9mike@reedtribe.org    { NULL, NULL }
619fb858245216dafee4de731fce4f0fa58c746d3e9mike@reedtribe.org};
620fb858245216dafee4de731fce4f0fa58c746d3e9mike@reedtribe.org
621fb858245216dafee4de731fce4f0fa58c746d3e9mike@reedtribe.org///////////////////////////////////////////////////////////////////////////////
622fb858245216dafee4de731fce4f0fa58c746d3e9mike@reedtribe.org
62374ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.comstatic int lpaint_isAntiAlias(lua_State* L) {
62474ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com    lua_pushboolean(L, get_obj<SkPaint>(L, 1)->isAntiAlias());
62574ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com    return 1;
62674ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com}
62774ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com
62874ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.comstatic int lpaint_setAntiAlias(lua_State* L) {
62988c9ec968f682ebcc4ec13fe76f4d24d1e05633breed@google.com    get_obj<SkPaint>(L, 1)->setAntiAlias(lua2bool(L, 2));
63074ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com    return 0;
63174ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com}
63274ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com
6331cd71fb013643b983b372fee24eab3708aae70e9commit-bot@chromium.orgstatic int lpaint_isDither(lua_State* L) {
6341cd71fb013643b983b372fee24eab3708aae70e9commit-bot@chromium.org    lua_pushboolean(L, get_obj<SkPaint>(L, 1)->isDither());
6351cd71fb013643b983b372fee24eab3708aae70e9commit-bot@chromium.org    return 1;
6361cd71fb013643b983b372fee24eab3708aae70e9commit-bot@chromium.org}
6371cd71fb013643b983b372fee24eab3708aae70e9commit-bot@chromium.org
6381cd71fb013643b983b372fee24eab3708aae70e9commit-bot@chromium.orgstatic int lpaint_isUnderlineText(lua_State* L) {
6391cd71fb013643b983b372fee24eab3708aae70e9commit-bot@chromium.org    lua_pushboolean(L, get_obj<SkPaint>(L, 1)->isUnderlineText());
6401cd71fb013643b983b372fee24eab3708aae70e9commit-bot@chromium.org    return 1;
6411cd71fb013643b983b372fee24eab3708aae70e9commit-bot@chromium.org}
6421cd71fb013643b983b372fee24eab3708aae70e9commit-bot@chromium.org
6431cd71fb013643b983b372fee24eab3708aae70e9commit-bot@chromium.orgstatic int lpaint_isStrikeThruText(lua_State* L) {
6441cd71fb013643b983b372fee24eab3708aae70e9commit-bot@chromium.org    lua_pushboolean(L, get_obj<SkPaint>(L, 1)->isStrikeThruText());
6451cd71fb013643b983b372fee24eab3708aae70e9commit-bot@chromium.org    return 1;
6461cd71fb013643b983b372fee24eab3708aae70e9commit-bot@chromium.org}
6471cd71fb013643b983b372fee24eab3708aae70e9commit-bot@chromium.org
6481cd71fb013643b983b372fee24eab3708aae70e9commit-bot@chromium.orgstatic int lpaint_isFakeBoldText(lua_State* L) {
6491cd71fb013643b983b372fee24eab3708aae70e9commit-bot@chromium.org    lua_pushboolean(L, get_obj<SkPaint>(L, 1)->isFakeBoldText());
6501cd71fb013643b983b372fee24eab3708aae70e9commit-bot@chromium.org    return 1;
6511cd71fb013643b983b372fee24eab3708aae70e9commit-bot@chromium.org}
6521cd71fb013643b983b372fee24eab3708aae70e9commit-bot@chromium.org
6531cd71fb013643b983b372fee24eab3708aae70e9commit-bot@chromium.orgstatic int lpaint_isLinearText(lua_State* L) {
6541cd71fb013643b983b372fee24eab3708aae70e9commit-bot@chromium.org    lua_pushboolean(L, get_obj<SkPaint>(L, 1)->isLinearText());
6551cd71fb013643b983b372fee24eab3708aae70e9commit-bot@chromium.org    return 1;
6561cd71fb013643b983b372fee24eab3708aae70e9commit-bot@chromium.org}
6571cd71fb013643b983b372fee24eab3708aae70e9commit-bot@chromium.org
6581cd71fb013643b983b372fee24eab3708aae70e9commit-bot@chromium.orgstatic int lpaint_isSubpixelText(lua_State* L) {
6591cd71fb013643b983b372fee24eab3708aae70e9commit-bot@chromium.org    lua_pushboolean(L, get_obj<SkPaint>(L, 1)->isSubpixelText());
6601cd71fb013643b983b372fee24eab3708aae70e9commit-bot@chromium.org    return 1;
6611cd71fb013643b983b372fee24eab3708aae70e9commit-bot@chromium.org}
6621cd71fb013643b983b372fee24eab3708aae70e9commit-bot@chromium.org
6631cd71fb013643b983b372fee24eab3708aae70e9commit-bot@chromium.orgstatic int lpaint_isDevKernText(lua_State* L) {
6641cd71fb013643b983b372fee24eab3708aae70e9commit-bot@chromium.org    lua_pushboolean(L, get_obj<SkPaint>(L, 1)->isDevKernText());
6651cd71fb013643b983b372fee24eab3708aae70e9commit-bot@chromium.org    return 1;
6661cd71fb013643b983b372fee24eab3708aae70e9commit-bot@chromium.org}
6671cd71fb013643b983b372fee24eab3708aae70e9commit-bot@chromium.org
6681cd71fb013643b983b372fee24eab3708aae70e9commit-bot@chromium.orgstatic int lpaint_isLCDRenderText(lua_State* L) {
6691cd71fb013643b983b372fee24eab3708aae70e9commit-bot@chromium.org    lua_pushboolean(L, get_obj<SkPaint>(L, 1)->isLCDRenderText());
6701cd71fb013643b983b372fee24eab3708aae70e9commit-bot@chromium.org    return 1;
6711cd71fb013643b983b372fee24eab3708aae70e9commit-bot@chromium.org}
6721cd71fb013643b983b372fee24eab3708aae70e9commit-bot@chromium.org
6731cd71fb013643b983b372fee24eab3708aae70e9commit-bot@chromium.orgstatic int lpaint_isEmbeddedBitmapText(lua_State* L) {
6741cd71fb013643b983b372fee24eab3708aae70e9commit-bot@chromium.org    lua_pushboolean(L, get_obj<SkPaint>(L, 1)->isEmbeddedBitmapText());
6751cd71fb013643b983b372fee24eab3708aae70e9commit-bot@chromium.org    return 1;
6761cd71fb013643b983b372fee24eab3708aae70e9commit-bot@chromium.org}
6771cd71fb013643b983b372fee24eab3708aae70e9commit-bot@chromium.org
6781cd71fb013643b983b372fee24eab3708aae70e9commit-bot@chromium.orgstatic int lpaint_isAutohinted(lua_State* L) {
6791cd71fb013643b983b372fee24eab3708aae70e9commit-bot@chromium.org    lua_pushboolean(L, get_obj<SkPaint>(L, 1)->isAutohinted());
6801cd71fb013643b983b372fee24eab3708aae70e9commit-bot@chromium.org    return 1;
6811cd71fb013643b983b372fee24eab3708aae70e9commit-bot@chromium.org}
6821cd71fb013643b983b372fee24eab3708aae70e9commit-bot@chromium.org
6831cd71fb013643b983b372fee24eab3708aae70e9commit-bot@chromium.orgstatic int lpaint_isVerticalText(lua_State* L) {
6841cd71fb013643b983b372fee24eab3708aae70e9commit-bot@chromium.org    lua_pushboolean(L, get_obj<SkPaint>(L, 1)->isVerticalText());
6851cd71fb013643b983b372fee24eab3708aae70e9commit-bot@chromium.org    return 1;
6861cd71fb013643b983b372fee24eab3708aae70e9commit-bot@chromium.org}
6871cd71fb013643b983b372fee24eab3708aae70e9commit-bot@chromium.org
68874ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.comstatic int lpaint_getColor(lua_State* L) {
68974ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com    SkLua(L).pushColor(get_obj<SkPaint>(L, 1)->getColor());
69074ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com    return 1;
69174ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com}
69274ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com
69374ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.comstatic int lpaint_setColor(lua_State* L) {
69474ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com    get_obj<SkPaint>(L, 1)->setColor(lua2color(L, 2));
69574ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com    return 0;
69674ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com}
69774ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com
698e3823fd901674e22269637a669ac2b3e2667dc9creed@google.comstatic int lpaint_getTextSize(lua_State* L) {
699e3823fd901674e22269637a669ac2b3e2667dc9creed@google.com    SkLua(L).pushScalar(get_obj<SkPaint>(L, 1)->getTextSize());
700e3823fd901674e22269637a669ac2b3e2667dc9creed@google.com    return 1;
701e3823fd901674e22269637a669ac2b3e2667dc9creed@google.com}
702e3823fd901674e22269637a669ac2b3e2667dc9creed@google.com
7031cd71fb013643b983b372fee24eab3708aae70e9commit-bot@chromium.orgstatic int lpaint_getTextScaleX(lua_State* L) {
7041cd71fb013643b983b372fee24eab3708aae70e9commit-bot@chromium.org    SkLua(L).pushScalar(get_obj<SkPaint>(L, 1)->getTextScaleX());
7051cd71fb013643b983b372fee24eab3708aae70e9commit-bot@chromium.org    return 1;
7061cd71fb013643b983b372fee24eab3708aae70e9commit-bot@chromium.org}
7071cd71fb013643b983b372fee24eab3708aae70e9commit-bot@chromium.org
7081cd71fb013643b983b372fee24eab3708aae70e9commit-bot@chromium.orgstatic int lpaint_getTextSkewX(lua_State* L) {
7091cd71fb013643b983b372fee24eab3708aae70e9commit-bot@chromium.org    SkLua(L).pushScalar(get_obj<SkPaint>(L, 1)->getTextSkewX());
7101cd71fb013643b983b372fee24eab3708aae70e9commit-bot@chromium.org    return 1;
7111cd71fb013643b983b372fee24eab3708aae70e9commit-bot@chromium.org}
7121cd71fb013643b983b372fee24eab3708aae70e9commit-bot@chromium.org
713e3823fd901674e22269637a669ac2b3e2667dc9creed@google.comstatic int lpaint_setTextSize(lua_State* L) {
714e3823fd901674e22269637a669ac2b3e2667dc9creed@google.com    get_obj<SkPaint>(L, 1)->setTextSize(lua2scalar(L, 2));
715e3823fd901674e22269637a669ac2b3e2667dc9creed@google.com    return 0;
716e3823fd901674e22269637a669ac2b3e2667dc9creed@google.com}
717e3823fd901674e22269637a669ac2b3e2667dc9creed@google.com
718e6469f10c8f9340032797316fd06ee2f109255ffmike@reedtribe.orgstatic int lpaint_getTypeface(lua_State* L) {
719e6469f10c8f9340032797316fd06ee2f109255ffmike@reedtribe.org    push_ref(L, get_obj<SkPaint>(L, 1)->getTypeface());
720e6469f10c8f9340032797316fd06ee2f109255ffmike@reedtribe.org    return 1;
721e6469f10c8f9340032797316fd06ee2f109255ffmike@reedtribe.org}
722e6469f10c8f9340032797316fd06ee2f109255ffmike@reedtribe.org
723e6469f10c8f9340032797316fd06ee2f109255ffmike@reedtribe.orgstatic int lpaint_setTypeface(lua_State* L) {
724e6469f10c8f9340032797316fd06ee2f109255ffmike@reedtribe.org    get_obj<SkPaint>(L, 1)->setTypeface(get_ref<SkTypeface>(L, 2));
725e6469f10c8f9340032797316fd06ee2f109255ffmike@reedtribe.org    return 0;
726e6469f10c8f9340032797316fd06ee2f109255ffmike@reedtribe.org}
727e6469f10c8f9340032797316fd06ee2f109255ffmike@reedtribe.org
7281cd71fb013643b983b372fee24eab3708aae70e9commit-bot@chromium.orgstatic int lpaint_getHinting(lua_State* L) {
7291cd71fb013643b983b372fee24eab3708aae70e9commit-bot@chromium.org    SkLua(L).pushU32(get_obj<SkPaint>(L, 1)->getHinting());
7301cd71fb013643b983b372fee24eab3708aae70e9commit-bot@chromium.org    return 1;
7311cd71fb013643b983b372fee24eab3708aae70e9commit-bot@chromium.org}
7321cd71fb013643b983b372fee24eab3708aae70e9commit-bot@chromium.org
733e3823fd901674e22269637a669ac2b3e2667dc9creed@google.comstatic int lpaint_getFontID(lua_State* L) {
734e3823fd901674e22269637a669ac2b3e2667dc9creed@google.com    SkTypeface* face = get_obj<SkPaint>(L, 1)->getTypeface();
735e3823fd901674e22269637a669ac2b3e2667dc9creed@google.com    SkLua(L).pushU32(SkTypeface::UniqueID(face));
736e3823fd901674e22269637a669ac2b3e2667dc9creed@google.com    return 1;
737e3823fd901674e22269637a669ac2b3e2667dc9creed@google.com}
738e3823fd901674e22269637a669ac2b3e2667dc9creed@google.com
739fb858245216dafee4de731fce4f0fa58c746d3e9mike@reedtribe.orgstatic const struct {
740fb858245216dafee4de731fce4f0fa58c746d3e9mike@reedtribe.org    const char*     fLabel;
741fb858245216dafee4de731fce4f0fa58c746d3e9mike@reedtribe.org    SkPaint::Align  fAlign;
742fb858245216dafee4de731fce4f0fa58c746d3e9mike@reedtribe.org} gAlignRec[] = {
743fb858245216dafee4de731fce4f0fa58c746d3e9mike@reedtribe.org    { "left",   SkPaint::kLeft_Align },
744fb858245216dafee4de731fce4f0fa58c746d3e9mike@reedtribe.org    { "center", SkPaint::kCenter_Align },
745fb858245216dafee4de731fce4f0fa58c746d3e9mike@reedtribe.org    { "right",  SkPaint::kRight_Align },
746fb858245216dafee4de731fce4f0fa58c746d3e9mike@reedtribe.org};
747fb858245216dafee4de731fce4f0fa58c746d3e9mike@reedtribe.org
748fb858245216dafee4de731fce4f0fa58c746d3e9mike@reedtribe.orgstatic int lpaint_getTextAlign(lua_State* L) {
749fb858245216dafee4de731fce4f0fa58c746d3e9mike@reedtribe.org    SkPaint::Align align = get_obj<SkPaint>(L, 1)->getTextAlign();
750fb858245216dafee4de731fce4f0fa58c746d3e9mike@reedtribe.org    for (size_t i = 0; i < SK_ARRAY_COUNT(gAlignRec); ++i) {
751fb858245216dafee4de731fce4f0fa58c746d3e9mike@reedtribe.org        if (gAlignRec[i].fAlign == align) {
752fb858245216dafee4de731fce4f0fa58c746d3e9mike@reedtribe.org            lua_pushstring(L, gAlignRec[i].fLabel);
753fb858245216dafee4de731fce4f0fa58c746d3e9mike@reedtribe.org            return 1;
754fb858245216dafee4de731fce4f0fa58c746d3e9mike@reedtribe.org        }
755fb858245216dafee4de731fce4f0fa58c746d3e9mike@reedtribe.org    }
756fb858245216dafee4de731fce4f0fa58c746d3e9mike@reedtribe.org    return 0;
757fb858245216dafee4de731fce4f0fa58c746d3e9mike@reedtribe.org}
758fb858245216dafee4de731fce4f0fa58c746d3e9mike@reedtribe.org
759fb858245216dafee4de731fce4f0fa58c746d3e9mike@reedtribe.orgstatic int lpaint_setTextAlign(lua_State* L) {
760fb858245216dafee4de731fce4f0fa58c746d3e9mike@reedtribe.org    if (lua_isstring(L, 2)) {
761fb858245216dafee4de731fce4f0fa58c746d3e9mike@reedtribe.org        size_t len;
762fb858245216dafee4de731fce4f0fa58c746d3e9mike@reedtribe.org        const char* label = lua_tolstring(L, 2, &len);
763370c534c19f0faa0d60b3cac2e77886b53535c8fskia.committer@gmail.com
764fb858245216dafee4de731fce4f0fa58c746d3e9mike@reedtribe.org        for (size_t i = 0; i < SK_ARRAY_COUNT(gAlignRec); ++i) {
765fb858245216dafee4de731fce4f0fa58c746d3e9mike@reedtribe.org            if (!strcmp(gAlignRec[i].fLabel, label)) {
766fb858245216dafee4de731fce4f0fa58c746d3e9mike@reedtribe.org                get_obj<SkPaint>(L, 1)->setTextAlign(gAlignRec[i].fAlign);
767fb858245216dafee4de731fce4f0fa58c746d3e9mike@reedtribe.org                break;
768fb858245216dafee4de731fce4f0fa58c746d3e9mike@reedtribe.org            }
769fb858245216dafee4de731fce4f0fa58c746d3e9mike@reedtribe.org        }
770fb858245216dafee4de731fce4f0fa58c746d3e9mike@reedtribe.org    }
771fb858245216dafee4de731fce4f0fa58c746d3e9mike@reedtribe.org    return 0;
772fb858245216dafee4de731fce4f0fa58c746d3e9mike@reedtribe.org}
773fb858245216dafee4de731fce4f0fa58c746d3e9mike@reedtribe.org
77473d9f1c65114ba638637152605b0f03e871271damike@reedtribe.orgstatic int lpaint_getStroke(lua_State* L) {
77573d9f1c65114ba638637152605b0f03e871271damike@reedtribe.org    lua_pushboolean(L, SkPaint::kStroke_Style == get_obj<SkPaint>(L, 1)->getStyle());
77673d9f1c65114ba638637152605b0f03e871271damike@reedtribe.org    return 1;
77773d9f1c65114ba638637152605b0f03e871271damike@reedtribe.org}
77873d9f1c65114ba638637152605b0f03e871271damike@reedtribe.org
77973d9f1c65114ba638637152605b0f03e871271damike@reedtribe.orgstatic int lpaint_setStroke(lua_State* L) {
78073d9f1c65114ba638637152605b0f03e871271damike@reedtribe.org    SkPaint::Style style;
781370c534c19f0faa0d60b3cac2e77886b53535c8fskia.committer@gmail.com
78273d9f1c65114ba638637152605b0f03e871271damike@reedtribe.org    if (lua_toboolean(L, 2)) {
78373d9f1c65114ba638637152605b0f03e871271damike@reedtribe.org        style = SkPaint::kStroke_Style;
78473d9f1c65114ba638637152605b0f03e871271damike@reedtribe.org    } else {
78573d9f1c65114ba638637152605b0f03e871271damike@reedtribe.org        style = SkPaint::kFill_Style;
78673d9f1c65114ba638637152605b0f03e871271damike@reedtribe.org    }
78773d9f1c65114ba638637152605b0f03e871271damike@reedtribe.org    get_obj<SkPaint>(L, 1)->setStyle(style);
78873d9f1c65114ba638637152605b0f03e871271damike@reedtribe.org    return 0;
78973d9f1c65114ba638637152605b0f03e871271damike@reedtribe.org}
79073d9f1c65114ba638637152605b0f03e871271damike@reedtribe.org
7911cd71fb013643b983b372fee24eab3708aae70e9commit-bot@chromium.orgstatic int lpaint_getStrokeCap(lua_State* L) {
7921cd71fb013643b983b372fee24eab3708aae70e9commit-bot@chromium.org    SkLua(L).pushU32(get_obj<SkPaint>(L, 1)->getStrokeCap());
7931cd71fb013643b983b372fee24eab3708aae70e9commit-bot@chromium.org    return 1;
7941cd71fb013643b983b372fee24eab3708aae70e9commit-bot@chromium.org}
7951cd71fb013643b983b372fee24eab3708aae70e9commit-bot@chromium.org
7961cd71fb013643b983b372fee24eab3708aae70e9commit-bot@chromium.orgstatic int lpaint_getStrokeJoin(lua_State* L) {
7971cd71fb013643b983b372fee24eab3708aae70e9commit-bot@chromium.org    SkLua(L).pushU32(get_obj<SkPaint>(L, 1)->getStrokeJoin());
7981cd71fb013643b983b372fee24eab3708aae70e9commit-bot@chromium.org    return 1;
7991cd71fb013643b983b372fee24eab3708aae70e9commit-bot@chromium.org}
8001cd71fb013643b983b372fee24eab3708aae70e9commit-bot@chromium.org
8011cd71fb013643b983b372fee24eab3708aae70e9commit-bot@chromium.orgstatic int lpaint_getTextEncoding(lua_State* L) {
802641bcc3c5caac1ed544cce95fa58ace904910dc4commit-bot@chromium.org    SkLua(L).pushU32(get_obj<SkPaint>(L, 1)->getTextEncoding());
8031cd71fb013643b983b372fee24eab3708aae70e9commit-bot@chromium.org    return 1;
8041cd71fb013643b983b372fee24eab3708aae70e9commit-bot@chromium.org}
8051cd71fb013643b983b372fee24eab3708aae70e9commit-bot@chromium.org
80673d9f1c65114ba638637152605b0f03e871271damike@reedtribe.orgstatic int lpaint_getStrokeWidth(lua_State* L) {
80773d9f1c65114ba638637152605b0f03e871271damike@reedtribe.org    SkLua(L).pushScalar(get_obj<SkPaint>(L, 1)->getStrokeWidth());
80873d9f1c65114ba638637152605b0f03e871271damike@reedtribe.org    return 1;
80973d9f1c65114ba638637152605b0f03e871271damike@reedtribe.org}
81073d9f1c65114ba638637152605b0f03e871271damike@reedtribe.org
81173d9f1c65114ba638637152605b0f03e871271damike@reedtribe.orgstatic int lpaint_setStrokeWidth(lua_State* L) {
81273d9f1c65114ba638637152605b0f03e871271damike@reedtribe.org    get_obj<SkPaint>(L, 1)->setStrokeWidth(lua2scalar(L, 2));
81373d9f1c65114ba638637152605b0f03e871271damike@reedtribe.org    return 0;
81473d9f1c65114ba638637152605b0f03e871271damike@reedtribe.org}
81573d9f1c65114ba638637152605b0f03e871271damike@reedtribe.org
8161cd71fb013643b983b372fee24eab3708aae70e9commit-bot@chromium.orgstatic int lpaint_getStrokeMiter(lua_State* L) {
8171cd71fb013643b983b372fee24eab3708aae70e9commit-bot@chromium.org    SkLua(L).pushScalar(get_obj<SkPaint>(L, 1)->getStrokeMiter());
8181cd71fb013643b983b372fee24eab3708aae70e9commit-bot@chromium.org    return 1;
8191cd71fb013643b983b372fee24eab3708aae70e9commit-bot@chromium.org}
8201cd71fb013643b983b372fee24eab3708aae70e9commit-bot@chromium.org
82173d9f1c65114ba638637152605b0f03e871271damike@reedtribe.orgstatic int lpaint_measureText(lua_State* L) {
82273d9f1c65114ba638637152605b0f03e871271damike@reedtribe.org    if (lua_isstring(L, 2)) {
82373d9f1c65114ba638637152605b0f03e871271damike@reedtribe.org        size_t len;
82473d9f1c65114ba638637152605b0f03e871271damike@reedtribe.org        const char* text = lua_tolstring(L, 2, &len);
82573d9f1c65114ba638637152605b0f03e871271damike@reedtribe.org        SkLua(L).pushScalar(get_obj<SkPaint>(L, 1)->measureText(text, len));
82673d9f1c65114ba638637152605b0f03e871271damike@reedtribe.org        return 1;
82773d9f1c65114ba638637152605b0f03e871271damike@reedtribe.org    }
82873d9f1c65114ba638637152605b0f03e871271damike@reedtribe.org    return 0;
82973d9f1c65114ba638637152605b0f03e871271damike@reedtribe.org}
83073d9f1c65114ba638637152605b0f03e871271damike@reedtribe.org
83173d9f1c65114ba638637152605b0f03e871271damike@reedtribe.orgstruct FontMetrics {
83273d9f1c65114ba638637152605b0f03e871271damike@reedtribe.org    SkScalar    fTop;       //!< The greatest distance above the baseline for any glyph (will be <= 0)
83373d9f1c65114ba638637152605b0f03e871271damike@reedtribe.org    SkScalar    fAscent;    //!< The recommended distance above the baseline (will be <= 0)
83473d9f1c65114ba638637152605b0f03e871271damike@reedtribe.org    SkScalar    fDescent;   //!< The recommended distance below the baseline (will be >= 0)
83573d9f1c65114ba638637152605b0f03e871271damike@reedtribe.org    SkScalar    fBottom;    //!< The greatest distance below the baseline for any glyph (will be >= 0)
83673d9f1c65114ba638637152605b0f03e871271damike@reedtribe.org    SkScalar    fLeading;   //!< The recommended distance to add between lines of text (will be >= 0)
83773d9f1c65114ba638637152605b0f03e871271damike@reedtribe.org    SkScalar    fAvgCharWidth;  //!< the average charactor width (>= 0)
83873d9f1c65114ba638637152605b0f03e871271damike@reedtribe.org    SkScalar    fXMin;      //!< The minimum bounding box x value for all glyphs
83973d9f1c65114ba638637152605b0f03e871271damike@reedtribe.org    SkScalar    fXMax;      //!< The maximum bounding box x value for all glyphs
84073d9f1c65114ba638637152605b0f03e871271damike@reedtribe.org    SkScalar    fXHeight;   //!< the height of an 'x' in px, or 0 if no 'x' in face
84173d9f1c65114ba638637152605b0f03e871271damike@reedtribe.org};
84273d9f1c65114ba638637152605b0f03e871271damike@reedtribe.org
84373d9f1c65114ba638637152605b0f03e871271damike@reedtribe.orgstatic int lpaint_getFontMetrics(lua_State* L) {
84473d9f1c65114ba638637152605b0f03e871271damike@reedtribe.org    SkPaint::FontMetrics fm;
84573d9f1c65114ba638637152605b0f03e871271damike@reedtribe.org    SkScalar height = get_obj<SkPaint>(L, 1)->getFontMetrics(&fm);
846370c534c19f0faa0d60b3cac2e77886b53535c8fskia.committer@gmail.com
84773d9f1c65114ba638637152605b0f03e871271damike@reedtribe.org    lua_newtable(L);
84873d9f1c65114ba638637152605b0f03e871271damike@reedtribe.org    setfield_scalar(L, "top", fm.fTop);
84973d9f1c65114ba638637152605b0f03e871271damike@reedtribe.org    setfield_scalar(L, "ascent", fm.fAscent);
85073d9f1c65114ba638637152605b0f03e871271damike@reedtribe.org    setfield_scalar(L, "descent", fm.fDescent);
85173d9f1c65114ba638637152605b0f03e871271damike@reedtribe.org    setfield_scalar(L, "bottom", fm.fBottom);
85273d9f1c65114ba638637152605b0f03e871271damike@reedtribe.org    setfield_scalar(L, "leading", fm.fLeading);
85373d9f1c65114ba638637152605b0f03e871271damike@reedtribe.org    SkLua(L).pushScalar(height);
85473d9f1c65114ba638637152605b0f03e871271damike@reedtribe.org    return 2;
85573d9f1c65114ba638637152605b0f03e871271damike@reedtribe.org}
85673d9f1c65114ba638637152605b0f03e871271damike@reedtribe.org
85729563879168ed58a8295520fbb4381d0ceff9f2freed@google.comstatic int lpaint_getEffects(lua_State* L) {
85829563879168ed58a8295520fbb4381d0ceff9f2freed@google.com    const SkPaint* paint = get_obj<SkPaint>(L, 1);
859de2e4e8a6422c7d8b5847f038f5c6360b187f7a2skia.committer@gmail.com
86029563879168ed58a8295520fbb4381d0ceff9f2freed@google.com    lua_newtable(L);
86129563879168ed58a8295520fbb4381d0ceff9f2freed@google.com    setfield_bool_if(L, "looper", !!paint->getLooper());
86229563879168ed58a8295520fbb4381d0ceff9f2freed@google.com    setfield_bool_if(L, "pathEffect", !!paint->getPathEffect());
86329563879168ed58a8295520fbb4381d0ceff9f2freed@google.com    setfield_bool_if(L, "rasterizer", !!paint->getRasterizer());
86429563879168ed58a8295520fbb4381d0ceff9f2freed@google.com    setfield_bool_if(L, "maskFilter", !!paint->getMaskFilter());
86529563879168ed58a8295520fbb4381d0ceff9f2freed@google.com    setfield_bool_if(L, "shader", !!paint->getShader());
86629563879168ed58a8295520fbb4381d0ceff9f2freed@google.com    setfield_bool_if(L, "colorFilter", !!paint->getColorFilter());
86729563879168ed58a8295520fbb4381d0ceff9f2freed@google.com    setfield_bool_if(L, "imageFilter", !!paint->getImageFilter());
86829563879168ed58a8295520fbb4381d0ceff9f2freed@google.com    setfield_bool_if(L, "xfermode", !!paint->getXfermode());
86929563879168ed58a8295520fbb4381d0ceff9f2freed@google.com    return 1;
87029563879168ed58a8295520fbb4381d0ceff9f2freed@google.com}
87129563879168ed58a8295520fbb4381d0ceff9f2freed@google.com
8725fdc983f58098e5c9fbdbedc7719f87e5efa4d31reed@google.comstatic int lpaint_getShader(lua_State* L) {
8735fdc983f58098e5c9fbdbedc7719f87e5efa4d31reed@google.com    const SkPaint* paint = get_obj<SkPaint>(L, 1);
8745fdc983f58098e5c9fbdbedc7719f87e5efa4d31reed@google.com    SkShader* shader = paint->getShader();
8755fdc983f58098e5c9fbdbedc7719f87e5efa4d31reed@google.com    if (shader) {
8765fdc983f58098e5c9fbdbedc7719f87e5efa4d31reed@google.com        push_ref(L, shader);
8775fdc983f58098e5c9fbdbedc7719f87e5efa4d31reed@google.com        return 1;
8785fdc983f58098e5c9fbdbedc7719f87e5efa4d31reed@google.com    }
8795fdc983f58098e5c9fbdbedc7719f87e5efa4d31reed@google.com    return 0;
8805fdc983f58098e5c9fbdbedc7719f87e5efa4d31reed@google.com}
8815fdc983f58098e5c9fbdbedc7719f87e5efa4d31reed@google.com
8821301bf3abfe355f9aadd53d5dbf04926013231bacommit-bot@chromium.orgstatic int lpaint_getPathEffect(lua_State* L) {
8831301bf3abfe355f9aadd53d5dbf04926013231bacommit-bot@chromium.org    const SkPaint* paint = get_obj<SkPaint>(L, 1);
8841301bf3abfe355f9aadd53d5dbf04926013231bacommit-bot@chromium.org    SkPathEffect* pe = paint->getPathEffect();
8851301bf3abfe355f9aadd53d5dbf04926013231bacommit-bot@chromium.org    if (pe) {
8861301bf3abfe355f9aadd53d5dbf04926013231bacommit-bot@chromium.org        push_ref(L, pe);
8871301bf3abfe355f9aadd53d5dbf04926013231bacommit-bot@chromium.org        return 1;
8881301bf3abfe355f9aadd53d5dbf04926013231bacommit-bot@chromium.org    }
8891301bf3abfe355f9aadd53d5dbf04926013231bacommit-bot@chromium.org    return 0;
8901301bf3abfe355f9aadd53d5dbf04926013231bacommit-bot@chromium.org}
8911301bf3abfe355f9aadd53d5dbf04926013231bacommit-bot@chromium.org
89274ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.comstatic int lpaint_gc(lua_State* L) {
89374ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com    get_obj<SkPaint>(L, 1)->~SkPaint();
89474ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com    return 0;
89574ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com}
89674ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com
89774ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.comstatic const struct luaL_Reg gSkPaint_Methods[] = {
89874ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com    { "isAntiAlias", lpaint_isAntiAlias },
89974ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com    { "setAntiAlias", lpaint_setAntiAlias },
9001cd71fb013643b983b372fee24eab3708aae70e9commit-bot@chromium.org    { "isDither", lpaint_isDither },
9011cd71fb013643b983b372fee24eab3708aae70e9commit-bot@chromium.org    { "isUnderlineText", lpaint_isUnderlineText },
9021cd71fb013643b983b372fee24eab3708aae70e9commit-bot@chromium.org    { "isStrikeThruText", lpaint_isStrikeThruText },
9031cd71fb013643b983b372fee24eab3708aae70e9commit-bot@chromium.org    { "isFakeBoldText", lpaint_isFakeBoldText },
9041cd71fb013643b983b372fee24eab3708aae70e9commit-bot@chromium.org    { "isLinearText", lpaint_isLinearText },
9051cd71fb013643b983b372fee24eab3708aae70e9commit-bot@chromium.org    { "isSubpixelText", lpaint_isSubpixelText },
9061cd71fb013643b983b372fee24eab3708aae70e9commit-bot@chromium.org    { "isDevKernText", lpaint_isDevKernText },
9071cd71fb013643b983b372fee24eab3708aae70e9commit-bot@chromium.org    { "isLCDRenderText", lpaint_isLCDRenderText },
9081cd71fb013643b983b372fee24eab3708aae70e9commit-bot@chromium.org    { "isEmbeddedBitmapText", lpaint_isEmbeddedBitmapText },
9091cd71fb013643b983b372fee24eab3708aae70e9commit-bot@chromium.org    { "isAutohinted", lpaint_isAutohinted },
9101cd71fb013643b983b372fee24eab3708aae70e9commit-bot@chromium.org    { "isVerticalText", lpaint_isVerticalText },
91174ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com    { "getColor", lpaint_getColor },
91274ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com    { "setColor", lpaint_setColor },
913e3823fd901674e22269637a669ac2b3e2667dc9creed@google.com    { "getTextSize", lpaint_getTextSize },
914e3823fd901674e22269637a669ac2b3e2667dc9creed@google.com    { "setTextSize", lpaint_setTextSize },
9151cd71fb013643b983b372fee24eab3708aae70e9commit-bot@chromium.org    { "getTextScaleX", lpaint_getTextScaleX },
9161cd71fb013643b983b372fee24eab3708aae70e9commit-bot@chromium.org    { "getTextSkewX", lpaint_getTextSkewX },
917e6469f10c8f9340032797316fd06ee2f109255ffmike@reedtribe.org    { "getTypeface", lpaint_getTypeface },
918e6469f10c8f9340032797316fd06ee2f109255ffmike@reedtribe.org    { "setTypeface", lpaint_setTypeface },
9191cd71fb013643b983b372fee24eab3708aae70e9commit-bot@chromium.org    { "getHinting", lpaint_getHinting },
920e3823fd901674e22269637a669ac2b3e2667dc9creed@google.com    { "getFontID", lpaint_getFontID },
921fb858245216dafee4de731fce4f0fa58c746d3e9mike@reedtribe.org    { "getTextAlign", lpaint_getTextAlign },
922fb858245216dafee4de731fce4f0fa58c746d3e9mike@reedtribe.org    { "setTextAlign", lpaint_setTextAlign },
92373d9f1c65114ba638637152605b0f03e871271damike@reedtribe.org    { "getStroke", lpaint_getStroke },
92473d9f1c65114ba638637152605b0f03e871271damike@reedtribe.org    { "setStroke", lpaint_setStroke },
9251cd71fb013643b983b372fee24eab3708aae70e9commit-bot@chromium.org    { "getStrokeCap", lpaint_getStrokeCap },
9261cd71fb013643b983b372fee24eab3708aae70e9commit-bot@chromium.org    { "getStrokeJoin", lpaint_getStrokeJoin },
9271cd71fb013643b983b372fee24eab3708aae70e9commit-bot@chromium.org    { "getTextEncoding", lpaint_getTextEncoding },
92873d9f1c65114ba638637152605b0f03e871271damike@reedtribe.org    { "getStrokeWidth", lpaint_getStrokeWidth },
92973d9f1c65114ba638637152605b0f03e871271damike@reedtribe.org    { "setStrokeWidth", lpaint_setStrokeWidth },
9301cd71fb013643b983b372fee24eab3708aae70e9commit-bot@chromium.org    { "getStrokeMiter", lpaint_getStrokeMiter },
93173d9f1c65114ba638637152605b0f03e871271damike@reedtribe.org    { "measureText", lpaint_measureText },
93273d9f1c65114ba638637152605b0f03e871271damike@reedtribe.org    { "getFontMetrics", lpaint_getFontMetrics },
93329563879168ed58a8295520fbb4381d0ceff9f2freed@google.com    { "getEffects", lpaint_getEffects },
9345fdc983f58098e5c9fbdbedc7719f87e5efa4d31reed@google.com    { "getShader", lpaint_getShader },
9351301bf3abfe355f9aadd53d5dbf04926013231bacommit-bot@chromium.org    { "getPathEffect", lpaint_getPathEffect },
93674ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com    { "__gc", lpaint_gc },
93774ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com    { NULL, NULL }
93874ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com};
93974ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com
94074ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com///////////////////////////////////////////////////////////////////////////////
94174ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com
9425fdc983f58098e5c9fbdbedc7719f87e5efa4d31reed@google.comstatic const char* mode2string(SkShader::TileMode mode) {
9435fdc983f58098e5c9fbdbedc7719f87e5efa4d31reed@google.com    static const char* gNames[] = { "clamp", "repeat", "mirror" };
9445fdc983f58098e5c9fbdbedc7719f87e5efa4d31reed@google.com    SkASSERT((unsigned)mode < SK_ARRAY_COUNT(gNames));
9455fdc983f58098e5c9fbdbedc7719f87e5efa4d31reed@google.com    return gNames[mode];
9465fdc983f58098e5c9fbdbedc7719f87e5efa4d31reed@google.com}
9475fdc983f58098e5c9fbdbedc7719f87e5efa4d31reed@google.com
9485fdc983f58098e5c9fbdbedc7719f87e5efa4d31reed@google.comstatic const char* gradtype2string(SkShader::GradientType t) {
9495fdc983f58098e5c9fbdbedc7719f87e5efa4d31reed@google.com    static const char* gNames[] = {
9505fdc983f58098e5c9fbdbedc7719f87e5efa4d31reed@google.com        "none", "color", "linear", "radial", "radial2", "sweep", "conical"
9515fdc983f58098e5c9fbdbedc7719f87e5efa4d31reed@google.com    };
9525fdc983f58098e5c9fbdbedc7719f87e5efa4d31reed@google.com    SkASSERT((unsigned)t < SK_ARRAY_COUNT(gNames));
9535fdc983f58098e5c9fbdbedc7719f87e5efa4d31reed@google.com    return gNames[t];
9545fdc983f58098e5c9fbdbedc7719f87e5efa4d31reed@google.com}
9555fdc983f58098e5c9fbdbedc7719f87e5efa4d31reed@google.com
9565fdc983f58098e5c9fbdbedc7719f87e5efa4d31reed@google.comstatic int lshader_isOpaque(lua_State* L) {
9575fdc983f58098e5c9fbdbedc7719f87e5efa4d31reed@google.com    SkShader* shader = get_ref<SkShader>(L, 1);
9585fdc983f58098e5c9fbdbedc7719f87e5efa4d31reed@google.com    return shader && shader->isOpaque();
9595fdc983f58098e5c9fbdbedc7719f87e5efa4d31reed@google.com}
9605fdc983f58098e5c9fbdbedc7719f87e5efa4d31reed@google.com
9615fdc983f58098e5c9fbdbedc7719f87e5efa4d31reed@google.comstatic int lshader_asABitmap(lua_State* L) {
9625fdc983f58098e5c9fbdbedc7719f87e5efa4d31reed@google.com    SkShader* shader = get_ref<SkShader>(L, 1);
9635fdc983f58098e5c9fbdbedc7719f87e5efa4d31reed@google.com    if (shader) {
9645fdc983f58098e5c9fbdbedc7719f87e5efa4d31reed@google.com        SkBitmap bm;
9655fdc983f58098e5c9fbdbedc7719f87e5efa4d31reed@google.com        SkMatrix matrix;
9665fdc983f58098e5c9fbdbedc7719f87e5efa4d31reed@google.com        SkShader::TileMode modes[2];
9675fdc983f58098e5c9fbdbedc7719f87e5efa4d31reed@google.com        switch (shader->asABitmap(&bm, &matrix, modes)) {
9685fdc983f58098e5c9fbdbedc7719f87e5efa4d31reed@google.com            case SkShader::kDefault_BitmapType:
9695fdc983f58098e5c9fbdbedc7719f87e5efa4d31reed@google.com                lua_newtable(L);
9705fdc983f58098e5c9fbdbedc7719f87e5efa4d31reed@google.com                setfield_number(L, "genID", bm.pixelRef() ? bm.pixelRef()->getGenerationID() : 0);
9715fdc983f58098e5c9fbdbedc7719f87e5efa4d31reed@google.com                setfield_number(L, "width", bm.width());
9725fdc983f58098e5c9fbdbedc7719f87e5efa4d31reed@google.com                setfield_number(L, "height", bm.height());
9735fdc983f58098e5c9fbdbedc7719f87e5efa4d31reed@google.com                setfield_string(L, "tileX", mode2string(modes[0]));
9745fdc983f58098e5c9fbdbedc7719f87e5efa4d31reed@google.com                setfield_string(L, "tileY", mode2string(modes[1]));
9755fdc983f58098e5c9fbdbedc7719f87e5efa4d31reed@google.com                return 1;
9765fdc983f58098e5c9fbdbedc7719f87e5efa4d31reed@google.com            default:
9775fdc983f58098e5c9fbdbedc7719f87e5efa4d31reed@google.com                break;
9785fdc983f58098e5c9fbdbedc7719f87e5efa4d31reed@google.com        }
9795fdc983f58098e5c9fbdbedc7719f87e5efa4d31reed@google.com    }
9805fdc983f58098e5c9fbdbedc7719f87e5efa4d31reed@google.com    return 0;
9815fdc983f58098e5c9fbdbedc7719f87e5efa4d31reed@google.com}
9825fdc983f58098e5c9fbdbedc7719f87e5efa4d31reed@google.com
9835fdc983f58098e5c9fbdbedc7719f87e5efa4d31reed@google.comstatic int lshader_asAGradient(lua_State* L) {
9845fdc983f58098e5c9fbdbedc7719f87e5efa4d31reed@google.com    SkShader* shader = get_ref<SkShader>(L, 1);
9855fdc983f58098e5c9fbdbedc7719f87e5efa4d31reed@google.com    if (shader) {
9865fdc983f58098e5c9fbdbedc7719f87e5efa4d31reed@google.com        SkShader::GradientInfo info;
9875fdc983f58098e5c9fbdbedc7719f87e5efa4d31reed@google.com        sk_bzero(&info, sizeof(info));
98874f96b9c4caeff8e805d8a37c63a5e5a103e59abcommit-bot@chromium.org
98974f96b9c4caeff8e805d8a37c63a5e5a103e59abcommit-bot@chromium.org        SkColor colors[3];  // hacked in for extracting info on 3 color case.
990bd74add1dcb47cfaa8c8d176c2cc70e1e31c8b50skia.committer@gmail.com        SkScalar pos[3];
99174f96b9c4caeff8e805d8a37c63a5e5a103e59abcommit-bot@chromium.org
99274f96b9c4caeff8e805d8a37c63a5e5a103e59abcommit-bot@chromium.org        info.fColorCount = 3;
99374f96b9c4caeff8e805d8a37c63a5e5a103e59abcommit-bot@chromium.org        info.fColors = &colors[0];
99474f96b9c4caeff8e805d8a37c63a5e5a103e59abcommit-bot@chromium.org        info.fColorOffsets = &pos[0];
995bd74add1dcb47cfaa8c8d176c2cc70e1e31c8b50skia.committer@gmail.com
9965fdc983f58098e5c9fbdbedc7719f87e5efa4d31reed@google.com        SkShader::GradientType t = shader->asAGradient(&info);
99774f96b9c4caeff8e805d8a37c63a5e5a103e59abcommit-bot@chromium.org
9985fdc983f58098e5c9fbdbedc7719f87e5efa4d31reed@google.com        if (SkShader::kNone_GradientType != t) {
9995fdc983f58098e5c9fbdbedc7719f87e5efa4d31reed@google.com            lua_newtable(L);
10005fdc983f58098e5c9fbdbedc7719f87e5efa4d31reed@google.com            setfield_string(L, "type", gradtype2string(t));
10015fdc983f58098e5c9fbdbedc7719f87e5efa4d31reed@google.com            setfield_number(L, "colorCount", info.fColorCount);
10025fdc983f58098e5c9fbdbedc7719f87e5efa4d31reed@google.com            setfield_string(L, "tile", mode2string(info.fTileMode));
100374f96b9c4caeff8e805d8a37c63a5e5a103e59abcommit-bot@chromium.org
100474f96b9c4caeff8e805d8a37c63a5e5a103e59abcommit-bot@chromium.org            if (info.fColorCount == 3){
100574f96b9c4caeff8e805d8a37c63a5e5a103e59abcommit-bot@chromium.org                setfield_number(L, "midPos", pos[1]);
100674f96b9c4caeff8e805d8a37c63a5e5a103e59abcommit-bot@chromium.org            }
1007bd74add1dcb47cfaa8c8d176c2cc70e1e31c8b50skia.committer@gmail.com
10085fdc983f58098e5c9fbdbedc7719f87e5efa4d31reed@google.com            return 1;
10095fdc983f58098e5c9fbdbedc7719f87e5efa4d31reed@google.com        }
10105fdc983f58098e5c9fbdbedc7719f87e5efa4d31reed@google.com    }
10115fdc983f58098e5c9fbdbedc7719f87e5efa4d31reed@google.com    return 0;
10125fdc983f58098e5c9fbdbedc7719f87e5efa4d31reed@google.com}
10135fdc983f58098e5c9fbdbedc7719f87e5efa4d31reed@google.com
10145fdc983f58098e5c9fbdbedc7719f87e5efa4d31reed@google.comstatic int lshader_gc(lua_State* L) {
10155fdc983f58098e5c9fbdbedc7719f87e5efa4d31reed@google.com    get_ref<SkShader>(L, 1)->unref();
10165fdc983f58098e5c9fbdbedc7719f87e5efa4d31reed@google.com    return 0;
10175fdc983f58098e5c9fbdbedc7719f87e5efa4d31reed@google.com}
10185fdc983f58098e5c9fbdbedc7719f87e5efa4d31reed@google.com
10195fdc983f58098e5c9fbdbedc7719f87e5efa4d31reed@google.comstatic const struct luaL_Reg gSkShader_Methods[] = {
10205fdc983f58098e5c9fbdbedc7719f87e5efa4d31reed@google.com    { "isOpaque",       lshader_isOpaque },
10215fdc983f58098e5c9fbdbedc7719f87e5efa4d31reed@google.com    { "asABitmap",      lshader_asABitmap },
10225fdc983f58098e5c9fbdbedc7719f87e5efa4d31reed@google.com    { "asAGradient",    lshader_asAGradient },
10235fdc983f58098e5c9fbdbedc7719f87e5efa4d31reed@google.com    { "__gc",           lshader_gc },
10245fdc983f58098e5c9fbdbedc7719f87e5efa4d31reed@google.com    { NULL, NULL }
10255fdc983f58098e5c9fbdbedc7719f87e5efa4d31reed@google.com};
10265fdc983f58098e5c9fbdbedc7719f87e5efa4d31reed@google.com
10275fdc983f58098e5c9fbdbedc7719f87e5efa4d31reed@google.com///////////////////////////////////////////////////////////////////////////////
10285fdc983f58098e5c9fbdbedc7719f87e5efa4d31reed@google.com
10294d803a976c25ed582b02f8c42cd91c82e9d1ea84commit-bot@chromium.orgstatic int lpatheffect_asADash(lua_State* L) {
10304d803a976c25ed582b02f8c42cd91c82e9d1ea84commit-bot@chromium.org    SkPathEffect* pe = get_ref<SkPathEffect>(L, 1);
10314d803a976c25ed582b02f8c42cd91c82e9d1ea84commit-bot@chromium.org    if (pe) {
10324d803a976c25ed582b02f8c42cd91c82e9d1ea84commit-bot@chromium.org        SkPathEffect::DashInfo info;
10334d803a976c25ed582b02f8c42cd91c82e9d1ea84commit-bot@chromium.org        SkPathEffect::DashType dashType = pe->asADash(&info);
10344d803a976c25ed582b02f8c42cd91c82e9d1ea84commit-bot@chromium.org        if (SkPathEffect::kDash_DashType == dashType) {
10354d803a976c25ed582b02f8c42cd91c82e9d1ea84commit-bot@chromium.org            SkAutoTArray<SkScalar> intervals(info.fCount);
10364d803a976c25ed582b02f8c42cd91c82e9d1ea84commit-bot@chromium.org            info.fIntervals = intervals.get();
10374d803a976c25ed582b02f8c42cd91c82e9d1ea84commit-bot@chromium.org            pe->asADash(&info);
10384d803a976c25ed582b02f8c42cd91c82e9d1ea84commit-bot@chromium.org            SkLua(L).pushDash(info);
10394d803a976c25ed582b02f8c42cd91c82e9d1ea84commit-bot@chromium.org            return 1;
10404d803a976c25ed582b02f8c42cd91c82e9d1ea84commit-bot@chromium.org        }
10414d803a976c25ed582b02f8c42cd91c82e9d1ea84commit-bot@chromium.org    }
10424d803a976c25ed582b02f8c42cd91c82e9d1ea84commit-bot@chromium.org    return 0;
10434d803a976c25ed582b02f8c42cd91c82e9d1ea84commit-bot@chromium.org}
10444d803a976c25ed582b02f8c42cd91c82e9d1ea84commit-bot@chromium.org
10451301bf3abfe355f9aadd53d5dbf04926013231bacommit-bot@chromium.orgstatic int lpatheffect_gc(lua_State* L) {
10461301bf3abfe355f9aadd53d5dbf04926013231bacommit-bot@chromium.org    get_ref<SkPathEffect>(L, 1)->unref();
10471301bf3abfe355f9aadd53d5dbf04926013231bacommit-bot@chromium.org    return 0;
10481301bf3abfe355f9aadd53d5dbf04926013231bacommit-bot@chromium.org}
10491301bf3abfe355f9aadd53d5dbf04926013231bacommit-bot@chromium.org
10501301bf3abfe355f9aadd53d5dbf04926013231bacommit-bot@chromium.orgstatic const struct luaL_Reg gSkPathEffect_Methods[] = {
10514d803a976c25ed582b02f8c42cd91c82e9d1ea84commit-bot@chromium.org    { "asADash",        lpatheffect_asADash },
10521301bf3abfe355f9aadd53d5dbf04926013231bacommit-bot@chromium.org    { "__gc",           lpatheffect_gc },
10531301bf3abfe355f9aadd53d5dbf04926013231bacommit-bot@chromium.org    { NULL, NULL }
10541301bf3abfe355f9aadd53d5dbf04926013231bacommit-bot@chromium.org};
10551301bf3abfe355f9aadd53d5dbf04926013231bacommit-bot@chromium.org
10561301bf3abfe355f9aadd53d5dbf04926013231bacommit-bot@chromium.org///////////////////////////////////////////////////////////////////////////////
10571301bf3abfe355f9aadd53d5dbf04926013231bacommit-bot@chromium.org
10582815c19c4d52f0fb522e21d1938d63e01c039124humper@google.comstatic int lmatrix_getType(lua_State* L) {
10592815c19c4d52f0fb522e21d1938d63e01c039124humper@google.com    SkMatrix::TypeMask mask = get_obj<SkMatrix>(L, 1)->getType();
1060de2e4e8a6422c7d8b5847f038f5c6360b187f7a2skia.committer@gmail.com
10612815c19c4d52f0fb522e21d1938d63e01c039124humper@google.com    lua_newtable(L);
10622815c19c4d52f0fb522e21d1938d63e01c039124humper@google.com    setfield_boolean(L, "translate",   SkToBool(mask & SkMatrix::kTranslate_Mask));
10632815c19c4d52f0fb522e21d1938d63e01c039124humper@google.com    setfield_boolean(L, "scale",       SkToBool(mask & SkMatrix::kScale_Mask));
10642815c19c4d52f0fb522e21d1938d63e01c039124humper@google.com    setfield_boolean(L, "affine",      SkToBool(mask & SkMatrix::kAffine_Mask));
10652815c19c4d52f0fb522e21d1938d63e01c039124humper@google.com    setfield_boolean(L, "perspective", SkToBool(mask & SkMatrix::kPerspective_Mask));
10662815c19c4d52f0fb522e21d1938d63e01c039124humper@google.com    return 1;
10672815c19c4d52f0fb522e21d1938d63e01c039124humper@google.com}
10682815c19c4d52f0fb522e21d1938d63e01c039124humper@google.com
10690f48ee0a07aa50ab60bfff3c2718b9649e3639eahumper@google.comstatic int lmatrix_getScaleX(lua_State* L) {
10700f48ee0a07aa50ab60bfff3c2718b9649e3639eahumper@google.com    lua_pushnumber(L, get_obj<SkMatrix>(L,1)->getScaleX());
10710f48ee0a07aa50ab60bfff3c2718b9649e3639eahumper@google.com    return 1;
10720f48ee0a07aa50ab60bfff3c2718b9649e3639eahumper@google.com}
10730f48ee0a07aa50ab60bfff3c2718b9649e3639eahumper@google.com
10740f48ee0a07aa50ab60bfff3c2718b9649e3639eahumper@google.comstatic int lmatrix_getScaleY(lua_State* L) {
10750f48ee0a07aa50ab60bfff3c2718b9649e3639eahumper@google.com    lua_pushnumber(L, get_obj<SkMatrix>(L,1)->getScaleY());
10760f48ee0a07aa50ab60bfff3c2718b9649e3639eahumper@google.com    return 1;
10770f48ee0a07aa50ab60bfff3c2718b9649e3639eahumper@google.com}
10780f48ee0a07aa50ab60bfff3c2718b9649e3639eahumper@google.com
10790f48ee0a07aa50ab60bfff3c2718b9649e3639eahumper@google.comstatic int lmatrix_getTranslateX(lua_State* L) {
10800f48ee0a07aa50ab60bfff3c2718b9649e3639eahumper@google.com    lua_pushnumber(L, get_obj<SkMatrix>(L,1)->getTranslateX());
10810f48ee0a07aa50ab60bfff3c2718b9649e3639eahumper@google.com    return 1;
10820f48ee0a07aa50ab60bfff3c2718b9649e3639eahumper@google.com}
10830f48ee0a07aa50ab60bfff3c2718b9649e3639eahumper@google.com
10840f48ee0a07aa50ab60bfff3c2718b9649e3639eahumper@google.comstatic int lmatrix_getTranslateY(lua_State* L) {
10850f48ee0a07aa50ab60bfff3c2718b9649e3639eahumper@google.com    lua_pushnumber(L, get_obj<SkMatrix>(L,1)->getTranslateY());
10860f48ee0a07aa50ab60bfff3c2718b9649e3639eahumper@google.com    return 1;
10870f48ee0a07aa50ab60bfff3c2718b9649e3639eahumper@google.com}
10880f48ee0a07aa50ab60bfff3c2718b9649e3639eahumper@google.com
10892815c19c4d52f0fb522e21d1938d63e01c039124humper@google.comstatic const struct luaL_Reg gSkMatrix_Methods[] = {
10902815c19c4d52f0fb522e21d1938d63e01c039124humper@google.com    { "getType", lmatrix_getType },
10910f48ee0a07aa50ab60bfff3c2718b9649e3639eahumper@google.com    { "getScaleX", lmatrix_getScaleX },
10920f48ee0a07aa50ab60bfff3c2718b9649e3639eahumper@google.com    { "getScaleY", lmatrix_getScaleY },
10930f48ee0a07aa50ab60bfff3c2718b9649e3639eahumper@google.com    { "getTranslateX", lmatrix_getTranslateX },
10940f48ee0a07aa50ab60bfff3c2718b9649e3639eahumper@google.com    { "getTranslateY", lmatrix_getTranslateY },
10952815c19c4d52f0fb522e21d1938d63e01c039124humper@google.com    { NULL, NULL }
10962815c19c4d52f0fb522e21d1938d63e01c039124humper@google.com};
10972815c19c4d52f0fb522e21d1938d63e01c039124humper@google.com
10982815c19c4d52f0fb522e21d1938d63e01c039124humper@google.com///////////////////////////////////////////////////////////////////////////////
10992815c19c4d52f0fb522e21d1938d63e01c039124humper@google.com
110074ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.comstatic int lpath_getBounds(lua_State* L) {
110174ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com    SkLua(L).pushRect(get_obj<SkPath>(L, 1)->getBounds());
110274ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com    return 1;
110374ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com}
110474ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com
1105d85b822616d609b7056154489176910cbd9f81a9commit-bot@chromium.orgstatic const char* fill_type_to_str(SkPath::FillType fill) {
1106d85b822616d609b7056154489176910cbd9f81a9commit-bot@chromium.org    switch (fill) {
1107d85b822616d609b7056154489176910cbd9f81a9commit-bot@chromium.org        case SkPath::kEvenOdd_FillType:
1108d85b822616d609b7056154489176910cbd9f81a9commit-bot@chromium.org            return "even-odd";
1109d85b822616d609b7056154489176910cbd9f81a9commit-bot@chromium.org        case SkPath::kWinding_FillType:
1110d85b822616d609b7056154489176910cbd9f81a9commit-bot@chromium.org            return "winding";
1111d85b822616d609b7056154489176910cbd9f81a9commit-bot@chromium.org        case SkPath::kInverseEvenOdd_FillType:
1112d85b822616d609b7056154489176910cbd9f81a9commit-bot@chromium.org            return "inverse-even-odd";
1113d85b822616d609b7056154489176910cbd9f81a9commit-bot@chromium.org        case SkPath::kInverseWinding_FillType:
1114d85b822616d609b7056154489176910cbd9f81a9commit-bot@chromium.org            return "inverse-winding";
1115d85b822616d609b7056154489176910cbd9f81a9commit-bot@chromium.org    }
1116d85b822616d609b7056154489176910cbd9f81a9commit-bot@chromium.org    return "unknown";
1117d85b822616d609b7056154489176910cbd9f81a9commit-bot@chromium.org}
1118d85b822616d609b7056154489176910cbd9f81a9commit-bot@chromium.org
1119d85b822616d609b7056154489176910cbd9f81a9commit-bot@chromium.orgstatic int lpath_getFillType(lua_State* L) {
1120d85b822616d609b7056154489176910cbd9f81a9commit-bot@chromium.org    SkPath::FillType fill = get_obj<SkPath>(L, 1)->getFillType();
1121d85b822616d609b7056154489176910cbd9f81a9commit-bot@chromium.org    SkLua(L).pushString(fill_type_to_str(fill));
1122d85b822616d609b7056154489176910cbd9f81a9commit-bot@chromium.org    return 1;
1123d85b822616d609b7056154489176910cbd9f81a9commit-bot@chromium.org}
1124d85b822616d609b7056154489176910cbd9f81a9commit-bot@chromium.org
1125d85b822616d609b7056154489176910cbd9f81a9commit-bot@chromium.orgstatic SkString segment_masks_to_str(uint32_t segmentMasks) {
1126d85b822616d609b7056154489176910cbd9f81a9commit-bot@chromium.org    SkString result;
1127d85b822616d609b7056154489176910cbd9f81a9commit-bot@chromium.org    bool first = true;
1128d85b822616d609b7056154489176910cbd9f81a9commit-bot@chromium.org    if (SkPath::kLine_SegmentMask & segmentMasks) {
1129d85b822616d609b7056154489176910cbd9f81a9commit-bot@chromium.org        result.append("line");
1130d85b822616d609b7056154489176910cbd9f81a9commit-bot@chromium.org        first = false;
1131d85b822616d609b7056154489176910cbd9f81a9commit-bot@chromium.org        SkDEBUGCODE(segmentMasks &= ~SkPath::kLine_SegmentMask;)
1132d85b822616d609b7056154489176910cbd9f81a9commit-bot@chromium.org    }
1133d85b822616d609b7056154489176910cbd9f81a9commit-bot@chromium.org    if (SkPath::kQuad_SegmentMask & segmentMasks) {
1134d85b822616d609b7056154489176910cbd9f81a9commit-bot@chromium.org        if (!first) {
1135d85b822616d609b7056154489176910cbd9f81a9commit-bot@chromium.org            result.append(" ");
1136d85b822616d609b7056154489176910cbd9f81a9commit-bot@chromium.org        }
1137d85b822616d609b7056154489176910cbd9f81a9commit-bot@chromium.org        result.append("quad");
1138d85b822616d609b7056154489176910cbd9f81a9commit-bot@chromium.org        first = false;
1139d85b822616d609b7056154489176910cbd9f81a9commit-bot@chromium.org        SkDEBUGCODE(segmentMasks &= ~SkPath::kQuad_SegmentMask;)
1140d85b822616d609b7056154489176910cbd9f81a9commit-bot@chromium.org    }
1141d85b822616d609b7056154489176910cbd9f81a9commit-bot@chromium.org    if (SkPath::kConic_SegmentMask & segmentMasks) {
1142d85b822616d609b7056154489176910cbd9f81a9commit-bot@chromium.org        if (!first) {
1143d85b822616d609b7056154489176910cbd9f81a9commit-bot@chromium.org            result.append(" ");
1144d85b822616d609b7056154489176910cbd9f81a9commit-bot@chromium.org        }
1145d85b822616d609b7056154489176910cbd9f81a9commit-bot@chromium.org        result.append("conic");
1146d85b822616d609b7056154489176910cbd9f81a9commit-bot@chromium.org        first = false;
1147d85b822616d609b7056154489176910cbd9f81a9commit-bot@chromium.org        SkDEBUGCODE(segmentMasks &= ~SkPath::kConic_SegmentMask;)
1148d85b822616d609b7056154489176910cbd9f81a9commit-bot@chromium.org    }
1149d85b822616d609b7056154489176910cbd9f81a9commit-bot@chromium.org    if (SkPath::kCubic_SegmentMask & segmentMasks) {
1150d85b822616d609b7056154489176910cbd9f81a9commit-bot@chromium.org        if (!first) {
1151d85b822616d609b7056154489176910cbd9f81a9commit-bot@chromium.org            result.append(" ");
1152d85b822616d609b7056154489176910cbd9f81a9commit-bot@chromium.org        }
1153d85b822616d609b7056154489176910cbd9f81a9commit-bot@chromium.org        result.append("cubic");
1154d85b822616d609b7056154489176910cbd9f81a9commit-bot@chromium.org        SkDEBUGCODE(segmentMasks &= ~SkPath::kCubic_SegmentMask;)
1155d85b822616d609b7056154489176910cbd9f81a9commit-bot@chromium.org    }
1156d85b822616d609b7056154489176910cbd9f81a9commit-bot@chromium.org    SkASSERT(0 == segmentMasks);
1157d85b822616d609b7056154489176910cbd9f81a9commit-bot@chromium.org    return result;
1158d85b822616d609b7056154489176910cbd9f81a9commit-bot@chromium.org}
1159d85b822616d609b7056154489176910cbd9f81a9commit-bot@chromium.org
1160d85b822616d609b7056154489176910cbd9f81a9commit-bot@chromium.orgstatic int lpath_getSegementTypes(lua_State* L) {
1161d85b822616d609b7056154489176910cbd9f81a9commit-bot@chromium.org    uint32_t segMasks = get_obj<SkPath>(L, 1)->getSegmentMasks();
1162d85b822616d609b7056154489176910cbd9f81a9commit-bot@chromium.org    SkLua(L).pushString(segment_masks_to_str(segMasks));
1163d85b822616d609b7056154489176910cbd9f81a9commit-bot@chromium.org    return 1;
1164d85b822616d609b7056154489176910cbd9f81a9commit-bot@chromium.org}
1165d85b822616d609b7056154489176910cbd9f81a9commit-bot@chromium.org
1166d85b822616d609b7056154489176910cbd9f81a9commit-bot@chromium.orgstatic int lpath_isConvex(lua_State* L) {
1167d85b822616d609b7056154489176910cbd9f81a9commit-bot@chromium.org    bool isConvex = SkPath::kConvex_Convexity == get_obj<SkPath>(L, 1)->getConvexity();
1168d85b822616d609b7056154489176910cbd9f81a9commit-bot@chromium.org    SkLua(L).pushBool(isConvex);
1169d85b822616d609b7056154489176910cbd9f81a9commit-bot@chromium.org    return 1;
1170d85b822616d609b7056154489176910cbd9f81a9commit-bot@chromium.org}
1171d85b822616d609b7056154489176910cbd9f81a9commit-bot@chromium.org
117274ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.comstatic int lpath_isEmpty(lua_State* L) {
117374ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com    lua_pushboolean(L, get_obj<SkPath>(L, 1)->isEmpty());
117474ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com    return 1;
117574ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com}
117674ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com
117774ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.comstatic int lpath_isRect(lua_State* L) {
117874ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com    SkRect r;
117974ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com    bool pred = get_obj<SkPath>(L, 1)->isRect(&r);
118074ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com    int ret_count = 1;
118174ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com    lua_pushboolean(L, pred);
118274ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com    if (pred) {
118374ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com        SkLua(L).pushRect(r);
118474ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com        ret_count += 1;
118574ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com    }
118674ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com    return ret_count;
118774ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com}
118874ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com
118974ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.comstatic const char* dir2string(SkPath::Direction dir) {
119074ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com    static const char* gStr[] = {
119174ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com        "unknown", "cw", "ccw"
119274ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com    };
119374ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com    SkASSERT((unsigned)dir < SK_ARRAY_COUNT(gStr));
119474ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com    return gStr[dir];
119574ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com}
119674ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com
119774ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.comstatic int lpath_isNestedRects(lua_State* L) {
119874ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com    SkRect rects[2];
119974ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com    SkPath::Direction dirs[2];
120074ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com    bool pred = get_obj<SkPath>(L, 1)->isNestedRects(rects, dirs);
120174ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com    int ret_count = 1;
120274ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com    lua_pushboolean(L, pred);
120374ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com    if (pred) {
120474ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com        SkLua lua(L);
120574ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com        lua.pushRect(rects[0]);
120674ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com        lua.pushRect(rects[1]);
120774ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com        lua_pushstring(L, dir2string(dirs[0]));
120874ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com        lua_pushstring(L, dir2string(dirs[0]));
120974ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com        ret_count += 4;
121074ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com    }
121174ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com    return ret_count;
121274ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com}
121374ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com
1214c530208ab02410df9efdabcfd50f42ec4c7fb750commit-bot@chromium.orgstatic int lpath_countPoints(lua_State* L) {
1215c530208ab02410df9efdabcfd50f42ec4c7fb750commit-bot@chromium.org    lua_pushinteger(L, get_obj<SkPath>(L, 1)->countPoints());
1216c530208ab02410df9efdabcfd50f42ec4c7fb750commit-bot@chromium.org    return 1;
1217c530208ab02410df9efdabcfd50f42ec4c7fb750commit-bot@chromium.org}
1218c530208ab02410df9efdabcfd50f42ec4c7fb750commit-bot@chromium.org
121974ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.comstatic int lpath_reset(lua_State* L) {
122074ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com    get_obj<SkPath>(L, 1)->reset();
122174ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com    return 0;
122274ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com}
122374ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com
122474ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.comstatic int lpath_moveTo(lua_State* L) {
122574ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com    get_obj<SkPath>(L, 1)->moveTo(lua2scalar(L, 2), lua2scalar(L, 3));
122674ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com    return 0;
122774ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com}
122874ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com
122974ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.comstatic int lpath_lineTo(lua_State* L) {
123074ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com    get_obj<SkPath>(L, 1)->lineTo(lua2scalar(L, 2), lua2scalar(L, 3));
123174ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com    return 0;
123274ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com}
123374ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com
123474ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.comstatic int lpath_quadTo(lua_State* L) {
123574ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com    get_obj<SkPath>(L, 1)->quadTo(lua2scalar(L, 2), lua2scalar(L, 3),
123674ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com                                  lua2scalar(L, 4), lua2scalar(L, 5));
123774ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com    return 0;
123874ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com}
123974ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com
124074ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.comstatic int lpath_cubicTo(lua_State* L) {
124174ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com    get_obj<SkPath>(L, 1)->cubicTo(lua2scalar(L, 2), lua2scalar(L, 3),
124274ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com                                   lua2scalar(L, 4), lua2scalar(L, 5),
124374ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com                                   lua2scalar(L, 6), lua2scalar(L, 7));
124474ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com    return 0;
124574ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com}
124674ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com
124774ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.comstatic int lpath_close(lua_State* L) {
124874ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com    get_obj<SkPath>(L, 1)->close();
124974ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com    return 0;
125074ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com}
125174ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com
125274ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.comstatic int lpath_gc(lua_State* L) {
125374ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com    get_obj<SkPath>(L, 1)->~SkPath();
125474ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com    return 0;
125574ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com}
125674ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com
125774ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.comstatic const struct luaL_Reg gSkPath_Methods[] = {
125874ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com    { "getBounds", lpath_getBounds },
1259d85b822616d609b7056154489176910cbd9f81a9commit-bot@chromium.org    { "getFillType", lpath_getFillType },
1260d85b822616d609b7056154489176910cbd9f81a9commit-bot@chromium.org    { "getSegmentTypes", lpath_getSegementTypes },
1261d85b822616d609b7056154489176910cbd9f81a9commit-bot@chromium.org    { "isConvex", lpath_isConvex },
126274ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com    { "isEmpty", lpath_isEmpty },
126374ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com    { "isRect", lpath_isRect },
126474ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com    { "isNestedRects", lpath_isNestedRects },
1265c530208ab02410df9efdabcfd50f42ec4c7fb750commit-bot@chromium.org    { "countPoints", lpath_countPoints },
126674ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com    { "reset", lpath_reset },
126774ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com    { "moveTo", lpath_moveTo },
126874ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com    { "lineTo", lpath_lineTo },
126974ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com    { "quadTo", lpath_quadTo },
127074ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com    { "cubicTo", lpath_cubicTo },
127174ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com    { "close", lpath_close },
127274ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com    { "__gc", lpath_gc },
127374ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com    { NULL, NULL }
127474ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com};
127574ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com
127674ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com///////////////////////////////////////////////////////////////////////////////
127774ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com
127874ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.comstatic const char* rrect_type(const SkRRect& rr) {
127974ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com    switch (rr.getType()) {
128074ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com        case SkRRect::kUnknown_Type: return "unknown";
128174ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com        case SkRRect::kEmpty_Type: return "empty";
128274ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com        case SkRRect::kRect_Type: return "rect";
128374ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com        case SkRRect::kOval_Type: return "oval";
128474ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com        case SkRRect::kSimple_Type: return "simple";
1285f338d7c860bf0bca82cac793069522311a3dbb1acommit-bot@chromium.org        case SkRRect::kNinePatch_Type: return "nine-patch";
128674ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com        case SkRRect::kComplex_Type: return "complex";
128774ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com    }
1288330313a8a8343876ee596da39da06a5d69badd9cmtklein@google.com    SkDEBUGFAIL("never get here");
128974ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com    return "";
129074ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com}
129174ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com
129274ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.comstatic int lrrect_rect(lua_State* L) {
129374ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com    SkLua(L).pushRect(get_obj<SkRRect>(L, 1)->rect());
129474ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com    return 1;
129574ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com}
129674ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com
129774ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.comstatic int lrrect_type(lua_State* L) {
129874ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com    lua_pushstring(L, rrect_type(*get_obj<SkRRect>(L, 1)));
129974ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com    return 1;
130074ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com}
130174ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com
130274ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.comstatic int lrrect_radii(lua_State* L) {
13037fa2a65c0cfc714364490cb715171461143024e0reed@google.com    int corner = SkToInt(lua_tointeger(L, 2));
130474ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com    SkVector v;
130574ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com    if (corner < 0 || corner > 3) {
130674ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com        SkDebugf("bad corner index %d", corner);
130774ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com        v.set(0, 0);
130874ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com    } else {
130974ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com        v = get_obj<SkRRect>(L, 1)->radii((SkRRect::Corner)corner);
131074ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com    }
131174ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com    lua_pushnumber(L, v.fX);
131274ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com    lua_pushnumber(L, v.fY);
131374ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com    return 2;
131474ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com}
131574ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com
131674ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.comstatic int lrrect_gc(lua_State* L) {
131774ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com    get_obj<SkRRect>(L, 1)->~SkRRect();
131874ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com    return 0;
131974ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com}
132074ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com
132174ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.comstatic const struct luaL_Reg gSkRRect_Methods[] = {
132274ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com    { "rect", lrrect_rect },
132374ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com    { "type", lrrect_type },
132474ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com    { "radii", lrrect_radii },
132574ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com    { "__gc", lrrect_gc },
132674ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com    { NULL, NULL }
132774ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com};
132874ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com
132974ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com///////////////////////////////////////////////////////////////////////////////
133074ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com
1331792bbd14c63f217f2de0e6b2f8df99acb1928eeamike@reedtribe.orgstatic int limage_width(lua_State* L) {
1332792bbd14c63f217f2de0e6b2f8df99acb1928eeamike@reedtribe.org    lua_pushinteger(L, get_ref<SkImage>(L, 1)->width());
1333792bbd14c63f217f2de0e6b2f8df99acb1928eeamike@reedtribe.org    return 1;
1334792bbd14c63f217f2de0e6b2f8df99acb1928eeamike@reedtribe.org}
1335792bbd14c63f217f2de0e6b2f8df99acb1928eeamike@reedtribe.org
1336792bbd14c63f217f2de0e6b2f8df99acb1928eeamike@reedtribe.orgstatic int limage_height(lua_State* L) {
1337792bbd14c63f217f2de0e6b2f8df99acb1928eeamike@reedtribe.org    lua_pushinteger(L, get_ref<SkImage>(L, 1)->height());
1338792bbd14c63f217f2de0e6b2f8df99acb1928eeamike@reedtribe.org    return 1;
1339792bbd14c63f217f2de0e6b2f8df99acb1928eeamike@reedtribe.org}
1340792bbd14c63f217f2de0e6b2f8df99acb1928eeamike@reedtribe.org
1341792bbd14c63f217f2de0e6b2f8df99acb1928eeamike@reedtribe.orgstatic int limage_gc(lua_State* L) {
1342792bbd14c63f217f2de0e6b2f8df99acb1928eeamike@reedtribe.org    get_ref<SkImage>(L, 1)->unref();
1343792bbd14c63f217f2de0e6b2f8df99acb1928eeamike@reedtribe.org    return 0;
1344792bbd14c63f217f2de0e6b2f8df99acb1928eeamike@reedtribe.org}
1345792bbd14c63f217f2de0e6b2f8df99acb1928eeamike@reedtribe.org
1346792bbd14c63f217f2de0e6b2f8df99acb1928eeamike@reedtribe.orgstatic const struct luaL_Reg gSkImage_Methods[] = {
1347792bbd14c63f217f2de0e6b2f8df99acb1928eeamike@reedtribe.org    { "width", limage_width },
1348792bbd14c63f217f2de0e6b2f8df99acb1928eeamike@reedtribe.org    { "height", limage_height },
1349792bbd14c63f217f2de0e6b2f8df99acb1928eeamike@reedtribe.org    { "__gc", limage_gc },
1350792bbd14c63f217f2de0e6b2f8df99acb1928eeamike@reedtribe.org    { NULL, NULL }
1351792bbd14c63f217f2de0e6b2f8df99acb1928eeamike@reedtribe.org};
1352792bbd14c63f217f2de0e6b2f8df99acb1928eeamike@reedtribe.org
1353792bbd14c63f217f2de0e6b2f8df99acb1928eeamike@reedtribe.org///////////////////////////////////////////////////////////////////////////////
1354792bbd14c63f217f2de0e6b2f8df99acb1928eeamike@reedtribe.org
1355e6469f10c8f9340032797316fd06ee2f109255ffmike@reedtribe.orgstatic int ltypeface_gc(lua_State* L) {
135677887af13f1f0a2e349155f74e6b5ded6aafe179commit-bot@chromium.org    SkSafeUnref(get_ref<SkTypeface>(L, 1));
1357e6469f10c8f9340032797316fd06ee2f109255ffmike@reedtribe.org    return 0;
1358e6469f10c8f9340032797316fd06ee2f109255ffmike@reedtribe.org}
1359e6469f10c8f9340032797316fd06ee2f109255ffmike@reedtribe.org
1360e6469f10c8f9340032797316fd06ee2f109255ffmike@reedtribe.orgstatic const struct luaL_Reg gSkTypeface_Methods[] = {
1361e6469f10c8f9340032797316fd06ee2f109255ffmike@reedtribe.org    { "__gc", ltypeface_gc },
1362e6469f10c8f9340032797316fd06ee2f109255ffmike@reedtribe.org    { NULL, NULL }
1363e6469f10c8f9340032797316fd06ee2f109255ffmike@reedtribe.org};
1364e6469f10c8f9340032797316fd06ee2f109255ffmike@reedtribe.org
1365e6469f10c8f9340032797316fd06ee2f109255ffmike@reedtribe.org///////////////////////////////////////////////////////////////////////////////
1366e6469f10c8f9340032797316fd06ee2f109255ffmike@reedtribe.org
136774ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.comclass AutoCallLua {
136874ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.compublic:
136974ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com    AutoCallLua(lua_State* L, const char func[], const char verb[]) : fL(L) {
137074ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com        lua_getglobal(L, func);
137174ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com        if (!lua_isfunction(L, -1)) {
137274ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com            int t = lua_type(L, -1);
137374ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com            SkDebugf("--- expected function %d\n", t);
137474ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com        }
13752d816ad36e806e5b1cf3c447e547829bbbe74fd1skia.committer@gmail.com
137674ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com        lua_newtable(L);
137774ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com        setfield_string(L, "verb", verb);
137874ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com    }
13792d816ad36e806e5b1cf3c447e547829bbbe74fd1skia.committer@gmail.com
138074ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com    ~AutoCallLua() {
138174ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com        if (lua_pcall(fL, 1, 0, 0) != LUA_OK) {
138274ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com            SkDebugf("lua err: %s\n", lua_tostring(fL, -1));
138374ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com        }
138474ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com        lua_settop(fL, -1);
138574ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com    }
13862d816ad36e806e5b1cf3c447e547829bbbe74fd1skia.committer@gmail.com
138774ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.comprivate:
138874ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com    lua_State* fL;
138974ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com};
139074ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com
139174ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com#define AUTO_LUA(verb)  AutoCallLua acl(fL, fFunc.c_str(), verb)
139274ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com
139374ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com///////////////////////////////////////////////////////////////////////////////
139474ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com
1395fb858245216dafee4de731fce4f0fa58c746d3e9mike@reedtribe.orgstatic int lsk_newDocumentPDF(lua_State* L) {
1396fb858245216dafee4de731fce4f0fa58c746d3e9mike@reedtribe.org    const char* file = NULL;
1397fb858245216dafee4de731fce4f0fa58c746d3e9mike@reedtribe.org    if (lua_gettop(L) > 0 && lua_isstring(L, 1)) {
1398fb858245216dafee4de731fce4f0fa58c746d3e9mike@reedtribe.org        file = lua_tolstring(L, 1, NULL);
1399fb858245216dafee4de731fce4f0fa58c746d3e9mike@reedtribe.org    }
1400fb858245216dafee4de731fce4f0fa58c746d3e9mike@reedtribe.org
1401fb858245216dafee4de731fce4f0fa58c746d3e9mike@reedtribe.org    SkDocument* doc = SkDocument::CreatePDF(file);
1402fb858245216dafee4de731fce4f0fa58c746d3e9mike@reedtribe.org    if (NULL == doc) {
1403fb858245216dafee4de731fce4f0fa58c746d3e9mike@reedtribe.org        // do I need to push a nil on the stack and return 1?
1404fb858245216dafee4de731fce4f0fa58c746d3e9mike@reedtribe.org        return 0;
1405fb858245216dafee4de731fce4f0fa58c746d3e9mike@reedtribe.org    } else {
1406fb858245216dafee4de731fce4f0fa58c746d3e9mike@reedtribe.org        push_ref(L, doc);
1407fb858245216dafee4de731fce4f0fa58c746d3e9mike@reedtribe.org        doc->unref();
1408fb858245216dafee4de731fce4f0fa58c746d3e9mike@reedtribe.org        return 1;
1409fb858245216dafee4de731fce4f0fa58c746d3e9mike@reedtribe.org    }
1410fb858245216dafee4de731fce4f0fa58c746d3e9mike@reedtribe.org}
1411fb858245216dafee4de731fce4f0fa58c746d3e9mike@reedtribe.org
14123597b73bc6e3e169f1d360de80d77e6e0ab65e96reed@google.comstatic int lsk_newPaint(lua_State* L) {
14133597b73bc6e3e169f1d360de80d77e6e0ab65e96reed@google.com    push_new<SkPaint>(L);
14143597b73bc6e3e169f1d360de80d77e6e0ab65e96reed@google.com    return 1;
14153597b73bc6e3e169f1d360de80d77e6e0ab65e96reed@google.com}
14163597b73bc6e3e169f1d360de80d77e6e0ab65e96reed@google.com
14173597b73bc6e3e169f1d360de80d77e6e0ab65e96reed@google.comstatic int lsk_newPath(lua_State* L) {
14183597b73bc6e3e169f1d360de80d77e6e0ab65e96reed@google.com    push_new<SkPath>(L);
14193597b73bc6e3e169f1d360de80d77e6e0ab65e96reed@google.com    return 1;
14203597b73bc6e3e169f1d360de80d77e6e0ab65e96reed@google.com}
14213597b73bc6e3e169f1d360de80d77e6e0ab65e96reed@google.com
14223597b73bc6e3e169f1d360de80d77e6e0ab65e96reed@google.comstatic int lsk_newRRect(lua_State* L) {
14233597b73bc6e3e169f1d360de80d77e6e0ab65e96reed@google.com    SkRRect* rr = push_new<SkRRect>(L);
14243597b73bc6e3e169f1d360de80d77e6e0ab65e96reed@google.com    rr->setEmpty();
14253597b73bc6e3e169f1d360de80d77e6e0ab65e96reed@google.com    return 1;
14263597b73bc6e3e169f1d360de80d77e6e0ab65e96reed@google.com}
14273597b73bc6e3e169f1d360de80d77e6e0ab65e96reed@google.com
1428e6469f10c8f9340032797316fd06ee2f109255ffmike@reedtribe.orgstatic int lsk_newTypeface(lua_State* L) {
1429e6469f10c8f9340032797316fd06ee2f109255ffmike@reedtribe.org    const char* name = NULL;
1430e6469f10c8f9340032797316fd06ee2f109255ffmike@reedtribe.org    int style = SkTypeface::kNormal;
14316319367bdcbf5e5050632ab97973f5035d0dd8faskia.committer@gmail.com
1432e6469f10c8f9340032797316fd06ee2f109255ffmike@reedtribe.org    int count = lua_gettop(L);
1433e6469f10c8f9340032797316fd06ee2f109255ffmike@reedtribe.org    if (count > 0 && lua_isstring(L, 1)) {
1434e6469f10c8f9340032797316fd06ee2f109255ffmike@reedtribe.org        name = lua_tolstring(L, 1, NULL);
1435e6469f10c8f9340032797316fd06ee2f109255ffmike@reedtribe.org        if (count > 1 && lua_isnumber(L, 2)) {
1436e6469f10c8f9340032797316fd06ee2f109255ffmike@reedtribe.org            style = lua_tointegerx(L, 2, NULL) & SkTypeface::kBoldItalic;
1437e6469f10c8f9340032797316fd06ee2f109255ffmike@reedtribe.org        }
1438e6469f10c8f9340032797316fd06ee2f109255ffmike@reedtribe.org    }
1439e6469f10c8f9340032797316fd06ee2f109255ffmike@reedtribe.org
1440e6469f10c8f9340032797316fd06ee2f109255ffmike@reedtribe.org    SkTypeface* face = SkTypeface::CreateFromName(name,
1441e6469f10c8f9340032797316fd06ee2f109255ffmike@reedtribe.org                                                  (SkTypeface::Style)style);
1442e6469f10c8f9340032797316fd06ee2f109255ffmike@reedtribe.org//    SkDebugf("---- name <%s> style=%d, face=%p ref=%d\n", name, style, face, face->getRefCnt());
1443e6469f10c8f9340032797316fd06ee2f109255ffmike@reedtribe.org    if (NULL == face) {
1444e6469f10c8f9340032797316fd06ee2f109255ffmike@reedtribe.org        face = SkTypeface::RefDefault();
1445e6469f10c8f9340032797316fd06ee2f109255ffmike@reedtribe.org    }
1446e6469f10c8f9340032797316fd06ee2f109255ffmike@reedtribe.org    push_ref(L, face);
1447e6469f10c8f9340032797316fd06ee2f109255ffmike@reedtribe.org    face->unref();
1448e6469f10c8f9340032797316fd06ee2f109255ffmike@reedtribe.org    return 1;
1449e6469f10c8f9340032797316fd06ee2f109255ffmike@reedtribe.org}
14503597b73bc6e3e169f1d360de80d77e6e0ab65e96reed@google.com
1451792bbd14c63f217f2de0e6b2f8df99acb1928eeamike@reedtribe.orgstatic int lsk_loadImage(lua_State* L) {
1452792bbd14c63f217f2de0e6b2f8df99acb1928eeamike@reedtribe.org    if (lua_gettop(L) > 0 && lua_isstring(L, 1)) {
1453792bbd14c63f217f2de0e6b2f8df99acb1928eeamike@reedtribe.org        const char* name = lua_tolstring(L, 1, NULL);
1454792bbd14c63f217f2de0e6b2f8df99acb1928eeamike@reedtribe.org        SkAutoDataUnref data(SkData::NewFromFileName(name));
1455792bbd14c63f217f2de0e6b2f8df99acb1928eeamike@reedtribe.org        if (data.get()) {
1456792bbd14c63f217f2de0e6b2f8df99acb1928eeamike@reedtribe.org            SkImage* image = SkImage::NewEncodedData(data.get());
1457792bbd14c63f217f2de0e6b2f8df99acb1928eeamike@reedtribe.org            if (image) {
1458792bbd14c63f217f2de0e6b2f8df99acb1928eeamike@reedtribe.org                push_ref(L, image);
1459792bbd14c63f217f2de0e6b2f8df99acb1928eeamike@reedtribe.org                image->unref();
1460792bbd14c63f217f2de0e6b2f8df99acb1928eeamike@reedtribe.org                return 1;
1461792bbd14c63f217f2de0e6b2f8df99acb1928eeamike@reedtribe.org            }
1462792bbd14c63f217f2de0e6b2f8df99acb1928eeamike@reedtribe.org        }
1463792bbd14c63f217f2de0e6b2f8df99acb1928eeamike@reedtribe.org    }
1464792bbd14c63f217f2de0e6b2f8df99acb1928eeamike@reedtribe.org    return 0;
1465792bbd14c63f217f2de0e6b2f8df99acb1928eeamike@reedtribe.org}
1466792bbd14c63f217f2de0e6b2f8df99acb1928eeamike@reedtribe.org
14673597b73bc6e3e169f1d360de80d77e6e0ab65e96reed@google.comstatic void register_Sk(lua_State* L) {
14683597b73bc6e3e169f1d360de80d77e6e0ab65e96reed@google.com    lua_newtable(L);
14693597b73bc6e3e169f1d360de80d77e6e0ab65e96reed@google.com    lua_pushvalue(L, -1);
14703597b73bc6e3e169f1d360de80d77e6e0ab65e96reed@google.com    lua_setglobal(L, "Sk");
14713597b73bc6e3e169f1d360de80d77e6e0ab65e96reed@google.com    // the Sk table is still on top
14723597b73bc6e3e169f1d360de80d77e6e0ab65e96reed@google.com
1473fb858245216dafee4de731fce4f0fa58c746d3e9mike@reedtribe.org    setfield_function(L, "newDocumentPDF", lsk_newDocumentPDF);
1474792bbd14c63f217f2de0e6b2f8df99acb1928eeamike@reedtribe.org    setfield_function(L, "loadImage", lsk_loadImage);
14753597b73bc6e3e169f1d360de80d77e6e0ab65e96reed@google.com    setfield_function(L, "newPaint", lsk_newPaint);
14763597b73bc6e3e169f1d360de80d77e6e0ab65e96reed@google.com    setfield_function(L, "newPath", lsk_newPath);
14773597b73bc6e3e169f1d360de80d77e6e0ab65e96reed@google.com    setfield_function(L, "newRRect", lsk_newRRect);
1478e6469f10c8f9340032797316fd06ee2f109255ffmike@reedtribe.org    setfield_function(L, "newTypeface", lsk_newTypeface);
14793597b73bc6e3e169f1d360de80d77e6e0ab65e96reed@google.com    lua_pop(L, 1);  // pop off the Sk table
14803597b73bc6e3e169f1d360de80d77e6e0ab65e96reed@google.com}
14813597b73bc6e3e169f1d360de80d77e6e0ab65e96reed@google.com
148274ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com#define REG_CLASS(L, C)                             \
148374ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com    do {                                            \
14843597b73bc6e3e169f1d360de80d77e6e0ab65e96reed@google.com        luaL_newmetatable(L, get_mtname<C>());      \
148574ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com        lua_pushvalue(L, -1);                       \
148674ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com        lua_setfield(L, -2, "__index");             \
148774ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com        luaL_setfuncs(L, g##C##_Methods, 0);        \
148874ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com        lua_pop(L, 1); /* pop off the meta-table */ \
148974ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com    } while (0)
149074ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com
149174ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.comvoid SkLua::Load(lua_State* L) {
14923597b73bc6e3e169f1d360de80d77e6e0ab65e96reed@google.com    register_Sk(L);
149374ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com    REG_CLASS(L, SkCanvas);
1494fb858245216dafee4de731fce4f0fa58c746d3e9mike@reedtribe.org    REG_CLASS(L, SkDocument);
1495792bbd14c63f217f2de0e6b2f8df99acb1928eeamike@reedtribe.org    REG_CLASS(L, SkImage);
149674ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com    REG_CLASS(L, SkPaint);
14971301bf3abfe355f9aadd53d5dbf04926013231bacommit-bot@chromium.org    REG_CLASS(L, SkPath);
14981301bf3abfe355f9aadd53d5dbf04926013231bacommit-bot@chromium.org    REG_CLASS(L, SkPathEffect);
149974ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com    REG_CLASS(L, SkRRect);
15005fdc983f58098e5c9fbdbedc7719f87e5efa4d31reed@google.com    REG_CLASS(L, SkShader);
1501e6469f10c8f9340032797316fd06ee2f109255ffmike@reedtribe.org    REG_CLASS(L, SkTypeface);
15022815c19c4d52f0fb522e21d1938d63e01c039124humper@google.com    REG_CLASS(L, SkMatrix);
150374ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com}
150428c27c8b795db712c76d79b8cd62b3626ac148eczachr@google.com
15057bce9988af2e3dfc384ebc8655d0eb3d08fad4d2reed@google.comextern "C" int luaopen_skia(lua_State* L);
150628c27c8b795db712c76d79b8cd62b3626ac148eczachr@google.comextern "C" int luaopen_skia(lua_State* L) {
150728c27c8b795db712c76d79b8cd62b3626ac148eczachr@google.com    SkLua::Load(L);
150828c27c8b795db712c76d79b8cd62b3626ac148eczachr@google.com    return 0;
150928c27c8b795db712c76d79b8cd62b3626ac148eczachr@google.com}
1510