diff options
author | commit-bot@chromium.org <commit-bot@chromium.org@2bbb7eff-a529-9590-31e7-b0007b416f81> | 2014-02-26 21:38:47 +0000 |
---|---|---|
committer | commit-bot@chromium.org <commit-bot@chromium.org@2bbb7eff-a529-9590-31e7-b0007b416f81> | 2014-02-26 21:38:47 +0000 |
commit | c530208ab02410df9efdabcfd50f42ec4c7fb750 (patch) | |
tree | 728074a76eafeb6c52ccbbf296deb58b8192e9a5 /tools/lua | |
parent | 5007aab81ad1394f4ab7833ea230f6462aa07e69 (diff) |
Add point count to lua SkPath.
Add some scripts for classifying rrects and counting complex clip combinations.
R=reed@google.com
Author: bsalomon@google.com
Review URL: https://codereview.chromium.org/181843004
git-svn-id: http://skia.googlecode.com/svn/trunk@13601 2bbb7eff-a529-9590-31e7-b0007b416f81
Diffstat (limited to 'tools/lua')
-rw-r--r-- | tools/lua/classify_rrect_clips.lua | 109 | ||||
-rw-r--r-- | tools/lua/count_reduced_clipstacks.lua | 87 |
2 files changed, 196 insertions, 0 deletions
diff --git a/tools/lua/classify_rrect_clips.lua b/tools/lua/classify_rrect_clips.lua new file mode 100644 index 0000000000..792d169ab3 --- /dev/null +++ b/tools/lua/classify_rrect_clips.lua @@ -0,0 +1,109 @@ + +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 diff --git a/tools/lua/count_reduced_clipstacks.lua b/tools/lua/count_reduced_clipstacks.lua new file mode 100644 index 0000000000..1ea7a44700 --- /dev/null +++ b/tools/lua/count_reduced_clipstacks.lua @@ -0,0 +1,87 @@ +stats = {} + +-- switch this to run on the automated scraper system +newline = "\n" +-- newline = "\\n" + +function sk_scrape_startcanvas(c, fileName) + canvas = c + oldstackstr = "<invalid>" +end + +function sk_scrape_endcanvas(c, fileName) + canvas = nil +end + +function string.starts(String,Start) + return string.sub(String,1,string.len(Start))==Start +end + +function build_stack_string(stack) + local info = "" + for i = 1, #stack do + local element = stack[i]; + info = info .. element["op"] .. ", " .. element["type"] .. ", aa:" .. tostring(element["aa"]) + if (element["type"] == "path") then + if (element["path"]:getSegmentTypes() == "line" and element["path"]:isConvex()) then + info = info .. ", convex_poly " .. element["path"]:countPoints() .. " points" + else + info = info .. ", fill: " .. element["path"]:getFillType() + info = info .. ", segments: (" .. element["path"]:getSegmentTypes() .. ")" + info = info .. ", convex:" .. tostring(element["path"]:isConvex()) + end + end + info = info .. newline + end + return info +end + +function sk_scrape_accumulate(t) + if (string.starts(t.verb, "draw")) then + local stack = canvas:getReducedClipStack() + local stackstr = build_stack_string(stack) + if (stackstr ~= "") then + if (stats[stackstr] == nil) then + stats[stackstr] = {} + stats[stackstr].drawCnt = 0 + stats[stackstr].instanceCnt = 0 + end + stats[stackstr].drawCnt = stats[stackstr].drawCnt + 1 + if (stackstr ~= oldstackstr) then + stats[stackstr].instanceCnt = stats[stackstr].instanceCnt + 1 + end + end + oldstackstr = stackstr + end +end + +function print_stats(stats) + function sort_by_draw_cnt(a, b) + return a.data.drawCnt > b.data.drawCnt + end + array = {} + for k,v in pairs(stats) do + array[#array + 1] = { name = k, data = v } + end + table.sort(array, sort_by_draw_cnt) + for i = 1, #array do + io.write("\n-------\n", array[i].name, tostring(array[i].data.drawCnt), " draws, ", tostring(array[i].data.instanceCnt), " instances.\n") + end +end + +function sk_scrape_summarize() + print_stats(stats) + --[[ To use the web scraper comment out the print above, run the code below to generate an + aggregate table on the automated scraper system. Then use the print_stats function on + agg_stats in the aggregator step. + for k,v in pairs(stats) do + if (v.drawCnt ~= nil) then + -- io.write("\n-------\n", k, tostring(v.drawCnt), " draws, ", tostring(v.instanceCnt), " instances.\n") + local tableEntry = 'agg_stats["' .. k .. '"]' + io.write(tableEntry, " = ", tableEntry, " or {}\n") + io.write(tableEntry, ".drawCnt = (", tableEntry, ".drawCnt or 0 ) + ", v.drawCnt, "\n") + io.write(tableEntry, ".instanceCnt = (", tableEntry, ".instanceCnt or 0 ) + ", v.instanceCnt, "\n") + end + end + --]] +end |