1function tostr(t)
2    local str = ""
3    for k, v in next, t do
4        if #str > 0 then
5            str = str .. ", "
6        end
7        if type(k) == "number" then
8            str = str .. "[" .. k .. "] = "
9        else
10            str = str .. tostring(k) .. " = "
11        end
12        if type(v) == "table" then
13            str = str .. "{ " .. tostr(v) .. " }"
14        else
15            str = str .. tostring(v)
16        end
17    end
18    return str
19end
20
21local total = {}    -- accumulate() stores its data in here
22local canvas        -- holds the current canvas (from startcanvas())
23
24--[[
25    startcanvas() is called at the start of each picture file, passing the
26    canvas that we will be drawing into, and the name of the file.
27    
28    Following this call, there will be some number of calls to accumulate(t)
29    where t is a table of parameters that were passed to that draw-op.
30    
31        t.verb is a string holding the name of the draw-op (e.g. "drawRect")
32    
33    when a given picture is done, we call endcanvas(canvas, fileName)
34]]
35function sk_scrape_startcanvas(c, fileName)
36    canvas = c
37end
38
39--[[
40    Called when the current canvas is done drawing.
41]]
42function sk_scrape_endcanvas(c, fileName)
43    canvas = nil
44end
45
46--[[
47    Called with the parameters to each canvas.draw call, where canvas is the
48    current canvas as set by startcanvas()
49]]
50function sk_scrape_accumulate(t)
51    local n = total[t.verb] or 0
52    total[t.verb] = n + 1
53
54    if false and t.verb == "drawRect" and t.paint:isAntiAlias() then
55        local r = t.rect;
56        local p = t.paint;
57        local c = p:getColor();
58        print("drawRect ", tostr(r), tostr(c), "\n")
59    end
60
61    if false and t.verb == "drawPath" then
62        local pred, r1, r2, d1, d2 = t.path:isNestedRects()
63        
64        if pred then
65            print("drawRect_Nested", tostr(r1), tostr(r2), d1, d2)
66        else
67            print("drawPath", "isEmpty", tostring(t.path:isEmpty()),
68                    "isRect", tostring(t.path:isRect()), tostr(t.path:getBounds()))
69        end
70    end
71end
72
73--[[
74    lua_pictures will call this function after all of the pictures have been
75    "accumulated".
76]]
77function sk_scrape_summarize()
78    io.write("\n{ ", tostr(total), " }\n")
79end
80
81