diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/utils/SkLua.cpp | 46 | ||||
-rw-r--r-- | src/utils/SkLuaCanvas.cpp | 28 |
2 files changed, 74 insertions, 0 deletions
diff --git a/src/utils/SkLua.cpp b/src/utils/SkLua.cpp index 9aef50e98c..bd453e3d1b 100644 --- a/src/utils/SkLua.cpp +++ b/src/utils/SkLua.cpp @@ -12,6 +12,7 @@ #include "SkMatrix.h" #include "SkRRect.h" #include "SkString.h" +#include "SkTypeface.h" extern "C" { #include "lua.h" @@ -120,6 +121,11 @@ static void setfield_function(lua_State* L, lua_setfield(L, -2, key); } +static void setarray_number(lua_State* L, int index, double value) { + lua_pushnumber(L, value); + lua_rawseti(L, -2, index); +} + void SkLua::pushBool(bool value, const char key[]) { lua_pushboolean(fL, value); CHECK_SETFIELD(key); @@ -130,6 +136,13 @@ void SkLua::pushString(const char str[], const char key[]) { CHECK_SETFIELD(key); } +void SkLua::pushString(const char str[], size_t length, const char key[]) { + // TODO: how to do this w/o making a copy? + SkString s(str, length); + lua_pushstring(fL, s.c_str()); + CHECK_SETFIELD(key); +} + void SkLua::pushString(const SkString& str, const char key[]) { lua_pushstring(fL, str.c_str()); CHECK_SETFIELD(key); @@ -144,11 +157,25 @@ void SkLua::pushColor(SkColor color, const char key[]) { CHECK_SETFIELD(key); } +void SkLua::pushU32(uint32_t value, const char key[]) { + lua_pushnumber(fL, (double)value); + CHECK_SETFIELD(key); +} + void SkLua::pushScalar(SkScalar value, const char key[]) { lua_pushnumber(fL, SkScalarToLua(value)); CHECK_SETFIELD(key); } +void SkLua::pushArrayU16(const uint16_t array[], int count, const char key[]) { + lua_newtable(fL); + for (int i = 0; i < count; ++i) { + // make it base-1 to match lua convention + setarray_number(fL, i + 1, (double)array[i]); + } + CHECK_SETFIELD(key); +} + void SkLua::pushRect(const SkRect& r, const char key[]) { lua_newtable(fL); setfield_number(fL, "left", SkScalarToLua(r.fLeft)); @@ -314,6 +341,22 @@ static int lpaint_setColor(lua_State* L) { return 0; } +static int lpaint_getTextSize(lua_State* L) { + SkLua(L).pushScalar(get_obj<SkPaint>(L, 1)->getTextSize()); + return 1; +} + +static int lpaint_setTextSize(lua_State* L) { + get_obj<SkPaint>(L, 1)->setTextSize(lua2scalar(L, 2)); + return 0; +} + +static int lpaint_getFontID(lua_State* L) { + SkTypeface* face = get_obj<SkPaint>(L, 1)->getTypeface(); + SkLua(L).pushU32(SkTypeface::UniqueID(face)); + return 1; +} + static int lpaint_gc(lua_State* L) { get_obj<SkPaint>(L, 1)->~SkPaint(); return 0; @@ -324,6 +367,9 @@ static const struct luaL_Reg gSkPaint_Methods[] = { { "setAntiAlias", lpaint_setAntiAlias }, { "getColor", lpaint_getColor }, { "setColor", lpaint_setColor }, + { "getTextSize", lpaint_getTextSize }, + { "setTextSize", lpaint_setTextSize }, + { "getFontID", lpaint_getFontID }, { "__gc", lpaint_gc }, { NULL, NULL } }; diff --git a/src/utils/SkLuaCanvas.cpp b/src/utils/SkLuaCanvas.cpp index d3ecd74bb0..1299a0e251 100644 --- a/src/utils/SkLuaCanvas.cpp +++ b/src/utils/SkLuaCanvas.cpp @@ -34,12 +34,36 @@ public: lua_settop(L, -1); } + void pushEncodedText(SkPaint::TextEncoding, const void*, size_t); + private: typedef SkLua INHERITED; }; #define AUTO_LUA(verb) AutoCallLua lua(fL, fFunc.c_str(), verb) + +/////////////////////////////////////////////////////////////////////////////// + +void AutoCallLua::pushEncodedText(SkPaint::TextEncoding enc, const void* text, + size_t length) { + switch (enc) { + case SkPaint::kUTF8_TextEncoding: + this->pushString((const char*)text, length, "text"); + break; + case SkPaint::kUTF16_TextEncoding: { + SkString str; + str.setUTF16((const uint16_t*)text, length); + this->pushString(str, "text"); + } break; + case SkPaint::kGlyphID_TextEncoding: + this->pushArrayU16((const uint16_t*)text, length >> 1, "glyphs"); + break; + case SkPaint::kUTF32_TextEncoding: + break; + } +} + /////////////////////////////////////////////////////////////////////////////// void SkLuaCanvas::pushThis() { @@ -216,12 +240,14 @@ void SkLuaCanvas::drawSprite(const SkBitmap& bitmap, int x, int y, void SkLuaCanvas::drawText(const void* text, size_t byteLength, SkScalar x, SkScalar y, const SkPaint& paint) { AUTO_LUA("drawText"); + lua.pushEncodedText(paint.getTextEncoding(), text, byteLength); lua.pushPaint(paint, "paint"); } void SkLuaCanvas::drawPosText(const void* text, size_t byteLength, const SkPoint pos[], const SkPaint& paint) { AUTO_LUA("drawPosText"); + lua.pushEncodedText(paint.getTextEncoding(), text, byteLength); lua.pushPaint(paint, "paint"); } @@ -229,6 +255,7 @@ void SkLuaCanvas::drawPosTextH(const void* text, size_t byteLength, const SkScalar xpos[], SkScalar constY, const SkPaint& paint) { AUTO_LUA("drawPosTextH"); + lua.pushEncodedText(paint.getTextEncoding(), text, byteLength); lua.pushPaint(paint, "paint"); } @@ -237,6 +264,7 @@ void SkLuaCanvas::drawTextOnPath(const void* text, size_t byteLength, const SkPaint& paint) { AUTO_LUA("drawTextOnPath"); lua.pushPath(path, "path"); + lua.pushEncodedText(paint.getTextEncoding(), text, byteLength); lua.pushPaint(paint, "paint"); } |