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
14468b1815d29d9bbe513f2d8eb4afc0b066715b52reed#include "SkBlurImageFilter.h"
1574ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com#include "SkCanvas.h"
16792bbd14c63f217f2de0e6b2f8df99acb1928eeamike@reedtribe.org#include "SkData.h"
17fb858245216dafee4de731fce4f0fa58c746d3e9mike@reedtribe.org#include "SkDocument.h"
189fbc3f31c0c7095f4f25ad3d2d17731bb63c0817reed#include "SkGradientShader.h"
19792bbd14c63f217f2de0e6b2f8df99acb1928eeamike@reedtribe.org#include "SkImage.h"
20792bbd14c63f217f2de0e6b2f8df99acb1928eeamike@reedtribe.org#include "SkMatrix.h"
2174ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com#include "SkPaint.h"
2274ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com#include "SkPath.h"
2396affcde22a675e3629b9da490bb45a0ab07fa2breed#include "SkPictureRecorder.h"
245fdc983f58098e5c9fbdbedc7719f87e5efa4d31reed@google.com#include "SkPixelRef.h"
2574ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com#include "SkRRect.h"
2674ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com#include "SkString.h"
27485557f95d7a4b04536c0c5f01fad5f9744531dareed#include "SkSurface.h"
28b7425173f96e93b090787e2386ba5f022b6c2869fmalita#include "SkTextBlob.h"
29e3823fd901674e22269637a669ac2b3e2667dc9creed@google.com#include "SkTypeface.h"
3074ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com
3174ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.comextern "C" {
323597b73bc6e3e169f1d360de80d77e6e0ab65e96reed@google.com    #include "lua.h"
333597b73bc6e3e169f1d360de80d77e6e0ab65e96reed@google.com    #include "lualib.h"
343597b73bc6e3e169f1d360de80d77e6e0ab65e96reed@google.com    #include "lauxlib.h"
353597b73bc6e3e169f1d360de80d77e6e0ab65e96reed@google.com}
363597b73bc6e3e169f1d360de80d77e6e0ab65e96reed@google.com
37fd3458750d92d9722e5760ddb99824e65455463creed@google.com// return the metatable name for a given class
383597b73bc6e3e169f1d360de80d77e6e0ab65e96reed@google.comtemplate <typename T> const char* get_mtname();
39fd3458750d92d9722e5760ddb99824e65455463creed@google.com#define DEF_MTNAME(T)                           \
40fd3458750d92d9722e5760ddb99824e65455463creed@google.com    template <> const char* get_mtname<T>() {   \
41fd3458750d92d9722e5760ddb99824e65455463creed@google.com        return #T "_LuaMetaTableName";          \
42fd3458750d92d9722e5760ddb99824e65455463creed@google.com    }
43fd3458750d92d9722e5760ddb99824e65455463creed@google.com
44fd3458750d92d9722e5760ddb99824e65455463creed@google.comDEF_MTNAME(SkCanvas)
45fb858245216dafee4de731fce4f0fa58c746d3e9mike@reedtribe.orgDEF_MTNAME(SkDocument)
46792bbd14c63f217f2de0e6b2f8df99acb1928eeamike@reedtribe.orgDEF_MTNAME(SkImage)
47468b1815d29d9bbe513f2d8eb4afc0b066715b52reedDEF_MTNAME(SkImageFilter)
48fd3458750d92d9722e5760ddb99824e65455463creed@google.comDEF_MTNAME(SkMatrix)
49fd3458750d92d9722e5760ddb99824e65455463creed@google.comDEF_MTNAME(SkRRect)
50fd3458750d92d9722e5760ddb99824e65455463creed@google.comDEF_MTNAME(SkPath)
51fd3458750d92d9722e5760ddb99824e65455463creed@google.comDEF_MTNAME(SkPaint)
521301bf3abfe355f9aadd53d5dbf04926013231bacommit-bot@chromium.orgDEF_MTNAME(SkPathEffect)
5396affcde22a675e3629b9da490bb45a0ab07fa2breedDEF_MTNAME(SkPicture)
5496affcde22a675e3629b9da490bb45a0ab07fa2breedDEF_MTNAME(SkPictureRecorder)
555fdc983f58098e5c9fbdbedc7719f87e5efa4d31reed@google.comDEF_MTNAME(SkShader)
56485557f95d7a4b04536c0c5f01fad5f9744531dareedDEF_MTNAME(SkSurface)
57b7425173f96e93b090787e2386ba5f022b6c2869fmalitaDEF_MTNAME(SkTextBlob)
58e6469f10c8f9340032797316fd06ee2f109255ffmike@reedtribe.orgDEF_MTNAME(SkTypeface)
593597b73bc6e3e169f1d360de80d77e6e0ab65e96reed@google.com
603597b73bc6e3e169f1d360de80d77e6e0ab65e96reed@google.comtemplate <typename T> T* push_new(lua_State* L) {
613597b73bc6e3e169f1d360de80d77e6e0ab65e96reed@google.com    T* addr = (T*)lua_newuserdata(L, sizeof(T));
623597b73bc6e3e169f1d360de80d77e6e0ab65e96reed@google.com    new (addr) T;
633597b73bc6e3e169f1d360de80d77e6e0ab65e96reed@google.com    luaL_getmetatable(L, get_mtname<T>());
643597b73bc6e3e169f1d360de80d77e6e0ab65e96reed@google.com    lua_setmetatable(L, -2);
653597b73bc6e3e169f1d360de80d77e6e0ab65e96reed@google.com    return addr;
6674ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com}
6774ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com
6874ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.comtemplate <typename T> void push_obj(lua_State* L, const T& obj) {
6974ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com    new (lua_newuserdata(L, sizeof(T))) T(obj);
703597b73bc6e3e169f1d360de80d77e6e0ab65e96reed@google.com    luaL_getmetatable(L, get_mtname<T>());
7174ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com    lua_setmetatable(L, -2);
7274ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com}
7374ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com
749fbc3f31c0c7095f4f25ad3d2d17731bb63c0817reedtemplate <typename T> T* push_ref(lua_State* L, T* ref) {
7577887af13f1f0a2e349155f74e6b5ded6aafe179commit-bot@chromium.org    *(T**)lua_newuserdata(L, sizeof(T*)) = SkSafeRef(ref);
763597b73bc6e3e169f1d360de80d77e6e0ab65e96reed@google.com    luaL_getmetatable(L, get_mtname<T>());
7774ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com    lua_setmetatable(L, -2);
789fbc3f31c0c7095f4f25ad3d2d17731bb63c0817reed    return ref;
7974ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com}
8074ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com
8174ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.comtemplate <typename T> T* get_ref(lua_State* L, int index) {
823597b73bc6e3e169f1d360de80d77e6e0ab65e96reed@google.com    return *(T**)luaL_checkudata(L, index, get_mtname<T>());
8374ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com}
8474ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com
8574ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.comtemplate <typename T> T* get_obj(lua_State* L, int index) {
863597b73bc6e3e169f1d360de80d77e6e0ab65e96reed@google.com    return (T*)luaL_checkudata(L, index, get_mtname<T>());
8774ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com}
8874ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com
8988c9ec968f682ebcc4ec13fe76f4d24d1e05633breed@google.comstatic bool lua2bool(lua_State* L, int index) {
9088c9ec968f682ebcc4ec13fe76f4d24d1e05633breed@google.com    return !!lua_toboolean(L, index);
9188c9ec968f682ebcc4ec13fe76f4d24d1e05633breed@google.com}
9288c9ec968f682ebcc4ec13fe76f4d24d1e05633breed@google.com
9374ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com///////////////////////////////////////////////////////////////////////////////
9474ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com
953597b73bc6e3e169f1d360de80d77e6e0ab65e96reed@google.comSkLua::SkLua(const char termCode[]) : fTermCode(termCode), fWeOwnL(true) {
963597b73bc6e3e169f1d360de80d77e6e0ab65e96reed@google.com    fL = luaL_newstate();
973597b73bc6e3e169f1d360de80d77e6e0ab65e96reed@google.com    luaL_openlibs(fL);
983597b73bc6e3e169f1d360de80d77e6e0ab65e96reed@google.com    SkLua::Load(fL);
993597b73bc6e3e169f1d360de80d77e6e0ab65e96reed@google.com}
1003597b73bc6e3e169f1d360de80d77e6e0ab65e96reed@google.com
1013597b73bc6e3e169f1d360de80d77e6e0ab65e96reed@google.comSkLua::SkLua(lua_State* L) : fL(L), fWeOwnL(false) {}
1023597b73bc6e3e169f1d360de80d77e6e0ab65e96reed@google.com
1033597b73bc6e3e169f1d360de80d77e6e0ab65e96reed@google.comSkLua::~SkLua() {
1043597b73bc6e3e169f1d360de80d77e6e0ab65e96reed@google.com    if (fWeOwnL) {
1053597b73bc6e3e169f1d360de80d77e6e0ab65e96reed@google.com        if (fTermCode.size() > 0) {
1063597b73bc6e3e169f1d360de80d77e6e0ab65e96reed@google.com            lua_getglobal(fL, fTermCode.c_str());
1073597b73bc6e3e169f1d360de80d77e6e0ab65e96reed@google.com            if (lua_pcall(fL, 0, 0, 0) != LUA_OK) {
1083597b73bc6e3e169f1d360de80d77e6e0ab65e96reed@google.com                SkDebugf("lua err: %s\n", lua_tostring(fL, -1));
1093597b73bc6e3e169f1d360de80d77e6e0ab65e96reed@google.com            }
1103597b73bc6e3e169f1d360de80d77e6e0ab65e96reed@google.com        }
1113597b73bc6e3e169f1d360de80d77e6e0ab65e96reed@google.com        lua_close(fL);
1123597b73bc6e3e169f1d360de80d77e6e0ab65e96reed@google.com    }
1133597b73bc6e3e169f1d360de80d77e6e0ab65e96reed@google.com}
1143597b73bc6e3e169f1d360de80d77e6e0ab65e96reed@google.com
1153597b73bc6e3e169f1d360de80d77e6e0ab65e96reed@google.combool SkLua::runCode(const char code[]) {
1163597b73bc6e3e169f1d360de80d77e6e0ab65e96reed@google.com    int err = luaL_loadstring(fL, code) || lua_pcall(fL, 0, 0, 0);
1173597b73bc6e3e169f1d360de80d77e6e0ab65e96reed@google.com    if (err) {
11873d9f1c65114ba638637152605b0f03e871271damike@reedtribe.org        SkDebugf("--- lua failed: %s\n", lua_tostring(fL, -1));
1193597b73bc6e3e169f1d360de80d77e6e0ab65e96reed@google.com        return false;
1203597b73bc6e3e169f1d360de80d77e6e0ab65e96reed@google.com    }
1213597b73bc6e3e169f1d360de80d77e6e0ab65e96reed@google.com    return true;
1223597b73bc6e3e169f1d360de80d77e6e0ab65e96reed@google.com}
1233597b73bc6e3e169f1d360de80d77e6e0ab65e96reed@google.com
1243597b73bc6e3e169f1d360de80d77e6e0ab65e96reed@google.combool SkLua::runCode(const void* code, size_t size) {
1253597b73bc6e3e169f1d360de80d77e6e0ab65e96reed@google.com    SkString str((const char*)code, size);
1263597b73bc6e3e169f1d360de80d77e6e0ab65e96reed@google.com    return this->runCode(str.c_str());
1273597b73bc6e3e169f1d360de80d77e6e0ab65e96reed@google.com}
1283597b73bc6e3e169f1d360de80d77e6e0ab65e96reed@google.com
1293597b73bc6e3e169f1d360de80d77e6e0ab65e96reed@google.com///////////////////////////////////////////////////////////////////////////////
1303597b73bc6e3e169f1d360de80d77e6e0ab65e96reed@google.com
1313597b73bc6e3e169f1d360de80d77e6e0ab65e96reed@google.com#define CHECK_SETFIELD(key) do if (key) lua_setfield(fL, -2, key); while (0)
1323597b73bc6e3e169f1d360de80d77e6e0ab65e96reed@google.com
13329563879168ed58a8295520fbb4381d0ceff9f2freed@google.comstatic void setfield_bool_if(lua_State* L, const char key[], bool pred) {
13429563879168ed58a8295520fbb4381d0ceff9f2freed@google.com    if (pred) {
13529563879168ed58a8295520fbb4381d0ceff9f2freed@google.com        lua_pushboolean(L, true);
13629563879168ed58a8295520fbb4381d0ceff9f2freed@google.com        lua_setfield(L, -2, key);
13729563879168ed58a8295520fbb4381d0ceff9f2freed@google.com    }
13829563879168ed58a8295520fbb4381d0ceff9f2freed@google.com}
13929563879168ed58a8295520fbb4381d0ceff9f2freed@google.com
14074ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.comstatic void setfield_string(lua_State* L, const char key[], const char value[]) {
14174ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com    lua_pushstring(L, value);
14274ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com    lua_setfield(L, -2, key);
14374ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com}
14474ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com
14574ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.comstatic void setfield_number(lua_State* L, const char key[], double value) {
14674ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com    lua_pushnumber(L, value);
14774ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com    lua_setfield(L, -2, key);
14874ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com}
14974ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com
1502815c19c4d52f0fb522e21d1938d63e01c039124humper@google.comstatic void setfield_boolean(lua_State* L, const char key[], bool value) {
1512815c19c4d52f0fb522e21d1938d63e01c039124humper@google.com    lua_pushboolean(L, value);
1522815c19c4d52f0fb522e21d1938d63e01c039124humper@google.com    lua_setfield(L, -2, key);
1532815c19c4d52f0fb522e21d1938d63e01c039124humper@google.com}
1542815c19c4d52f0fb522e21d1938d63e01c039124humper@google.com
15573d9f1c65114ba638637152605b0f03e871271damike@reedtribe.orgstatic void setfield_scalar(lua_State* L, const char key[], SkScalar value) {
15673d9f1c65114ba638637152605b0f03e871271damike@reedtribe.org    setfield_number(L, key, SkScalarToLua(value));
15773d9f1c65114ba638637152605b0f03e871271damike@reedtribe.org}
15873d9f1c65114ba638637152605b0f03e871271damike@reedtribe.org
1593597b73bc6e3e169f1d360de80d77e6e0ab65e96reed@google.comstatic void setfield_function(lua_State* L,
1603597b73bc6e3e169f1d360de80d77e6e0ab65e96reed@google.com                              const char key[], lua_CFunction value) {
1613597b73bc6e3e169f1d360de80d77e6e0ab65e96reed@google.com    lua_pushcfunction(L, value);
1623597b73bc6e3e169f1d360de80d77e6e0ab65e96reed@google.com    lua_setfield(L, -2, key);
16374ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com}
16474ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com
1657a72c6702da9e1f6fb536efe844db23f77535a19reedstatic int lua2int_def(lua_State* L, int index, int defaultValue) {
1667a72c6702da9e1f6fb536efe844db23f77535a19reed    if (lua_isnumber(L, index)) {
1677a72c6702da9e1f6fb536efe844db23f77535a19reed        return (int)lua_tonumber(L, index);
1687a72c6702da9e1f6fb536efe844db23f77535a19reed    } else {
1697a72c6702da9e1f6fb536efe844db23f77535a19reed        return defaultValue;
1707a72c6702da9e1f6fb536efe844db23f77535a19reed    }
1717a72c6702da9e1f6fb536efe844db23f77535a19reed}
1727a72c6702da9e1f6fb536efe844db23f77535a19reed
1737a72c6702da9e1f6fb536efe844db23f77535a19reedstatic SkScalar lua2scalar(lua_State* L, int index) {
1747a72c6702da9e1f6fb536efe844db23f77535a19reed    SkASSERT(lua_isnumber(L, index));
1757a72c6702da9e1f6fb536efe844db23f77535a19reed    return SkLuaToScalar(lua_tonumber(L, index));
1767a72c6702da9e1f6fb536efe844db23f77535a19reed}
1777a72c6702da9e1f6fb536efe844db23f77535a19reed
1787a72c6702da9e1f6fb536efe844db23f77535a19reedstatic SkScalar lua2scalar_def(lua_State* L, int index, SkScalar defaultValue) {
1797a72c6702da9e1f6fb536efe844db23f77535a19reed    if (lua_isnumber(L, index)) {
1807a72c6702da9e1f6fb536efe844db23f77535a19reed        return SkLuaToScalar(lua_tonumber(L, index));
1817a72c6702da9e1f6fb536efe844db23f77535a19reed    } else {
1827a72c6702da9e1f6fb536efe844db23f77535a19reed        return defaultValue;
1837a72c6702da9e1f6fb536efe844db23f77535a19reed    }
1847a72c6702da9e1f6fb536efe844db23f77535a19reed}
1857a72c6702da9e1f6fb536efe844db23f77535a19reed
1867a72c6702da9e1f6fb536efe844db23f77535a19reedstatic SkScalar getarray_scalar(lua_State* L, int stackIndex, int arrayIndex) {
1877a72c6702da9e1f6fb536efe844db23f77535a19reed    SkASSERT(lua_istable(L, stackIndex));
1887a72c6702da9e1f6fb536efe844db23f77535a19reed    lua_rawgeti(L, stackIndex, arrayIndex);
1898aacf2085673f6302a43d590d4d2890789b87192mtklein
1907a72c6702da9e1f6fb536efe844db23f77535a19reed    SkScalar value = lua2scalar(L, -1);
1917a72c6702da9e1f6fb536efe844db23f77535a19reed    lua_pop(L, 1);
1927a72c6702da9e1f6fb536efe844db23f77535a19reed    return value;
1937a72c6702da9e1f6fb536efe844db23f77535a19reed}
1947a72c6702da9e1f6fb536efe844db23f77535a19reed
1957a72c6702da9e1f6fb536efe844db23f77535a19reedstatic void getarray_scalars(lua_State* L, int stackIndex, SkScalar dst[], int count) {
1967a72c6702da9e1f6fb536efe844db23f77535a19reed    for (int i = 0; i < count; ++i) {
1977a72c6702da9e1f6fb536efe844db23f77535a19reed        dst[i] = getarray_scalar(L, stackIndex, i + 1);
1987a72c6702da9e1f6fb536efe844db23f77535a19reed    }
1997a72c6702da9e1f6fb536efe844db23f77535a19reed}
2007a72c6702da9e1f6fb536efe844db23f77535a19reed
2017a72c6702da9e1f6fb536efe844db23f77535a19reedstatic void getarray_points(lua_State* L, int stackIndex, SkPoint pts[], int count) {
2027a72c6702da9e1f6fb536efe844db23f77535a19reed    getarray_scalars(L, stackIndex, &pts[0].fX, count * 2);
2037a72c6702da9e1f6fb536efe844db23f77535a19reed}
2047a72c6702da9e1f6fb536efe844db23f77535a19reed
205e3823fd901674e22269637a669ac2b3e2667dc9creed@google.comstatic void setarray_number(lua_State* L, int index, double value) {
206e3823fd901674e22269637a669ac2b3e2667dc9creed@google.com    lua_pushnumber(L, value);
207e3823fd901674e22269637a669ac2b3e2667dc9creed@google.com    lua_rawseti(L, -2, index);
208e3823fd901674e22269637a669ac2b3e2667dc9creed@google.com}
209e3823fd901674e22269637a669ac2b3e2667dc9creed@google.com
2104d803a976c25ed582b02f8c42cd91c82e9d1ea84commit-bot@chromium.orgstatic void setarray_scalar(lua_State* L, int index, SkScalar value) {
2114d803a976c25ed582b02f8c42cd91c82e9d1ea84commit-bot@chromium.org    setarray_number(L, index, SkScalarToLua(value));
2124d803a976c25ed582b02f8c42cd91c82e9d1ea84commit-bot@chromium.org}
2134d803a976c25ed582b02f8c42cd91c82e9d1ea84commit-bot@chromium.org
21474ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.comvoid SkLua::pushBool(bool value, const char key[]) {
21574ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com    lua_pushboolean(fL, value);
21674ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com    CHECK_SETFIELD(key);
21774ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com}
21874ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com
21974ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.comvoid SkLua::pushString(const char str[], const char key[]) {
22074ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com    lua_pushstring(fL, str);
22174ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com    CHECK_SETFIELD(key);
22274ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com}
22374ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com
224e3823fd901674e22269637a669ac2b3e2667dc9creed@google.comvoid SkLua::pushString(const char str[], size_t length, const char key[]) {
225e3823fd901674e22269637a669ac2b3e2667dc9creed@google.com    // TODO: how to do this w/o making a copy?
226e3823fd901674e22269637a669ac2b3e2667dc9creed@google.com    SkString s(str, length);
227e3823fd901674e22269637a669ac2b3e2667dc9creed@google.com    lua_pushstring(fL, s.c_str());
228e3823fd901674e22269637a669ac2b3e2667dc9creed@google.com    CHECK_SETFIELD(key);
229e3823fd901674e22269637a669ac2b3e2667dc9creed@google.com}
230e3823fd901674e22269637a669ac2b3e2667dc9creed@google.com
23174ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.comvoid SkLua::pushString(const SkString& str, const char key[]) {
23274ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com    lua_pushstring(fL, str.c_str());
23374ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com    CHECK_SETFIELD(key);
23474ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com}
23574ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com
23674ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.comvoid SkLua::pushColor(SkColor color, const char key[]) {
23774ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com    lua_newtable(fL);
23874ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com    setfield_number(fL, "a", SkColorGetA(color) / 255.0);
23974ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com    setfield_number(fL, "r", SkColorGetR(color) / 255.0);
24074ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com    setfield_number(fL, "g", SkColorGetG(color) / 255.0);
24174ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com    setfield_number(fL, "b", SkColorGetB(color) / 255.0);
24274ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com    CHECK_SETFIELD(key);
24374ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com}
24474ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com
245e3823fd901674e22269637a669ac2b3e2667dc9creed@google.comvoid SkLua::pushU32(uint32_t value, const char key[]) {
246e3823fd901674e22269637a669ac2b3e2667dc9creed@google.com    lua_pushnumber(fL, (double)value);
247e3823fd901674e22269637a669ac2b3e2667dc9creed@google.com    CHECK_SETFIELD(key);
248e3823fd901674e22269637a669ac2b3e2667dc9creed@google.com}
249e3823fd901674e22269637a669ac2b3e2667dc9creed@google.com
25074ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.comvoid SkLua::pushScalar(SkScalar value, const char key[]) {
25174ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com    lua_pushnumber(fL, SkScalarToLua(value));
25274ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com    CHECK_SETFIELD(key);
25374ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com}
25474ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com
255e3823fd901674e22269637a669ac2b3e2667dc9creed@google.comvoid SkLua::pushArrayU16(const uint16_t array[], int count, const char key[]) {
256e3823fd901674e22269637a669ac2b3e2667dc9creed@google.com    lua_newtable(fL);
257e3823fd901674e22269637a669ac2b3e2667dc9creed@google.com    for (int i = 0; i < count; ++i) {
258e3823fd901674e22269637a669ac2b3e2667dc9creed@google.com        // make it base-1 to match lua convention
259e3823fd901674e22269637a669ac2b3e2667dc9creed@google.com        setarray_number(fL, i + 1, (double)array[i]);
260e3823fd901674e22269637a669ac2b3e2667dc9creed@google.com    }
261e3823fd901674e22269637a669ac2b3e2667dc9creed@google.com    CHECK_SETFIELD(key);
262e3823fd901674e22269637a669ac2b3e2667dc9creed@google.com}
263e3823fd901674e22269637a669ac2b3e2667dc9creed@google.com
2641301bf3abfe355f9aadd53d5dbf04926013231bacommit-bot@chromium.orgvoid SkLua::pushArrayPoint(const SkPoint array[], int count, const char key[]) {
2651301bf3abfe355f9aadd53d5dbf04926013231bacommit-bot@chromium.org    lua_newtable(fL);
2661301bf3abfe355f9aadd53d5dbf04926013231bacommit-bot@chromium.org    for (int i = 0; i < count; ++i) {
2671301bf3abfe355f9aadd53d5dbf04926013231bacommit-bot@chromium.org        // make it base-1 to match lua convention
2681301bf3abfe355f9aadd53d5dbf04926013231bacommit-bot@chromium.org        lua_newtable(fL);
2691301bf3abfe355f9aadd53d5dbf04926013231bacommit-bot@chromium.org        this->pushScalar(array[i].fX, "x");
2701301bf3abfe355f9aadd53d5dbf04926013231bacommit-bot@chromium.org        this->pushScalar(array[i].fY, "y");
2711301bf3abfe355f9aadd53d5dbf04926013231bacommit-bot@chromium.org        lua_rawseti(fL, -2, i + 1);
2721301bf3abfe355f9aadd53d5dbf04926013231bacommit-bot@chromium.org    }
2731301bf3abfe355f9aadd53d5dbf04926013231bacommit-bot@chromium.org    CHECK_SETFIELD(key);
2741301bf3abfe355f9aadd53d5dbf04926013231bacommit-bot@chromium.org}
2751301bf3abfe355f9aadd53d5dbf04926013231bacommit-bot@chromium.org
2764d803a976c25ed582b02f8c42cd91c82e9d1ea84commit-bot@chromium.orgvoid SkLua::pushArrayScalar(const SkScalar array[], int count, const char key[]) {
2774d803a976c25ed582b02f8c42cd91c82e9d1ea84commit-bot@chromium.org    lua_newtable(fL);
2784d803a976c25ed582b02f8c42cd91c82e9d1ea84commit-bot@chromium.org    for (int i = 0; i < count; ++i) {
2794d803a976c25ed582b02f8c42cd91c82e9d1ea84commit-bot@chromium.org        // make it base-1 to match lua convention
2804d803a976c25ed582b02f8c42cd91c82e9d1ea84commit-bot@chromium.org        setarray_scalar(fL, i + 1, array[i]);
2814d803a976c25ed582b02f8c42cd91c82e9d1ea84commit-bot@chromium.org    }
2824d803a976c25ed582b02f8c42cd91c82e9d1ea84commit-bot@chromium.org    CHECK_SETFIELD(key);
2834d803a976c25ed582b02f8c42cd91c82e9d1ea84commit-bot@chromium.org}
2844d803a976c25ed582b02f8c42cd91c82e9d1ea84commit-bot@chromium.org
28574ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.comvoid SkLua::pushRect(const SkRect& r, const char key[]) {
28674ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com    lua_newtable(fL);
28773d9f1c65114ba638637152605b0f03e871271damike@reedtribe.org    setfield_scalar(fL, "left", r.fLeft);
28873d9f1c65114ba638637152605b0f03e871271damike@reedtribe.org    setfield_scalar(fL, "top", r.fTop);
28973d9f1c65114ba638637152605b0f03e871271damike@reedtribe.org    setfield_scalar(fL, "right", r.fRight);
29073d9f1c65114ba638637152605b0f03e871271damike@reedtribe.org    setfield_scalar(fL, "bottom", r.fBottom);
29174ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com    CHECK_SETFIELD(key);
29274ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com}
29374ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com
29474ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.comvoid SkLua::pushRRect(const SkRRect& rr, const char key[]) {
29574ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com    push_obj(fL, rr);
29674ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com    CHECK_SETFIELD(key);
29774ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com}
29874ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com
2994d803a976c25ed582b02f8c42cd91c82e9d1ea84commit-bot@chromium.orgvoid SkLua::pushDash(const SkPathEffect::DashInfo& info, const char key[]) {
3004d803a976c25ed582b02f8c42cd91c82e9d1ea84commit-bot@chromium.org    lua_newtable(fL);
3014d803a976c25ed582b02f8c42cd91c82e9d1ea84commit-bot@chromium.org    setfield_scalar(fL, "phase", info.fPhase);
3024d803a976c25ed582b02f8c42cd91c82e9d1ea84commit-bot@chromium.org    this->pushArrayScalar(info.fIntervals, info.fCount, "intervals");
3034d803a976c25ed582b02f8c42cd91c82e9d1ea84commit-bot@chromium.org    CHECK_SETFIELD(key);
3044d803a976c25ed582b02f8c42cd91c82e9d1ea84commit-bot@chromium.org}
3054d803a976c25ed582b02f8c42cd91c82e9d1ea84commit-bot@chromium.org
3064d803a976c25ed582b02f8c42cd91c82e9d1ea84commit-bot@chromium.org
30774ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.comvoid SkLua::pushMatrix(const SkMatrix& matrix, const char key[]) {
30874ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com    push_obj(fL, matrix);
30974ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com    CHECK_SETFIELD(key);
31074ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com}
31174ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com
31274ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.comvoid SkLua::pushPaint(const SkPaint& paint, const char key[]) {
31374ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com    push_obj(fL, paint);
31474ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com    CHECK_SETFIELD(key);
31574ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com}
31674ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com
31774ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.comvoid SkLua::pushPath(const SkPath& path, const char key[]) {
31874ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com    push_obj(fL, path);
31974ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com    CHECK_SETFIELD(key);
32074ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com}
32174ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com
32274ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.comvoid SkLua::pushCanvas(SkCanvas* canvas, const char key[]) {
32374ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com    push_ref(fL, canvas);
32474ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com    CHECK_SETFIELD(key);
32574ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com}
32674ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com
327b7425173f96e93b090787e2386ba5f022b6c2869fmalitavoid SkLua::pushTextBlob(const SkTextBlob* blob, const char key[]) {
328b7425173f96e93b090787e2386ba5f022b6c2869fmalita    push_ref(fL, const_cast<SkTextBlob*>(blob));
329b7425173f96e93b090787e2386ba5f022b6c2869fmalita    CHECK_SETFIELD(key);
330b7425173f96e93b090787e2386ba5f022b6c2869fmalita}
331b7425173f96e93b090787e2386ba5f022b6c2869fmalita
3325cc25359c62c83c356c3a30572a05ac9647daa55commit-bot@chromium.orgstatic const char* element_type(SkClipStack::Element::Type type) {
3335cc25359c62c83c356c3a30572a05ac9647daa55commit-bot@chromium.org    switch (type) {
3345cc25359c62c83c356c3a30572a05ac9647daa55commit-bot@chromium.org        case SkClipStack::Element::kEmpty_Type:
3355cc25359c62c83c356c3a30572a05ac9647daa55commit-bot@chromium.org            return "empty";
3365cc25359c62c83c356c3a30572a05ac9647daa55commit-bot@chromium.org        case SkClipStack::Element::kRect_Type:
3375cc25359c62c83c356c3a30572a05ac9647daa55commit-bot@chromium.org            return "rect";
3385cc25359c62c83c356c3a30572a05ac9647daa55commit-bot@chromium.org        case SkClipStack::Element::kRRect_Type:
3395cc25359c62c83c356c3a30572a05ac9647daa55commit-bot@chromium.org            return "rrect";
3405cc25359c62c83c356c3a30572a05ac9647daa55commit-bot@chromium.org        case SkClipStack::Element::kPath_Type:
3415cc25359c62c83c356c3a30572a05ac9647daa55commit-bot@chromium.org            return "path";
3425cc25359c62c83c356c3a30572a05ac9647daa55commit-bot@chromium.org    }
3435cc25359c62c83c356c3a30572a05ac9647daa55commit-bot@chromium.org    return "unknown";
3445cc25359c62c83c356c3a30572a05ac9647daa55commit-bot@chromium.org}
3455cc25359c62c83c356c3a30572a05ac9647daa55commit-bot@chromium.org
3465cc25359c62c83c356c3a30572a05ac9647daa55commit-bot@chromium.orgstatic const char* region_op(SkRegion::Op op) {
3475cc25359c62c83c356c3a30572a05ac9647daa55commit-bot@chromium.org    switch (op) {
3485cc25359c62c83c356c3a30572a05ac9647daa55commit-bot@chromium.org        case SkRegion::kDifference_Op:
3495cc25359c62c83c356c3a30572a05ac9647daa55commit-bot@chromium.org            return "difference";
3505cc25359c62c83c356c3a30572a05ac9647daa55commit-bot@chromium.org        case SkRegion::kIntersect_Op:
3515cc25359c62c83c356c3a30572a05ac9647daa55commit-bot@chromium.org            return "intersect";
3525cc25359c62c83c356c3a30572a05ac9647daa55commit-bot@chromium.org        case SkRegion::kUnion_Op:
3535cc25359c62c83c356c3a30572a05ac9647daa55commit-bot@chromium.org            return "union";
3545cc25359c62c83c356c3a30572a05ac9647daa55commit-bot@chromium.org        case SkRegion::kXOR_Op:
3555cc25359c62c83c356c3a30572a05ac9647daa55commit-bot@chromium.org            return "xor";
3565cc25359c62c83c356c3a30572a05ac9647daa55commit-bot@chromium.org        case SkRegion::kReverseDifference_Op:
3575cc25359c62c83c356c3a30572a05ac9647daa55commit-bot@chromium.org            return "reverse-difference";
3585cc25359c62c83c356c3a30572a05ac9647daa55commit-bot@chromium.org        case SkRegion::kReplace_Op:
3595cc25359c62c83c356c3a30572a05ac9647daa55commit-bot@chromium.org            return "replace";
3605cc25359c62c83c356c3a30572a05ac9647daa55commit-bot@chromium.org    }
3615cc25359c62c83c356c3a30572a05ac9647daa55commit-bot@chromium.org    return "unknown";
3625cc25359c62c83c356c3a30572a05ac9647daa55commit-bot@chromium.org}
3635cc25359c62c83c356c3a30572a05ac9647daa55commit-bot@chromium.org
3645cc25359c62c83c356c3a30572a05ac9647daa55commit-bot@chromium.orgvoid SkLua::pushClipStack(const SkClipStack& stack, const char* key) {
3655cc25359c62c83c356c3a30572a05ac9647daa55commit-bot@chromium.org    lua_newtable(fL);
3665cc25359c62c83c356c3a30572a05ac9647daa55commit-bot@chromium.org    SkClipStack::B2TIter iter(stack);
3675cc25359c62c83c356c3a30572a05ac9647daa55commit-bot@chromium.org    const SkClipStack::Element* element;
3685cc25359c62c83c356c3a30572a05ac9647daa55commit-bot@chromium.org    int i = 0;
36949f085dddff10473b6ebf832a974288300224e60bsalomon    while ((element = iter.next())) {
3704ebe3821888d550d8a8b89341ec251ba942f0225bsalomon@google.com        this->pushClipStackElement(*element);
3715cc25359c62c83c356c3a30572a05ac9647daa55commit-bot@chromium.org        lua_rawseti(fL, -2, ++i);
3725cc25359c62c83c356c3a30572a05ac9647daa55commit-bot@chromium.org    }
3735cc25359c62c83c356c3a30572a05ac9647daa55commit-bot@chromium.org    CHECK_SETFIELD(key);
3745cc25359c62c83c356c3a30572a05ac9647daa55commit-bot@chromium.org}
3755cc25359c62c83c356c3a30572a05ac9647daa55commit-bot@chromium.org
3764ebe3821888d550d8a8b89341ec251ba942f0225bsalomon@google.comvoid SkLua::pushClipStackElement(const SkClipStack::Element& element, const char* key) {
3774ebe3821888d550d8a8b89341ec251ba942f0225bsalomon@google.com    lua_newtable(fL);
3784ebe3821888d550d8a8b89341ec251ba942f0225bsalomon@google.com    SkClipStack::Element::Type type = element.getType();
3794ebe3821888d550d8a8b89341ec251ba942f0225bsalomon@google.com    this->pushString(element_type(type), "type");
3804ebe3821888d550d8a8b89341ec251ba942f0225bsalomon@google.com    switch (type) {
3814ebe3821888d550d8a8b89341ec251ba942f0225bsalomon@google.com        case SkClipStack::Element::kEmpty_Type:
3824ebe3821888d550d8a8b89341ec251ba942f0225bsalomon@google.com            break;
3834ebe3821888d550d8a8b89341ec251ba942f0225bsalomon@google.com        case SkClipStack::Element::kRect_Type:
3844ebe3821888d550d8a8b89341ec251ba942f0225bsalomon@google.com            this->pushRect(element.getRect(), "rect");
3854ebe3821888d550d8a8b89341ec251ba942f0225bsalomon@google.com            break;
3864ebe3821888d550d8a8b89341ec251ba942f0225bsalomon@google.com        case SkClipStack::Element::kRRect_Type:
3874ebe3821888d550d8a8b89341ec251ba942f0225bsalomon@google.com            this->pushRRect(element.getRRect(), "rrect");
3884ebe3821888d550d8a8b89341ec251ba942f0225bsalomon@google.com            break;
3894ebe3821888d550d8a8b89341ec251ba942f0225bsalomon@google.com        case SkClipStack::Element::kPath_Type:
3904ebe3821888d550d8a8b89341ec251ba942f0225bsalomon@google.com            this->pushPath(element.getPath(), "path");
3914ebe3821888d550d8a8b89341ec251ba942f0225bsalomon@google.com            break;
3924ebe3821888d550d8a8b89341ec251ba942f0225bsalomon@google.com    }
3934ebe3821888d550d8a8b89341ec251ba942f0225bsalomon@google.com    this->pushString(region_op(element.getOp()), "op");
3944ebe3821888d550d8a8b89341ec251ba942f0225bsalomon@google.com    this->pushBool(element.isAA(), "aa");
3954ebe3821888d550d8a8b89341ec251ba942f0225bsalomon@google.com    CHECK_SETFIELD(key);
3964ebe3821888d550d8a8b89341ec251ba942f0225bsalomon@google.com}
3974ebe3821888d550d8a8b89341ec251ba942f0225bsalomon@google.com
3984ebe3821888d550d8a8b89341ec251ba942f0225bsalomon@google.com
39974ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com///////////////////////////////////////////////////////////////////////////////
40074ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com///////////////////////////////////////////////////////////////////////////////
40174ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com
40274ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.comstatic SkScalar getfield_scalar(lua_State* L, int index, const char key[]) {
40374ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com    SkASSERT(lua_istable(L, index));
40474ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com    lua_pushstring(L, key);
40574ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com    lua_gettable(L, index);
4068aacf2085673f6302a43d590d4d2890789b87192mtklein
40774ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com    SkScalar value = lua2scalar(L, -1);
40874ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com    lua_pop(L, 1);
40974ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com    return value;
41074ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com}
41174ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com
41273d9f1c65114ba638637152605b0f03e871271damike@reedtribe.orgstatic SkScalar getfield_scalar_default(lua_State* L, int index, const char key[], SkScalar def) {
41373d9f1c65114ba638637152605b0f03e871271damike@reedtribe.org    SkASSERT(lua_istable(L, index));
41473d9f1c65114ba638637152605b0f03e871271damike@reedtribe.org    lua_pushstring(L, key);
41573d9f1c65114ba638637152605b0f03e871271damike@reedtribe.org    lua_gettable(L, index);
416370c534c19f0faa0d60b3cac2e77886b53535c8fskia.committer@gmail.com
41773d9f1c65114ba638637152605b0f03e871271damike@reedtribe.org    SkScalar value;
41873d9f1c65114ba638637152605b0f03e871271damike@reedtribe.org    if (lua_isnil(L, -1)) {
41973d9f1c65114ba638637152605b0f03e871271damike@reedtribe.org        value = def;
42073d9f1c65114ba638637152605b0f03e871271damike@reedtribe.org    } else {
42173d9f1c65114ba638637152605b0f03e871271damike@reedtribe.org        value = lua2scalar(L, -1);
42273d9f1c65114ba638637152605b0f03e871271damike@reedtribe.org    }
42373d9f1c65114ba638637152605b0f03e871271damike@reedtribe.org    lua_pop(L, 1);
42473d9f1c65114ba638637152605b0f03e871271damike@reedtribe.org    return value;
42573d9f1c65114ba638637152605b0f03e871271damike@reedtribe.org}
42673d9f1c65114ba638637152605b0f03e871271damike@reedtribe.org
427468b1815d29d9bbe513f2d8eb4afc0b066715b52reedstatic SkScalar byte2unit(U8CPU byte) {
428468b1815d29d9bbe513f2d8eb4afc0b066715b52reed    return byte / 255.0f;
429468b1815d29d9bbe513f2d8eb4afc0b066715b52reed}
430468b1815d29d9bbe513f2d8eb4afc0b066715b52reed
43174ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.comstatic U8CPU unit2byte(SkScalar x) {
43274ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com    if (x <= 0) {
43374ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com        return 0;
43474ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com    } else if (x >= 1) {
43574ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com        return 255;
43674ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com    } else {
43774ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com        return SkScalarRoundToInt(x * 255);
43874ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com    }
43974ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com}
44074ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com
44174ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.comstatic SkColor lua2color(lua_State* L, int index) {
442485557f95d7a4b04536c0c5f01fad5f9744531dareed    return SkColorSetARGB(unit2byte(getfield_scalar_default(L, index, "a", 1)),
443485557f95d7a4b04536c0c5f01fad5f9744531dareed                          unit2byte(getfield_scalar_default(L, index, "r", 0)),
444485557f95d7a4b04536c0c5f01fad5f9744531dareed                          unit2byte(getfield_scalar_default(L, index, "g", 0)),
445485557f95d7a4b04536c0c5f01fad5f9744531dareed                          unit2byte(getfield_scalar_default(L, index, "b", 0)));
44674ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com}
44774ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com
44874ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.comstatic SkRect* lua2rect(lua_State* L, int index, SkRect* rect) {
44973d9f1c65114ba638637152605b0f03e871271damike@reedtribe.org    rect->set(getfield_scalar_default(L, index, "left", 0),
45073d9f1c65114ba638637152605b0f03e871271damike@reedtribe.org              getfield_scalar_default(L, index, "top", 0),
45174ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com              getfield_scalar(L, index, "right"),
45274ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com              getfield_scalar(L, index, "bottom"));
45374ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com    return rect;
45474ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com}
45574ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com
456f355df58517691b05be8bc3f0e99331ede6c4d44reedstatic int lcanvas_clear(lua_State* L) {
457f355df58517691b05be8bc3f0e99331ede6c4d44reed    get_ref<SkCanvas>(L, 1)->clear(0);
458f355df58517691b05be8bc3f0e99331ede6c4d44reed    return 0;
459f355df58517691b05be8bc3f0e99331ede6c4d44reed}
460f355df58517691b05be8bc3f0e99331ede6c4d44reed
46174ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.comstatic int lcanvas_drawColor(lua_State* L) {
46274ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com    get_ref<SkCanvas>(L, 1)->drawColor(lua2color(L, 2));
46374ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com    return 0;
46474ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com}
46574ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com
4669fbc3f31c0c7095f4f25ad3d2d17731bb63c0817reedstatic int lcanvas_drawPaint(lua_State* L) {
4679fbc3f31c0c7095f4f25ad3d2d17731bb63c0817reed    get_ref<SkCanvas>(L, 1)->drawPaint(*get_obj<SkPaint>(L, 2));
4689fbc3f31c0c7095f4f25ad3d2d17731bb63c0817reed    return 0;
4699fbc3f31c0c7095f4f25ad3d2d17731bb63c0817reed}
4709fbc3f31c0c7095f4f25ad3d2d17731bb63c0817reed
47174ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.comstatic int lcanvas_drawRect(lua_State* L) {
47274ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com    SkRect rect;
4737a72c6702da9e1f6fb536efe844db23f77535a19reed    lua2rect(L, 2, &rect);
4747a72c6702da9e1f6fb536efe844db23f77535a19reed    const SkPaint* paint = get_obj<SkPaint>(L, 3);
4757a72c6702da9e1f6fb536efe844db23f77535a19reed    get_ref<SkCanvas>(L, 1)->drawRect(rect, *paint);
47674ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com    return 0;
47774ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com}
47874ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com
47974ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.comstatic int lcanvas_drawOval(lua_State* L) {
48074ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com    SkRect rect;
48174ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com    get_ref<SkCanvas>(L, 1)->drawOval(*lua2rect(L, 2, &rect),
48274ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com                                      *get_obj<SkPaint>(L, 3));
48374ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com    return 0;
48474ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com}
48574ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com
48674ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.comstatic int lcanvas_drawCircle(lua_State* L) {
48774ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com    get_ref<SkCanvas>(L, 1)->drawCircle(lua2scalar(L, 2),
48874ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com                                        lua2scalar(L, 3),
48974ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com                                        lua2scalar(L, 4),
49074ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com                                        *get_obj<SkPaint>(L, 5));
49174ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com    return 0;
49274ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com}
49374ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com
494485557f95d7a4b04536c0c5f01fad5f9744531dareedstatic SkPaint* lua2OptionalPaint(lua_State* L, int index, SkPaint* paint) {
495485557f95d7a4b04536c0c5f01fad5f9744531dareed    if (lua_isnumber(L, index)) {
496485557f95d7a4b04536c0c5f01fad5f9744531dareed        paint->setAlpha(SkScalarRoundToInt(lua2scalar(L, index) * 255));
497485557f95d7a4b04536c0c5f01fad5f9744531dareed        return paint;
498f355df58517691b05be8bc3f0e99331ede6c4d44reed    } else if (lua_isuserdata(L, index)) {
499485557f95d7a4b04536c0c5f01fad5f9744531dareed        const SkPaint* ptr = get_obj<SkPaint>(L, index);
500485557f95d7a4b04536c0c5f01fad5f9744531dareed        if (ptr) {
501485557f95d7a4b04536c0c5f01fad5f9744531dareed            *paint = *ptr;
502485557f95d7a4b04536c0c5f01fad5f9744531dareed            return paint;
503485557f95d7a4b04536c0c5f01fad5f9744531dareed        }
504485557f95d7a4b04536c0c5f01fad5f9744531dareed    }
505485557f95d7a4b04536c0c5f01fad5f9744531dareed    return NULL;
506485557f95d7a4b04536c0c5f01fad5f9744531dareed}
507485557f95d7a4b04536c0c5f01fad5f9744531dareed
508792bbd14c63f217f2de0e6b2f8df99acb1928eeamike@reedtribe.orgstatic int lcanvas_drawImage(lua_State* L) {
509792bbd14c63f217f2de0e6b2f8df99acb1928eeamike@reedtribe.org    SkCanvas* canvas = get_ref<SkCanvas>(L, 1);
510792bbd14c63f217f2de0e6b2f8df99acb1928eeamike@reedtribe.org    SkImage* image = get_ref<SkImage>(L, 2);
511792bbd14c63f217f2de0e6b2f8df99acb1928eeamike@reedtribe.org    if (NULL == image) {
512792bbd14c63f217f2de0e6b2f8df99acb1928eeamike@reedtribe.org        return 0;
513792bbd14c63f217f2de0e6b2f8df99acb1928eeamike@reedtribe.org    }
514792bbd14c63f217f2de0e6b2f8df99acb1928eeamike@reedtribe.org    SkScalar x = lua2scalar(L, 3);
515792bbd14c63f217f2de0e6b2f8df99acb1928eeamike@reedtribe.org    SkScalar y = lua2scalar(L, 4);
516792bbd14c63f217f2de0e6b2f8df99acb1928eeamike@reedtribe.org
517792bbd14c63f217f2de0e6b2f8df99acb1928eeamike@reedtribe.org    SkPaint paint;
518485557f95d7a4b04536c0c5f01fad5f9744531dareed    canvas->drawImage(image, x, y, lua2OptionalPaint(L, 5, &paint));
519792bbd14c63f217f2de0e6b2f8df99acb1928eeamike@reedtribe.org    return 0;
520792bbd14c63f217f2de0e6b2f8df99acb1928eeamike@reedtribe.org}
521792bbd14c63f217f2de0e6b2f8df99acb1928eeamike@reedtribe.org
522ba5fb932a1b5666a861043735cfb055cc1b600c7reedstatic int lcanvas_drawImageRect(lua_State* L) {
523ba5fb932a1b5666a861043735cfb055cc1b600c7reed    SkCanvas* canvas = get_ref<SkCanvas>(L, 1);
524ba5fb932a1b5666a861043735cfb055cc1b600c7reed    SkImage* image = get_ref<SkImage>(L, 2);
525ba5fb932a1b5666a861043735cfb055cc1b600c7reed    if (NULL == image) {
526ba5fb932a1b5666a861043735cfb055cc1b600c7reed        return 0;
527ba5fb932a1b5666a861043735cfb055cc1b600c7reed    }
528ba5fb932a1b5666a861043735cfb055cc1b600c7reed
529ba5fb932a1b5666a861043735cfb055cc1b600c7reed    SkRect srcR, dstR;
530ba5fb932a1b5666a861043735cfb055cc1b600c7reed    SkRect* srcRPtr = NULL;
531ba5fb932a1b5666a861043735cfb055cc1b600c7reed    if (!lua_isnil(L, 3)) {
532ba5fb932a1b5666a861043735cfb055cc1b600c7reed        srcRPtr = lua2rect(L, 3, &srcR);
533ba5fb932a1b5666a861043735cfb055cc1b600c7reed    }
534ba5fb932a1b5666a861043735cfb055cc1b600c7reed    lua2rect(L, 4, &dstR);
5358aacf2085673f6302a43d590d4d2890789b87192mtklein
536ba5fb932a1b5666a861043735cfb055cc1b600c7reed    SkPaint paint;
537485557f95d7a4b04536c0c5f01fad5f9744531dareed    canvas->drawImageRect(image, srcRPtr, dstR, lua2OptionalPaint(L, 5, &paint));
538ba5fb932a1b5666a861043735cfb055cc1b600c7reed    return 0;
539ba5fb932a1b5666a861043735cfb055cc1b600c7reed}
540ba5fb932a1b5666a861043735cfb055cc1b600c7reed
5417a72c6702da9e1f6fb536efe844db23f77535a19reedstatic int lcanvas_drawPatch(lua_State* L) {
5427a72c6702da9e1f6fb536efe844db23f77535a19reed    SkPoint cubics[12];
5437a72c6702da9e1f6fb536efe844db23f77535a19reed    SkColor colorStorage[4];
5447a72c6702da9e1f6fb536efe844db23f77535a19reed    SkPoint texStorage[4];
5457a72c6702da9e1f6fb536efe844db23f77535a19reed
5467a72c6702da9e1f6fb536efe844db23f77535a19reed    const SkColor* colors = NULL;
5477a72c6702da9e1f6fb536efe844db23f77535a19reed    const SkPoint* texs = NULL;
5487a72c6702da9e1f6fb536efe844db23f77535a19reed
5497a72c6702da9e1f6fb536efe844db23f77535a19reed    getarray_points(L, 2, cubics, 12);
5507a72c6702da9e1f6fb536efe844db23f77535a19reed
5517a72c6702da9e1f6fb536efe844db23f77535a19reed    colorStorage[0] = SK_ColorRED;
5527a72c6702da9e1f6fb536efe844db23f77535a19reed    colorStorage[1] = SK_ColorGREEN;
5537a72c6702da9e1f6fb536efe844db23f77535a19reed    colorStorage[2] = SK_ColorBLUE;
5547a72c6702da9e1f6fb536efe844db23f77535a19reed    colorStorage[3] = SK_ColorGRAY;
5557a72c6702da9e1f6fb536efe844db23f77535a19reed
5567a72c6702da9e1f6fb536efe844db23f77535a19reed    if (lua_isnil(L, 4)) {
5577a72c6702da9e1f6fb536efe844db23f77535a19reed        colors = colorStorage;
5587a72c6702da9e1f6fb536efe844db23f77535a19reed    } else {
5597a72c6702da9e1f6fb536efe844db23f77535a19reed        getarray_points(L, 4, texStorage, 4);
5607a72c6702da9e1f6fb536efe844db23f77535a19reed        texs = texStorage;
5617a72c6702da9e1f6fb536efe844db23f77535a19reed    }
5627a72c6702da9e1f6fb536efe844db23f77535a19reed
5637a72c6702da9e1f6fb536efe844db23f77535a19reed    get_ref<SkCanvas>(L, 1)->drawPatch(cubics, colors, texs, NULL, *get_obj<SkPaint>(L, 5));
5647a72c6702da9e1f6fb536efe844db23f77535a19reed    return 0;
5657a72c6702da9e1f6fb536efe844db23f77535a19reed}
5667a72c6702da9e1f6fb536efe844db23f77535a19reed
567fd3458750d92d9722e5760ddb99824e65455463creed@google.comstatic int lcanvas_drawPath(lua_State* L) {
568fd3458750d92d9722e5760ddb99824e65455463creed@google.com    get_ref<SkCanvas>(L, 1)->drawPath(*get_obj<SkPath>(L, 2),
569fd3458750d92d9722e5760ddb99824e65455463creed@google.com                                      *get_obj<SkPaint>(L, 3));
570fd3458750d92d9722e5760ddb99824e65455463creed@google.com    return 0;
571fd3458750d92d9722e5760ddb99824e65455463creed@google.com}
572fd3458750d92d9722e5760ddb99824e65455463creed@google.com
57396affcde22a675e3629b9da490bb45a0ab07fa2breed// drawPicture(pic, x, y, paint)
57496affcde22a675e3629b9da490bb45a0ab07fa2breedstatic int lcanvas_drawPicture(lua_State* L) {
57596affcde22a675e3629b9da490bb45a0ab07fa2breed    SkCanvas* canvas = get_ref<SkCanvas>(L, 1);
57696affcde22a675e3629b9da490bb45a0ab07fa2breed    SkPicture* picture = get_ref<SkPicture>(L, 2);
57796affcde22a675e3629b9da490bb45a0ab07fa2breed    SkScalar x = lua2scalar_def(L, 3, 0);
57896affcde22a675e3629b9da490bb45a0ab07fa2breed    SkScalar y = lua2scalar_def(L, 4, 0);
57996affcde22a675e3629b9da490bb45a0ab07fa2breed    SkMatrix matrix, *matrixPtr = NULL;
58096affcde22a675e3629b9da490bb45a0ab07fa2breed    if (x || y) {
58196affcde22a675e3629b9da490bb45a0ab07fa2breed        matrix.setTranslate(x, y);
58296affcde22a675e3629b9da490bb45a0ab07fa2breed        matrixPtr = &matrix;
58396affcde22a675e3629b9da490bb45a0ab07fa2breed    }
58496affcde22a675e3629b9da490bb45a0ab07fa2breed    SkPaint paint;
58596affcde22a675e3629b9da490bb45a0ab07fa2breed    canvas->drawPicture(picture, matrixPtr, lua2OptionalPaint(L, 5, &paint));
58696affcde22a675e3629b9da490bb45a0ab07fa2breed    return 0;
58796affcde22a675e3629b9da490bb45a0ab07fa2breed}
58896affcde22a675e3629b9da490bb45a0ab07fa2breed
589e6469f10c8f9340032797316fd06ee2f109255ffmike@reedtribe.orgstatic int lcanvas_drawText(lua_State* L) {
590e6469f10c8f9340032797316fd06ee2f109255ffmike@reedtribe.org    if (lua_gettop(L) < 5) {
591e6469f10c8f9340032797316fd06ee2f109255ffmike@reedtribe.org        return 0;
592e6469f10c8f9340032797316fd06ee2f109255ffmike@reedtribe.org    }
593e6469f10c8f9340032797316fd06ee2f109255ffmike@reedtribe.org
594e6469f10c8f9340032797316fd06ee2f109255ffmike@reedtribe.org    if (lua_isstring(L, 2) && lua_isnumber(L, 3) && lua_isnumber(L, 4)) {
595e6469f10c8f9340032797316fd06ee2f109255ffmike@reedtribe.org        size_t len;
596e6469f10c8f9340032797316fd06ee2f109255ffmike@reedtribe.org        const char* text = lua_tolstring(L, 2, &len);
597e6469f10c8f9340032797316fd06ee2f109255ffmike@reedtribe.org        get_ref<SkCanvas>(L, 1)->drawText(text, len,
598e6469f10c8f9340032797316fd06ee2f109255ffmike@reedtribe.org                                          lua2scalar(L, 3), lua2scalar(L, 4),
599e6469f10c8f9340032797316fd06ee2f109255ffmike@reedtribe.org                                          *get_obj<SkPaint>(L, 5));
600e6469f10c8f9340032797316fd06ee2f109255ffmike@reedtribe.org    }
601e6469f10c8f9340032797316fd06ee2f109255ffmike@reedtribe.org    return 0;
602e6469f10c8f9340032797316fd06ee2f109255ffmike@reedtribe.org}
603e6469f10c8f9340032797316fd06ee2f109255ffmike@reedtribe.org
6041b6ab4417e0edef3b91d150e6650205f49f04d17reedstatic int lcanvas_drawTextBlob(lua_State* L) {
6051b6ab4417e0edef3b91d150e6650205f49f04d17reed    const SkTextBlob* blob = get_ref<SkTextBlob>(L, 2);
6061b6ab4417e0edef3b91d150e6650205f49f04d17reed    SkScalar x = lua2scalar(L, 3);
6071b6ab4417e0edef3b91d150e6650205f49f04d17reed    SkScalar y = lua2scalar(L, 4);
6081b6ab4417e0edef3b91d150e6650205f49f04d17reed    const SkPaint& paint = *get_obj<SkPaint>(L, 5);
6091b6ab4417e0edef3b91d150e6650205f49f04d17reed    get_ref<SkCanvas>(L, 1)->drawTextBlob(blob, x, y, paint);
6101b6ab4417e0edef3b91d150e6650205f49f04d17reed    return 0;
6111b6ab4417e0edef3b91d150e6650205f49f04d17reed}
6121b6ab4417e0edef3b91d150e6650205f49f04d17reed
61374ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.comstatic int lcanvas_getSaveCount(lua_State* L) {
61474ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com    lua_pushnumber(L, get_ref<SkCanvas>(L, 1)->getSaveCount());
61574ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com    return 1;
61674ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com}
61774ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com
61874ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.comstatic int lcanvas_getTotalMatrix(lua_State* L) {
61974ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com    SkLua(L).pushMatrix(get_ref<SkCanvas>(L, 1)->getTotalMatrix());
62074ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com    return 1;
62174ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com}
62274ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com
6235cc25359c62c83c356c3a30572a05ac9647daa55commit-bot@chromium.orgstatic int lcanvas_getClipStack(lua_State* L) {
6245cc25359c62c83c356c3a30572a05ac9647daa55commit-bot@chromium.org    SkLua(L).pushClipStack(*get_ref<SkCanvas>(L, 1)->getClipStack());
6255cc25359c62c83c356c3a30572a05ac9647daa55commit-bot@chromium.org    return 1;
6265cc25359c62c83c356c3a30572a05ac9647daa55commit-bot@chromium.org}
6275cc25359c62c83c356c3a30572a05ac9647daa55commit-bot@chromium.org
6284ebe3821888d550d8a8b89341ec251ba942f0225bsalomon@google.comint SkLua::lcanvas_getReducedClipStack(lua_State* L) {
6294ebe3821888d550d8a8b89341ec251ba942f0225bsalomon@google.com#if SK_SUPPORT_GPU
6304ebe3821888d550d8a8b89341ec251ba942f0225bsalomon@google.com    const SkCanvas* canvas = get_ref<SkCanvas>(L, 1);
6314ebe3821888d550d8a8b89341ec251ba942f0225bsalomon@google.com    SkISize layerSize = canvas->getTopLayerSize();
6324ebe3821888d550d8a8b89341ec251ba942f0225bsalomon@google.com    SkIPoint layerOrigin = canvas->getTopLayerOrigin();
6334ebe3821888d550d8a8b89341ec251ba942f0225bsalomon@google.com    SkIRect queryBounds = SkIRect::MakeXYWH(layerOrigin.fX, layerOrigin.fY,
6344ebe3821888d550d8a8b89341ec251ba942f0225bsalomon@google.com                                            layerSize.fWidth, layerSize.fHeight);
6354ebe3821888d550d8a8b89341ec251ba942f0225bsalomon@google.com
6364ebe3821888d550d8a8b89341ec251ba942f0225bsalomon@google.com    GrReducedClip::ElementList elements;
6374ebe3821888d550d8a8b89341ec251ba942f0225bsalomon@google.com    GrReducedClip::InitialState initialState;
6384ebe3821888d550d8a8b89341ec251ba942f0225bsalomon@google.com    int32_t genID;
6394ebe3821888d550d8a8b89341ec251ba942f0225bsalomon@google.com    SkIRect resultBounds;
6404ebe3821888d550d8a8b89341ec251ba942f0225bsalomon@google.com
6414ebe3821888d550d8a8b89341ec251ba942f0225bsalomon@google.com    const SkClipStack& stack = *canvas->getClipStack();
6424ebe3821888d550d8a8b89341ec251ba942f0225bsalomon@google.com
6434ebe3821888d550d8a8b89341ec251ba942f0225bsalomon@google.com    GrReducedClip::ReduceClipStack(stack,
6444ebe3821888d550d8a8b89341ec251ba942f0225bsalomon@google.com                                   queryBounds,
6454ebe3821888d550d8a8b89341ec251ba942f0225bsalomon@google.com                                   &elements,
6464ebe3821888d550d8a8b89341ec251ba942f0225bsalomon@google.com                                   &genID,
6474ebe3821888d550d8a8b89341ec251ba942f0225bsalomon@google.com                                   &initialState,
6484ebe3821888d550d8a8b89341ec251ba942f0225bsalomon@google.com                                   &resultBounds,
6494ebe3821888d550d8a8b89341ec251ba942f0225bsalomon@google.com                                   NULL);
6504ebe3821888d550d8a8b89341ec251ba942f0225bsalomon@google.com
6514ebe3821888d550d8a8b89341ec251ba942f0225bsalomon@google.com    GrReducedClip::ElementList::Iter iter(elements);
6524ebe3821888d550d8a8b89341ec251ba942f0225bsalomon@google.com    int i = 0;
6534ebe3821888d550d8a8b89341ec251ba942f0225bsalomon@google.com    lua_newtable(L);
65449f085dddff10473b6ebf832a974288300224e60bsalomon    while(iter.get()) {
6554ebe3821888d550d8a8b89341ec251ba942f0225bsalomon@google.com        SkLua(L).pushClipStackElement(*iter.get());
6564ebe3821888d550d8a8b89341ec251ba942f0225bsalomon@google.com        iter.next();
6574ebe3821888d550d8a8b89341ec251ba942f0225bsalomon@google.com        lua_rawseti(L, -2, ++i);
6584ebe3821888d550d8a8b89341ec251ba942f0225bsalomon@google.com    }
6594ebe3821888d550d8a8b89341ec251ba942f0225bsalomon@google.com    // Currently this only returns the element list to lua, not the initial state or result bounds.
6604ebe3821888d550d8a8b89341ec251ba942f0225bsalomon@google.com    // It could return these as additional items on the lua stack.
6614ebe3821888d550d8a8b89341ec251ba942f0225bsalomon@google.com    return 1;
6624ebe3821888d550d8a8b89341ec251ba942f0225bsalomon@google.com#else
6634ebe3821888d550d8a8b89341ec251ba942f0225bsalomon@google.com    return 0;
6644ebe3821888d550d8a8b89341ec251ba942f0225bsalomon@google.com#endif
6654ebe3821888d550d8a8b89341ec251ba942f0225bsalomon@google.com}
6664ebe3821888d550d8a8b89341ec251ba942f0225bsalomon@google.com
667fb858245216dafee4de731fce4f0fa58c746d3e9mike@reedtribe.orgstatic int lcanvas_save(lua_State* L) {
668fb858245216dafee4de731fce4f0fa58c746d3e9mike@reedtribe.org    lua_pushinteger(L, get_ref<SkCanvas>(L, 1)->save());
669fb858245216dafee4de731fce4f0fa58c746d3e9mike@reedtribe.org    return 1;
670fb858245216dafee4de731fce4f0fa58c746d3e9mike@reedtribe.org}
671fb858245216dafee4de731fce4f0fa58c746d3e9mike@reedtribe.org
67286217d831d70949f9dde6a60f821d3f357558bdfreedstatic int lcanvas_saveLayer(lua_State* L) {
67386217d831d70949f9dde6a60f821d3f357558bdfreed    SkPaint paint;
67486217d831d70949f9dde6a60f821d3f357558bdfreed    lua_pushinteger(L, get_ref<SkCanvas>(L, 1)->saveLayer(NULL, lua2OptionalPaint(L, 2, &paint)));
67586217d831d70949f9dde6a60f821d3f357558bdfreed    return 1;
67686217d831d70949f9dde6a60f821d3f357558bdfreed}
67786217d831d70949f9dde6a60f821d3f357558bdfreed
678fb858245216dafee4de731fce4f0fa58c746d3e9mike@reedtribe.orgstatic int lcanvas_restore(lua_State* L) {
679fb858245216dafee4de731fce4f0fa58c746d3e9mike@reedtribe.org    get_ref<SkCanvas>(L, 1)->restore();
680fb858245216dafee4de731fce4f0fa58c746d3e9mike@reedtribe.org    return 0;
681fb858245216dafee4de731fce4f0fa58c746d3e9mike@reedtribe.org}
682fb858245216dafee4de731fce4f0fa58c746d3e9mike@reedtribe.org
6831d32cc67f77d3fac29db574d79c7dff93e035259mike@reedtribe.orgstatic int lcanvas_scale(lua_State* L) {
6841d32cc67f77d3fac29db574d79c7dff93e035259mike@reedtribe.org    SkScalar sx = lua2scalar_def(L, 2, 1);
6851d32cc67f77d3fac29db574d79c7dff93e035259mike@reedtribe.org    SkScalar sy = lua2scalar_def(L, 3, sx);
6861d32cc67f77d3fac29db574d79c7dff93e035259mike@reedtribe.org    get_ref<SkCanvas>(L, 1)->scale(sx, sy);
6871d32cc67f77d3fac29db574d79c7dff93e035259mike@reedtribe.org    return 0;
6881d32cc67f77d3fac29db574d79c7dff93e035259mike@reedtribe.org}
6891d32cc67f77d3fac29db574d79c7dff93e035259mike@reedtribe.org
6903597b73bc6e3e169f1d360de80d77e6e0ab65e96reed@google.comstatic int lcanvas_translate(lua_State* L) {
6911d32cc67f77d3fac29db574d79c7dff93e035259mike@reedtribe.org    SkScalar tx = lua2scalar_def(L, 2, 0);
6921d32cc67f77d3fac29db574d79c7dff93e035259mike@reedtribe.org    SkScalar ty = lua2scalar_def(L, 3, 0);
6931d32cc67f77d3fac29db574d79c7dff93e035259mike@reedtribe.org    get_ref<SkCanvas>(L, 1)->translate(tx, ty);
6941d32cc67f77d3fac29db574d79c7dff93e035259mike@reedtribe.org    return 0;
6951d32cc67f77d3fac29db574d79c7dff93e035259mike@reedtribe.org}
6961d32cc67f77d3fac29db574d79c7dff93e035259mike@reedtribe.org
6971d32cc67f77d3fac29db574d79c7dff93e035259mike@reedtribe.orgstatic int lcanvas_rotate(lua_State* L) {
6981d32cc67f77d3fac29db574d79c7dff93e035259mike@reedtribe.org    SkScalar degrees = lua2scalar_def(L, 2, 0);
6991d32cc67f77d3fac29db574d79c7dff93e035259mike@reedtribe.org    get_ref<SkCanvas>(L, 1)->rotate(degrees);
7003597b73bc6e3e169f1d360de80d77e6e0ab65e96reed@google.com    return 0;
7013597b73bc6e3e169f1d360de80d77e6e0ab65e96reed@google.com}
7023597b73bc6e3e169f1d360de80d77e6e0ab65e96reed@google.com
703bdc49ae0d422b8fe1957af570c4f4e63272f5285reedstatic int lcanvas_concat(lua_State* L) {
704bdc49ae0d422b8fe1957af570c4f4e63272f5285reed    get_ref<SkCanvas>(L, 1)->concat(*get_obj<SkMatrix>(L, 2));
705bdc49ae0d422b8fe1957af570c4f4e63272f5285reed    return 0;
706bdc49ae0d422b8fe1957af570c4f4e63272f5285reed}
707bdc49ae0d422b8fe1957af570c4f4e63272f5285reed
708485557f95d7a4b04536c0c5f01fad5f9744531dareedstatic int lcanvas_newSurface(lua_State* L) {
709485557f95d7a4b04536c0c5f01fad5f9744531dareed    int width = lua2int_def(L, 2, 0);
7107a72c6702da9e1f6fb536efe844db23f77535a19reed    int height = lua2int_def(L, 3, 0);
711485557f95d7a4b04536c0c5f01fad5f9744531dareed    SkImageInfo info = SkImageInfo::MakeN32Premul(width, height);
712485557f95d7a4b04536c0c5f01fad5f9744531dareed    SkSurface* surface = get_ref<SkCanvas>(L, 1)->newSurface(info);
713485557f95d7a4b04536c0c5f01fad5f9744531dareed    if (NULL == surface) {
714485557f95d7a4b04536c0c5f01fad5f9744531dareed        lua_pushnil(L);
715485557f95d7a4b04536c0c5f01fad5f9744531dareed    } else {
7169fbc3f31c0c7095f4f25ad3d2d17731bb63c0817reed        push_ref(L, surface)->unref();
717485557f95d7a4b04536c0c5f01fad5f9744531dareed    }
718485557f95d7a4b04536c0c5f01fad5f9744531dareed    return 1;
719485557f95d7a4b04536c0c5f01fad5f9744531dareed}
720485557f95d7a4b04536c0c5f01fad5f9744531dareed
72174ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.comstatic int lcanvas_gc(lua_State* L) {
72274ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com    get_ref<SkCanvas>(L, 1)->unref();
72374ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com    return 0;
72474ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com}
72574ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com
7264ebe3821888d550d8a8b89341ec251ba942f0225bsalomon@google.comconst struct luaL_Reg gSkCanvas_Methods[] = {
727f355df58517691b05be8bc3f0e99331ede6c4d44reed    { "clear", lcanvas_clear },
72874ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com    { "drawColor", lcanvas_drawColor },
7299fbc3f31c0c7095f4f25ad3d2d17731bb63c0817reed    { "drawPaint", lcanvas_drawPaint },
73074ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com    { "drawRect", lcanvas_drawRect },
73174ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com    { "drawOval", lcanvas_drawOval },
73274ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com    { "drawCircle", lcanvas_drawCircle },
733792bbd14c63f217f2de0e6b2f8df99acb1928eeamike@reedtribe.org    { "drawImage", lcanvas_drawImage },
734ba5fb932a1b5666a861043735cfb055cc1b600c7reed    { "drawImageRect", lcanvas_drawImageRect },
7357a72c6702da9e1f6fb536efe844db23f77535a19reed    { "drawPatch", lcanvas_drawPatch },
736fd3458750d92d9722e5760ddb99824e65455463creed@google.com    { "drawPath", lcanvas_drawPath },
73796affcde22a675e3629b9da490bb45a0ab07fa2breed    { "drawPicture", lcanvas_drawPicture },
738e6469f10c8f9340032797316fd06ee2f109255ffmike@reedtribe.org    { "drawText", lcanvas_drawText },
7391b6ab4417e0edef3b91d150e6650205f49f04d17reed    { "drawTextBlob", lcanvas_drawTextBlob },
74074ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com    { "getSaveCount", lcanvas_getSaveCount },
74174ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com    { "getTotalMatrix", lcanvas_getTotalMatrix },
7425cc25359c62c83c356c3a30572a05ac9647daa55commit-bot@chromium.org    { "getClipStack", lcanvas_getClipStack },
7434ebe3821888d550d8a8b89341ec251ba942f0225bsalomon@google.com#if SK_SUPPORT_GPU
7444ebe3821888d550d8a8b89341ec251ba942f0225bsalomon@google.com    { "getReducedClipStack", SkLua::lcanvas_getReducedClipStack },
7454ebe3821888d550d8a8b89341ec251ba942f0225bsalomon@google.com#endif
746fb858245216dafee4de731fce4f0fa58c746d3e9mike@reedtribe.org    { "save", lcanvas_save },
74786217d831d70949f9dde6a60f821d3f357558bdfreed    { "saveLayer", lcanvas_saveLayer },
748fb858245216dafee4de731fce4f0fa58c746d3e9mike@reedtribe.org    { "restore", lcanvas_restore },
7491d32cc67f77d3fac29db574d79c7dff93e035259mike@reedtribe.org    { "scale", lcanvas_scale },
7503597b73bc6e3e169f1d360de80d77e6e0ab65e96reed@google.com    { "translate", lcanvas_translate },
7511d32cc67f77d3fac29db574d79c7dff93e035259mike@reedtribe.org    { "rotate", lcanvas_rotate },
752bdc49ae0d422b8fe1957af570c4f4e63272f5285reed    { "concat", lcanvas_concat },
753485557f95d7a4b04536c0c5f01fad5f9744531dareed
754485557f95d7a4b04536c0c5f01fad5f9744531dareed    { "newSurface", lcanvas_newSurface },
755485557f95d7a4b04536c0c5f01fad5f9744531dareed
75674ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com    { "__gc", lcanvas_gc },
75774ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com    { NULL, NULL }
75874ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com};
75974ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com
76074ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com///////////////////////////////////////////////////////////////////////////////
76174ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com
762fb858245216dafee4de731fce4f0fa58c746d3e9mike@reedtribe.orgstatic int ldocument_beginPage(lua_State* L) {
763fb858245216dafee4de731fce4f0fa58c746d3e9mike@reedtribe.org    const SkRect* contentPtr = NULL;
764fb858245216dafee4de731fce4f0fa58c746d3e9mike@reedtribe.org    push_ref(L, get_ref<SkDocument>(L, 1)->beginPage(lua2scalar(L, 2),
765fb858245216dafee4de731fce4f0fa58c746d3e9mike@reedtribe.org                                                     lua2scalar(L, 3),
766fb858245216dafee4de731fce4f0fa58c746d3e9mike@reedtribe.org                                                     contentPtr));
767fb858245216dafee4de731fce4f0fa58c746d3e9mike@reedtribe.org    return 1;
768fb858245216dafee4de731fce4f0fa58c746d3e9mike@reedtribe.org}
769fb858245216dafee4de731fce4f0fa58c746d3e9mike@reedtribe.org
770fb858245216dafee4de731fce4f0fa58c746d3e9mike@reedtribe.orgstatic int ldocument_endPage(lua_State* L) {
771fb858245216dafee4de731fce4f0fa58c746d3e9mike@reedtribe.org    get_ref<SkDocument>(L, 1)->endPage();
772fb858245216dafee4de731fce4f0fa58c746d3e9mike@reedtribe.org    return 0;
773fb858245216dafee4de731fce4f0fa58c746d3e9mike@reedtribe.org}
774fb858245216dafee4de731fce4f0fa58c746d3e9mike@reedtribe.org
775fb858245216dafee4de731fce4f0fa58c746d3e9mike@reedtribe.orgstatic int ldocument_close(lua_State* L) {
776fb858245216dafee4de731fce4f0fa58c746d3e9mike@reedtribe.org    get_ref<SkDocument>(L, 1)->close();
777fb858245216dafee4de731fce4f0fa58c746d3e9mike@reedtribe.org    return 0;
778fb858245216dafee4de731fce4f0fa58c746d3e9mike@reedtribe.org}
779fb858245216dafee4de731fce4f0fa58c746d3e9mike@reedtribe.org
780fb858245216dafee4de731fce4f0fa58c746d3e9mike@reedtribe.orgstatic int ldocument_gc(lua_State* L) {
781fb858245216dafee4de731fce4f0fa58c746d3e9mike@reedtribe.org    get_ref<SkDocument>(L, 1)->unref();
782fb858245216dafee4de731fce4f0fa58c746d3e9mike@reedtribe.org    return 0;
783fb858245216dafee4de731fce4f0fa58c746d3e9mike@reedtribe.org}
784fb858245216dafee4de731fce4f0fa58c746d3e9mike@reedtribe.org
785fb858245216dafee4de731fce4f0fa58c746d3e9mike@reedtribe.orgstatic const struct luaL_Reg gSkDocument_Methods[] = {
786fb858245216dafee4de731fce4f0fa58c746d3e9mike@reedtribe.org    { "beginPage", ldocument_beginPage },
787fb858245216dafee4de731fce4f0fa58c746d3e9mike@reedtribe.org    { "endPage", ldocument_endPage },
788fb858245216dafee4de731fce4f0fa58c746d3e9mike@reedtribe.org    { "close", ldocument_close },
789fb858245216dafee4de731fce4f0fa58c746d3e9mike@reedtribe.org    { "__gc", ldocument_gc },
790fb858245216dafee4de731fce4f0fa58c746d3e9mike@reedtribe.org    { NULL, NULL }
791fb858245216dafee4de731fce4f0fa58c746d3e9mike@reedtribe.org};
792fb858245216dafee4de731fce4f0fa58c746d3e9mike@reedtribe.org
793fb858245216dafee4de731fce4f0fa58c746d3e9mike@reedtribe.org///////////////////////////////////////////////////////////////////////////////
794fb858245216dafee4de731fce4f0fa58c746d3e9mike@reedtribe.org
79574ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.comstatic int lpaint_isAntiAlias(lua_State* L) {
79674ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com    lua_pushboolean(L, get_obj<SkPaint>(L, 1)->isAntiAlias());
79774ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com    return 1;
79874ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com}
79974ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com
80074ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.comstatic int lpaint_setAntiAlias(lua_State* L) {
80188c9ec968f682ebcc4ec13fe76f4d24d1e05633breed@google.com    get_obj<SkPaint>(L, 1)->setAntiAlias(lua2bool(L, 2));
80274ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com    return 0;
80374ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com}
80474ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com
8051cd71fb013643b983b372fee24eab3708aae70e9commit-bot@chromium.orgstatic int lpaint_isDither(lua_State* L) {
8061cd71fb013643b983b372fee24eab3708aae70e9commit-bot@chromium.org    lua_pushboolean(L, get_obj<SkPaint>(L, 1)->isDither());
8071cd71fb013643b983b372fee24eab3708aae70e9commit-bot@chromium.org    return 1;
8081cd71fb013643b983b372fee24eab3708aae70e9commit-bot@chromium.org}
8091cd71fb013643b983b372fee24eab3708aae70e9commit-bot@chromium.org
810bb8a0ababab1aa2693a2a97733524ee367da1791reedstatic int lpaint_setDither(lua_State* L) {
811bb8a0ababab1aa2693a2a97733524ee367da1791reed    get_obj<SkPaint>(L, 1)->setDither(lua2bool(L, 2));
812bb8a0ababab1aa2693a2a97733524ee367da1791reed    return 0;
813bb8a0ababab1aa2693a2a97733524ee367da1791reed}
814bb8a0ababab1aa2693a2a97733524ee367da1791reed
8151cd71fb013643b983b372fee24eab3708aae70e9commit-bot@chromium.orgstatic int lpaint_isUnderlineText(lua_State* L) {
8161cd71fb013643b983b372fee24eab3708aae70e9commit-bot@chromium.org    lua_pushboolean(L, get_obj<SkPaint>(L, 1)->isUnderlineText());
8171cd71fb013643b983b372fee24eab3708aae70e9commit-bot@chromium.org    return 1;
8181cd71fb013643b983b372fee24eab3708aae70e9commit-bot@chromium.org}
8191cd71fb013643b983b372fee24eab3708aae70e9commit-bot@chromium.org
8201cd71fb013643b983b372fee24eab3708aae70e9commit-bot@chromium.orgstatic int lpaint_isStrikeThruText(lua_State* L) {
8211cd71fb013643b983b372fee24eab3708aae70e9commit-bot@chromium.org    lua_pushboolean(L, get_obj<SkPaint>(L, 1)->isStrikeThruText());
8221cd71fb013643b983b372fee24eab3708aae70e9commit-bot@chromium.org    return 1;
8231cd71fb013643b983b372fee24eab3708aae70e9commit-bot@chromium.org}
8241cd71fb013643b983b372fee24eab3708aae70e9commit-bot@chromium.org
8251cd71fb013643b983b372fee24eab3708aae70e9commit-bot@chromium.orgstatic int lpaint_isFakeBoldText(lua_State* L) {
8261cd71fb013643b983b372fee24eab3708aae70e9commit-bot@chromium.org    lua_pushboolean(L, get_obj<SkPaint>(L, 1)->isFakeBoldText());
8271cd71fb013643b983b372fee24eab3708aae70e9commit-bot@chromium.org    return 1;
8281cd71fb013643b983b372fee24eab3708aae70e9commit-bot@chromium.org}
8291cd71fb013643b983b372fee24eab3708aae70e9commit-bot@chromium.org
8301cd71fb013643b983b372fee24eab3708aae70e9commit-bot@chromium.orgstatic int lpaint_isLinearText(lua_State* L) {
8311cd71fb013643b983b372fee24eab3708aae70e9commit-bot@chromium.org    lua_pushboolean(L, get_obj<SkPaint>(L, 1)->isLinearText());
8321cd71fb013643b983b372fee24eab3708aae70e9commit-bot@chromium.org    return 1;
8331cd71fb013643b983b372fee24eab3708aae70e9commit-bot@chromium.org}
8341cd71fb013643b983b372fee24eab3708aae70e9commit-bot@chromium.org
8351cd71fb013643b983b372fee24eab3708aae70e9commit-bot@chromium.orgstatic int lpaint_isSubpixelText(lua_State* L) {
8361cd71fb013643b983b372fee24eab3708aae70e9commit-bot@chromium.org    lua_pushboolean(L, get_obj<SkPaint>(L, 1)->isSubpixelText());
8371cd71fb013643b983b372fee24eab3708aae70e9commit-bot@chromium.org    return 1;
8381cd71fb013643b983b372fee24eab3708aae70e9commit-bot@chromium.org}
8391cd71fb013643b983b372fee24eab3708aae70e9commit-bot@chromium.org
84009a1d6751c5c7c09d72ff8e195148509d2cb87cereedstatic int lpaint_setSubpixelText(lua_State* L) {
84109a1d6751c5c7c09d72ff8e195148509d2cb87cereed    get_obj<SkPaint>(L, 1)->setSubpixelText(lua2bool(L, 2));
84209a1d6751c5c7c09d72ff8e195148509d2cb87cereed    return 1;
84309a1d6751c5c7c09d72ff8e195148509d2cb87cereed}
84409a1d6751c5c7c09d72ff8e195148509d2cb87cereed
8451cd71fb013643b983b372fee24eab3708aae70e9commit-bot@chromium.orgstatic int lpaint_isDevKernText(lua_State* L) {
8461cd71fb013643b983b372fee24eab3708aae70e9commit-bot@chromium.org    lua_pushboolean(L, get_obj<SkPaint>(L, 1)->isDevKernText());
8471cd71fb013643b983b372fee24eab3708aae70e9commit-bot@chromium.org    return 1;
8481cd71fb013643b983b372fee24eab3708aae70e9commit-bot@chromium.org}
8491cd71fb013643b983b372fee24eab3708aae70e9commit-bot@chromium.org
8501cd71fb013643b983b372fee24eab3708aae70e9commit-bot@chromium.orgstatic int lpaint_isLCDRenderText(lua_State* L) {
8511cd71fb013643b983b372fee24eab3708aae70e9commit-bot@chromium.org    lua_pushboolean(L, get_obj<SkPaint>(L, 1)->isLCDRenderText());
8521cd71fb013643b983b372fee24eab3708aae70e9commit-bot@chromium.org    return 1;
8531cd71fb013643b983b372fee24eab3708aae70e9commit-bot@chromium.org}
8541cd71fb013643b983b372fee24eab3708aae70e9commit-bot@chromium.org
85536c9c11ed97d6c6f49bfdad53537a459b9e4b41dreedstatic int lpaint_setLCDRenderText(lua_State* L) {
85636c9c11ed97d6c6f49bfdad53537a459b9e4b41dreed    get_obj<SkPaint>(L, 1)->setLCDRenderText(lua2bool(L, 2));
85736c9c11ed97d6c6f49bfdad53537a459b9e4b41dreed    return 1;
85836c9c11ed97d6c6f49bfdad53537a459b9e4b41dreed}
85936c9c11ed97d6c6f49bfdad53537a459b9e4b41dreed
8601cd71fb013643b983b372fee24eab3708aae70e9commit-bot@chromium.orgstatic int lpaint_isEmbeddedBitmapText(lua_State* L) {
8611cd71fb013643b983b372fee24eab3708aae70e9commit-bot@chromium.org    lua_pushboolean(L, get_obj<SkPaint>(L, 1)->isEmbeddedBitmapText());
8621cd71fb013643b983b372fee24eab3708aae70e9commit-bot@chromium.org    return 1;
8631cd71fb013643b983b372fee24eab3708aae70e9commit-bot@chromium.org}
8641cd71fb013643b983b372fee24eab3708aae70e9commit-bot@chromium.org
8651cd71fb013643b983b372fee24eab3708aae70e9commit-bot@chromium.orgstatic int lpaint_isAutohinted(lua_State* L) {
8661cd71fb013643b983b372fee24eab3708aae70e9commit-bot@chromium.org    lua_pushboolean(L, get_obj<SkPaint>(L, 1)->isAutohinted());
8671cd71fb013643b983b372fee24eab3708aae70e9commit-bot@chromium.org    return 1;
8681cd71fb013643b983b372fee24eab3708aae70e9commit-bot@chromium.org}
8691cd71fb013643b983b372fee24eab3708aae70e9commit-bot@chromium.org
8701cd71fb013643b983b372fee24eab3708aae70e9commit-bot@chromium.orgstatic int lpaint_isVerticalText(lua_State* L) {
8711cd71fb013643b983b372fee24eab3708aae70e9commit-bot@chromium.org    lua_pushboolean(L, get_obj<SkPaint>(L, 1)->isVerticalText());
8721cd71fb013643b983b372fee24eab3708aae70e9commit-bot@chromium.org    return 1;
8731cd71fb013643b983b372fee24eab3708aae70e9commit-bot@chromium.org}
8741cd71fb013643b983b372fee24eab3708aae70e9commit-bot@chromium.org
875468b1815d29d9bbe513f2d8eb4afc0b066715b52reedstatic int lpaint_getAlpha(lua_State* L) {
876468b1815d29d9bbe513f2d8eb4afc0b066715b52reed    SkLua(L).pushScalar(byte2unit(get_obj<SkPaint>(L, 1)->getAlpha()));
877468b1815d29d9bbe513f2d8eb4afc0b066715b52reed    return 1;
878468b1815d29d9bbe513f2d8eb4afc0b066715b52reed}
879468b1815d29d9bbe513f2d8eb4afc0b066715b52reed
880468b1815d29d9bbe513f2d8eb4afc0b066715b52reedstatic int lpaint_setAlpha(lua_State* L) {
881468b1815d29d9bbe513f2d8eb4afc0b066715b52reed    get_obj<SkPaint>(L, 1)->setAlpha(unit2byte(lua2scalar(L, 2)));
882468b1815d29d9bbe513f2d8eb4afc0b066715b52reed    return 0;
883468b1815d29d9bbe513f2d8eb4afc0b066715b52reed}
884468b1815d29d9bbe513f2d8eb4afc0b066715b52reed
88574ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.comstatic int lpaint_getColor(lua_State* L) {
88674ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com    SkLua(L).pushColor(get_obj<SkPaint>(L, 1)->getColor());
88774ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com    return 1;
88874ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com}
88974ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com
89074ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.comstatic int lpaint_setColor(lua_State* L) {
89174ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com    get_obj<SkPaint>(L, 1)->setColor(lua2color(L, 2));
89274ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com    return 0;
89374ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com}
89474ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com
895e3823fd901674e22269637a669ac2b3e2667dc9creed@google.comstatic int lpaint_getTextSize(lua_State* L) {
896e3823fd901674e22269637a669ac2b3e2667dc9creed@google.com    SkLua(L).pushScalar(get_obj<SkPaint>(L, 1)->getTextSize());
897e3823fd901674e22269637a669ac2b3e2667dc9creed@google.com    return 1;
898e3823fd901674e22269637a669ac2b3e2667dc9creed@google.com}
899e3823fd901674e22269637a669ac2b3e2667dc9creed@google.com
9001cd71fb013643b983b372fee24eab3708aae70e9commit-bot@chromium.orgstatic int lpaint_getTextScaleX(lua_State* L) {
9011cd71fb013643b983b372fee24eab3708aae70e9commit-bot@chromium.org    SkLua(L).pushScalar(get_obj<SkPaint>(L, 1)->getTextScaleX());
9021cd71fb013643b983b372fee24eab3708aae70e9commit-bot@chromium.org    return 1;
9031cd71fb013643b983b372fee24eab3708aae70e9commit-bot@chromium.org}
9041cd71fb013643b983b372fee24eab3708aae70e9commit-bot@chromium.org
9051cd71fb013643b983b372fee24eab3708aae70e9commit-bot@chromium.orgstatic int lpaint_getTextSkewX(lua_State* L) {
9061cd71fb013643b983b372fee24eab3708aae70e9commit-bot@chromium.org    SkLua(L).pushScalar(get_obj<SkPaint>(L, 1)->getTextSkewX());
9071cd71fb013643b983b372fee24eab3708aae70e9commit-bot@chromium.org    return 1;
9081cd71fb013643b983b372fee24eab3708aae70e9commit-bot@chromium.org}
9091cd71fb013643b983b372fee24eab3708aae70e9commit-bot@chromium.org
910e3823fd901674e22269637a669ac2b3e2667dc9creed@google.comstatic int lpaint_setTextSize(lua_State* L) {
911e3823fd901674e22269637a669ac2b3e2667dc9creed@google.com    get_obj<SkPaint>(L, 1)->setTextSize(lua2scalar(L, 2));
912e3823fd901674e22269637a669ac2b3e2667dc9creed@google.com    return 0;
913e3823fd901674e22269637a669ac2b3e2667dc9creed@google.com}
914e3823fd901674e22269637a669ac2b3e2667dc9creed@google.com
915e6469f10c8f9340032797316fd06ee2f109255ffmike@reedtribe.orgstatic int lpaint_getTypeface(lua_State* L) {
916e6469f10c8f9340032797316fd06ee2f109255ffmike@reedtribe.org    push_ref(L, get_obj<SkPaint>(L, 1)->getTypeface());
917e6469f10c8f9340032797316fd06ee2f109255ffmike@reedtribe.org    return 1;
918e6469f10c8f9340032797316fd06ee2f109255ffmike@reedtribe.org}
919e6469f10c8f9340032797316fd06ee2f109255ffmike@reedtribe.org
920e6469f10c8f9340032797316fd06ee2f109255ffmike@reedtribe.orgstatic int lpaint_setTypeface(lua_State* L) {
921e6469f10c8f9340032797316fd06ee2f109255ffmike@reedtribe.org    get_obj<SkPaint>(L, 1)->setTypeface(get_ref<SkTypeface>(L, 2));
922e6469f10c8f9340032797316fd06ee2f109255ffmike@reedtribe.org    return 0;
923e6469f10c8f9340032797316fd06ee2f109255ffmike@reedtribe.org}
924e6469f10c8f9340032797316fd06ee2f109255ffmike@reedtribe.org
9251cd71fb013643b983b372fee24eab3708aae70e9commit-bot@chromium.orgstatic int lpaint_getHinting(lua_State* L) {
9261cd71fb013643b983b372fee24eab3708aae70e9commit-bot@chromium.org    SkLua(L).pushU32(get_obj<SkPaint>(L, 1)->getHinting());
9271cd71fb013643b983b372fee24eab3708aae70e9commit-bot@chromium.org    return 1;
9281cd71fb013643b983b372fee24eab3708aae70e9commit-bot@chromium.org}
9291cd71fb013643b983b372fee24eab3708aae70e9commit-bot@chromium.org
93093a1215fe0ab007ce941c721f1fd3e9dcb5d4754reedstatic int lpaint_getFilterQuality(lua_State* L) {
93193a1215fe0ab007ce941c721f1fd3e9dcb5d4754reed    SkLua(L).pushU32(get_obj<SkPaint>(L, 1)->getFilterQuality());
9327a72c6702da9e1f6fb536efe844db23f77535a19reed    return 1;
9337a72c6702da9e1f6fb536efe844db23f77535a19reed}
9347a72c6702da9e1f6fb536efe844db23f77535a19reed
93593a1215fe0ab007ce941c721f1fd3e9dcb5d4754reedstatic int lpaint_setFilterQuality(lua_State* L) {
9367a72c6702da9e1f6fb536efe844db23f77535a19reed    int level = lua2int_def(L, 2, -1);
9377a72c6702da9e1f6fb536efe844db23f77535a19reed    if (level >= 0 && level <= 3) {
93893a1215fe0ab007ce941c721f1fd3e9dcb5d4754reed        get_obj<SkPaint>(L, 1)->setFilterQuality((SkFilterQuality)level);
9397a72c6702da9e1f6fb536efe844db23f77535a19reed    }
9407a72c6702da9e1f6fb536efe844db23f77535a19reed    return 0;
9417a72c6702da9e1f6fb536efe844db23f77535a19reed}
9427a72c6702da9e1f6fb536efe844db23f77535a19reed
943e3823fd901674e22269637a669ac2b3e2667dc9creed@google.comstatic int lpaint_getFontID(lua_State* L) {
944e3823fd901674e22269637a669ac2b3e2667dc9creed@google.com    SkTypeface* face = get_obj<SkPaint>(L, 1)->getTypeface();
945e3823fd901674e22269637a669ac2b3e2667dc9creed@google.com    SkLua(L).pushU32(SkTypeface::UniqueID(face));
946e3823fd901674e22269637a669ac2b3e2667dc9creed@google.com    return 1;
947e3823fd901674e22269637a669ac2b3e2667dc9creed@google.com}
948e3823fd901674e22269637a669ac2b3e2667dc9creed@google.com
949fb858245216dafee4de731fce4f0fa58c746d3e9mike@reedtribe.orgstatic const struct {
950fb858245216dafee4de731fce4f0fa58c746d3e9mike@reedtribe.org    const char*     fLabel;
951fb858245216dafee4de731fce4f0fa58c746d3e9mike@reedtribe.org    SkPaint::Align  fAlign;
952fb858245216dafee4de731fce4f0fa58c746d3e9mike@reedtribe.org} gAlignRec[] = {
953fb858245216dafee4de731fce4f0fa58c746d3e9mike@reedtribe.org    { "left",   SkPaint::kLeft_Align },
954fb858245216dafee4de731fce4f0fa58c746d3e9mike@reedtribe.org    { "center", SkPaint::kCenter_Align },
955fb858245216dafee4de731fce4f0fa58c746d3e9mike@reedtribe.org    { "right",  SkPaint::kRight_Align },
956fb858245216dafee4de731fce4f0fa58c746d3e9mike@reedtribe.org};
957fb858245216dafee4de731fce4f0fa58c746d3e9mike@reedtribe.org
958fb858245216dafee4de731fce4f0fa58c746d3e9mike@reedtribe.orgstatic int lpaint_getTextAlign(lua_State* L) {
959fb858245216dafee4de731fce4f0fa58c746d3e9mike@reedtribe.org    SkPaint::Align align = get_obj<SkPaint>(L, 1)->getTextAlign();
960fb858245216dafee4de731fce4f0fa58c746d3e9mike@reedtribe.org    for (size_t i = 0; i < SK_ARRAY_COUNT(gAlignRec); ++i) {
961fb858245216dafee4de731fce4f0fa58c746d3e9mike@reedtribe.org        if (gAlignRec[i].fAlign == align) {
962fb858245216dafee4de731fce4f0fa58c746d3e9mike@reedtribe.org            lua_pushstring(L, gAlignRec[i].fLabel);
963fb858245216dafee4de731fce4f0fa58c746d3e9mike@reedtribe.org            return 1;
964fb858245216dafee4de731fce4f0fa58c746d3e9mike@reedtribe.org        }
965fb858245216dafee4de731fce4f0fa58c746d3e9mike@reedtribe.org    }
966fb858245216dafee4de731fce4f0fa58c746d3e9mike@reedtribe.org    return 0;
967fb858245216dafee4de731fce4f0fa58c746d3e9mike@reedtribe.org}
968fb858245216dafee4de731fce4f0fa58c746d3e9mike@reedtribe.org
969fb858245216dafee4de731fce4f0fa58c746d3e9mike@reedtribe.orgstatic int lpaint_setTextAlign(lua_State* L) {
970fb858245216dafee4de731fce4f0fa58c746d3e9mike@reedtribe.org    if (lua_isstring(L, 2)) {
971fb858245216dafee4de731fce4f0fa58c746d3e9mike@reedtribe.org        size_t len;
972fb858245216dafee4de731fce4f0fa58c746d3e9mike@reedtribe.org        const char* label = lua_tolstring(L, 2, &len);
973370c534c19f0faa0d60b3cac2e77886b53535c8fskia.committer@gmail.com
974fb858245216dafee4de731fce4f0fa58c746d3e9mike@reedtribe.org        for (size_t i = 0; i < SK_ARRAY_COUNT(gAlignRec); ++i) {
975fb858245216dafee4de731fce4f0fa58c746d3e9mike@reedtribe.org            if (!strcmp(gAlignRec[i].fLabel, label)) {
976fb858245216dafee4de731fce4f0fa58c746d3e9mike@reedtribe.org                get_obj<SkPaint>(L, 1)->setTextAlign(gAlignRec[i].fAlign);
977fb858245216dafee4de731fce4f0fa58c746d3e9mike@reedtribe.org                break;
978fb858245216dafee4de731fce4f0fa58c746d3e9mike@reedtribe.org            }
979fb858245216dafee4de731fce4f0fa58c746d3e9mike@reedtribe.org        }
980fb858245216dafee4de731fce4f0fa58c746d3e9mike@reedtribe.org    }
981fb858245216dafee4de731fce4f0fa58c746d3e9mike@reedtribe.org    return 0;
982fb858245216dafee4de731fce4f0fa58c746d3e9mike@reedtribe.org}
983fb858245216dafee4de731fce4f0fa58c746d3e9mike@reedtribe.org
98473d9f1c65114ba638637152605b0f03e871271damike@reedtribe.orgstatic int lpaint_getStroke(lua_State* L) {
98573d9f1c65114ba638637152605b0f03e871271damike@reedtribe.org    lua_pushboolean(L, SkPaint::kStroke_Style == get_obj<SkPaint>(L, 1)->getStyle());
98673d9f1c65114ba638637152605b0f03e871271damike@reedtribe.org    return 1;
98773d9f1c65114ba638637152605b0f03e871271damike@reedtribe.org}
98873d9f1c65114ba638637152605b0f03e871271damike@reedtribe.org
98973d9f1c65114ba638637152605b0f03e871271damike@reedtribe.orgstatic int lpaint_setStroke(lua_State* L) {
99073d9f1c65114ba638637152605b0f03e871271damike@reedtribe.org    SkPaint::Style style;
991370c534c19f0faa0d60b3cac2e77886b53535c8fskia.committer@gmail.com
99273d9f1c65114ba638637152605b0f03e871271damike@reedtribe.org    if (lua_toboolean(L, 2)) {
99373d9f1c65114ba638637152605b0f03e871271damike@reedtribe.org        style = SkPaint::kStroke_Style;
99473d9f1c65114ba638637152605b0f03e871271damike@reedtribe.org    } else {
99573d9f1c65114ba638637152605b0f03e871271damike@reedtribe.org        style = SkPaint::kFill_Style;
99673d9f1c65114ba638637152605b0f03e871271damike@reedtribe.org    }
99773d9f1c65114ba638637152605b0f03e871271damike@reedtribe.org    get_obj<SkPaint>(L, 1)->setStyle(style);
99873d9f1c65114ba638637152605b0f03e871271damike@reedtribe.org    return 0;
99973d9f1c65114ba638637152605b0f03e871271damike@reedtribe.org}
100073d9f1c65114ba638637152605b0f03e871271damike@reedtribe.org
10011cd71fb013643b983b372fee24eab3708aae70e9commit-bot@chromium.orgstatic int lpaint_getStrokeCap(lua_State* L) {
10021cd71fb013643b983b372fee24eab3708aae70e9commit-bot@chromium.org    SkLua(L).pushU32(get_obj<SkPaint>(L, 1)->getStrokeCap());
10031cd71fb013643b983b372fee24eab3708aae70e9commit-bot@chromium.org    return 1;
10041cd71fb013643b983b372fee24eab3708aae70e9commit-bot@chromium.org}
10051cd71fb013643b983b372fee24eab3708aae70e9commit-bot@chromium.org
10061cd71fb013643b983b372fee24eab3708aae70e9commit-bot@chromium.orgstatic int lpaint_getStrokeJoin(lua_State* L) {
10071cd71fb013643b983b372fee24eab3708aae70e9commit-bot@chromium.org    SkLua(L).pushU32(get_obj<SkPaint>(L, 1)->getStrokeJoin());
10081cd71fb013643b983b372fee24eab3708aae70e9commit-bot@chromium.org    return 1;
10091cd71fb013643b983b372fee24eab3708aae70e9commit-bot@chromium.org}
10101cd71fb013643b983b372fee24eab3708aae70e9commit-bot@chromium.org
10111cd71fb013643b983b372fee24eab3708aae70e9commit-bot@chromium.orgstatic int lpaint_getTextEncoding(lua_State* L) {
1012641bcc3c5caac1ed544cce95fa58ace904910dc4commit-bot@chromium.org    SkLua(L).pushU32(get_obj<SkPaint>(L, 1)->getTextEncoding());
10131cd71fb013643b983b372fee24eab3708aae70e9commit-bot@chromium.org    return 1;
10141cd71fb013643b983b372fee24eab3708aae70e9commit-bot@chromium.org}
10151cd71fb013643b983b372fee24eab3708aae70e9commit-bot@chromium.org
101673d9f1c65114ba638637152605b0f03e871271damike@reedtribe.orgstatic int lpaint_getStrokeWidth(lua_State* L) {
101773d9f1c65114ba638637152605b0f03e871271damike@reedtribe.org    SkLua(L).pushScalar(get_obj<SkPaint>(L, 1)->getStrokeWidth());
101873d9f1c65114ba638637152605b0f03e871271damike@reedtribe.org    return 1;
101973d9f1c65114ba638637152605b0f03e871271damike@reedtribe.org}
102073d9f1c65114ba638637152605b0f03e871271damike@reedtribe.org
102173d9f1c65114ba638637152605b0f03e871271damike@reedtribe.orgstatic int lpaint_setStrokeWidth(lua_State* L) {
102273d9f1c65114ba638637152605b0f03e871271damike@reedtribe.org    get_obj<SkPaint>(L, 1)->setStrokeWidth(lua2scalar(L, 2));
102373d9f1c65114ba638637152605b0f03e871271damike@reedtribe.org    return 0;
102473d9f1c65114ba638637152605b0f03e871271damike@reedtribe.org}
102573d9f1c65114ba638637152605b0f03e871271damike@reedtribe.org
10261cd71fb013643b983b372fee24eab3708aae70e9commit-bot@chromium.orgstatic int lpaint_getStrokeMiter(lua_State* L) {
10271cd71fb013643b983b372fee24eab3708aae70e9commit-bot@chromium.org    SkLua(L).pushScalar(get_obj<SkPaint>(L, 1)->getStrokeMiter());
10281cd71fb013643b983b372fee24eab3708aae70e9commit-bot@chromium.org    return 1;
10291cd71fb013643b983b372fee24eab3708aae70e9commit-bot@chromium.org}
10301cd71fb013643b983b372fee24eab3708aae70e9commit-bot@chromium.org
103173d9f1c65114ba638637152605b0f03e871271damike@reedtribe.orgstatic int lpaint_measureText(lua_State* L) {
103273d9f1c65114ba638637152605b0f03e871271damike@reedtribe.org    if (lua_isstring(L, 2)) {
103373d9f1c65114ba638637152605b0f03e871271damike@reedtribe.org        size_t len;
103473d9f1c65114ba638637152605b0f03e871271damike@reedtribe.org        const char* text = lua_tolstring(L, 2, &len);
103573d9f1c65114ba638637152605b0f03e871271damike@reedtribe.org        SkLua(L).pushScalar(get_obj<SkPaint>(L, 1)->measureText(text, len));
103673d9f1c65114ba638637152605b0f03e871271damike@reedtribe.org        return 1;
103773d9f1c65114ba638637152605b0f03e871271damike@reedtribe.org    }
103873d9f1c65114ba638637152605b0f03e871271damike@reedtribe.org    return 0;
103973d9f1c65114ba638637152605b0f03e871271damike@reedtribe.org}
104073d9f1c65114ba638637152605b0f03e871271damike@reedtribe.org
104173d9f1c65114ba638637152605b0f03e871271damike@reedtribe.orgstruct FontMetrics {
104273d9f1c65114ba638637152605b0f03e871271damike@reedtribe.org    SkScalar    fTop;       //!< The greatest distance above the baseline for any glyph (will be <= 0)
104373d9f1c65114ba638637152605b0f03e871271damike@reedtribe.org    SkScalar    fAscent;    //!< The recommended distance above the baseline (will be <= 0)
104473d9f1c65114ba638637152605b0f03e871271damike@reedtribe.org    SkScalar    fDescent;   //!< The recommended distance below the baseline (will be >= 0)
104573d9f1c65114ba638637152605b0f03e871271damike@reedtribe.org    SkScalar    fBottom;    //!< The greatest distance below the baseline for any glyph (will be >= 0)
104673d9f1c65114ba638637152605b0f03e871271damike@reedtribe.org    SkScalar    fLeading;   //!< The recommended distance to add between lines of text (will be >= 0)
104773d9f1c65114ba638637152605b0f03e871271damike@reedtribe.org    SkScalar    fAvgCharWidth;  //!< the average charactor width (>= 0)
104873d9f1c65114ba638637152605b0f03e871271damike@reedtribe.org    SkScalar    fXMin;      //!< The minimum bounding box x value for all glyphs
104973d9f1c65114ba638637152605b0f03e871271damike@reedtribe.org    SkScalar    fXMax;      //!< The maximum bounding box x value for all glyphs
105073d9f1c65114ba638637152605b0f03e871271damike@reedtribe.org    SkScalar    fXHeight;   //!< the height of an 'x' in px, or 0 if no 'x' in face
105173d9f1c65114ba638637152605b0f03e871271damike@reedtribe.org};
105273d9f1c65114ba638637152605b0f03e871271damike@reedtribe.org
105373d9f1c65114ba638637152605b0f03e871271damike@reedtribe.orgstatic int lpaint_getFontMetrics(lua_State* L) {
105473d9f1c65114ba638637152605b0f03e871271damike@reedtribe.org    SkPaint::FontMetrics fm;
105573d9f1c65114ba638637152605b0f03e871271damike@reedtribe.org    SkScalar height = get_obj<SkPaint>(L, 1)->getFontMetrics(&fm);
1056370c534c19f0faa0d60b3cac2e77886b53535c8fskia.committer@gmail.com
105773d9f1c65114ba638637152605b0f03e871271damike@reedtribe.org    lua_newtable(L);
105873d9f1c65114ba638637152605b0f03e871271damike@reedtribe.org    setfield_scalar(L, "top", fm.fTop);
105973d9f1c65114ba638637152605b0f03e871271damike@reedtribe.org    setfield_scalar(L, "ascent", fm.fAscent);
106073d9f1c65114ba638637152605b0f03e871271damike@reedtribe.org    setfield_scalar(L, "descent", fm.fDescent);
106173d9f1c65114ba638637152605b0f03e871271damike@reedtribe.org    setfield_scalar(L, "bottom", fm.fBottom);
106273d9f1c65114ba638637152605b0f03e871271damike@reedtribe.org    setfield_scalar(L, "leading", fm.fLeading);
106373d9f1c65114ba638637152605b0f03e871271damike@reedtribe.org    SkLua(L).pushScalar(height);
106473d9f1c65114ba638637152605b0f03e871271damike@reedtribe.org    return 2;
106573d9f1c65114ba638637152605b0f03e871271damike@reedtribe.org}
106673d9f1c65114ba638637152605b0f03e871271damike@reedtribe.org
106729563879168ed58a8295520fbb4381d0ceff9f2freed@google.comstatic int lpaint_getEffects(lua_State* L) {
106829563879168ed58a8295520fbb4381d0ceff9f2freed@google.com    const SkPaint* paint = get_obj<SkPaint>(L, 1);
1069de2e4e8a6422c7d8b5847f038f5c6360b187f7a2skia.committer@gmail.com
107029563879168ed58a8295520fbb4381d0ceff9f2freed@google.com    lua_newtable(L);
1071468b1815d29d9bbe513f2d8eb4afc0b066715b52reed    setfield_bool_if(L, "looper",      !!paint->getLooper());
1072468b1815d29d9bbe513f2d8eb4afc0b066715b52reed    setfield_bool_if(L, "pathEffect",  !!paint->getPathEffect());
1073468b1815d29d9bbe513f2d8eb4afc0b066715b52reed    setfield_bool_if(L, "rasterizer",  !!paint->getRasterizer());
1074468b1815d29d9bbe513f2d8eb4afc0b066715b52reed    setfield_bool_if(L, "maskFilter",  !!paint->getMaskFilter());
1075468b1815d29d9bbe513f2d8eb4afc0b066715b52reed    setfield_bool_if(L, "shader",      !!paint->getShader());
107629563879168ed58a8295520fbb4381d0ceff9f2freed@google.com    setfield_bool_if(L, "colorFilter", !!paint->getColorFilter());
107729563879168ed58a8295520fbb4381d0ceff9f2freed@google.com    setfield_bool_if(L, "imageFilter", !!paint->getImageFilter());
1078468b1815d29d9bbe513f2d8eb4afc0b066715b52reed    setfield_bool_if(L, "xfermode",    !!paint->getXfermode());
107929563879168ed58a8295520fbb4381d0ceff9f2freed@google.com    return 1;
108029563879168ed58a8295520fbb4381d0ceff9f2freed@google.com}
108129563879168ed58a8295520fbb4381d0ceff9f2freed@google.com
1082468b1815d29d9bbe513f2d8eb4afc0b066715b52reedstatic int lpaint_getImageFilter(lua_State* L) {
1083468b1815d29d9bbe513f2d8eb4afc0b066715b52reed    const SkPaint* paint = get_obj<SkPaint>(L, 1);
1084468b1815d29d9bbe513f2d8eb4afc0b066715b52reed    SkImageFilter* imf = paint->getImageFilter();
1085468b1815d29d9bbe513f2d8eb4afc0b066715b52reed    if (imf) {
1086468b1815d29d9bbe513f2d8eb4afc0b066715b52reed        push_ref(L, imf);
1087468b1815d29d9bbe513f2d8eb4afc0b066715b52reed        return 1;
1088468b1815d29d9bbe513f2d8eb4afc0b066715b52reed    }
1089468b1815d29d9bbe513f2d8eb4afc0b066715b52reed    return 0;
1090468b1815d29d9bbe513f2d8eb4afc0b066715b52reed}
1091468b1815d29d9bbe513f2d8eb4afc0b066715b52reed
1092468b1815d29d9bbe513f2d8eb4afc0b066715b52reedstatic int lpaint_setImageFilter(lua_State* L) {
1093468b1815d29d9bbe513f2d8eb4afc0b066715b52reed    SkPaint* paint = get_obj<SkPaint>(L, 1);
1094468b1815d29d9bbe513f2d8eb4afc0b066715b52reed    paint->setImageFilter(get_ref<SkImageFilter>(L, 2));
1095468b1815d29d9bbe513f2d8eb4afc0b066715b52reed    return 0;
1096468b1815d29d9bbe513f2d8eb4afc0b066715b52reed}
1097468b1815d29d9bbe513f2d8eb4afc0b066715b52reed
10985fdc983f58098e5c9fbdbedc7719f87e5efa4d31reed@google.comstatic int lpaint_getShader(lua_State* L) {
10995fdc983f58098e5c9fbdbedc7719f87e5efa4d31reed@google.com    const SkPaint* paint = get_obj<SkPaint>(L, 1);
11005fdc983f58098e5c9fbdbedc7719f87e5efa4d31reed@google.com    SkShader* shader = paint->getShader();
11015fdc983f58098e5c9fbdbedc7719f87e5efa4d31reed@google.com    if (shader) {
11025fdc983f58098e5c9fbdbedc7719f87e5efa4d31reed@google.com        push_ref(L, shader);
11035fdc983f58098e5c9fbdbedc7719f87e5efa4d31reed@google.com        return 1;
11045fdc983f58098e5c9fbdbedc7719f87e5efa4d31reed@google.com    }
11055fdc983f58098e5c9fbdbedc7719f87e5efa4d31reed@google.com    return 0;
11065fdc983f58098e5c9fbdbedc7719f87e5efa4d31reed@google.com}
11075fdc983f58098e5c9fbdbedc7719f87e5efa4d31reed@google.com
11089fbc3f31c0c7095f4f25ad3d2d17731bb63c0817reedstatic int lpaint_setShader(lua_State* L) {
11099fbc3f31c0c7095f4f25ad3d2d17731bb63c0817reed    SkPaint* paint = get_obj<SkPaint>(L, 1);
11109fbc3f31c0c7095f4f25ad3d2d17731bb63c0817reed    paint->setShader(get_ref<SkShader>(L, 2));
11119fbc3f31c0c7095f4f25ad3d2d17731bb63c0817reed    return 0;
11129fbc3f31c0c7095f4f25ad3d2d17731bb63c0817reed}
11139fbc3f31c0c7095f4f25ad3d2d17731bb63c0817reed
11141301bf3abfe355f9aadd53d5dbf04926013231bacommit-bot@chromium.orgstatic int lpaint_getPathEffect(lua_State* L) {
11151301bf3abfe355f9aadd53d5dbf04926013231bacommit-bot@chromium.org    const SkPaint* paint = get_obj<SkPaint>(L, 1);
11161301bf3abfe355f9aadd53d5dbf04926013231bacommit-bot@chromium.org    SkPathEffect* pe = paint->getPathEffect();
11171301bf3abfe355f9aadd53d5dbf04926013231bacommit-bot@chromium.org    if (pe) {
11181301bf3abfe355f9aadd53d5dbf04926013231bacommit-bot@chromium.org        push_ref(L, pe);
11191301bf3abfe355f9aadd53d5dbf04926013231bacommit-bot@chromium.org        return 1;
11201301bf3abfe355f9aadd53d5dbf04926013231bacommit-bot@chromium.org    }
11211301bf3abfe355f9aadd53d5dbf04926013231bacommit-bot@chromium.org    return 0;
11221301bf3abfe355f9aadd53d5dbf04926013231bacommit-bot@chromium.org}
11231301bf3abfe355f9aadd53d5dbf04926013231bacommit-bot@chromium.org
112474ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.comstatic int lpaint_gc(lua_State* L) {
112574ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com    get_obj<SkPaint>(L, 1)->~SkPaint();
112674ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com    return 0;
112774ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com}
112874ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com
112974ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.comstatic const struct luaL_Reg gSkPaint_Methods[] = {
113074ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com    { "isAntiAlias", lpaint_isAntiAlias },
113174ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com    { "setAntiAlias", lpaint_setAntiAlias },
11321cd71fb013643b983b372fee24eab3708aae70e9commit-bot@chromium.org    { "isDither", lpaint_isDither },
1133bb8a0ababab1aa2693a2a97733524ee367da1791reed    { "setDither", lpaint_setDither },
113493a1215fe0ab007ce941c721f1fd3e9dcb5d4754reed    { "getFilterQuality", lpaint_getFilterQuality },
113593a1215fe0ab007ce941c721f1fd3e9dcb5d4754reed    { "setFilterQuality", lpaint_setFilterQuality },
11361cd71fb013643b983b372fee24eab3708aae70e9commit-bot@chromium.org    { "isUnderlineText", lpaint_isUnderlineText },
11371cd71fb013643b983b372fee24eab3708aae70e9commit-bot@chromium.org    { "isStrikeThruText", lpaint_isStrikeThruText },
11381cd71fb013643b983b372fee24eab3708aae70e9commit-bot@chromium.org    { "isFakeBoldText", lpaint_isFakeBoldText },
11391cd71fb013643b983b372fee24eab3708aae70e9commit-bot@chromium.org    { "isLinearText", lpaint_isLinearText },
11401cd71fb013643b983b372fee24eab3708aae70e9commit-bot@chromium.org    { "isSubpixelText", lpaint_isSubpixelText },
114109a1d6751c5c7c09d72ff8e195148509d2cb87cereed    { "setSubpixelText", lpaint_setSubpixelText },
11421cd71fb013643b983b372fee24eab3708aae70e9commit-bot@chromium.org    { "isDevKernText", lpaint_isDevKernText },
11431cd71fb013643b983b372fee24eab3708aae70e9commit-bot@chromium.org    { "isLCDRenderText", lpaint_isLCDRenderText },
114436c9c11ed97d6c6f49bfdad53537a459b9e4b41dreed    { "setLCDRenderText", lpaint_setLCDRenderText },
11451cd71fb013643b983b372fee24eab3708aae70e9commit-bot@chromium.org    { "isEmbeddedBitmapText", lpaint_isEmbeddedBitmapText },
11461cd71fb013643b983b372fee24eab3708aae70e9commit-bot@chromium.org    { "isAutohinted", lpaint_isAutohinted },
11471cd71fb013643b983b372fee24eab3708aae70e9commit-bot@chromium.org    { "isVerticalText", lpaint_isVerticalText },
1148468b1815d29d9bbe513f2d8eb4afc0b066715b52reed    { "getAlpha", lpaint_getAlpha },
1149468b1815d29d9bbe513f2d8eb4afc0b066715b52reed    { "setAlpha", lpaint_setAlpha },
115074ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com    { "getColor", lpaint_getColor },
115174ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com    { "setColor", lpaint_setColor },
1152e3823fd901674e22269637a669ac2b3e2667dc9creed@google.com    { "getTextSize", lpaint_getTextSize },
1153e3823fd901674e22269637a669ac2b3e2667dc9creed@google.com    { "setTextSize", lpaint_setTextSize },
11541cd71fb013643b983b372fee24eab3708aae70e9commit-bot@chromium.org    { "getTextScaleX", lpaint_getTextScaleX },
11551cd71fb013643b983b372fee24eab3708aae70e9commit-bot@chromium.org    { "getTextSkewX", lpaint_getTextSkewX },
1156e6469f10c8f9340032797316fd06ee2f109255ffmike@reedtribe.org    { "getTypeface", lpaint_getTypeface },
1157e6469f10c8f9340032797316fd06ee2f109255ffmike@reedtribe.org    { "setTypeface", lpaint_setTypeface },
11581cd71fb013643b983b372fee24eab3708aae70e9commit-bot@chromium.org    { "getHinting", lpaint_getHinting },
1159e3823fd901674e22269637a669ac2b3e2667dc9creed@google.com    { "getFontID", lpaint_getFontID },
1160fb858245216dafee4de731fce4f0fa58c746d3e9mike@reedtribe.org    { "getTextAlign", lpaint_getTextAlign },
1161fb858245216dafee4de731fce4f0fa58c746d3e9mike@reedtribe.org    { "setTextAlign", lpaint_setTextAlign },
116273d9f1c65114ba638637152605b0f03e871271damike@reedtribe.org    { "getStroke", lpaint_getStroke },
116373d9f1c65114ba638637152605b0f03e871271damike@reedtribe.org    { "setStroke", lpaint_setStroke },
11641cd71fb013643b983b372fee24eab3708aae70e9commit-bot@chromium.org    { "getStrokeCap", lpaint_getStrokeCap },
11651cd71fb013643b983b372fee24eab3708aae70e9commit-bot@chromium.org    { "getStrokeJoin", lpaint_getStrokeJoin },
11661cd71fb013643b983b372fee24eab3708aae70e9commit-bot@chromium.org    { "getTextEncoding", lpaint_getTextEncoding },
116773d9f1c65114ba638637152605b0f03e871271damike@reedtribe.org    { "getStrokeWidth", lpaint_getStrokeWidth },
116873d9f1c65114ba638637152605b0f03e871271damike@reedtribe.org    { "setStrokeWidth", lpaint_setStrokeWidth },
11691cd71fb013643b983b372fee24eab3708aae70e9commit-bot@chromium.org    { "getStrokeMiter", lpaint_getStrokeMiter },
117073d9f1c65114ba638637152605b0f03e871271damike@reedtribe.org    { "measureText", lpaint_measureText },
117173d9f1c65114ba638637152605b0f03e871271damike@reedtribe.org    { "getFontMetrics", lpaint_getFontMetrics },
117229563879168ed58a8295520fbb4381d0ceff9f2freed@google.com    { "getEffects", lpaint_getEffects },
1173468b1815d29d9bbe513f2d8eb4afc0b066715b52reed    { "getImageFilter", lpaint_getImageFilter },
1174468b1815d29d9bbe513f2d8eb4afc0b066715b52reed    { "setImageFilter", lpaint_setImageFilter },
11755fdc983f58098e5c9fbdbedc7719f87e5efa4d31reed@google.com    { "getShader", lpaint_getShader },
11769fbc3f31c0c7095f4f25ad3d2d17731bb63c0817reed    { "setShader", lpaint_setShader },
11771301bf3abfe355f9aadd53d5dbf04926013231bacommit-bot@chromium.org    { "getPathEffect", lpaint_getPathEffect },
117874ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com    { "__gc", lpaint_gc },
117974ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com    { NULL, NULL }
118074ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com};
118174ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com
118274ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com///////////////////////////////////////////////////////////////////////////////
118374ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com
11845fdc983f58098e5c9fbdbedc7719f87e5efa4d31reed@google.comstatic const char* mode2string(SkShader::TileMode mode) {
11855fdc983f58098e5c9fbdbedc7719f87e5efa4d31reed@google.com    static const char* gNames[] = { "clamp", "repeat", "mirror" };
11865fdc983f58098e5c9fbdbedc7719f87e5efa4d31reed@google.com    SkASSERT((unsigned)mode < SK_ARRAY_COUNT(gNames));
11875fdc983f58098e5c9fbdbedc7719f87e5efa4d31reed@google.com    return gNames[mode];
11885fdc983f58098e5c9fbdbedc7719f87e5efa4d31reed@google.com}
11895fdc983f58098e5c9fbdbedc7719f87e5efa4d31reed@google.com
11905fdc983f58098e5c9fbdbedc7719f87e5efa4d31reed@google.comstatic const char* gradtype2string(SkShader::GradientType t) {
11915fdc983f58098e5c9fbdbedc7719f87e5efa4d31reed@google.com    static const char* gNames[] = {
11925fdc983f58098e5c9fbdbedc7719f87e5efa4d31reed@google.com        "none", "color", "linear", "radial", "radial2", "sweep", "conical"
11935fdc983f58098e5c9fbdbedc7719f87e5efa4d31reed@google.com    };
11945fdc983f58098e5c9fbdbedc7719f87e5efa4d31reed@google.com    SkASSERT((unsigned)t < SK_ARRAY_COUNT(gNames));
11955fdc983f58098e5c9fbdbedc7719f87e5efa4d31reed@google.com    return gNames[t];
11965fdc983f58098e5c9fbdbedc7719f87e5efa4d31reed@google.com}
11975fdc983f58098e5c9fbdbedc7719f87e5efa4d31reed@google.com
11985fdc983f58098e5c9fbdbedc7719f87e5efa4d31reed@google.comstatic int lshader_isOpaque(lua_State* L) {
11995fdc983f58098e5c9fbdbedc7719f87e5efa4d31reed@google.com    SkShader* shader = get_ref<SkShader>(L, 1);
12005fdc983f58098e5c9fbdbedc7719f87e5efa4d31reed@google.com    return shader && shader->isOpaque();
12015fdc983f58098e5c9fbdbedc7719f87e5efa4d31reed@google.com}
12025fdc983f58098e5c9fbdbedc7719f87e5efa4d31reed@google.com
12035fdc983f58098e5c9fbdbedc7719f87e5efa4d31reed@google.comstatic int lshader_asABitmap(lua_State* L) {
12045fdc983f58098e5c9fbdbedc7719f87e5efa4d31reed@google.com    SkShader* shader = get_ref<SkShader>(L, 1);
12055fdc983f58098e5c9fbdbedc7719f87e5efa4d31reed@google.com    if (shader) {
12065fdc983f58098e5c9fbdbedc7719f87e5efa4d31reed@google.com        SkBitmap bm;
12075fdc983f58098e5c9fbdbedc7719f87e5efa4d31reed@google.com        SkMatrix matrix;
12085fdc983f58098e5c9fbdbedc7719f87e5efa4d31reed@google.com        SkShader::TileMode modes[2];
12095fdc983f58098e5c9fbdbedc7719f87e5efa4d31reed@google.com        switch (shader->asABitmap(&bm, &matrix, modes)) {
12105fdc983f58098e5c9fbdbedc7719f87e5efa4d31reed@google.com            case SkShader::kDefault_BitmapType:
12115fdc983f58098e5c9fbdbedc7719f87e5efa4d31reed@google.com                lua_newtable(L);
12125fdc983f58098e5c9fbdbedc7719f87e5efa4d31reed@google.com                setfield_number(L, "genID", bm.pixelRef() ? bm.pixelRef()->getGenerationID() : 0);
12135fdc983f58098e5c9fbdbedc7719f87e5efa4d31reed@google.com                setfield_number(L, "width", bm.width());
12145fdc983f58098e5c9fbdbedc7719f87e5efa4d31reed@google.com                setfield_number(L, "height", bm.height());
12155fdc983f58098e5c9fbdbedc7719f87e5efa4d31reed@google.com                setfield_string(L, "tileX", mode2string(modes[0]));
12165fdc983f58098e5c9fbdbedc7719f87e5efa4d31reed@google.com                setfield_string(L, "tileY", mode2string(modes[1]));
12175fdc983f58098e5c9fbdbedc7719f87e5efa4d31reed@google.com                return 1;
12185fdc983f58098e5c9fbdbedc7719f87e5efa4d31reed@google.com            default:
12195fdc983f58098e5c9fbdbedc7719f87e5efa4d31reed@google.com                break;
12205fdc983f58098e5c9fbdbedc7719f87e5efa4d31reed@google.com        }
12215fdc983f58098e5c9fbdbedc7719f87e5efa4d31reed@google.com    }
12225fdc983f58098e5c9fbdbedc7719f87e5efa4d31reed@google.com    return 0;
12235fdc983f58098e5c9fbdbedc7719f87e5efa4d31reed@google.com}
12245fdc983f58098e5c9fbdbedc7719f87e5efa4d31reed@google.com
12255fdc983f58098e5c9fbdbedc7719f87e5efa4d31reed@google.comstatic int lshader_asAGradient(lua_State* L) {
12265fdc983f58098e5c9fbdbedc7719f87e5efa4d31reed@google.com    SkShader* shader = get_ref<SkShader>(L, 1);
12275fdc983f58098e5c9fbdbedc7719f87e5efa4d31reed@google.com    if (shader) {
12285fdc983f58098e5c9fbdbedc7719f87e5efa4d31reed@google.com        SkShader::GradientInfo info;
12295fdc983f58098e5c9fbdbedc7719f87e5efa4d31reed@google.com        sk_bzero(&info, sizeof(info));
123074f96b9c4caeff8e805d8a37c63a5e5a103e59abcommit-bot@chromium.org
123174f96b9c4caeff8e805d8a37c63a5e5a103e59abcommit-bot@chromium.org        SkColor colors[3];  // hacked in for extracting info on 3 color case.
1232bd74add1dcb47cfaa8c8d176c2cc70e1e31c8b50skia.committer@gmail.com        SkScalar pos[3];
123374f96b9c4caeff8e805d8a37c63a5e5a103e59abcommit-bot@chromium.org
123474f96b9c4caeff8e805d8a37c63a5e5a103e59abcommit-bot@chromium.org        info.fColorCount = 3;
123574f96b9c4caeff8e805d8a37c63a5e5a103e59abcommit-bot@chromium.org        info.fColors = &colors[0];
123674f96b9c4caeff8e805d8a37c63a5e5a103e59abcommit-bot@chromium.org        info.fColorOffsets = &pos[0];
1237bd74add1dcb47cfaa8c8d176c2cc70e1e31c8b50skia.committer@gmail.com
12385fdc983f58098e5c9fbdbedc7719f87e5efa4d31reed@google.com        SkShader::GradientType t = shader->asAGradient(&info);
123974f96b9c4caeff8e805d8a37c63a5e5a103e59abcommit-bot@chromium.org
12405fdc983f58098e5c9fbdbedc7719f87e5efa4d31reed@google.com        if (SkShader::kNone_GradientType != t) {
12415fdc983f58098e5c9fbdbedc7719f87e5efa4d31reed@google.com            lua_newtable(L);
12425fdc983f58098e5c9fbdbedc7719f87e5efa4d31reed@google.com            setfield_string(L, "type", gradtype2string(t));
12435fdc983f58098e5c9fbdbedc7719f87e5efa4d31reed@google.com            setfield_number(L, "colorCount", info.fColorCount);
12445fdc983f58098e5c9fbdbedc7719f87e5efa4d31reed@google.com            setfield_string(L, "tile", mode2string(info.fTileMode));
124574f96b9c4caeff8e805d8a37c63a5e5a103e59abcommit-bot@chromium.org
124674f96b9c4caeff8e805d8a37c63a5e5a103e59abcommit-bot@chromium.org            if (info.fColorCount == 3){
124774f96b9c4caeff8e805d8a37c63a5e5a103e59abcommit-bot@chromium.org                setfield_number(L, "midPos", pos[1]);
124874f96b9c4caeff8e805d8a37c63a5e5a103e59abcommit-bot@chromium.org            }
1249bd74add1dcb47cfaa8c8d176c2cc70e1e31c8b50skia.committer@gmail.com
12505fdc983f58098e5c9fbdbedc7719f87e5efa4d31reed@google.com            return 1;
12515fdc983f58098e5c9fbdbedc7719f87e5efa4d31reed@google.com        }
12525fdc983f58098e5c9fbdbedc7719f87e5efa4d31reed@google.com    }
12535fdc983f58098e5c9fbdbedc7719f87e5efa4d31reed@google.com    return 0;
12545fdc983f58098e5c9fbdbedc7719f87e5efa4d31reed@google.com}
12555fdc983f58098e5c9fbdbedc7719f87e5efa4d31reed@google.com
12565fdc983f58098e5c9fbdbedc7719f87e5efa4d31reed@google.comstatic int lshader_gc(lua_State* L) {
12575fdc983f58098e5c9fbdbedc7719f87e5efa4d31reed@google.com    get_ref<SkShader>(L, 1)->unref();
12585fdc983f58098e5c9fbdbedc7719f87e5efa4d31reed@google.com    return 0;
12595fdc983f58098e5c9fbdbedc7719f87e5efa4d31reed@google.com}
12605fdc983f58098e5c9fbdbedc7719f87e5efa4d31reed@google.com
12615fdc983f58098e5c9fbdbedc7719f87e5efa4d31reed@google.comstatic const struct luaL_Reg gSkShader_Methods[] = {
12625fdc983f58098e5c9fbdbedc7719f87e5efa4d31reed@google.com    { "isOpaque",       lshader_isOpaque },
12635fdc983f58098e5c9fbdbedc7719f87e5efa4d31reed@google.com    { "asABitmap",      lshader_asABitmap },
12645fdc983f58098e5c9fbdbedc7719f87e5efa4d31reed@google.com    { "asAGradient",    lshader_asAGradient },
12655fdc983f58098e5c9fbdbedc7719f87e5efa4d31reed@google.com    { "__gc",           lshader_gc },
12665fdc983f58098e5c9fbdbedc7719f87e5efa4d31reed@google.com    { NULL, NULL }
12675fdc983f58098e5c9fbdbedc7719f87e5efa4d31reed@google.com};
12685fdc983f58098e5c9fbdbedc7719f87e5efa4d31reed@google.com
12695fdc983f58098e5c9fbdbedc7719f87e5efa4d31reed@google.com///////////////////////////////////////////////////////////////////////////////
12705fdc983f58098e5c9fbdbedc7719f87e5efa4d31reed@google.com
12714d803a976c25ed582b02f8c42cd91c82e9d1ea84commit-bot@chromium.orgstatic int lpatheffect_asADash(lua_State* L) {
12724d803a976c25ed582b02f8c42cd91c82e9d1ea84commit-bot@chromium.org    SkPathEffect* pe = get_ref<SkPathEffect>(L, 1);
12734d803a976c25ed582b02f8c42cd91c82e9d1ea84commit-bot@chromium.org    if (pe) {
12744d803a976c25ed582b02f8c42cd91c82e9d1ea84commit-bot@chromium.org        SkPathEffect::DashInfo info;
12754d803a976c25ed582b02f8c42cd91c82e9d1ea84commit-bot@chromium.org        SkPathEffect::DashType dashType = pe->asADash(&info);
12764d803a976c25ed582b02f8c42cd91c82e9d1ea84commit-bot@chromium.org        if (SkPathEffect::kDash_DashType == dashType) {
12774d803a976c25ed582b02f8c42cd91c82e9d1ea84commit-bot@chromium.org            SkAutoTArray<SkScalar> intervals(info.fCount);
12784d803a976c25ed582b02f8c42cd91c82e9d1ea84commit-bot@chromium.org            info.fIntervals = intervals.get();
12794d803a976c25ed582b02f8c42cd91c82e9d1ea84commit-bot@chromium.org            pe->asADash(&info);
12804d803a976c25ed582b02f8c42cd91c82e9d1ea84commit-bot@chromium.org            SkLua(L).pushDash(info);
12814d803a976c25ed582b02f8c42cd91c82e9d1ea84commit-bot@chromium.org            return 1;
12824d803a976c25ed582b02f8c42cd91c82e9d1ea84commit-bot@chromium.org        }
12834d803a976c25ed582b02f8c42cd91c82e9d1ea84commit-bot@chromium.org    }
12844d803a976c25ed582b02f8c42cd91c82e9d1ea84commit-bot@chromium.org    return 0;
12854d803a976c25ed582b02f8c42cd91c82e9d1ea84commit-bot@chromium.org}
12864d803a976c25ed582b02f8c42cd91c82e9d1ea84commit-bot@chromium.org
12871301bf3abfe355f9aadd53d5dbf04926013231bacommit-bot@chromium.orgstatic int lpatheffect_gc(lua_State* L) {
12881301bf3abfe355f9aadd53d5dbf04926013231bacommit-bot@chromium.org    get_ref<SkPathEffect>(L, 1)->unref();
12891301bf3abfe355f9aadd53d5dbf04926013231bacommit-bot@chromium.org    return 0;
12901301bf3abfe355f9aadd53d5dbf04926013231bacommit-bot@chromium.org}
12911301bf3abfe355f9aadd53d5dbf04926013231bacommit-bot@chromium.org
12921301bf3abfe355f9aadd53d5dbf04926013231bacommit-bot@chromium.orgstatic const struct luaL_Reg gSkPathEffect_Methods[] = {
12934d803a976c25ed582b02f8c42cd91c82e9d1ea84commit-bot@chromium.org    { "asADash",        lpatheffect_asADash },
12941301bf3abfe355f9aadd53d5dbf04926013231bacommit-bot@chromium.org    { "__gc",           lpatheffect_gc },
12951301bf3abfe355f9aadd53d5dbf04926013231bacommit-bot@chromium.org    { NULL, NULL }
12961301bf3abfe355f9aadd53d5dbf04926013231bacommit-bot@chromium.org};
12971301bf3abfe355f9aadd53d5dbf04926013231bacommit-bot@chromium.org
12981301bf3abfe355f9aadd53d5dbf04926013231bacommit-bot@chromium.org///////////////////////////////////////////////////////////////////////////////
12991301bf3abfe355f9aadd53d5dbf04926013231bacommit-bot@chromium.org
1300468b1815d29d9bbe513f2d8eb4afc0b066715b52reedstatic int lpimagefilter_gc(lua_State* L) {
1301468b1815d29d9bbe513f2d8eb4afc0b066715b52reed    get_ref<SkImageFilter>(L, 1)->unref();
1302468b1815d29d9bbe513f2d8eb4afc0b066715b52reed    return 0;
1303468b1815d29d9bbe513f2d8eb4afc0b066715b52reed}
1304468b1815d29d9bbe513f2d8eb4afc0b066715b52reed
1305468b1815d29d9bbe513f2d8eb4afc0b066715b52reedstatic const struct luaL_Reg gSkImageFilter_Methods[] = {
1306468b1815d29d9bbe513f2d8eb4afc0b066715b52reed    { "__gc",       lpimagefilter_gc },
1307468b1815d29d9bbe513f2d8eb4afc0b066715b52reed    { NULL, NULL }
1308468b1815d29d9bbe513f2d8eb4afc0b066715b52reed};
1309468b1815d29d9bbe513f2d8eb4afc0b066715b52reed
1310468b1815d29d9bbe513f2d8eb4afc0b066715b52reed///////////////////////////////////////////////////////////////////////////////
1311468b1815d29d9bbe513f2d8eb4afc0b066715b52reed
13122815c19c4d52f0fb522e21d1938d63e01c039124humper@google.comstatic int lmatrix_getType(lua_State* L) {
13132815c19c4d52f0fb522e21d1938d63e01c039124humper@google.com    SkMatrix::TypeMask mask = get_obj<SkMatrix>(L, 1)->getType();
1314de2e4e8a6422c7d8b5847f038f5c6360b187f7a2skia.committer@gmail.com
13152815c19c4d52f0fb522e21d1938d63e01c039124humper@google.com    lua_newtable(L);
13162815c19c4d52f0fb522e21d1938d63e01c039124humper@google.com    setfield_boolean(L, "translate",   SkToBool(mask & SkMatrix::kTranslate_Mask));
13172815c19c4d52f0fb522e21d1938d63e01c039124humper@google.com    setfield_boolean(L, "scale",       SkToBool(mask & SkMatrix::kScale_Mask));
13182815c19c4d52f0fb522e21d1938d63e01c039124humper@google.com    setfield_boolean(L, "affine",      SkToBool(mask & SkMatrix::kAffine_Mask));
13192815c19c4d52f0fb522e21d1938d63e01c039124humper@google.com    setfield_boolean(L, "perspective", SkToBool(mask & SkMatrix::kPerspective_Mask));
13202815c19c4d52f0fb522e21d1938d63e01c039124humper@google.com    return 1;
13212815c19c4d52f0fb522e21d1938d63e01c039124humper@google.com}
13222815c19c4d52f0fb522e21d1938d63e01c039124humper@google.com
13230f48ee0a07aa50ab60bfff3c2718b9649e3639eahumper@google.comstatic int lmatrix_getScaleX(lua_State* L) {
13240f48ee0a07aa50ab60bfff3c2718b9649e3639eahumper@google.com    lua_pushnumber(L, get_obj<SkMatrix>(L,1)->getScaleX());
13250f48ee0a07aa50ab60bfff3c2718b9649e3639eahumper@google.com    return 1;
13260f48ee0a07aa50ab60bfff3c2718b9649e3639eahumper@google.com}
13270f48ee0a07aa50ab60bfff3c2718b9649e3639eahumper@google.com
13280f48ee0a07aa50ab60bfff3c2718b9649e3639eahumper@google.comstatic int lmatrix_getScaleY(lua_State* L) {
13290f48ee0a07aa50ab60bfff3c2718b9649e3639eahumper@google.com    lua_pushnumber(L, get_obj<SkMatrix>(L,1)->getScaleY());
13300f48ee0a07aa50ab60bfff3c2718b9649e3639eahumper@google.com    return 1;
13310f48ee0a07aa50ab60bfff3c2718b9649e3639eahumper@google.com}
13320f48ee0a07aa50ab60bfff3c2718b9649e3639eahumper@google.com
13330f48ee0a07aa50ab60bfff3c2718b9649e3639eahumper@google.comstatic int lmatrix_getTranslateX(lua_State* L) {
13340f48ee0a07aa50ab60bfff3c2718b9649e3639eahumper@google.com    lua_pushnumber(L, get_obj<SkMatrix>(L,1)->getTranslateX());
13350f48ee0a07aa50ab60bfff3c2718b9649e3639eahumper@google.com    return 1;
13360f48ee0a07aa50ab60bfff3c2718b9649e3639eahumper@google.com}
13370f48ee0a07aa50ab60bfff3c2718b9649e3639eahumper@google.com
13380f48ee0a07aa50ab60bfff3c2718b9649e3639eahumper@google.comstatic int lmatrix_getTranslateY(lua_State* L) {
13390f48ee0a07aa50ab60bfff3c2718b9649e3639eahumper@google.com    lua_pushnumber(L, get_obj<SkMatrix>(L,1)->getTranslateY());
13400f48ee0a07aa50ab60bfff3c2718b9649e3639eahumper@google.com    return 1;
13410f48ee0a07aa50ab60bfff3c2718b9649e3639eahumper@google.com}
13420f48ee0a07aa50ab60bfff3c2718b9649e3639eahumper@google.com
13437a72c6702da9e1f6fb536efe844db23f77535a19reedstatic int lmatrix_invert(lua_State* L) {
13447a72c6702da9e1f6fb536efe844db23f77535a19reed    lua_pushboolean(L, get_obj<SkMatrix>(L, 1)->invert(get_obj<SkMatrix>(L, 2)));
13457a72c6702da9e1f6fb536efe844db23f77535a19reed    return 1;
13467a72c6702da9e1f6fb536efe844db23f77535a19reed}
13477a72c6702da9e1f6fb536efe844db23f77535a19reed
13487a72c6702da9e1f6fb536efe844db23f77535a19reedstatic int lmatrix_mapXY(lua_State* L) {
13497a72c6702da9e1f6fb536efe844db23f77535a19reed    SkPoint pt = { lua2scalar(L, 2), lua2scalar(L, 3) };
13507a72c6702da9e1f6fb536efe844db23f77535a19reed    get_obj<SkMatrix>(L, 1)->mapPoints(&pt, &pt, 1);
13517a72c6702da9e1f6fb536efe844db23f77535a19reed    lua_pushnumber(L, pt.x());
13527a72c6702da9e1f6fb536efe844db23f77535a19reed    lua_pushnumber(L, pt.y());
13537a72c6702da9e1f6fb536efe844db23f77535a19reed    return 2;
13547a72c6702da9e1f6fb536efe844db23f77535a19reed}
13557a72c6702da9e1f6fb536efe844db23f77535a19reed
1356bdc49ae0d422b8fe1957af570c4f4e63272f5285reedstatic int lmatrix_setRectToRect(lua_State* L) {
1357bdc49ae0d422b8fe1957af570c4f4e63272f5285reed    SkMatrix* matrix = get_obj<SkMatrix>(L, 1);
1358bdc49ae0d422b8fe1957af570c4f4e63272f5285reed    SkRect srcR, dstR;
1359bdc49ae0d422b8fe1957af570c4f4e63272f5285reed    lua2rect(L, 2, &srcR);
1360bdc49ae0d422b8fe1957af570c4f4e63272f5285reed    lua2rect(L, 3, &dstR);
1361bdc49ae0d422b8fe1957af570c4f4e63272f5285reed    const char* scaleToFitStr = lua_tostring(L, 4);
1362bdc49ae0d422b8fe1957af570c4f4e63272f5285reed    SkMatrix::ScaleToFit scaleToFit = SkMatrix::kFill_ScaleToFit;
1363bdc49ae0d422b8fe1957af570c4f4e63272f5285reed
1364bdc49ae0d422b8fe1957af570c4f4e63272f5285reed    if (scaleToFitStr) {
1365bdc49ae0d422b8fe1957af570c4f4e63272f5285reed        const struct {
1366bdc49ae0d422b8fe1957af570c4f4e63272f5285reed            const char* fName;
1367bdc49ae0d422b8fe1957af570c4f4e63272f5285reed            SkMatrix::ScaleToFit fScaleToFit;
1368bdc49ae0d422b8fe1957af570c4f4e63272f5285reed        } rec[] = {
1369bdc49ae0d422b8fe1957af570c4f4e63272f5285reed            { "fill",   SkMatrix::kFill_ScaleToFit },
1370bdc49ae0d422b8fe1957af570c4f4e63272f5285reed            { "start",  SkMatrix::kStart_ScaleToFit },
1371bdc49ae0d422b8fe1957af570c4f4e63272f5285reed            { "center", SkMatrix::kCenter_ScaleToFit },
1372bdc49ae0d422b8fe1957af570c4f4e63272f5285reed            { "end",    SkMatrix::kEnd_ScaleToFit },
1373bdc49ae0d422b8fe1957af570c4f4e63272f5285reed        };
1374bdc49ae0d422b8fe1957af570c4f4e63272f5285reed
1375bdc49ae0d422b8fe1957af570c4f4e63272f5285reed        for (size_t i = 0; i < SK_ARRAY_COUNT(rec); ++i) {
1376bdc49ae0d422b8fe1957af570c4f4e63272f5285reed            if (strcmp(rec[i].fName, scaleToFitStr) == 0) {
1377bdc49ae0d422b8fe1957af570c4f4e63272f5285reed                scaleToFit = rec[i].fScaleToFit;
1378bdc49ae0d422b8fe1957af570c4f4e63272f5285reed                break;
1379bdc49ae0d422b8fe1957af570c4f4e63272f5285reed            }
1380bdc49ae0d422b8fe1957af570c4f4e63272f5285reed        }
1381bdc49ae0d422b8fe1957af570c4f4e63272f5285reed    }
1382bdc49ae0d422b8fe1957af570c4f4e63272f5285reed
1383bdc49ae0d422b8fe1957af570c4f4e63272f5285reed    matrix->setRectToRect(srcR, dstR, scaleToFit);
1384bdc49ae0d422b8fe1957af570c4f4e63272f5285reed    return 0;
1385bdc49ae0d422b8fe1957af570c4f4e63272f5285reed}
1386bdc49ae0d422b8fe1957af570c4f4e63272f5285reed
13872815c19c4d52f0fb522e21d1938d63e01c039124humper@google.comstatic const struct luaL_Reg gSkMatrix_Methods[] = {
13882815c19c4d52f0fb522e21d1938d63e01c039124humper@google.com    { "getType", lmatrix_getType },
13890f48ee0a07aa50ab60bfff3c2718b9649e3639eahumper@google.com    { "getScaleX", lmatrix_getScaleX },
13900f48ee0a07aa50ab60bfff3c2718b9649e3639eahumper@google.com    { "getScaleY", lmatrix_getScaleY },
13910f48ee0a07aa50ab60bfff3c2718b9649e3639eahumper@google.com    { "getTranslateX", lmatrix_getTranslateX },
13920f48ee0a07aa50ab60bfff3c2718b9649e3639eahumper@google.com    { "getTranslateY", lmatrix_getTranslateY },
1393bdc49ae0d422b8fe1957af570c4f4e63272f5285reed    { "setRectToRect", lmatrix_setRectToRect },
13947a72c6702da9e1f6fb536efe844db23f77535a19reed    { "invert", lmatrix_invert },
13957a72c6702da9e1f6fb536efe844db23f77535a19reed    { "mapXY", lmatrix_mapXY },
13962815c19c4d52f0fb522e21d1938d63e01c039124humper@google.com    { NULL, NULL }
13972815c19c4d52f0fb522e21d1938d63e01c039124humper@google.com};
13982815c19c4d52f0fb522e21d1938d63e01c039124humper@google.com
13992815c19c4d52f0fb522e21d1938d63e01c039124humper@google.com///////////////////////////////////////////////////////////////////////////////
14002815c19c4d52f0fb522e21d1938d63e01c039124humper@google.com
140174ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.comstatic int lpath_getBounds(lua_State* L) {
140274ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com    SkLua(L).pushRect(get_obj<SkPath>(L, 1)->getBounds());
140374ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com    return 1;
140474ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com}
140574ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com
1406d85b822616d609b7056154489176910cbd9f81a9commit-bot@chromium.orgstatic const char* fill_type_to_str(SkPath::FillType fill) {
1407d85b822616d609b7056154489176910cbd9f81a9commit-bot@chromium.org    switch (fill) {
1408d85b822616d609b7056154489176910cbd9f81a9commit-bot@chromium.org        case SkPath::kEvenOdd_FillType:
1409d85b822616d609b7056154489176910cbd9f81a9commit-bot@chromium.org            return "even-odd";
1410d85b822616d609b7056154489176910cbd9f81a9commit-bot@chromium.org        case SkPath::kWinding_FillType:
1411d85b822616d609b7056154489176910cbd9f81a9commit-bot@chromium.org            return "winding";
1412d85b822616d609b7056154489176910cbd9f81a9commit-bot@chromium.org        case SkPath::kInverseEvenOdd_FillType:
1413d85b822616d609b7056154489176910cbd9f81a9commit-bot@chromium.org            return "inverse-even-odd";
1414d85b822616d609b7056154489176910cbd9f81a9commit-bot@chromium.org        case SkPath::kInverseWinding_FillType:
1415d85b822616d609b7056154489176910cbd9f81a9commit-bot@chromium.org            return "inverse-winding";
1416d85b822616d609b7056154489176910cbd9f81a9commit-bot@chromium.org    }
1417d85b822616d609b7056154489176910cbd9f81a9commit-bot@chromium.org    return "unknown";
1418d85b822616d609b7056154489176910cbd9f81a9commit-bot@chromium.org}
1419d85b822616d609b7056154489176910cbd9f81a9commit-bot@chromium.org
1420d85b822616d609b7056154489176910cbd9f81a9commit-bot@chromium.orgstatic int lpath_getFillType(lua_State* L) {
1421d85b822616d609b7056154489176910cbd9f81a9commit-bot@chromium.org    SkPath::FillType fill = get_obj<SkPath>(L, 1)->getFillType();
1422d85b822616d609b7056154489176910cbd9f81a9commit-bot@chromium.org    SkLua(L).pushString(fill_type_to_str(fill));
1423d85b822616d609b7056154489176910cbd9f81a9commit-bot@chromium.org    return 1;
1424d85b822616d609b7056154489176910cbd9f81a9commit-bot@chromium.org}
1425d85b822616d609b7056154489176910cbd9f81a9commit-bot@chromium.org
1426d85b822616d609b7056154489176910cbd9f81a9commit-bot@chromium.orgstatic SkString segment_masks_to_str(uint32_t segmentMasks) {
1427d85b822616d609b7056154489176910cbd9f81a9commit-bot@chromium.org    SkString result;
1428d85b822616d609b7056154489176910cbd9f81a9commit-bot@chromium.org    bool first = true;
1429d85b822616d609b7056154489176910cbd9f81a9commit-bot@chromium.org    if (SkPath::kLine_SegmentMask & segmentMasks) {
1430d85b822616d609b7056154489176910cbd9f81a9commit-bot@chromium.org        result.append("line");
1431d85b822616d609b7056154489176910cbd9f81a9commit-bot@chromium.org        first = false;
1432d85b822616d609b7056154489176910cbd9f81a9commit-bot@chromium.org        SkDEBUGCODE(segmentMasks &= ~SkPath::kLine_SegmentMask;)
1433d85b822616d609b7056154489176910cbd9f81a9commit-bot@chromium.org    }
1434d85b822616d609b7056154489176910cbd9f81a9commit-bot@chromium.org    if (SkPath::kQuad_SegmentMask & segmentMasks) {
1435d85b822616d609b7056154489176910cbd9f81a9commit-bot@chromium.org        if (!first) {
1436d85b822616d609b7056154489176910cbd9f81a9commit-bot@chromium.org            result.append(" ");
1437d85b822616d609b7056154489176910cbd9f81a9commit-bot@chromium.org        }
1438d85b822616d609b7056154489176910cbd9f81a9commit-bot@chromium.org        result.append("quad");
1439d85b822616d609b7056154489176910cbd9f81a9commit-bot@chromium.org        first = false;
1440d85b822616d609b7056154489176910cbd9f81a9commit-bot@chromium.org        SkDEBUGCODE(segmentMasks &= ~SkPath::kQuad_SegmentMask;)
1441d85b822616d609b7056154489176910cbd9f81a9commit-bot@chromium.org    }
1442d85b822616d609b7056154489176910cbd9f81a9commit-bot@chromium.org    if (SkPath::kConic_SegmentMask & segmentMasks) {
1443d85b822616d609b7056154489176910cbd9f81a9commit-bot@chromium.org        if (!first) {
1444d85b822616d609b7056154489176910cbd9f81a9commit-bot@chromium.org            result.append(" ");
1445d85b822616d609b7056154489176910cbd9f81a9commit-bot@chromium.org        }
1446d85b822616d609b7056154489176910cbd9f81a9commit-bot@chromium.org        result.append("conic");
1447d85b822616d609b7056154489176910cbd9f81a9commit-bot@chromium.org        first = false;
1448d85b822616d609b7056154489176910cbd9f81a9commit-bot@chromium.org        SkDEBUGCODE(segmentMasks &= ~SkPath::kConic_SegmentMask;)
1449d85b822616d609b7056154489176910cbd9f81a9commit-bot@chromium.org    }
1450d85b822616d609b7056154489176910cbd9f81a9commit-bot@chromium.org    if (SkPath::kCubic_SegmentMask & segmentMasks) {
1451d85b822616d609b7056154489176910cbd9f81a9commit-bot@chromium.org        if (!first) {
1452d85b822616d609b7056154489176910cbd9f81a9commit-bot@chromium.org            result.append(" ");
1453d85b822616d609b7056154489176910cbd9f81a9commit-bot@chromium.org        }
1454d85b822616d609b7056154489176910cbd9f81a9commit-bot@chromium.org        result.append("cubic");
1455d85b822616d609b7056154489176910cbd9f81a9commit-bot@chromium.org        SkDEBUGCODE(segmentMasks &= ~SkPath::kCubic_SegmentMask;)
1456d85b822616d609b7056154489176910cbd9f81a9commit-bot@chromium.org    }
1457d85b822616d609b7056154489176910cbd9f81a9commit-bot@chromium.org    SkASSERT(0 == segmentMasks);
1458d85b822616d609b7056154489176910cbd9f81a9commit-bot@chromium.org    return result;
1459d85b822616d609b7056154489176910cbd9f81a9commit-bot@chromium.org}
1460d85b822616d609b7056154489176910cbd9f81a9commit-bot@chromium.org
146195498ed2d8ad933d47f41fd97c0ee2feefbc1399krajcevskistatic int lpath_getSegmentTypes(lua_State* L) {
1462d85b822616d609b7056154489176910cbd9f81a9commit-bot@chromium.org    uint32_t segMasks = get_obj<SkPath>(L, 1)->getSegmentMasks();
1463d85b822616d609b7056154489176910cbd9f81a9commit-bot@chromium.org    SkLua(L).pushString(segment_masks_to_str(segMasks));
1464d85b822616d609b7056154489176910cbd9f81a9commit-bot@chromium.org    return 1;
1465d85b822616d609b7056154489176910cbd9f81a9commit-bot@chromium.org}
1466d85b822616d609b7056154489176910cbd9f81a9commit-bot@chromium.org
1467d85b822616d609b7056154489176910cbd9f81a9commit-bot@chromium.orgstatic int lpath_isConvex(lua_State* L) {
1468d85b822616d609b7056154489176910cbd9f81a9commit-bot@chromium.org    bool isConvex = SkPath::kConvex_Convexity == get_obj<SkPath>(L, 1)->getConvexity();
1469d85b822616d609b7056154489176910cbd9f81a9commit-bot@chromium.org    SkLua(L).pushBool(isConvex);
1470d85b822616d609b7056154489176910cbd9f81a9commit-bot@chromium.org    return 1;
1471d85b822616d609b7056154489176910cbd9f81a9commit-bot@chromium.org}
1472d85b822616d609b7056154489176910cbd9f81a9commit-bot@chromium.org
147374ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.comstatic int lpath_isEmpty(lua_State* L) {
147474ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com    lua_pushboolean(L, get_obj<SkPath>(L, 1)->isEmpty());
147574ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com    return 1;
147674ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com}
147774ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com
147874ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.comstatic int lpath_isRect(lua_State* L) {
147974ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com    SkRect r;
148074ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com    bool pred = get_obj<SkPath>(L, 1)->isRect(&r);
148174ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com    int ret_count = 1;
148274ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com    lua_pushboolean(L, pred);
148374ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com    if (pred) {
148474ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com        SkLua(L).pushRect(r);
148574ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com        ret_count += 1;
148674ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com    }
148774ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com    return ret_count;
148874ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com}
148974ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com
149074ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.comstatic const char* dir2string(SkPath::Direction dir) {
149174ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com    static const char* gStr[] = {
149274ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com        "unknown", "cw", "ccw"
149374ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com    };
149474ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com    SkASSERT((unsigned)dir < SK_ARRAY_COUNT(gStr));
149574ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com    return gStr[dir];
149674ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com}
149774ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com
149895bc5f349561fef2d6fbae71adb08cf5c2eec0c9caryclarkstatic int lpath_isNestedFillRects(lua_State* L) {
149974ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com    SkRect rects[2];
150074ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com    SkPath::Direction dirs[2];
150195bc5f349561fef2d6fbae71adb08cf5c2eec0c9caryclark    bool pred = get_obj<SkPath>(L, 1)->isNestedFillRects(rects, dirs);
150274ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com    int ret_count = 1;
150374ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com    lua_pushboolean(L, pred);
150474ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com    if (pred) {
150574ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com        SkLua lua(L);
150674ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com        lua.pushRect(rects[0]);
150774ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com        lua.pushRect(rects[1]);
150874ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com        lua_pushstring(L, dir2string(dirs[0]));
150974ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com        lua_pushstring(L, dir2string(dirs[0]));
151074ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com        ret_count += 4;
151174ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com    }
151274ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com    return ret_count;
151374ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com}
151474ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com
1515c530208ab02410df9efdabcfd50f42ec4c7fb750commit-bot@chromium.orgstatic int lpath_countPoints(lua_State* L) {
1516c530208ab02410df9efdabcfd50f42ec4c7fb750commit-bot@chromium.org    lua_pushinteger(L, get_obj<SkPath>(L, 1)->countPoints());
1517c530208ab02410df9efdabcfd50f42ec4c7fb750commit-bot@chromium.org    return 1;
1518c530208ab02410df9efdabcfd50f42ec4c7fb750commit-bot@chromium.org}
1519c530208ab02410df9efdabcfd50f42ec4c7fb750commit-bot@chromium.org
152074ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.comstatic int lpath_reset(lua_State* L) {
152174ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com    get_obj<SkPath>(L, 1)->reset();
152274ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com    return 0;
152374ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com}
152474ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com
152574ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.comstatic int lpath_moveTo(lua_State* L) {
152674ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com    get_obj<SkPath>(L, 1)->moveTo(lua2scalar(L, 2), lua2scalar(L, 3));
152774ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com    return 0;
152874ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com}
152974ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com
153074ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.comstatic int lpath_lineTo(lua_State* L) {
153174ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com    get_obj<SkPath>(L, 1)->lineTo(lua2scalar(L, 2), lua2scalar(L, 3));
153274ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com    return 0;
153374ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com}
153474ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com
153574ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.comstatic int lpath_quadTo(lua_State* L) {
153674ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com    get_obj<SkPath>(L, 1)->quadTo(lua2scalar(L, 2), lua2scalar(L, 3),
153774ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com                                  lua2scalar(L, 4), lua2scalar(L, 5));
153874ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com    return 0;
153974ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com}
154074ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com
154174ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.comstatic int lpath_cubicTo(lua_State* L) {
154274ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com    get_obj<SkPath>(L, 1)->cubicTo(lua2scalar(L, 2), lua2scalar(L, 3),
154374ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com                                   lua2scalar(L, 4), lua2scalar(L, 5),
154474ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com                                   lua2scalar(L, 6), lua2scalar(L, 7));
154574ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com    return 0;
154674ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com}
154774ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com
154874ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.comstatic int lpath_close(lua_State* L) {
154974ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com    get_obj<SkPath>(L, 1)->close();
155074ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com    return 0;
155174ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com}
155274ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com
155374ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.comstatic int lpath_gc(lua_State* L) {
155474ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com    get_obj<SkPath>(L, 1)->~SkPath();
155574ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com    return 0;
155674ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com}
155774ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com
155874ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.comstatic const struct luaL_Reg gSkPath_Methods[] = {
155974ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com    { "getBounds", lpath_getBounds },
1560d85b822616d609b7056154489176910cbd9f81a9commit-bot@chromium.org    { "getFillType", lpath_getFillType },
156195498ed2d8ad933d47f41fd97c0ee2feefbc1399krajcevski    { "getSegmentTypes", lpath_getSegmentTypes },
1562d85b822616d609b7056154489176910cbd9f81a9commit-bot@chromium.org    { "isConvex", lpath_isConvex },
156374ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com    { "isEmpty", lpath_isEmpty },
156474ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com    { "isRect", lpath_isRect },
156595bc5f349561fef2d6fbae71adb08cf5c2eec0c9caryclark    { "isNestedFillRects", lpath_isNestedFillRects },
1566c530208ab02410df9efdabcfd50f42ec4c7fb750commit-bot@chromium.org    { "countPoints", lpath_countPoints },
156774ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com    { "reset", lpath_reset },
156874ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com    { "moveTo", lpath_moveTo },
156974ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com    { "lineTo", lpath_lineTo },
157074ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com    { "quadTo", lpath_quadTo },
157174ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com    { "cubicTo", lpath_cubicTo },
157274ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com    { "close", lpath_close },
157374ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com    { "__gc", lpath_gc },
157474ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com    { NULL, NULL }
157574ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com};
157674ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com
157774ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com///////////////////////////////////////////////////////////////////////////////
157874ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com
157974ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.comstatic const char* rrect_type(const SkRRect& rr) {
158074ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com    switch (rr.getType()) {
158174ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com        case SkRRect::kEmpty_Type: return "empty";
158274ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com        case SkRRect::kRect_Type: return "rect";
158374ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com        case SkRRect::kOval_Type: return "oval";
158474ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com        case SkRRect::kSimple_Type: return "simple";
1585f338d7c860bf0bca82cac793069522311a3dbb1acommit-bot@chromium.org        case SkRRect::kNinePatch_Type: return "nine-patch";
158674ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com        case SkRRect::kComplex_Type: return "complex";
158774ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com    }
1588330313a8a8343876ee596da39da06a5d69badd9cmtklein@google.com    SkDEBUGFAIL("never get here");
158974ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com    return "";
159074ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com}
159174ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com
159274ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.comstatic int lrrect_rect(lua_State* L) {
159374ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com    SkLua(L).pushRect(get_obj<SkRRect>(L, 1)->rect());
159474ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com    return 1;
159574ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com}
159674ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com
159774ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.comstatic int lrrect_type(lua_State* L) {
159874ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com    lua_pushstring(L, rrect_type(*get_obj<SkRRect>(L, 1)));
159974ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com    return 1;
160074ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com}
160174ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com
160274ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.comstatic int lrrect_radii(lua_State* L) {
16037fa2a65c0cfc714364490cb715171461143024e0reed@google.com    int corner = SkToInt(lua_tointeger(L, 2));
160474ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com    SkVector v;
160574ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com    if (corner < 0 || corner > 3) {
160674ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com        SkDebugf("bad corner index %d", corner);
160774ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com        v.set(0, 0);
160874ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com    } else {
160974ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com        v = get_obj<SkRRect>(L, 1)->radii((SkRRect::Corner)corner);
161074ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com    }
161174ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com    lua_pushnumber(L, v.fX);
161274ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com    lua_pushnumber(L, v.fY);
161374ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com    return 2;
161474ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com}
161574ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com
161674ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.comstatic int lrrect_gc(lua_State* L) {
161774ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com    get_obj<SkRRect>(L, 1)->~SkRRect();
161874ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com    return 0;
161974ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com}
162074ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com
162174ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.comstatic const struct luaL_Reg gSkRRect_Methods[] = {
162274ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com    { "rect", lrrect_rect },
162374ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com    { "type", lrrect_type },
162474ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com    { "radii", lrrect_radii },
162574ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com    { "__gc", lrrect_gc },
162674ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com    { NULL, NULL }
162774ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com};
162874ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com
162974ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com///////////////////////////////////////////////////////////////////////////////
163074ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com
1631792bbd14c63f217f2de0e6b2f8df99acb1928eeamike@reedtribe.orgstatic int limage_width(lua_State* L) {
1632792bbd14c63f217f2de0e6b2f8df99acb1928eeamike@reedtribe.org    lua_pushinteger(L, get_ref<SkImage>(L, 1)->width());
1633792bbd14c63f217f2de0e6b2f8df99acb1928eeamike@reedtribe.org    return 1;
1634792bbd14c63f217f2de0e6b2f8df99acb1928eeamike@reedtribe.org}
1635792bbd14c63f217f2de0e6b2f8df99acb1928eeamike@reedtribe.org
1636792bbd14c63f217f2de0e6b2f8df99acb1928eeamike@reedtribe.orgstatic int limage_height(lua_State* L) {
1637792bbd14c63f217f2de0e6b2f8df99acb1928eeamike@reedtribe.org    lua_pushinteger(L, get_ref<SkImage>(L, 1)->height());
1638792bbd14c63f217f2de0e6b2f8df99acb1928eeamike@reedtribe.org    return 1;
1639792bbd14c63f217f2de0e6b2f8df99acb1928eeamike@reedtribe.org}
1640792bbd14c63f217f2de0e6b2f8df99acb1928eeamike@reedtribe.org
16417a72c6702da9e1f6fb536efe844db23f77535a19reedstatic int limage_newShader(lua_State* L) {
16427a72c6702da9e1f6fb536efe844db23f77535a19reed    SkShader::TileMode tmode = SkShader::kClamp_TileMode;
16437a72c6702da9e1f6fb536efe844db23f77535a19reed    const SkMatrix* localM = NULL;
16447a72c6702da9e1f6fb536efe844db23f77535a19reed    SkAutoTUnref<SkShader> shader(get_ref<SkImage>(L, 1)->newShader(tmode, tmode, localM));
16457a72c6702da9e1f6fb536efe844db23f77535a19reed    push_ref(L, shader.get());
16467a72c6702da9e1f6fb536efe844db23f77535a19reed    return 1;
16477a72c6702da9e1f6fb536efe844db23f77535a19reed}
16487a72c6702da9e1f6fb536efe844db23f77535a19reed
1649792bbd14c63f217f2de0e6b2f8df99acb1928eeamike@reedtribe.orgstatic int limage_gc(lua_State* L) {
1650792bbd14c63f217f2de0e6b2f8df99acb1928eeamike@reedtribe.org    get_ref<SkImage>(L, 1)->unref();
1651792bbd14c63f217f2de0e6b2f8df99acb1928eeamike@reedtribe.org    return 0;
1652792bbd14c63f217f2de0e6b2f8df99acb1928eeamike@reedtribe.org}
1653792bbd14c63f217f2de0e6b2f8df99acb1928eeamike@reedtribe.org
1654792bbd14c63f217f2de0e6b2f8df99acb1928eeamike@reedtribe.orgstatic const struct luaL_Reg gSkImage_Methods[] = {
1655792bbd14c63f217f2de0e6b2f8df99acb1928eeamike@reedtribe.org    { "width", limage_width },
1656792bbd14c63f217f2de0e6b2f8df99acb1928eeamike@reedtribe.org    { "height", limage_height },
16577a72c6702da9e1f6fb536efe844db23f77535a19reed    { "newShader", limage_newShader },
1658792bbd14c63f217f2de0e6b2f8df99acb1928eeamike@reedtribe.org    { "__gc", limage_gc },
1659792bbd14c63f217f2de0e6b2f8df99acb1928eeamike@reedtribe.org    { NULL, NULL }
1660792bbd14c63f217f2de0e6b2f8df99acb1928eeamike@reedtribe.org};
1661792bbd14c63f217f2de0e6b2f8df99acb1928eeamike@reedtribe.org
1662792bbd14c63f217f2de0e6b2f8df99acb1928eeamike@reedtribe.org///////////////////////////////////////////////////////////////////////////////
1663792bbd14c63f217f2de0e6b2f8df99acb1928eeamike@reedtribe.org
1664485557f95d7a4b04536c0c5f01fad5f9744531dareedstatic int lsurface_width(lua_State* L) {
1665485557f95d7a4b04536c0c5f01fad5f9744531dareed    lua_pushinteger(L, get_ref<SkSurface>(L, 1)->width());
1666485557f95d7a4b04536c0c5f01fad5f9744531dareed    return 1;
1667485557f95d7a4b04536c0c5f01fad5f9744531dareed}
1668485557f95d7a4b04536c0c5f01fad5f9744531dareed
1669485557f95d7a4b04536c0c5f01fad5f9744531dareedstatic int lsurface_height(lua_State* L) {
1670485557f95d7a4b04536c0c5f01fad5f9744531dareed    lua_pushinteger(L, get_ref<SkSurface>(L, 1)->height());
1671485557f95d7a4b04536c0c5f01fad5f9744531dareed    return 1;
1672485557f95d7a4b04536c0c5f01fad5f9744531dareed}
1673485557f95d7a4b04536c0c5f01fad5f9744531dareed
1674485557f95d7a4b04536c0c5f01fad5f9744531dareedstatic int lsurface_getCanvas(lua_State* L) {
1675485557f95d7a4b04536c0c5f01fad5f9744531dareed    SkCanvas* canvas = get_ref<SkSurface>(L, 1)->getCanvas();
1676485557f95d7a4b04536c0c5f01fad5f9744531dareed    if (NULL == canvas) {
1677485557f95d7a4b04536c0c5f01fad5f9744531dareed        lua_pushnil(L);
1678485557f95d7a4b04536c0c5f01fad5f9744531dareed    } else {
1679485557f95d7a4b04536c0c5f01fad5f9744531dareed        push_ref(L, canvas);
1680485557f95d7a4b04536c0c5f01fad5f9744531dareed        // note: we don't unref canvas, since getCanvas did not ref it.
1681485557f95d7a4b04536c0c5f01fad5f9744531dareed        // warning: this is weird: now Lua owns a ref on this canvas, but what if they let
1682485557f95d7a4b04536c0c5f01fad5f9744531dareed        // the real owner (the surface) go away, but still hold onto the canvas?
1683485557f95d7a4b04536c0c5f01fad5f9744531dareed        // *really* we want to sort of ref the surface again, but have the native object
1684485557f95d7a4b04536c0c5f01fad5f9744531dareed        // know that it is supposed to be treated as a canvas...
1685485557f95d7a4b04536c0c5f01fad5f9744531dareed    }
1686485557f95d7a4b04536c0c5f01fad5f9744531dareed    return 1;
1687485557f95d7a4b04536c0c5f01fad5f9744531dareed}
1688485557f95d7a4b04536c0c5f01fad5f9744531dareed
1689485557f95d7a4b04536c0c5f01fad5f9744531dareedstatic int lsurface_newImageSnapshot(lua_State* L) {
1690485557f95d7a4b04536c0c5f01fad5f9744531dareed    SkImage* image = get_ref<SkSurface>(L, 1)->newImageSnapshot();
1691485557f95d7a4b04536c0c5f01fad5f9744531dareed    if (NULL == image) {
1692485557f95d7a4b04536c0c5f01fad5f9744531dareed        lua_pushnil(L);
1693485557f95d7a4b04536c0c5f01fad5f9744531dareed    } else {
16949fbc3f31c0c7095f4f25ad3d2d17731bb63c0817reed        push_ref(L, image)->unref();
1695485557f95d7a4b04536c0c5f01fad5f9744531dareed    }
1696485557f95d7a4b04536c0c5f01fad5f9744531dareed    return 1;
1697485557f95d7a4b04536c0c5f01fad5f9744531dareed}
1698485557f95d7a4b04536c0c5f01fad5f9744531dareed
1699485557f95d7a4b04536c0c5f01fad5f9744531dareedstatic int lsurface_newSurface(lua_State* L) {
1700485557f95d7a4b04536c0c5f01fad5f9744531dareed    int width = lua2int_def(L, 2, 0);
170196affcde22a675e3629b9da490bb45a0ab07fa2breed    int height = lua2int_def(L, 3, 0);
1702485557f95d7a4b04536c0c5f01fad5f9744531dareed    SkImageInfo info = SkImageInfo::MakeN32Premul(width, height);
1703485557f95d7a4b04536c0c5f01fad5f9744531dareed    SkSurface* surface = get_ref<SkSurface>(L, 1)->newSurface(info);
1704485557f95d7a4b04536c0c5f01fad5f9744531dareed    if (NULL == surface) {
1705485557f95d7a4b04536c0c5f01fad5f9744531dareed        lua_pushnil(L);
1706485557f95d7a4b04536c0c5f01fad5f9744531dareed    } else {
17079fbc3f31c0c7095f4f25ad3d2d17731bb63c0817reed        push_ref(L, surface)->unref();
1708485557f95d7a4b04536c0c5f01fad5f9744531dareed    }
1709485557f95d7a4b04536c0c5f01fad5f9744531dareed    return 1;
1710485557f95d7a4b04536c0c5f01fad5f9744531dareed}
1711485557f95d7a4b04536c0c5f01fad5f9744531dareed
1712485557f95d7a4b04536c0c5f01fad5f9744531dareedstatic int lsurface_gc(lua_State* L) {
1713485557f95d7a4b04536c0c5f01fad5f9744531dareed    get_ref<SkSurface>(L, 1)->unref();
1714485557f95d7a4b04536c0c5f01fad5f9744531dareed    return 0;
1715485557f95d7a4b04536c0c5f01fad5f9744531dareed}
1716485557f95d7a4b04536c0c5f01fad5f9744531dareed
1717485557f95d7a4b04536c0c5f01fad5f9744531dareedstatic const struct luaL_Reg gSkSurface_Methods[] = {
1718485557f95d7a4b04536c0c5f01fad5f9744531dareed    { "width", lsurface_width },
1719485557f95d7a4b04536c0c5f01fad5f9744531dareed    { "height", lsurface_height },
1720485557f95d7a4b04536c0c5f01fad5f9744531dareed    { "getCanvas", lsurface_getCanvas },
1721485557f95d7a4b04536c0c5f01fad5f9744531dareed    { "newImageSnapshot", lsurface_newImageSnapshot },
1722485557f95d7a4b04536c0c5f01fad5f9744531dareed    { "newSurface", lsurface_newSurface },
1723485557f95d7a4b04536c0c5f01fad5f9744531dareed    { "__gc", lsurface_gc },
1724485557f95d7a4b04536c0c5f01fad5f9744531dareed    { NULL, NULL }
1725485557f95d7a4b04536c0c5f01fad5f9744531dareed};
1726485557f95d7a4b04536c0c5f01fad5f9744531dareed
1727485557f95d7a4b04536c0c5f01fad5f9744531dareed///////////////////////////////////////////////////////////////////////////////
1728485557f95d7a4b04536c0c5f01fad5f9744531dareed
172996affcde22a675e3629b9da490bb45a0ab07fa2breedstatic int lpicturerecorder_beginRecording(lua_State* L) {
173096affcde22a675e3629b9da490bb45a0ab07fa2breed    const SkScalar w = lua2scalar_def(L, 2, -1);
173196affcde22a675e3629b9da490bb45a0ab07fa2breed    const SkScalar h = lua2scalar_def(L, 3, -1);
173296affcde22a675e3629b9da490bb45a0ab07fa2breed    if (w <= 0 || h <= 0) {
173396affcde22a675e3629b9da490bb45a0ab07fa2breed        lua_pushnil(L);
173496affcde22a675e3629b9da490bb45a0ab07fa2breed        return 1;
173596affcde22a675e3629b9da490bb45a0ab07fa2breed    }
173696affcde22a675e3629b9da490bb45a0ab07fa2breed
173796affcde22a675e3629b9da490bb45a0ab07fa2breed    SkCanvas* canvas = get_obj<SkPictureRecorder>(L, 1)->beginRecording(w, h);
173896affcde22a675e3629b9da490bb45a0ab07fa2breed    if (NULL == canvas) {
173996affcde22a675e3629b9da490bb45a0ab07fa2breed        lua_pushnil(L);
174096affcde22a675e3629b9da490bb45a0ab07fa2breed        return 1;
174196affcde22a675e3629b9da490bb45a0ab07fa2breed    }
174296affcde22a675e3629b9da490bb45a0ab07fa2breed
174396affcde22a675e3629b9da490bb45a0ab07fa2breed    push_ref(L, canvas);
174496affcde22a675e3629b9da490bb45a0ab07fa2breed    return 1;
174596affcde22a675e3629b9da490bb45a0ab07fa2breed}
174696affcde22a675e3629b9da490bb45a0ab07fa2breed
174796affcde22a675e3629b9da490bb45a0ab07fa2breedstatic int lpicturerecorder_getCanvas(lua_State* L) {
174896affcde22a675e3629b9da490bb45a0ab07fa2breed    SkCanvas* canvas = get_obj<SkPictureRecorder>(L, 1)->getRecordingCanvas();
174996affcde22a675e3629b9da490bb45a0ab07fa2breed    if (NULL == canvas) {
175096affcde22a675e3629b9da490bb45a0ab07fa2breed        lua_pushnil(L);
175196affcde22a675e3629b9da490bb45a0ab07fa2breed        return 1;
175296affcde22a675e3629b9da490bb45a0ab07fa2breed    }
175396affcde22a675e3629b9da490bb45a0ab07fa2breed    push_ref(L, canvas);
175496affcde22a675e3629b9da490bb45a0ab07fa2breed    return 1;
175596affcde22a675e3629b9da490bb45a0ab07fa2breed}
175696affcde22a675e3629b9da490bb45a0ab07fa2breed
175796affcde22a675e3629b9da490bb45a0ab07fa2breedstatic int lpicturerecorder_endRecording(lua_State* L) {
175896affcde22a675e3629b9da490bb45a0ab07fa2breed    SkPicture* pic = get_obj<SkPictureRecorder>(L, 1)->endRecording();
175996affcde22a675e3629b9da490bb45a0ab07fa2breed    if (NULL == pic) {
176096affcde22a675e3629b9da490bb45a0ab07fa2breed        lua_pushnil(L);
176196affcde22a675e3629b9da490bb45a0ab07fa2breed        return 1;
176296affcde22a675e3629b9da490bb45a0ab07fa2breed    }
17639fbc3f31c0c7095f4f25ad3d2d17731bb63c0817reed    push_ref(L, pic)->unref();
176496affcde22a675e3629b9da490bb45a0ab07fa2breed    return 1;
176596affcde22a675e3629b9da490bb45a0ab07fa2breed}
176696affcde22a675e3629b9da490bb45a0ab07fa2breed
176796affcde22a675e3629b9da490bb45a0ab07fa2breedstatic int lpicturerecorder_gc(lua_State* L) {
176896affcde22a675e3629b9da490bb45a0ab07fa2breed    get_obj<SkPictureRecorder>(L, 1)->~SkPictureRecorder();
176996affcde22a675e3629b9da490bb45a0ab07fa2breed    return 0;
177096affcde22a675e3629b9da490bb45a0ab07fa2breed}
177196affcde22a675e3629b9da490bb45a0ab07fa2breed
177296affcde22a675e3629b9da490bb45a0ab07fa2breedstatic const struct luaL_Reg gSkPictureRecorder_Methods[] = {
177396affcde22a675e3629b9da490bb45a0ab07fa2breed    { "beginRecording", lpicturerecorder_beginRecording },
177496affcde22a675e3629b9da490bb45a0ab07fa2breed    { "getCanvas", lpicturerecorder_getCanvas },
177596affcde22a675e3629b9da490bb45a0ab07fa2breed    { "endRecording", lpicturerecorder_endRecording },
177696affcde22a675e3629b9da490bb45a0ab07fa2breed    { "__gc", lpicturerecorder_gc },
177796affcde22a675e3629b9da490bb45a0ab07fa2breed    { NULL, NULL }
177896affcde22a675e3629b9da490bb45a0ab07fa2breed};
177996affcde22a675e3629b9da490bb45a0ab07fa2breed
178096affcde22a675e3629b9da490bb45a0ab07fa2breed///////////////////////////////////////////////////////////////////////////////
178196affcde22a675e3629b9da490bb45a0ab07fa2breed
178296affcde22a675e3629b9da490bb45a0ab07fa2breedstatic int lpicture_width(lua_State* L) {
178396affcde22a675e3629b9da490bb45a0ab07fa2breed    lua_pushnumber(L, get_ref<SkPicture>(L, 1)->cullRect().width());
178496affcde22a675e3629b9da490bb45a0ab07fa2breed    return 1;
178596affcde22a675e3629b9da490bb45a0ab07fa2breed}
178696affcde22a675e3629b9da490bb45a0ab07fa2breed
178796affcde22a675e3629b9da490bb45a0ab07fa2breedstatic int lpicture_height(lua_State* L) {
178896affcde22a675e3629b9da490bb45a0ab07fa2breed    lua_pushnumber(L, get_ref<SkPicture>(L, 1)->cullRect().height());
178996affcde22a675e3629b9da490bb45a0ab07fa2breed    return 1;
179096affcde22a675e3629b9da490bb45a0ab07fa2breed}
179196affcde22a675e3629b9da490bb45a0ab07fa2breed
179296affcde22a675e3629b9da490bb45a0ab07fa2breedstatic int lpicture_gc(lua_State* L) {
179396affcde22a675e3629b9da490bb45a0ab07fa2breed    get_ref<SkPicture>(L, 1)->unref();
179496affcde22a675e3629b9da490bb45a0ab07fa2breed    return 0;
179596affcde22a675e3629b9da490bb45a0ab07fa2breed}
179696affcde22a675e3629b9da490bb45a0ab07fa2breed
179796affcde22a675e3629b9da490bb45a0ab07fa2breedstatic const struct luaL_Reg gSkPicture_Methods[] = {
179896affcde22a675e3629b9da490bb45a0ab07fa2breed    { "width", lpicture_width },
179996affcde22a675e3629b9da490bb45a0ab07fa2breed    { "height", lpicture_height },
180096affcde22a675e3629b9da490bb45a0ab07fa2breed    { "__gc", lpicture_gc },
180196affcde22a675e3629b9da490bb45a0ab07fa2breed    { NULL, NULL }
180296affcde22a675e3629b9da490bb45a0ab07fa2breed};
180396affcde22a675e3629b9da490bb45a0ab07fa2breed
180496affcde22a675e3629b9da490bb45a0ab07fa2breed///////////////////////////////////////////////////////////////////////////////
180596affcde22a675e3629b9da490bb45a0ab07fa2breed
18061b6ab4417e0edef3b91d150e6650205f49f04d17reedstatic int ltextblob_bounds(lua_State* L) {
18071b6ab4417e0edef3b91d150e6650205f49f04d17reed    SkLua(L).pushRect(get_ref<SkTextBlob>(L, 1)->bounds());
18081b6ab4417e0edef3b91d150e6650205f49f04d17reed    return 1;
18091b6ab4417e0edef3b91d150e6650205f49f04d17reed}
18101b6ab4417e0edef3b91d150e6650205f49f04d17reed
18111b6ab4417e0edef3b91d150e6650205f49f04d17reedstatic int ltextblob_gc(lua_State* L) {
18121b6ab4417e0edef3b91d150e6650205f49f04d17reed    SkSafeUnref(get_ref<SkTextBlob>(L, 1));
18131b6ab4417e0edef3b91d150e6650205f49f04d17reed    return 0;
18141b6ab4417e0edef3b91d150e6650205f49f04d17reed}
18151b6ab4417e0edef3b91d150e6650205f49f04d17reed
18161b6ab4417e0edef3b91d150e6650205f49f04d17reedstatic const struct luaL_Reg gSkTextBlob_Methods[] = {
18171b6ab4417e0edef3b91d150e6650205f49f04d17reed    { "bounds", ltextblob_bounds },
18181b6ab4417e0edef3b91d150e6650205f49f04d17reed    { "__gc", ltextblob_gc },
18191b6ab4417e0edef3b91d150e6650205f49f04d17reed    { NULL, NULL }
18201b6ab4417e0edef3b91d150e6650205f49f04d17reed};
18211b6ab4417e0edef3b91d150e6650205f49f04d17reed
18221b6ab4417e0edef3b91d150e6650205f49f04d17reed///////////////////////////////////////////////////////////////////////////////
18231b6ab4417e0edef3b91d150e6650205f49f04d17reed
182436c9c11ed97d6c6f49bfdad53537a459b9e4b41dreedstatic int ltypeface_getFamilyName(lua_State* L) {
182536c9c11ed97d6c6f49bfdad53537a459b9e4b41dreed    SkString str;
182636c9c11ed97d6c6f49bfdad53537a459b9e4b41dreed    get_ref<SkTypeface>(L, 1)->getFamilyName(&str);
182736c9c11ed97d6c6f49bfdad53537a459b9e4b41dreed    lua_pushstring(L, str.c_str());
182836c9c11ed97d6c6f49bfdad53537a459b9e4b41dreed    return 1;
182936c9c11ed97d6c6f49bfdad53537a459b9e4b41dreed}
183036c9c11ed97d6c6f49bfdad53537a459b9e4b41dreed
183136c9c11ed97d6c6f49bfdad53537a459b9e4b41dreedstatic int ltypeface_getStyle(lua_State* L) {
183236c9c11ed97d6c6f49bfdad53537a459b9e4b41dreed    lua_pushnumber(L, (double)get_ref<SkTypeface>(L, 1)->style());
183336c9c11ed97d6c6f49bfdad53537a459b9e4b41dreed    return 1;
183436c9c11ed97d6c6f49bfdad53537a459b9e4b41dreed}
183536c9c11ed97d6c6f49bfdad53537a459b9e4b41dreed
1836e6469f10c8f9340032797316fd06ee2f109255ffmike@reedtribe.orgstatic int ltypeface_gc(lua_State* L) {
183777887af13f1f0a2e349155f74e6b5ded6aafe179commit-bot@chromium.org    SkSafeUnref(get_ref<SkTypeface>(L, 1));
1838e6469f10c8f9340032797316fd06ee2f109255ffmike@reedtribe.org    return 0;
1839e6469f10c8f9340032797316fd06ee2f109255ffmike@reedtribe.org}
1840e6469f10c8f9340032797316fd06ee2f109255ffmike@reedtribe.org
1841e6469f10c8f9340032797316fd06ee2f109255ffmike@reedtribe.orgstatic const struct luaL_Reg gSkTypeface_Methods[] = {
184236c9c11ed97d6c6f49bfdad53537a459b9e4b41dreed    { "getFamilyName", ltypeface_getFamilyName },
184336c9c11ed97d6c6f49bfdad53537a459b9e4b41dreed    { "getStyle", ltypeface_getStyle },
1844e6469f10c8f9340032797316fd06ee2f109255ffmike@reedtribe.org    { "__gc", ltypeface_gc },
1845e6469f10c8f9340032797316fd06ee2f109255ffmike@reedtribe.org    { NULL, NULL }
1846e6469f10c8f9340032797316fd06ee2f109255ffmike@reedtribe.org};
1847e6469f10c8f9340032797316fd06ee2f109255ffmike@reedtribe.org
1848e6469f10c8f9340032797316fd06ee2f109255ffmike@reedtribe.org///////////////////////////////////////////////////////////////////////////////
1849e6469f10c8f9340032797316fd06ee2f109255ffmike@reedtribe.org
185074ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.comclass AutoCallLua {
185174ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.compublic:
185274ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com    AutoCallLua(lua_State* L, const char func[], const char verb[]) : fL(L) {
185374ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com        lua_getglobal(L, func);
185474ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com        if (!lua_isfunction(L, -1)) {
185574ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com            int t = lua_type(L, -1);
185674ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com            SkDebugf("--- expected function %d\n", t);
185774ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com        }
18582d816ad36e806e5b1cf3c447e547829bbbe74fd1skia.committer@gmail.com
185974ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com        lua_newtable(L);
186074ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com        setfield_string(L, "verb", verb);
186174ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com    }
18622d816ad36e806e5b1cf3c447e547829bbbe74fd1skia.committer@gmail.com
186374ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com    ~AutoCallLua() {
186474ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com        if (lua_pcall(fL, 1, 0, 0) != LUA_OK) {
186574ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com            SkDebugf("lua err: %s\n", lua_tostring(fL, -1));
186674ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com        }
186774ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com        lua_settop(fL, -1);
186874ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com    }
18692d816ad36e806e5b1cf3c447e547829bbbe74fd1skia.committer@gmail.com
187074ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.comprivate:
187174ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com    lua_State* fL;
187274ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com};
187374ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com
187474ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com#define AUTO_LUA(verb)  AutoCallLua acl(fL, fFunc.c_str(), verb)
187574ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com
187674ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com///////////////////////////////////////////////////////////////////////////////
187774ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com
1878fb858245216dafee4de731fce4f0fa58c746d3e9mike@reedtribe.orgstatic int lsk_newDocumentPDF(lua_State* L) {
1879fb858245216dafee4de731fce4f0fa58c746d3e9mike@reedtribe.org    const char* file = NULL;
1880fb858245216dafee4de731fce4f0fa58c746d3e9mike@reedtribe.org    if (lua_gettop(L) > 0 && lua_isstring(L, 1)) {
1881fb858245216dafee4de731fce4f0fa58c746d3e9mike@reedtribe.org        file = lua_tolstring(L, 1, NULL);
1882fb858245216dafee4de731fce4f0fa58c746d3e9mike@reedtribe.org    }
1883fb858245216dafee4de731fce4f0fa58c746d3e9mike@reedtribe.org
1884fb858245216dafee4de731fce4f0fa58c746d3e9mike@reedtribe.org    SkDocument* doc = SkDocument::CreatePDF(file);
1885fb858245216dafee4de731fce4f0fa58c746d3e9mike@reedtribe.org    if (NULL == doc) {
1886fb858245216dafee4de731fce4f0fa58c746d3e9mike@reedtribe.org        // do I need to push a nil on the stack and return 1?
1887fb858245216dafee4de731fce4f0fa58c746d3e9mike@reedtribe.org        return 0;
1888fb858245216dafee4de731fce4f0fa58c746d3e9mike@reedtribe.org    } else {
18899fbc3f31c0c7095f4f25ad3d2d17731bb63c0817reed        push_ref(L, doc)->unref();
1890fb858245216dafee4de731fce4f0fa58c746d3e9mike@reedtribe.org        return 1;
1891fb858245216dafee4de731fce4f0fa58c746d3e9mike@reedtribe.org    }
1892fb858245216dafee4de731fce4f0fa58c746d3e9mike@reedtribe.org}
1893fb858245216dafee4de731fce4f0fa58c746d3e9mike@reedtribe.org
1894468b1815d29d9bbe513f2d8eb4afc0b066715b52reedstatic int lsk_newBlurImageFilter(lua_State* L) {
1895468b1815d29d9bbe513f2d8eb4afc0b066715b52reed    SkScalar sigmaX = lua2scalar_def(L, 1, 0);
1896468b1815d29d9bbe513f2d8eb4afc0b066715b52reed    SkScalar sigmaY = lua2scalar_def(L, 2, 0);
1897468b1815d29d9bbe513f2d8eb4afc0b066715b52reed    SkImageFilter* imf = SkBlurImageFilter::Create(sigmaX, sigmaY);
1898468b1815d29d9bbe513f2d8eb4afc0b066715b52reed    if (NULL == imf) {
1899468b1815d29d9bbe513f2d8eb4afc0b066715b52reed        lua_pushnil(L);
1900468b1815d29d9bbe513f2d8eb4afc0b066715b52reed    } else {
19019fbc3f31c0c7095f4f25ad3d2d17731bb63c0817reed        push_ref(L, imf)->unref();
19029fbc3f31c0c7095f4f25ad3d2d17731bb63c0817reed    }
19039fbc3f31c0c7095f4f25ad3d2d17731bb63c0817reed    return 1;
19049fbc3f31c0c7095f4f25ad3d2d17731bb63c0817reed}
19059fbc3f31c0c7095f4f25ad3d2d17731bb63c0817reed
19069fbc3f31c0c7095f4f25ad3d2d17731bb63c0817reedstatic int lsk_newLinearGradient(lua_State* L) {
19079fbc3f31c0c7095f4f25ad3d2d17731bb63c0817reed    SkScalar x0 = lua2scalar_def(L, 1, 0);
19089fbc3f31c0c7095f4f25ad3d2d17731bb63c0817reed    SkScalar y0 = lua2scalar_def(L, 2, 0);
19099fbc3f31c0c7095f4f25ad3d2d17731bb63c0817reed    SkColor  c0 = lua2color(L, 3);
19109fbc3f31c0c7095f4f25ad3d2d17731bb63c0817reed    SkScalar x1 = lua2scalar_def(L, 4, 0);
19119fbc3f31c0c7095f4f25ad3d2d17731bb63c0817reed    SkScalar y1 = lua2scalar_def(L, 5, 0);
19129fbc3f31c0c7095f4f25ad3d2d17731bb63c0817reed    SkColor  c1 = lua2color(L, 6);
19139fbc3f31c0c7095f4f25ad3d2d17731bb63c0817reed
19149fbc3f31c0c7095f4f25ad3d2d17731bb63c0817reed    SkPoint pts[] = { { x0, y0 }, { x1, y1 } };
19159fbc3f31c0c7095f4f25ad3d2d17731bb63c0817reed    SkColor colors[] = { c0, c1 };
19169fbc3f31c0c7095f4f25ad3d2d17731bb63c0817reed    SkShader* s = SkGradientShader::CreateLinear(pts, colors, NULL, 2, SkShader::kClamp_TileMode);
19179fbc3f31c0c7095f4f25ad3d2d17731bb63c0817reed    if (NULL == s) {
19189fbc3f31c0c7095f4f25ad3d2d17731bb63c0817reed        lua_pushnil(L);
19199fbc3f31c0c7095f4f25ad3d2d17731bb63c0817reed    } else {
19209fbc3f31c0c7095f4f25ad3d2d17731bb63c0817reed        push_ref(L, s)->unref();
1921468b1815d29d9bbe513f2d8eb4afc0b066715b52reed    }
1922468b1815d29d9bbe513f2d8eb4afc0b066715b52reed    return 1;
1923468b1815d29d9bbe513f2d8eb4afc0b066715b52reed}
1924468b1815d29d9bbe513f2d8eb4afc0b066715b52reed
1925bdc49ae0d422b8fe1957af570c4f4e63272f5285reedstatic int lsk_newMatrix(lua_State* L) {
1926bdc49ae0d422b8fe1957af570c4f4e63272f5285reed    push_new<SkMatrix>(L)->reset();
1927bdc49ae0d422b8fe1957af570c4f4e63272f5285reed    return 1;
1928bdc49ae0d422b8fe1957af570c4f4e63272f5285reed}
1929bdc49ae0d422b8fe1957af570c4f4e63272f5285reed
19303597b73bc6e3e169f1d360de80d77e6e0ab65e96reed@google.comstatic int lsk_newPaint(lua_State* L) {
19313597b73bc6e3e169f1d360de80d77e6e0ab65e96reed@google.com    push_new<SkPaint>(L);
19323597b73bc6e3e169f1d360de80d77e6e0ab65e96reed@google.com    return 1;
19333597b73bc6e3e169f1d360de80d77e6e0ab65e96reed@google.com}
19343597b73bc6e3e169f1d360de80d77e6e0ab65e96reed@google.com
19353597b73bc6e3e169f1d360de80d77e6e0ab65e96reed@google.comstatic int lsk_newPath(lua_State* L) {
19363597b73bc6e3e169f1d360de80d77e6e0ab65e96reed@google.com    push_new<SkPath>(L);
19373597b73bc6e3e169f1d360de80d77e6e0ab65e96reed@google.com    return 1;
19383597b73bc6e3e169f1d360de80d77e6e0ab65e96reed@google.com}
19393597b73bc6e3e169f1d360de80d77e6e0ab65e96reed@google.com
194096affcde22a675e3629b9da490bb45a0ab07fa2breedstatic int lsk_newPictureRecorder(lua_State* L) {
194196affcde22a675e3629b9da490bb45a0ab07fa2breed    push_new<SkPictureRecorder>(L);
194296affcde22a675e3629b9da490bb45a0ab07fa2breed    return 1;
194396affcde22a675e3629b9da490bb45a0ab07fa2breed}
194496affcde22a675e3629b9da490bb45a0ab07fa2breed
19453597b73bc6e3e169f1d360de80d77e6e0ab65e96reed@google.comstatic int lsk_newRRect(lua_State* L) {
1946bdc49ae0d422b8fe1957af570c4f4e63272f5285reed    push_new<SkRRect>(L)->setEmpty();
19473597b73bc6e3e169f1d360de80d77e6e0ab65e96reed@google.com    return 1;
19483597b73bc6e3e169f1d360de80d77e6e0ab65e96reed@google.com}
19493597b73bc6e3e169f1d360de80d77e6e0ab65e96reed@google.com
19501b6ab4417e0edef3b91d150e6650205f49f04d17reed#include "SkTextBox.h"
19511b6ab4417e0edef3b91d150e6650205f49f04d17reed// Sk.newTextBlob(text, rect, paint)
19521b6ab4417e0edef3b91d150e6650205f49f04d17reedstatic int lsk_newTextBlob(lua_State* L) {
19531b6ab4417e0edef3b91d150e6650205f49f04d17reed    const char* text = lua_tolstring(L, 1, NULL);
19541b6ab4417e0edef3b91d150e6650205f49f04d17reed    SkRect bounds;
19551b6ab4417e0edef3b91d150e6650205f49f04d17reed    lua2rect(L, 2, &bounds);
19561b6ab4417e0edef3b91d150e6650205f49f04d17reed    const SkPaint& paint = *get_obj<SkPaint>(L, 3);
19571b6ab4417e0edef3b91d150e6650205f49f04d17reed
19581b6ab4417e0edef3b91d150e6650205f49f04d17reed    SkTextBox box;
19591b6ab4417e0edef3b91d150e6650205f49f04d17reed    box.setMode(SkTextBox::kLineBreak_Mode);
19601b6ab4417e0edef3b91d150e6650205f49f04d17reed    box.setBox(bounds);
19611b6ab4417e0edef3b91d150e6650205f49f04d17reed    box.setText(text, strlen(text), paint);
19621b6ab4417e0edef3b91d150e6650205f49f04d17reed
19631b6ab4417e0edef3b91d150e6650205f49f04d17reed    SkScalar newBottom;
19641b6ab4417e0edef3b91d150e6650205f49f04d17reed    SkAutoTUnref<SkTextBlob> blob(box.snapshotTextBlob(&newBottom));
19651b6ab4417e0edef3b91d150e6650205f49f04d17reed    push_ref<SkTextBlob>(L, blob);
19661b6ab4417e0edef3b91d150e6650205f49f04d17reed    SkLua(L).pushScalar(newBottom);
19671b6ab4417e0edef3b91d150e6650205f49f04d17reed    return 2;
19681b6ab4417e0edef3b91d150e6650205f49f04d17reed}
19691b6ab4417e0edef3b91d150e6650205f49f04d17reed
1970e6469f10c8f9340032797316fd06ee2f109255ffmike@reedtribe.orgstatic int lsk_newTypeface(lua_State* L) {
1971e6469f10c8f9340032797316fd06ee2f109255ffmike@reedtribe.org    const char* name = NULL;
1972e6469f10c8f9340032797316fd06ee2f109255ffmike@reedtribe.org    int style = SkTypeface::kNormal;
19736319367bdcbf5e5050632ab97973f5035d0dd8faskia.committer@gmail.com
1974e6469f10c8f9340032797316fd06ee2f109255ffmike@reedtribe.org    int count = lua_gettop(L);
1975e6469f10c8f9340032797316fd06ee2f109255ffmike@reedtribe.org    if (count > 0 && lua_isstring(L, 1)) {
1976e6469f10c8f9340032797316fd06ee2f109255ffmike@reedtribe.org        name = lua_tolstring(L, 1, NULL);
1977e6469f10c8f9340032797316fd06ee2f109255ffmike@reedtribe.org        if (count > 1 && lua_isnumber(L, 2)) {
1978e6469f10c8f9340032797316fd06ee2f109255ffmike@reedtribe.org            style = lua_tointegerx(L, 2, NULL) & SkTypeface::kBoldItalic;
1979e6469f10c8f9340032797316fd06ee2f109255ffmike@reedtribe.org        }
1980e6469f10c8f9340032797316fd06ee2f109255ffmike@reedtribe.org    }
1981e6469f10c8f9340032797316fd06ee2f109255ffmike@reedtribe.org
1982e6469f10c8f9340032797316fd06ee2f109255ffmike@reedtribe.org    SkTypeface* face = SkTypeface::CreateFromName(name,
1983e6469f10c8f9340032797316fd06ee2f109255ffmike@reedtribe.org                                                  (SkTypeface::Style)style);
1984e6469f10c8f9340032797316fd06ee2f109255ffmike@reedtribe.org//    SkDebugf("---- name <%s> style=%d, face=%p ref=%d\n", name, style, face, face->getRefCnt());
1985e6469f10c8f9340032797316fd06ee2f109255ffmike@reedtribe.org    if (NULL == face) {
1986e6469f10c8f9340032797316fd06ee2f109255ffmike@reedtribe.org        face = SkTypeface::RefDefault();
1987e6469f10c8f9340032797316fd06ee2f109255ffmike@reedtribe.org    }
19889fbc3f31c0c7095f4f25ad3d2d17731bb63c0817reed    push_ref(L, face)->unref();
1989e6469f10c8f9340032797316fd06ee2f109255ffmike@reedtribe.org    return 1;
1990e6469f10c8f9340032797316fd06ee2f109255ffmike@reedtribe.org}
19913597b73bc6e3e169f1d360de80d77e6e0ab65e96reed@google.com
1992485557f95d7a4b04536c0c5f01fad5f9744531dareedstatic int lsk_newRasterSurface(lua_State* L) {
19937b8646669f5b1e2daddf53764bcde62d743ff076reed    int width = lua2int_def(L, 1, 0);
1994485557f95d7a4b04536c0c5f01fad5f9744531dareed    int height = lua2int_def(L, 2, 0);
1995485557f95d7a4b04536c0c5f01fad5f9744531dareed    SkImageInfo info = SkImageInfo::MakeN32Premul(width, height);
1996485557f95d7a4b04536c0c5f01fad5f9744531dareed    SkSurface* surface = SkSurface::NewRaster(info);
1997485557f95d7a4b04536c0c5f01fad5f9744531dareed    if (NULL == surface) {
1998485557f95d7a4b04536c0c5f01fad5f9744531dareed        lua_pushnil(L);
1999485557f95d7a4b04536c0c5f01fad5f9744531dareed    } else {
20009fbc3f31c0c7095f4f25ad3d2d17731bb63c0817reed        push_ref(L, surface)->unref();
2001485557f95d7a4b04536c0c5f01fad5f9744531dareed    }
2002485557f95d7a4b04536c0c5f01fad5f9744531dareed    return 1;
2003485557f95d7a4b04536c0c5f01fad5f9744531dareed}
2004485557f95d7a4b04536c0c5f01fad5f9744531dareed
2005792bbd14c63f217f2de0e6b2f8df99acb1928eeamike@reedtribe.orgstatic int lsk_loadImage(lua_State* L) {
2006792bbd14c63f217f2de0e6b2f8df99acb1928eeamike@reedtribe.org    if (lua_gettop(L) > 0 && lua_isstring(L, 1)) {
2007792bbd14c63f217f2de0e6b2f8df99acb1928eeamike@reedtribe.org        const char* name = lua_tolstring(L, 1, NULL);
2008792bbd14c63f217f2de0e6b2f8df99acb1928eeamike@reedtribe.org        SkAutoDataUnref data(SkData::NewFromFileName(name));
2009792bbd14c63f217f2de0e6b2f8df99acb1928eeamike@reedtribe.org        if (data.get()) {
20105965c8ae4ee960275da4bc40189bdba85aab8b5ereed            SkImage* image = SkImage::NewFromData(data);
2011792bbd14c63f217f2de0e6b2f8df99acb1928eeamike@reedtribe.org            if (image) {
20129fbc3f31c0c7095f4f25ad3d2d17731bb63c0817reed                push_ref(L, image)->unref();
2013792bbd14c63f217f2de0e6b2f8df99acb1928eeamike@reedtribe.org                return 1;
2014792bbd14c63f217f2de0e6b2f8df99acb1928eeamike@reedtribe.org            }
2015792bbd14c63f217f2de0e6b2f8df99acb1928eeamike@reedtribe.org        }
2016792bbd14c63f217f2de0e6b2f8df99acb1928eeamike@reedtribe.org    }
2017792bbd14c63f217f2de0e6b2f8df99acb1928eeamike@reedtribe.org    return 0;
2018792bbd14c63f217f2de0e6b2f8df99acb1928eeamike@reedtribe.org}
2019792bbd14c63f217f2de0e6b2f8df99acb1928eeamike@reedtribe.org
20203597b73bc6e3e169f1d360de80d77e6e0ab65e96reed@google.comstatic void register_Sk(lua_State* L) {
20213597b73bc6e3e169f1d360de80d77e6e0ab65e96reed@google.com    lua_newtable(L);
20223597b73bc6e3e169f1d360de80d77e6e0ab65e96reed@google.com    lua_pushvalue(L, -1);
20233597b73bc6e3e169f1d360de80d77e6e0ab65e96reed@google.com    lua_setglobal(L, "Sk");
20243597b73bc6e3e169f1d360de80d77e6e0ab65e96reed@google.com    // the Sk table is still on top
20253597b73bc6e3e169f1d360de80d77e6e0ab65e96reed@google.com
2026fb858245216dafee4de731fce4f0fa58c746d3e9mike@reedtribe.org    setfield_function(L, "newDocumentPDF", lsk_newDocumentPDF);
2027792bbd14c63f217f2de0e6b2f8df99acb1928eeamike@reedtribe.org    setfield_function(L, "loadImage", lsk_loadImage);
2028468b1815d29d9bbe513f2d8eb4afc0b066715b52reed    setfield_function(L, "newBlurImageFilter", lsk_newBlurImageFilter);
20299fbc3f31c0c7095f4f25ad3d2d17731bb63c0817reed    setfield_function(L, "newLinearGradient", lsk_newLinearGradient);
2030bdc49ae0d422b8fe1957af570c4f4e63272f5285reed    setfield_function(L, "newMatrix", lsk_newMatrix);
20313597b73bc6e3e169f1d360de80d77e6e0ab65e96reed@google.com    setfield_function(L, "newPaint", lsk_newPaint);
20323597b73bc6e3e169f1d360de80d77e6e0ab65e96reed@google.com    setfield_function(L, "newPath", lsk_newPath);
203396affcde22a675e3629b9da490bb45a0ab07fa2breed    setfield_function(L, "newPictureRecorder", lsk_newPictureRecorder);
20343597b73bc6e3e169f1d360de80d77e6e0ab65e96reed@google.com    setfield_function(L, "newRRect", lsk_newRRect);
2035485557f95d7a4b04536c0c5f01fad5f9744531dareed    setfield_function(L, "newRasterSurface", lsk_newRasterSurface);
20361b6ab4417e0edef3b91d150e6650205f49f04d17reed    setfield_function(L, "newTextBlob", lsk_newTextBlob);
2037e6469f10c8f9340032797316fd06ee2f109255ffmike@reedtribe.org    setfield_function(L, "newTypeface", lsk_newTypeface);
20383597b73bc6e3e169f1d360de80d77e6e0ab65e96reed@google.com    lua_pop(L, 1);  // pop off the Sk table
20393597b73bc6e3e169f1d360de80d77e6e0ab65e96reed@google.com}
20403597b73bc6e3e169f1d360de80d77e6e0ab65e96reed@google.com
204174ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com#define REG_CLASS(L, C)                             \
204274ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com    do {                                            \
20433597b73bc6e3e169f1d360de80d77e6e0ab65e96reed@google.com        luaL_newmetatable(L, get_mtname<C>());      \
204474ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com        lua_pushvalue(L, -1);                       \
204574ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com        lua_setfield(L, -2, "__index");             \
204674ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com        luaL_setfuncs(L, g##C##_Methods, 0);        \
204774ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com        lua_pop(L, 1); /* pop off the meta-table */ \
204874ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com    } while (0)
204974ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com
205074ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.comvoid SkLua::Load(lua_State* L) {
20513597b73bc6e3e169f1d360de80d77e6e0ab65e96reed@google.com    register_Sk(L);
205274ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com    REG_CLASS(L, SkCanvas);
2053fb858245216dafee4de731fce4f0fa58c746d3e9mike@reedtribe.org    REG_CLASS(L, SkDocument);
2054792bbd14c63f217f2de0e6b2f8df99acb1928eeamike@reedtribe.org    REG_CLASS(L, SkImage);
2055468b1815d29d9bbe513f2d8eb4afc0b066715b52reed    REG_CLASS(L, SkImageFilter);
20561b6ab4417e0edef3b91d150e6650205f49f04d17reed    REG_CLASS(L, SkMatrix);
205774ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com    REG_CLASS(L, SkPaint);
20581301bf3abfe355f9aadd53d5dbf04926013231bacommit-bot@chromium.org    REG_CLASS(L, SkPath);
20591301bf3abfe355f9aadd53d5dbf04926013231bacommit-bot@chromium.org    REG_CLASS(L, SkPathEffect);
206096affcde22a675e3629b9da490bb45a0ab07fa2breed    REG_CLASS(L, SkPicture);
206196affcde22a675e3629b9da490bb45a0ab07fa2breed    REG_CLASS(L, SkPictureRecorder);
206274ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com    REG_CLASS(L, SkRRect);
20635fdc983f58098e5c9fbdbedc7719f87e5efa4d31reed@google.com    REG_CLASS(L, SkShader);
2064485557f95d7a4b04536c0c5f01fad5f9744531dareed    REG_CLASS(L, SkSurface);
20651b6ab4417e0edef3b91d150e6650205f49f04d17reed    REG_CLASS(L, SkTextBlob);
2066e6469f10c8f9340032797316fd06ee2f109255ffmike@reedtribe.org    REG_CLASS(L, SkTypeface);
206774ce6f046c8c8990172cebcfa830c8e5f5e42a1ereed@google.com}
206828c27c8b795db712c76d79b8cd62b3626ac148eczachr@google.com
20697bce9988af2e3dfc384ebc8655d0eb3d08fad4d2reed@google.comextern "C" int luaopen_skia(lua_State* L);
207028c27c8b795db712c76d79b8cd62b3626ac148eczachr@google.comextern "C" int luaopen_skia(lua_State* L) {
207128c27c8b795db712c76d79b8cd62b3626ac148eczachr@google.com    SkLua::Load(L);
207228c27c8b795db712c76d79b8cd62b3626ac148eczachr@google.com    return 0;
207328c27c8b795db712c76d79b8cd62b3626ac148eczachr@google.com}
2074