7b8646669f
BUG=skia: Review URL: https://codereview.chromium.org/686853005
209 lines
5.9 KiB
Lua
209 lines
5.9 KiB
Lua
function scale_text_delta(template, delta)
|
|
template = template.slide
|
|
for i = 1, #template do
|
|
local paint = template[i].paint
|
|
paint:setTextSize(paint:getTextSize() + delta)
|
|
end
|
|
end
|
|
|
|
function slide_transition(prev, next, is_forward)
|
|
local rec = {
|
|
proc = function(self, canvas, drawSlideProc)
|
|
if self:isDone() then
|
|
drawSlideProc(canvas)
|
|
return nil
|
|
end
|
|
self.prevDrawable:draw(canvas, self.curr_x, 0)
|
|
self.nextDrawable:draw(canvas, self.curr_x + 640, 0)
|
|
self.curr_x = self.curr_x + self.step_x
|
|
return self
|
|
end
|
|
}
|
|
if is_forward then
|
|
rec.prevDrawable = prev
|
|
rec.nextDrawable = next
|
|
rec.curr_x = 0
|
|
rec.step_x = -15
|
|
rec.isDone = function (self) return self.curr_x <= -640 end
|
|
else
|
|
rec.prevDrawable = next
|
|
rec.nextDrawable = prev
|
|
rec.curr_x = -640
|
|
rec.step_x = 15
|
|
rec.isDone = function (self) return self.curr_x >= 0 end
|
|
end
|
|
return rec
|
|
end
|
|
|
|
function sqr(value) return value * value end
|
|
|
|
function set_blur(paint, alpha)
|
|
local sigma = sqr(1 - alpha) * 20
|
|
if gUseBlurInTransitions then
|
|
paint:setImageFilter(Sk.newBlurImageFilter(sigma, sigma))
|
|
end
|
|
paint:setAlpha(alpha)
|
|
end
|
|
|
|
function fade_slide_transition(prev, next, is_forward)
|
|
local rec = {
|
|
paint = Sk.newPaint(),
|
|
prevDrawable = prev,
|
|
nextDrawable = next,
|
|
proc = function(self, canvas, drawSlideProc)
|
|
if self:isDone() then
|
|
drawSlideProc(canvas)
|
|
return nil
|
|
end
|
|
|
|
set_blur(self.paint, self.prev_a)
|
|
self.prevDrawable:draw(canvas, self.prev_x, 0, self.paint)
|
|
|
|
set_blur(self.paint, self.next_a)
|
|
self.nextDrawable:draw(canvas, self.next_x, 0, self.paint)
|
|
self:step()
|
|
return self
|
|
end
|
|
}
|
|
if is_forward then
|
|
rec.prev_x = 0
|
|
rec.prev_a = 1
|
|
rec.next_x = 640
|
|
rec.next_a = 0
|
|
rec.isDone = function (self) return self.next_x <= 0 end
|
|
rec.step = function (self)
|
|
self.next_x = self.next_x - 20
|
|
self.next_a = (640 - self.next_x) / 640
|
|
self.prev_a = 1 - self.next_a
|
|
end
|
|
else
|
|
rec.prev_x = 0
|
|
rec.prev_a = 1
|
|
rec.next_x = 0
|
|
rec.next_a = 0
|
|
rec.isDone = function (self) return self.prev_x >= 640 end
|
|
rec.step = function (self)
|
|
self.prev_x = self.prev_x + 20
|
|
self.prev_a = (640 - self.prev_x) / 640
|
|
self.next_a = 1 - self.prev_a
|
|
end
|
|
end
|
|
return rec
|
|
end
|
|
|
|
function fade_transition(prev, next, is_forward)
|
|
local rec = {
|
|
paint = Sk.newPaint(),
|
|
prevDrawable = prev,
|
|
nextDrawable = next,
|
|
proc = function(self, canvas, drawSlideProc)
|
|
if self:isDone() then
|
|
drawSlideProc(canvas)
|
|
return nil
|
|
end
|
|
|
|
set_blur(self.paint, self.prev_a)
|
|
self.prevDrawable:draw(canvas, 0, 0, self.paint)
|
|
|
|
set_blur(self.paint, self.next_a)
|
|
self.nextDrawable:draw(canvas, 0, 0, self.paint)
|
|
self:step()
|
|
return self
|
|
end
|
|
}
|
|
rec.prev_a = 1
|
|
rec.next_a = 0
|
|
rec.isDone = function (self) return self.next_a >= 1 end
|
|
rec.step = function (self)
|
|
self.prev_a = math.max(self.prev_a - 0.025, 0)
|
|
self.next_a = 1 - self.prev_a
|
|
end
|
|
|
|
return rec
|
|
end
|
|
|
|
function rotate_transition(prev, next, is_forward)
|
|
local rec = {
|
|
angle = 0,
|
|
prevDrawable = prev,
|
|
nextDrawable = next,
|
|
activeDrawable = prev,
|
|
proc = function(self, canvas, drawSlideProc)
|
|
if self:isDone() then
|
|
drawSlideProc(canvas)
|
|
return nil
|
|
end
|
|
|
|
canvas:save()
|
|
canvas:translate(320, 240)
|
|
canvas:rotate(self.angle)
|
|
canvas:translate(-320, -240)
|
|
self.activeDrawable:draw(canvas, 0, 0)
|
|
self:step()
|
|
return self
|
|
end,
|
|
isDone = function (self) return self.angle >= 360 or self.angle <= -360 end
|
|
}
|
|
if is_forward then
|
|
rec.step = function (self)
|
|
self.angle = self.angle + 10
|
|
if self.angle >= 180 then
|
|
self.activeDrawable = self.nextDrawable
|
|
end
|
|
end
|
|
else
|
|
rec.step = function (self)
|
|
self.angle = self.angle - 10
|
|
if self.angle <= -180 then
|
|
self.activeDrawable = self.nextDrawable
|
|
end
|
|
end
|
|
end
|
|
return rec
|
|
end
|
|
|
|
function zoom_transition(prev, next, is_forward)
|
|
local rec = {
|
|
scale = 1,
|
|
scale_delta = .95,
|
|
scale_limit = 0.2,
|
|
pivot_x = 320,
|
|
pivot_y = 240,
|
|
prevDrawable = prev,
|
|
nextDrawable = next,
|
|
activeDrawable = prev,
|
|
proc = function(self, canvas, drawSlideProc)
|
|
if self:isDone() then
|
|
drawSlideProc(canvas)
|
|
return nil
|
|
end
|
|
|
|
canvas:translate(self.pivot_x, self.pivot_y)
|
|
canvas:scale(self.scale, self.scale)
|
|
canvas:translate(-self.pivot_x, -self.pivot_y)
|
|
self.activeDrawable:draw(canvas, 0, 0)
|
|
self:step()
|
|
return self
|
|
end,
|
|
isDone = function (self) return self.scale > 1 end,
|
|
step = function (self)
|
|
if self.scale < self.scale_limit then
|
|
self.scale = self.scale_limit
|
|
self.scale_delta = 1 / self.scale_delta
|
|
self.activeDrawable = self.nextDrawable
|
|
end
|
|
self.scale = self.scale * self.scale_delta
|
|
end
|
|
}
|
|
return rec
|
|
end
|
|
|
|
gTransitionTable = {
|
|
fade = fade_transition,
|
|
slide = slide_transition,
|
|
fade_slide = fade_slide_transition,
|
|
rotate = rotate_transition,
|
|
zoom = zoom_transition,
|
|
}
|
|
|