function tostr(t) local str = "" for k, v in next, t do if #str > 0 then str = str .. ", " end if type(k) == "number" then str = str .. "[" .. k .. "] = " else str = str .. tostring(k) .. " = " end if type(v) == "table" then str = str .. "{ " .. tostr(v) .. " }" else str = str .. tostring(v) end end return str end local canvas -- holds the current canvas (from startcanvas()) --[[ startcanvas() is called at the start of each picture file, passing the canvas that we will be drawing into, and the name of the file. Following this call, there will be some number of calls to accumulate(t) where t is a table of parameters that were passed to that draw-op. t.verb is a string holding the name of the draw-op (e.g. "drawRect") when a given picture is done, we call endcanvas(canvas, fileName) ]] function sk_scrape_startcanvas(c, fileName) canvas = c end --[[ Called when the current canvas is done drawing. ]] function sk_scrape_endcanvas(c, fileName) canvas = nil end --[[ Called with the parameters to each canvas.draw call, where canvas is the current canvas as set by startcanvas() ]] function round(x, mul) mul = mul or 1 return math.floor(x * mul + 0.5) / mul end dump_glyph_array_p = false function dump_array_as_C(array) for k, v in next, array do io.write(tostring(v), ", "); end io.write("-1,\n") end local strikes = {} -- [fontID_pointsize] = [] unique glyphs function make_strike_key(paint) return paint:getFontID() * 1000 + paint:getTextSize() end -- array is an array of bools (true), using glyphID as the index -- other is just an array[1...N] of numbers (glyphIDs) function array_union(array, other) for k, v in next, other do array[v] = true; end end -- take a table of bools, indexed by values, and return a sorted table of values function bools_to_values(t) local array = {} for k, v in next, t do array[#array + 1] = k end table.sort(array) return array end function array_count(array) local n = 0 for k in next, array do n = n + 1 end return n end function sk_scrape_accumulate(t) verb = t.verb; if verb == "drawPosText" or verb == "drawPosTextH" then if t.glyphs then local key = make_strike_key(t.paint) strikes[key] = strikes[key] or {} array_union(strikes[key], t.glyphs) if dump_glyph_array_p then dump_array_as_C(t.glyphs) end end end end --[[ lua_pictures will call this function after all of the pictures have been "accumulated". ]] function sk_scrape_summarize() local totalCount = 0 local strikeCount = 0 local min, max = 0, 0 local histogram = {} for k, v in next, strikes do local fontID = round(k / 1000) local size = k - fontID * 1000 local count = array_count(v) -- io.write("fontID,", fontID, ", size,", size, ", entries,", count, "\n"); min = math.min(min, count) max = math.max(max, count) totalCount = totalCount + count strikeCount = strikeCount + 1 histogram[count] = (histogram[count] or 0) + 1 end local ave = round(totalCount / strikeCount) io.write("\n", "unique glyphs: min = ", min, ", max = ", max, ", ave = ", ave, "\n"); for k, v in next, histogram do io.write("glyph_count,", k, ",frequency,", v, "\n") end end function test_summary() io.write("just testing test_summary\n") end function summarize_unique_glyphIDs() io.write("/* runs of unique glyph IDs, with a -1 sentinel between different runs */\n") io.write("static const int gUniqueGlyphIDs[] = {\n"); for k, v in next, strikes do dump_array_as_C(bools_to_values(v)) end io.write("-1 };\n") end