add script to scrape glyph usage in drawText calls

git-svn-id: http://skia.googlecode.com/svn/trunk@9353 2bbb7eff-a529-9590-31e7-b0007b416f81
diff --git a/src/utils/SkLua.cpp b/src/utils/SkLua.cpp
index 9aef50e..bd453e3 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 @@
     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 @@
     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 @@
     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 @@
     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 @@
     { "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 d3ecd74..1299a0e 100644
--- a/src/utils/SkLuaCanvas.cpp
+++ b/src/utils/SkLuaCanvas.cpp
@@ -34,12 +34,36 @@
         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::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 @@
                                  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 @@
                                    const SkPaint& paint) {
     AUTO_LUA("drawTextOnPath");
     lua.pushPath(path, "path");
+    lua.pushEncodedText(paint.getTextEncoding(), text, byteLength);
     lua.pushPaint(paint, "paint");
 }