10f149e5a78842c920c0ce1e1ac45f54473c11f05krajcevski-- 20f149e5a78842c920c0ce1e1ac45f54473c11f05krajcevski-- Copyright 2014 Google Inc. 30f149e5a78842c920c0ce1e1ac45f54473c11f05krajcevski-- 40f149e5a78842c920c0ce1e1ac45f54473c11f05krajcevski-- Use of this source code is governed by a BSD-style license that can be 50f149e5a78842c920c0ce1e1ac45f54473c11f05krajcevski-- found in the LICENSE file. 60f149e5a78842c920c0ce1e1ac45f54473c11f05krajcevski-- 70f149e5a78842c920c0ce1e1ac45f54473c11f05krajcevski 80f149e5a78842c920c0ce1e1ac45f54473c11f05krajcevski-- Path scraping script. 90f149e5a78842c920c0ce1e1ac45f54473c11f05krajcevski-- This script is designed to count the number of times we fall back to software 100f149e5a78842c920c0ce1e1ac45f54473c11f05krajcevski-- rendering for a path in a given SKP. However, this script does not count an exact 110f149e5a78842c920c0ce1e1ac45f54473c11f05krajcevski-- number of uploads, since there is some overlap with clipping: e.g. two clipped paths 120f149e5a78842c920c0ce1e1ac45f54473c11f05krajcevski-- may cause three uploads to the GPU (set clip 1, set clip 2, unset clip 2/reset clip 1), 130f149e5a78842c920c0ce1e1ac45f54473c11f05krajcevski-- but these cases are rare. 140f149e5a78842c920c0ce1e1ac45f54473c11f05krajcevski 150f149e5a78842c920c0ce1e1ac45f54473c11f05krajcevskidraws = 0 160f149e5a78842c920c0ce1e1ac45f54473c11f05krajcevskidrawPaths = 0 170f149e5a78842c920c0ce1e1ac45f54473c11f05krajcevskidrawPathsAnti = 0 180f149e5a78842c920c0ce1e1ac45f54473c11f05krajcevskidrawPathsConvexAnti = 0 190f149e5a78842c920c0ce1e1ac45f54473c11f05krajcevski 200f149e5a78842c920c0ce1e1ac45f54473c11f05krajcevskiclips = 0 210f149e5a78842c920c0ce1e1ac45f54473c11f05krajcevskiclipPaths = 0 220f149e5a78842c920c0ce1e1ac45f54473c11f05krajcevskiclipPathsAnti = 0 230f149e5a78842c920c0ce1e1ac45f54473c11f05krajcevskiclipPathsConvexAnti = 0 240f149e5a78842c920c0ce1e1ac45f54473c11f05krajcevski 250f149e5a78842c920c0ce1e1ac45f54473c11f05krajcevskiusedPath = false 260f149e5a78842c920c0ce1e1ac45f54473c11f05krajcevskiusedSWPath = false 270f149e5a78842c920c0ce1e1ac45f54473c11f05krajcevski 280f149e5a78842c920c0ce1e1ac45f54473c11f05krajcevskiskpsTotal = 0 290f149e5a78842c920c0ce1e1ac45f54473c11f05krajcevskiskpsWithPath = 0 300f149e5a78842c920c0ce1e1ac45f54473c11f05krajcevskiskpsWithSWPath = 0 310f149e5a78842c920c0ce1e1ac45f54473c11f05krajcevski 320f149e5a78842c920c0ce1e1ac45f54473c11f05krajcevskifunction sk_scrape_startcanvas(c, fileName) 330f149e5a78842c920c0ce1e1ac45f54473c11f05krajcevski usedPath = false 340f149e5a78842c920c0ce1e1ac45f54473c11f05krajcevski usedSWPath = false 350f149e5a78842c920c0ce1e1ac45f54473c11f05krajcevskiend 360f149e5a78842c920c0ce1e1ac45f54473c11f05krajcevski 370f149e5a78842c920c0ce1e1ac45f54473c11f05krajcevskifunction sk_scrape_endcanvas(c, fileName) 380f149e5a78842c920c0ce1e1ac45f54473c11f05krajcevski skpsTotal = skpsTotal + 1 390f149e5a78842c920c0ce1e1ac45f54473c11f05krajcevski if usedPath then 400f149e5a78842c920c0ce1e1ac45f54473c11f05krajcevski skpsWithPath = skpsWithPath + 1 410f149e5a78842c920c0ce1e1ac45f54473c11f05krajcevski if usedSWPath then 420f149e5a78842c920c0ce1e1ac45f54473c11f05krajcevski skpsWithSWPath = skpsWithSWPath + 1 430f149e5a78842c920c0ce1e1ac45f54473c11f05krajcevski end 440f149e5a78842c920c0ce1e1ac45f54473c11f05krajcevski end 450f149e5a78842c920c0ce1e1ac45f54473c11f05krajcevskiend 460f149e5a78842c920c0ce1e1ac45f54473c11f05krajcevski 470f149e5a78842c920c0ce1e1ac45f54473c11f05krajcevskifunction string.starts(String,Start) 480f149e5a78842c920c0ce1e1ac45f54473c11f05krajcevski return string.sub(String,1,string.len(Start))==Start 490f149e5a78842c920c0ce1e1ac45f54473c11f05krajcevskiend 500f149e5a78842c920c0ce1e1ac45f54473c11f05krajcevski 510f149e5a78842c920c0ce1e1ac45f54473c11f05krajcevskifunction isPathValid(path) 520f149e5a78842c920c0ce1e1ac45f54473c11f05krajcevski if not path then 530f149e5a78842c920c0ce1e1ac45f54473c11f05krajcevski return false 540f149e5a78842c920c0ce1e1ac45f54473c11f05krajcevski end 550f149e5a78842c920c0ce1e1ac45f54473c11f05krajcevski 560f149e5a78842c920c0ce1e1ac45f54473c11f05krajcevski if path:isEmpty() then 570f149e5a78842c920c0ce1e1ac45f54473c11f05krajcevski return false 580f149e5a78842c920c0ce1e1ac45f54473c11f05krajcevski end 590f149e5a78842c920c0ce1e1ac45f54473c11f05krajcevski 600f149e5a78842c920c0ce1e1ac45f54473c11f05krajcevski if path:isRect() then 610f149e5a78842c920c0ce1e1ac45f54473c11f05krajcevski return false 620f149e5a78842c920c0ce1e1ac45f54473c11f05krajcevski end 630f149e5a78842c920c0ce1e1ac45f54473c11f05krajcevski 640f149e5a78842c920c0ce1e1ac45f54473c11f05krajcevski return true 650f149e5a78842c920c0ce1e1ac45f54473c11f05krajcevskiend 660f149e5a78842c920c0ce1e1ac45f54473c11f05krajcevski 670f149e5a78842c920c0ce1e1ac45f54473c11f05krajcevskifunction sk_scrape_accumulate(t) 680f149e5a78842c920c0ce1e1ac45f54473c11f05krajcevski if (string.starts(t.verb, "draw")) then 690f149e5a78842c920c0ce1e1ac45f54473c11f05krajcevski draws = draws + 1 700f149e5a78842c920c0ce1e1ac45f54473c11f05krajcevski end 710f149e5a78842c920c0ce1e1ac45f54473c11f05krajcevski 720f149e5a78842c920c0ce1e1ac45f54473c11f05krajcevski if (string.starts(t.verb, "clip")) then 730f149e5a78842c920c0ce1e1ac45f54473c11f05krajcevski clips = clips + 1 740f149e5a78842c920c0ce1e1ac45f54473c11f05krajcevski end 750f149e5a78842c920c0ce1e1ac45f54473c11f05krajcevski 760f149e5a78842c920c0ce1e1ac45f54473c11f05krajcevski if t.verb == "clipPath" then 770f149e5a78842c920c0ce1e1ac45f54473c11f05krajcevski local path = t.path 780f149e5a78842c920c0ce1e1ac45f54473c11f05krajcevski if isPathValid(path) then 790f149e5a78842c920c0ce1e1ac45f54473c11f05krajcevski clipPaths = clipPaths + 1 800f149e5a78842c920c0ce1e1ac45f54473c11f05krajcevski usedPath = true 810f149e5a78842c920c0ce1e1ac45f54473c11f05krajcevski if t.aa then 820f149e5a78842c920c0ce1e1ac45f54473c11f05krajcevski clipPathsAnti = clipPathsAnti + 1 830f149e5a78842c920c0ce1e1ac45f54473c11f05krajcevski if path:isConvex() then 840f149e5a78842c920c0ce1e1ac45f54473c11f05krajcevski clipPathsConvexAnti = clipPathsConvexAnti + 1 850f149e5a78842c920c0ce1e1ac45f54473c11f05krajcevski else 860f149e5a78842c920c0ce1e1ac45f54473c11f05krajcevski usedSWPath = true 870f149e5a78842c920c0ce1e1ac45f54473c11f05krajcevski end 880f149e5a78842c920c0ce1e1ac45f54473c11f05krajcevski end 890f149e5a78842c920c0ce1e1ac45f54473c11f05krajcevski end 900f149e5a78842c920c0ce1e1ac45f54473c11f05krajcevski end 910f149e5a78842c920c0ce1e1ac45f54473c11f05krajcevski 920f149e5a78842c920c0ce1e1ac45f54473c11f05krajcevski if t.verb == "drawPath" then 930f149e5a78842c920c0ce1e1ac45f54473c11f05krajcevski local path = t.path 940f149e5a78842c920c0ce1e1ac45f54473c11f05krajcevski local paint = t.paint 950f149e5a78842c920c0ce1e1ac45f54473c11f05krajcevski if paint and isPathValid(path) then 960f149e5a78842c920c0ce1e1ac45f54473c11f05krajcevski drawPaths = drawPaths + 1 970f149e5a78842c920c0ce1e1ac45f54473c11f05krajcevski usedPath = true 980f149e5a78842c920c0ce1e1ac45f54473c11f05krajcevski if paint:isAntiAlias() then 990f149e5a78842c920c0ce1e1ac45f54473c11f05krajcevski drawPathsAnti = drawPathsAnti + 1 1000f149e5a78842c920c0ce1e1ac45f54473c11f05krajcevski if path:isConvex() then 1010f149e5a78842c920c0ce1e1ac45f54473c11f05krajcevski drawPathsConvexAnti = drawPathsConvexAnti + 1 1020f149e5a78842c920c0ce1e1ac45f54473c11f05krajcevski else 1030f149e5a78842c920c0ce1e1ac45f54473c11f05krajcevski usedSWPath = true 1040f149e5a78842c920c0ce1e1ac45f54473c11f05krajcevski end 1050f149e5a78842c920c0ce1e1ac45f54473c11f05krajcevski end 1060f149e5a78842c920c0ce1e1ac45f54473c11f05krajcevski end 1070f149e5a78842c920c0ce1e1ac45f54473c11f05krajcevski end 1080f149e5a78842c920c0ce1e1ac45f54473c11f05krajcevskiend 1090f149e5a78842c920c0ce1e1ac45f54473c11f05krajcevski 1100f149e5a78842c920c0ce1e1ac45f54473c11f05krajcevskifunction sk_scrape_summarize() 1110f149e5a78842c920c0ce1e1ac45f54473c11f05krajcevski local swDrawPaths = drawPathsAnti - drawPathsConvexAnti 1120f149e5a78842c920c0ce1e1ac45f54473c11f05krajcevski local swClipPaths = clipPathsAnti - clipPathsConvexAnti 1130f149e5a78842c920c0ce1e1ac45f54473c11f05krajcevski 1140f149e5a78842c920c0ce1e1ac45f54473c11f05krajcevski io.write("clips = clips + ", clips, "\n"); 1150f149e5a78842c920c0ce1e1ac45f54473c11f05krajcevski io.write("draws = draws + ", draws, "\n"); 1160f149e5a78842c920c0ce1e1ac45f54473c11f05krajcevski io.write("clipPaths = clipPaths + ", clipPaths, "\n"); 1170f149e5a78842c920c0ce1e1ac45f54473c11f05krajcevski io.write("drawPaths = drawPaths + ", drawPaths, "\n"); 1180f149e5a78842c920c0ce1e1ac45f54473c11f05krajcevski io.write("swClipPaths = swClipPaths + ", swClipPaths, "\n"); 1190f149e5a78842c920c0ce1e1ac45f54473c11f05krajcevski io.write("swDrawPaths = swDrawPaths + ", swDrawPaths, "\n"); 1200f149e5a78842c920c0ce1e1ac45f54473c11f05krajcevski 1210f149e5a78842c920c0ce1e1ac45f54473c11f05krajcevski io.write("skpsTotal = skpsTotal + ", skpsTotal, "\n"); 1220f149e5a78842c920c0ce1e1ac45f54473c11f05krajcevski io.write("skpsWithPath = skpsWithPath + ", skpsWithPath, "\n"); 1230f149e5a78842c920c0ce1e1ac45f54473c11f05krajcevski io.write("skpsWithSWPath = skpsWithSWPath + ", skpsWithSWPath, "\n"); 1240f149e5a78842c920c0ce1e1ac45f54473c11f05krajcevskiend 125