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