add SkLuaCanvas

add lua 5.2 to third_party

BUG=
R=bungeman@google.com

Review URL: https://codereview.chromium.org/14907017

git-svn-id: http://skia.googlecode.com/svn/trunk@9149 2bbb7eff-a529-9590-31e7-b0007b416f81
diff --git a/tools/lua/lua_pictures.cpp b/tools/lua/lua_pictures.cpp
new file mode 100644
index 0000000..2d5fe46
--- /dev/null
+++ b/tools/lua/lua_pictures.cpp
@@ -0,0 +1,153 @@
+/*
+ * Copyright 2013 Google Inc.
+ *
+ * Use of this source code is governed by a BSD-style license that can be
+ * found in the LICENSE file.
+ */
+
+#include "SkLuaCanvas.h"
+#include "SkPicture.h"
+#include "SkCommandLineFlags.h"
+#include "SkGraphics.h"
+#include "SkStream.h"
+#include "SkData.h"
+#include "picture_utils.h"
+#include "SkOSFile.h"
+#include "SkImageDecoder.h"
+
+extern "C" {
+    #include "lua.h"
+    #include "lualib.h"
+    #include "lauxlib.h"
+}
+
+// PictureRenderingFlags.cpp
+extern bool lazy_decode_bitmap(const void* buffer, size_t size, SkBitmap*);
+
+
+// Flags used by this file, alphabetically:
+DEFINE_string2(skpPath, r, "", "Read .skp files from this dir");
+DEFINE_string2(luaFile, l, "", "File containing lua script to run");
+
+static SkPicture* load_picture(const char path[]) {
+    SkAutoTUnref<SkStream> stream(SkStream::NewFromFile(path));
+    SkPicture* pic = NULL;
+    if (stream.get()) {
+        bool success;
+        pic = SkNEW_ARGS(SkPicture, (stream.get(), &success,
+                                     &lazy_decode_bitmap));
+        if (!success) {
+            SkDELETE(pic);
+            pic = NULL;
+        }
+    }
+    return pic;
+}
+
+static SkData* read_into_data(const char file[]) {
+    SkAutoTUnref<SkStream> stream(SkStream::NewFromFile(file));
+    if (!stream.get()) {
+        return SkData::NewEmpty();
+    }
+    size_t len = stream->getLength();
+    void* buffer = sk_malloc_throw(len);
+    stream->read(buffer, len);
+    return SkData::NewFromMalloc(buffer, len);
+}
+
+class SkAutoLua {
+public:
+    SkAutoLua(const char termCode[] = NULL) : fTermCode(termCode) {
+        fL = luaL_newstate();
+        luaL_openlibs(fL);
+    }
+    ~SkAutoLua() {
+        if (fTermCode.size() > 0) {
+            lua_getglobal(fL, fTermCode.c_str());
+            if (lua_pcall(fL, 0, 0, 0) != LUA_OK) {
+                SkDebugf("lua err: %s\n", lua_tostring(fL, -1));
+            }
+        }
+        lua_close(fL);
+    }
+    
+    lua_State* get() const { return fL; }
+    lua_State* operator*() const { return fL; }
+    lua_State* operator->() const { return fL; }
+    
+    bool load(const char code[]) {
+        int err = luaL_loadstring(fL, code) || lua_pcall(fL, 0, 0, 0);
+        if (err) {
+            SkDebugf("--- lua failed\n");
+            return false;
+        }
+        return true;
+    }
+    bool load(const void* code, size_t size) {
+        SkString str((const char*)code, size);
+        return load(str.c_str());
+        int err = luaL_loadbufferx(fL, (const char*)code, size, NULL, NULL)
+               || lua_pcall(fL, 0, 0, 0);
+        if (err) {
+            SkDebugf("--- lua failed\n");
+            return false;
+        }
+        return true;
+    }
+private:
+    lua_State* fL;
+    SkString   fTermCode;
+};
+
+int tool_main(int argc, char** argv);
+int tool_main(int argc, char** argv) {
+    SkCommandLineFlags::SetUsage("apply lua script to .skp files.");
+    SkCommandLineFlags::Parse(argc, argv);
+
+    if (FLAGS_skpPath.isEmpty()) {
+        SkDebugf(".skp files or directories are required.\n");
+        exit(-1);
+    }
+    if (FLAGS_luaFile.isEmpty()) {
+        SkDebugf("missing luaFile\n");
+        exit(-1);
+    }
+
+    SkAutoDataUnref data(read_into_data(FLAGS_luaFile[0]));
+
+    SkAutoGraphics ag;
+    SkAutoLua L("summarize");
+    if (!L.load(data->data(), data->size())) {
+        SkDebugf("failed to load luaFile %s\n", FLAGS_luaFile[0]);
+        exit(-1);
+    }
+
+    for (int i = 0; i < FLAGS_skpPath.count(); i ++) {
+        SkOSFile::Iter iter(FLAGS_skpPath[i], "skp");
+        SkString inputFilename;
+
+        while (iter.next(&inputFilename)) {
+            SkString inputPath;
+            SkString inputAsSkString(FLAGS_skpPath[i]);
+            sk_tools::make_filepath(&inputPath, inputAsSkString, inputFilename);
+            
+            const char* path = inputPath.c_str();
+            SkAutoTUnref<SkPicture> pic(load_picture(path));
+
+            if (pic.get()) {
+                SkDebugf("scraping %s\n", path);
+                SkLuaCanvas canvas(pic->width(), pic->height(), L.get(), "accumulate");
+                canvas.drawPicture(*pic);
+            } else {
+                SkDebugf("failed to load %s\n", path);
+            }
+        }
+    }
+    return 0;
+}
+
+#if !defined SK_BUILD_FOR_IOS
+int main(int argc, char * const argv[]) {
+    return tool_main(argc, (char**) argv);
+}
+#endif
diff --git a/tools/lua/scrape.lua b/tools/lua/scrape.lua
new file mode 100644
index 0000000..1d9cda9
--- /dev/null
+++ b/tools/lua/scrape.lua
@@ -0,0 +1,15 @@
+canvas = {}
+total = 0
+function accumulate(verb)
+  total = total + 1
+  n = canvas[verb] or 0
+  n = n + 1
+  canvas[verb] = n
+end
+function summarize()
+  io.write('total='..total..' ')
+  for k, v in next, canvas do
+    io.write(k..'='..v..' ')
+  end
+end
+