| Index: tools/lua/lua_pictures.cpp | 
| diff --git a/tools/lua/lua_pictures.cpp b/tools/lua/lua_pictures.cpp | 
| new file mode 100644 | 
| index 0000000000000000000000000000000000000000..2d5fe46675a42ddc2919054af4554b311b36293b | 
| --- /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 | 
|  |