|  |  | 
|  | function sk_scrape_startcanvas(c, fileName) end | 
|  |  | 
|  | function sk_scrape_endcanvas(c, fileName) end | 
|  |  | 
|  | function classify_rrect(rrect) | 
|  | if (rrect:type() == "simple") then | 
|  | local x, y = rrect:radii(0) | 
|  | if (x == y) then | 
|  | return "simple_circle" | 
|  | else | 
|  | return "simple_oval" | 
|  | end | 
|  | elseif (rrect:type() == "complex") then | 
|  | local numNotSquare = 0 | 
|  | local rx, ry | 
|  | local same = true; | 
|  | local first_not_square_corner | 
|  | local last_not_square_corner | 
|  | for i = 1, 4 do | 
|  | local x, y = rrect:radii(i-1) | 
|  | if (x ~= 0 and y ~= 0) then | 
|  | if (numNotSquare == 0) then | 
|  | rx = x | 
|  | ry = y | 
|  | first_not_square_corner = i | 
|  | else | 
|  | last_not_square_corner = i | 
|  | if (rx ~= x or ry ~=y) then | 
|  | same = false | 
|  | end | 
|  | end | 
|  | numNotSquare = numNotSquare + 1 | 
|  | end | 
|  | end | 
|  | local numSquare = 4 - numNotSquare | 
|  | if (numSquare > 0 and same) then | 
|  | local corners = "corners" | 
|  | if (numSquare == 2) then | 
|  | if ((last_not_square_corner - 1 == first_not_square_corner) or | 
|  | (1 == first_not_square_corner and 4 == last_not_square_corner )) then | 
|  | corners = "adjacent_" .. corners | 
|  | else | 
|  | corners = "opposite_" .. corners | 
|  | end | 
|  | elseif (1 == numSquare) then | 
|  | corners = "corner" | 
|  | end | 
|  | if (rx == ry) then | 
|  | return "circles_with_" .. numSquare .. "_square_" .. corners | 
|  | else | 
|  | return "ovals_with_" .. numSquare .. "_square_" .. corners | 
|  | end | 
|  | end | 
|  | return "complex_unclassified" | 
|  | elseif (rrect:type() == "rect") then | 
|  | return "rect" | 
|  | elseif (rrect:type() == "oval") then | 
|  | local x, y = rrect:radii(0) | 
|  | if (x == y) then | 
|  | return "circle" | 
|  | else | 
|  | return "oval" | 
|  | end | 
|  | elseif (rrect:type() == "empty") then | 
|  | return "empty" | 
|  | else | 
|  | return "unknown" | 
|  | end | 
|  | end | 
|  |  | 
|  | function print_classes(class_table) | 
|  | function sort_classes(a, b) | 
|  | return a.count > b.count | 
|  | end | 
|  | array = {} | 
|  | for k, v in pairs(class_table) do | 
|  | if (type(v) == "number") then | 
|  | array[#array + 1] = {class = k, count = v}; | 
|  | end | 
|  | end | 
|  | table.sort(array, sort_classes) | 
|  | local i | 
|  | for i = 1, #array do | 
|  | io.write(array[i].class, ": ", array[i].count, " (", array[i].count/class_table["total"] * 100, "%)\n"); | 
|  | end | 
|  | end | 
|  |  | 
|  | function sk_scrape_accumulate(t) | 
|  | if (t.verb == "clipRRect") then | 
|  | local rrect = t.rrect | 
|  | table["total"] = (table["total"] or 0) + 1 | 
|  | local class = classify_rrect(rrect) | 
|  | table[class] = (table[class] or 0) + 1 | 
|  | end | 
|  | end | 
|  |  | 
|  | function sk_scrape_summarize() | 
|  | print_classes(table) | 
|  | --[[ To use the web scraper comment out the above call to print_classes, run the code below, | 
|  | and in the aggregator pass agg_table to print_classes. | 
|  | for k, v in pairs(table) do | 
|  | if (type(v) == "number") then | 
|  | local t = "agg_table[\"" .. k .. "\"]" | 
|  | io.write(t, " = (", t, " or 0) + ", table[k], "\n" ); | 
|  | end | 
|  | end | 
|  | --]] | 
|  | end |