
local r = { left = 10, top = 10, right = 100, bottom = 80 }
local x = 0;

local paint = Sk.newPaint();
paint:setAntiAlias(true);

local image     -- = Sk.loadImage('/skia/sailboat.jpg');
function setImageFilename(filename)
    image = Sk.loadImage(filename)
end


local color = {a = 1, r = 1, g = 0, b = 0};

function rnd(range) 
   return math.random() * range;
end 

rndX = function () return rnd(640) end 
rndY = function () return rnd(480) end 

function draw_rand_path(canvas);
   if not path_paint then 
       path_paint = Sk.newPaint();
       path_paint:setAntiAlias(true);
   end 
   path_paint:setColor({a = 1, r = math.random(), g = math.random(), b = math.random() });

   local path = Sk.newPath();
   path:moveTo(rndX(), rndY());
   for i = 0, 50 do 
       path:quadTo(rndX(), rndY(), rndX(), rndY());
   end 
   canvas:drawPath(path, path_paint);

   paint:setColor{a=1,r=0,g=0,b=1};
   local align = { 'left', 'center', 'right' };
   paint:setTextSize(30);
   for k, v in next, align do 
       paint:setTextAlign(v);
       canvas:drawText('Hamburgefons', 320, 200 + 30*k, paint);
   end 
end 

function onStartup()
    local paint = Sk.newPaint();
    paint:setColor{a=1, r=1, g=0, b=0};
    if false then
        local doc = Sk.newDocumentPDF('out/test.pdf');
        local canvas = doc:beginPage(72*8.5, 72*11);
        canvas:drawText('Hello Lua', 300, 300, paint);
        doc:close();
        doc = nil;
    end
end 

function onDrawContent(canvas)
    draw_rand_path(canvas);
    color.g = x / 100;
    paint:setColor(color) 
    canvas:translate(x, 0);
    canvas:drawOval(r, paint) 
    x = x + 1;
    local r2 = {}
    r2.left = x;
    r2.top = r.bottom + 50;
    r2.right = r2.left + image:width() * 1;
    r2.bottom = r2.top + image:height() * 1;
    canvas:drawImageRect(image, nil, r2, 0.75);
    if x > 200 then x = 0 end;

    return true -- so we can animate
end

onStartup()
