| filename = "" | 
 |  | 
 | function sk_scrape_startcanvas(c, fileName) | 
 |     filename = fileName | 
 | end | 
 |  | 
 | function sk_scrape_endcanvas(c, fileName) | 
 |  | 
 | end | 
 |  | 
 | LuaDoubleNearlyZero = 1.0 / bit32.lshift(1.0, 12) | 
 |  | 
 | function LuaDoubleNearlyEqual(a, b) | 
 |     return math.abs(a-b) <= LuaDoubleNearlyZero | 
 | end | 
 |  | 
 | function bounds(rect) | 
 |     local width  = rect.right  - rect.left | 
 |     local height = rect.bottom - rect.top | 
 |  | 
 |     return width, height | 
 | end | 
 |  | 
 | gradients = {} | 
 |  | 
 | i = 1 | 
 |  | 
 | function sk_scrape_accumulate(t) | 
 |     local p = t.paint | 
 |     if p then | 
 |         local s = p:getShader() | 
 |         if s then | 
 |             local g = s:asAGradient() | 
 |             if g then | 
 |                 gradients[i] = {} | 
 |  | 
 |                 gradients[i].filename = filename | 
 |  | 
 |                 local width, height = -1, -1 | 
 |                 if t.rect then | 
 |                     width, height = bounds(t.rect) | 
 |                 elseif t.rrect then | 
 |                     width, height = bounds(t.rrect:rect()) | 
 |                 elseif t.path then | 
 |                     width, height = bounds(t.path:getBounds()) | 
 |                 end | 
 |                 gradients[i].boundsWidth  = width | 
 |                 gradients[i].boundsHeight = height | 
 |  | 
 |                 gradients[i].colorCount = g.colorCount | 
 |                 gradients[i].type       = g.type | 
 |                 gradients[i].tile       = g.tile | 
 |  | 
 |                 isEvenlySpaced = true | 
 |                 for j = 1, g.colorCount, 1 do | 
 |                     if not LuaDoubleNearlyEqual(g.positions[j], (j-1)/(g.colorCount-1)) then | 
 |                         isEvenlySpaced = false | 
 |                     end | 
 |                 end | 
 |                 gradients[i].isEvenlySpaced = isEvenlySpaced | 
 |  | 
 |                 numHardStops = 0 | 
 |                 for j = 2, g.colorCount, 1 do | 
 |                     if LuaDoubleNearlyEqual(g.positions[j], g.positions[j-1]) then | 
 |                         numHardStops = numHardStops + 1 | 
 |                     end | 
 |                 end | 
 |                 gradients[i].numHardStops = numHardStops | 
 |  | 
 |                 gradients[i].verb = t.verb | 
 |                  | 
 |                 gradients[i].positions = {} | 
 |                 for j = 1, g.colorCount, 1 do | 
 |                     gradients[i].positions[j] = g.positions[j] | 
 |                 end | 
 |  | 
 |                 i = i + 1 | 
 |             end | 
 |         end | 
 |     end | 
 | end | 
 |  | 
 | function sk_scrape_summarize() | 
 |     for k, v in pairs(gradients) do | 
 |         local pos = "" | 
 |         for j = 1, v.colorCount , 1 do | 
 |             pos = pos .. v.positions[j] | 
 |             if j ~= v.colorCount then | 
 |                 pos = pos .. "," | 
 |             end | 
 |         end | 
 |  | 
 |         io.write(string.format("%s %d %s %s %d %d %s %d %d %s\n", | 
 |                                 v.filename, | 
 |                                 v.colorCount, | 
 |                                 v.type, | 
 |                                 v.tile, | 
 |                                 tonumber(v.isEvenlySpaced and 1 or 0), | 
 |                                 v.numHardStops, | 
 |                                 v.verb, | 
 |                                 v.boundsWidth, | 
 |                                 v.boundsHeight, | 
 |                                 pos)) | 
 |     end | 
 | end | 
 |  |