diff options
author | reed@google.com <reed@google.com@2bbb7eff-a529-9590-31e7-b0007b416f81> | 2013-05-15 19:34:20 +0000 |
---|---|---|
committer | reed@google.com <reed@google.com@2bbb7eff-a529-9590-31e7-b0007b416f81> | 2013-05-15 19:34:20 +0000 |
commit | dff7e11c2000d6745261de046d76b1500a05ece9 (patch) | |
tree | 5d49340cf544bccaad31c91720a4cb5d7a679e1a /tools/lua | |
parent | 9da0e1de1d0615038e27fc894d1fcc44562cecf5 (diff) |
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
Diffstat (limited to 'tools/lua')
-rw-r--r-- | tools/lua/lua_pictures.cpp | 153 | ||||
-rw-r--r-- | tools/lua/scrape.lua | 15 |
2 files changed, 168 insertions, 0 deletions
diff --git a/tools/lua/lua_pictures.cpp b/tools/lua/lua_pictures.cpp new file mode 100644 index 0000000000..2d5fe46675 --- /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 0000000000..1d9cda91fe --- /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 + |