1e3823fd901674e22269637a669ac2b3e2667dc9creed@google.comfunction tostr(t) 2e3823fd901674e22269637a669ac2b3e2667dc9creed@google.com local str = "" 3e3823fd901674e22269637a669ac2b3e2667dc9creed@google.com for k, v in next, t do 4e3823fd901674e22269637a669ac2b3e2667dc9creed@google.com if #str > 0 then 5e3823fd901674e22269637a669ac2b3e2667dc9creed@google.com str = str .. ", " 6e3823fd901674e22269637a669ac2b3e2667dc9creed@google.com end 7e3823fd901674e22269637a669ac2b3e2667dc9creed@google.com if type(k) == "number" then 8e3823fd901674e22269637a669ac2b3e2667dc9creed@google.com str = str .. "[" .. k .. "] = " 9e3823fd901674e22269637a669ac2b3e2667dc9creed@google.com else 10e3823fd901674e22269637a669ac2b3e2667dc9creed@google.com str = str .. tostring(k) .. " = " 11e3823fd901674e22269637a669ac2b3e2667dc9creed@google.com end 12e3823fd901674e22269637a669ac2b3e2667dc9creed@google.com if type(v) == "table" then 13e3823fd901674e22269637a669ac2b3e2667dc9creed@google.com str = str .. "{ " .. tostr(v) .. " }" 14e3823fd901674e22269637a669ac2b3e2667dc9creed@google.com else 15e3823fd901674e22269637a669ac2b3e2667dc9creed@google.com str = str .. tostring(v) 16e3823fd901674e22269637a669ac2b3e2667dc9creed@google.com end 17e3823fd901674e22269637a669ac2b3e2667dc9creed@google.com end 18e3823fd901674e22269637a669ac2b3e2667dc9creed@google.com return str 19e3823fd901674e22269637a669ac2b3e2667dc9creed@google.comend 20e3823fd901674e22269637a669ac2b3e2667dc9creed@google.com 21e3823fd901674e22269637a669ac2b3e2667dc9creed@google.comlocal canvas -- holds the current canvas (from startcanvas()) 22e3823fd901674e22269637a669ac2b3e2667dc9creed@google.com 23e3823fd901674e22269637a669ac2b3e2667dc9creed@google.com--[[ 24e3823fd901674e22269637a669ac2b3e2667dc9creed@google.com startcanvas() is called at the start of each picture file, passing the 25e3823fd901674e22269637a669ac2b3e2667dc9creed@google.com canvas that we will be drawing into, and the name of the file. 26e3823fd901674e22269637a669ac2b3e2667dc9creed@google.com 27e3823fd901674e22269637a669ac2b3e2667dc9creed@google.com Following this call, there will be some number of calls to accumulate(t) 28e3823fd901674e22269637a669ac2b3e2667dc9creed@google.com where t is a table of parameters that were passed to that draw-op. 29e3823fd901674e22269637a669ac2b3e2667dc9creed@google.com 30e3823fd901674e22269637a669ac2b3e2667dc9creed@google.com t.verb is a string holding the name of the draw-op (e.g. "drawRect") 31e3823fd901674e22269637a669ac2b3e2667dc9creed@google.com 32e3823fd901674e22269637a669ac2b3e2667dc9creed@google.com when a given picture is done, we call endcanvas(canvas, fileName) 33e3823fd901674e22269637a669ac2b3e2667dc9creed@google.com]] 34e3823fd901674e22269637a669ac2b3e2667dc9creed@google.comfunction sk_scrape_startcanvas(c, fileName) 35e3823fd901674e22269637a669ac2b3e2667dc9creed@google.com canvas = c 36e3823fd901674e22269637a669ac2b3e2667dc9creed@google.comend 37e3823fd901674e22269637a669ac2b3e2667dc9creed@google.com 38e3823fd901674e22269637a669ac2b3e2667dc9creed@google.com--[[ 39e3823fd901674e22269637a669ac2b3e2667dc9creed@google.com Called when the current canvas is done drawing. 40e3823fd901674e22269637a669ac2b3e2667dc9creed@google.com]] 41e3823fd901674e22269637a669ac2b3e2667dc9creed@google.comfunction sk_scrape_endcanvas(c, fileName) 42e3823fd901674e22269637a669ac2b3e2667dc9creed@google.com canvas = nil 43e3823fd901674e22269637a669ac2b3e2667dc9creed@google.comend 44e3823fd901674e22269637a669ac2b3e2667dc9creed@google.com 45e3823fd901674e22269637a669ac2b3e2667dc9creed@google.com--[[ 46e3823fd901674e22269637a669ac2b3e2667dc9creed@google.com Called with the parameters to each canvas.draw call, where canvas is the 47e3823fd901674e22269637a669ac2b3e2667dc9creed@google.com current canvas as set by startcanvas() 48e3823fd901674e22269637a669ac2b3e2667dc9creed@google.com]] 49e3823fd901674e22269637a669ac2b3e2667dc9creed@google.com 50e3823fd901674e22269637a669ac2b3e2667dc9creed@google.comfunction round(x, mul) 51e3823fd901674e22269637a669ac2b3e2667dc9creed@google.com mul = mul or 1 52e3823fd901674e22269637a669ac2b3e2667dc9creed@google.com return math.floor(x * mul + 0.5) / mul 53e3823fd901674e22269637a669ac2b3e2667dc9creed@google.comend 54e3823fd901674e22269637a669ac2b3e2667dc9creed@google.com 55e2aad27c5f02e375077ed605738c65009ba0644creed@google.comdump_glyph_array_p = false 56e2aad27c5f02e375077ed605738c65009ba0644creed@google.com 57e2aad27c5f02e375077ed605738c65009ba0644creed@google.comfunction dump_array_as_C(array) 58e2aad27c5f02e375077ed605738c65009ba0644creed@google.com for k, v in next, array do 59e2aad27c5f02e375077ed605738c65009ba0644creed@google.com io.write(tostring(v), ", "); 60e2aad27c5f02e375077ed605738c65009ba0644creed@google.com end 61e2aad27c5f02e375077ed605738c65009ba0644creed@google.com io.write("-1,\n") 62e2aad27c5f02e375077ed605738c65009ba0644creed@google.comend 63e2aad27c5f02e375077ed605738c65009ba0644creed@google.com 64e3823fd901674e22269637a669ac2b3e2667dc9creed@google.comlocal strikes = {} -- [fontID_pointsize] = [] unique glyphs 65e3823fd901674e22269637a669ac2b3e2667dc9creed@google.com 66e3823fd901674e22269637a669ac2b3e2667dc9creed@google.comfunction make_strike_key(paint) 67e3823fd901674e22269637a669ac2b3e2667dc9creed@google.com return paint:getFontID() * 1000 + paint:getTextSize() 68e3823fd901674e22269637a669ac2b3e2667dc9creed@google.comend 69e3823fd901674e22269637a669ac2b3e2667dc9creed@google.com 70e3823fd901674e22269637a669ac2b3e2667dc9creed@google.com-- array is an array of bools (true), using glyphID as the index 71e3823fd901674e22269637a669ac2b3e2667dc9creed@google.com-- other is just an array[1...N] of numbers (glyphIDs) 72e3823fd901674e22269637a669ac2b3e2667dc9creed@google.comfunction array_union(array, other) 73e3823fd901674e22269637a669ac2b3e2667dc9creed@google.com for k, v in next, other do 74e3823fd901674e22269637a669ac2b3e2667dc9creed@google.com array[v] = true; 75e3823fd901674e22269637a669ac2b3e2667dc9creed@google.com end 76e3823fd901674e22269637a669ac2b3e2667dc9creed@google.comend 77e3823fd901674e22269637a669ac2b3e2667dc9creed@google.com 78e2aad27c5f02e375077ed605738c65009ba0644creed@google.com-- take a table of bools, indexed by values, and return a sorted table of values 79e2aad27c5f02e375077ed605738c65009ba0644creed@google.comfunction bools_to_values(t) 80e2aad27c5f02e375077ed605738c65009ba0644creed@google.com local array = {} 81e2aad27c5f02e375077ed605738c65009ba0644creed@google.com for k, v in next, t do 82e2aad27c5f02e375077ed605738c65009ba0644creed@google.com array[#array + 1] = k 83e2aad27c5f02e375077ed605738c65009ba0644creed@google.com end 84e2aad27c5f02e375077ed605738c65009ba0644creed@google.com table.sort(array) 85e2aad27c5f02e375077ed605738c65009ba0644creed@google.com return array 86e2aad27c5f02e375077ed605738c65009ba0644creed@google.comend 87e2aad27c5f02e375077ed605738c65009ba0644creed@google.com 88e3823fd901674e22269637a669ac2b3e2667dc9creed@google.comfunction array_count(array) 89e3823fd901674e22269637a669ac2b3e2667dc9creed@google.com local n = 0 90e3823fd901674e22269637a669ac2b3e2667dc9creed@google.com for k in next, array do 91e3823fd901674e22269637a669ac2b3e2667dc9creed@google.com n = n + 1 92e3823fd901674e22269637a669ac2b3e2667dc9creed@google.com end 93e3823fd901674e22269637a669ac2b3e2667dc9creed@google.com return n 94e3823fd901674e22269637a669ac2b3e2667dc9creed@google.comend 95e3823fd901674e22269637a669ac2b3e2667dc9creed@google.com 96e3823fd901674e22269637a669ac2b3e2667dc9creed@google.comfunction sk_scrape_accumulate(t) 97e3823fd901674e22269637a669ac2b3e2667dc9creed@google.com verb = t.verb; 98e3823fd901674e22269637a669ac2b3e2667dc9creed@google.com if verb == "drawPosText" or verb == "drawPosTextH" then 99e3823fd901674e22269637a669ac2b3e2667dc9creed@google.com if t.glyphs then 100e3823fd901674e22269637a669ac2b3e2667dc9creed@google.com local key = make_strike_key(t.paint) 101e3823fd901674e22269637a669ac2b3e2667dc9creed@google.com strikes[key] = strikes[key] or {} 102e3823fd901674e22269637a669ac2b3e2667dc9creed@google.com array_union(strikes[key], t.glyphs) 103e2aad27c5f02e375077ed605738c65009ba0644creed@google.com 104e2aad27c5f02e375077ed605738c65009ba0644creed@google.com if dump_glyph_array_p then 105e2aad27c5f02e375077ed605738c65009ba0644creed@google.com dump_array_as_C(t.glyphs) 106e2aad27c5f02e375077ed605738c65009ba0644creed@google.com end 107e3823fd901674e22269637a669ac2b3e2667dc9creed@google.com end 108e3823fd901674e22269637a669ac2b3e2667dc9creed@google.com end 109e3823fd901674e22269637a669ac2b3e2667dc9creed@google.comend 110e3823fd901674e22269637a669ac2b3e2667dc9creed@google.com 111e3823fd901674e22269637a669ac2b3e2667dc9creed@google.com--[[ 112e3823fd901674e22269637a669ac2b3e2667dc9creed@google.com lua_pictures will call this function after all of the pictures have been 113e3823fd901674e22269637a669ac2b3e2667dc9creed@google.com "accumulated". 114e3823fd901674e22269637a669ac2b3e2667dc9creed@google.com]] 115e3823fd901674e22269637a669ac2b3e2667dc9creed@google.comfunction sk_scrape_summarize() 116e3823fd901674e22269637a669ac2b3e2667dc9creed@google.com local totalCount = 0 117e3823fd901674e22269637a669ac2b3e2667dc9creed@google.com local strikeCount = 0 118e3823fd901674e22269637a669ac2b3e2667dc9creed@google.com local min, max = 0, 0 119e3823fd901674e22269637a669ac2b3e2667dc9creed@google.com 120e2aad27c5f02e375077ed605738c65009ba0644creed@google.com local histogram = {} 121e2aad27c5f02e375077ed605738c65009ba0644creed@google.com 122e3823fd901674e22269637a669ac2b3e2667dc9creed@google.com for k, v in next, strikes do 123e3823fd901674e22269637a669ac2b3e2667dc9creed@google.com local fontID = round(k / 1000) 124e3823fd901674e22269637a669ac2b3e2667dc9creed@google.com local size = k - fontID * 1000 125e3823fd901674e22269637a669ac2b3e2667dc9creed@google.com local count = array_count(v) 126e3823fd901674e22269637a669ac2b3e2667dc9creed@google.com 127e2aad27c5f02e375077ed605738c65009ba0644creed@google.com-- io.write("fontID,", fontID, ", size,", size, ", entries,", count, "\n"); 128e3823fd901674e22269637a669ac2b3e2667dc9creed@google.com 129e3823fd901674e22269637a669ac2b3e2667dc9creed@google.com min = math.min(min, count) 130e3823fd901674e22269637a669ac2b3e2667dc9creed@google.com max = math.max(max, count) 131e3823fd901674e22269637a669ac2b3e2667dc9creed@google.com totalCount = totalCount + count 132e3823fd901674e22269637a669ac2b3e2667dc9creed@google.com strikeCount = strikeCount + 1 133e2aad27c5f02e375077ed605738c65009ba0644creed@google.com 134e2aad27c5f02e375077ed605738c65009ba0644creed@google.com histogram[count] = (histogram[count] or 0) + 1 135e3823fd901674e22269637a669ac2b3e2667dc9creed@google.com end 136e3823fd901674e22269637a669ac2b3e2667dc9creed@google.com local ave = round(totalCount / strikeCount) 137e3823fd901674e22269637a669ac2b3e2667dc9creed@google.com 138e3823fd901674e22269637a669ac2b3e2667dc9creed@google.com io.write("\n", "unique glyphs: min = ", min, ", max = ", max, ", ave = ", ave, "\n"); 139e2aad27c5f02e375077ed605738c65009ba0644creed@google.com 140e2aad27c5f02e375077ed605738c65009ba0644creed@google.com for k, v in next, histogram do 141e2aad27c5f02e375077ed605738c65009ba0644creed@google.com io.write("glyph_count,", k, ",frequency,", v, "\n") 142e2aad27c5f02e375077ed605738c65009ba0644creed@google.com end 143e2aad27c5f02e375077ed605738c65009ba0644creed@google.comend 144e2aad27c5f02e375077ed605738c65009ba0644creed@google.com 145e2aad27c5f02e375077ed605738c65009ba0644creed@google.comfunction test_summary() 146e2aad27c5f02e375077ed605738c65009ba0644creed@google.com io.write("just testing test_summary\n") 147e2aad27c5f02e375077ed605738c65009ba0644creed@google.comend 148e2aad27c5f02e375077ed605738c65009ba0644creed@google.com 149e2aad27c5f02e375077ed605738c65009ba0644creed@google.comfunction summarize_unique_glyphIDs() 150e2aad27c5f02e375077ed605738c65009ba0644creed@google.com io.write("/* runs of unique glyph IDs, with a -1 sentinel between different runs */\n") 151e2aad27c5f02e375077ed605738c65009ba0644creed@google.com io.write("static const int gUniqueGlyphIDs[] = {\n"); 152e2aad27c5f02e375077ed605738c65009ba0644creed@google.com for k, v in next, strikes do 153e2aad27c5f02e375077ed605738c65009ba0644creed@google.com dump_array_as_C(bools_to_values(v)) 154e2aad27c5f02e375077ed605738c65009ba0644creed@google.com end 155e2aad27c5f02e375077ed605738c65009ba0644creed@google.com io.write("-1 };\n") 156e3823fd901674e22269637a669ac2b3e2667dc9creed@google.comend 157e3823fd901674e22269637a669ac2b3e2667dc9creed@google.com 158