blob: 30f146d766eb52d92f4fdc32ddd36f5a040a50c5 [file] [log] [blame]
reed86217d82014-10-25 20:44:40 -07001
2gPath = "/skia/trunk/resources/"
3
4function load_file(file)
5 package.path = package.path .. ";" .. gPath .. file .. ".lua"
6 require(file)
reedd2e7dfb2014-10-13 19:43:17 -07007end
8
reed86217d82014-10-25 20:44:40 -07009load_file("slides_utils")
reedd2e7dfb2014-10-13 19:43:17 -070010
11gSlides = parse_file(io.open("/skia/trunk/resources/slides_content.lua", "r"))
reed18ea7772014-10-11 11:28:07 -070012
reedbdc49ae2014-10-14 09:34:52 -070013function make_rect(l, t, r, b)
14 return { left = l, top = t, right = r, bottom = b }
15end
16
17function make_paint(typefacename, stylebits, size, color)
reed18ea7772014-10-11 11:28:07 -070018 local paint = Sk.newPaint();
19 paint:setAntiAlias(true)
reed09a1d672014-10-11 13:13:11 -070020 paint:setSubpixelText(true)
reedbdc49ae2014-10-14 09:34:52 -070021 paint:setTypeface(Sk.newTypeface(typefacename, stylebits))
reed18ea7772014-10-11 11:28:07 -070022 paint:setTextSize(size)
23 paint:setColor(color)
24 return paint
25end
26
reedbdc49ae2014-10-14 09:34:52 -070027function drawSlide(canvas, slide, template)
28 template = template.slide -- need to sniff the slide to know if we're title or slide
29
30 local x = template.margin_x
31 local y = template.margin_y
32
reed9fbc3f32014-10-21 07:12:58 -070033 local scale = 1.25
reedd2e7dfb2014-10-13 19:43:17 -070034 for i = 1, #slide do
35 local node = slide[i]
reed9fbc3f32014-10-21 07:12:58 -070036 local paint = template[node.indent + 1].paint
37 local extra_dy = template[node.indent + 1].extra_dy
reedd2e7dfb2014-10-13 19:43:17 -070038 local fm = paint:getFontMetrics()
reedbdc49ae2014-10-14 09:34:52 -070039 local x_offset = -fm.ascent * node.indent
40
reedd2e7dfb2014-10-13 19:43:17 -070041 y = y - fm.ascent * scale
reedbdc49ae2014-10-14 09:34:52 -070042 canvas:drawText(node.text, x + x_offset, y, paint)
reed9fbc3f32014-10-21 07:12:58 -070043 y = y + fm.descent * scale + extra_dy
44 end
45end
46
47function scale_text_delta(template, delta)
48 template = template.slide
49 for i = 1, #template do
50 local paint = template[i].paint
51 paint:setTextSize(paint:getTextSize() + delta)
reed18ea7772014-10-11 11:28:07 -070052 end
53end
54
reedf355df52014-10-12 12:18:40 -070055function slide_transition(prev, next, is_forward)
56 local rec = {
57 proc = function(self, canvas, drawSlideProc)
58 if self:isDone() then
59 drawSlideProc(canvas)
60 return nil
61 end
reed96affcd2014-10-13 12:38:04 -070062 self.prevDrawable:draw(canvas, self.curr_x, 0)
63 self.nextDrawable:draw(canvas, self.curr_x + 640, 0)
reedf355df52014-10-12 12:18:40 -070064 self.curr_x = self.curr_x + self.step_x
65 return self
66 end
67 }
68 if is_forward then
reed96affcd2014-10-13 12:38:04 -070069 rec.prevDrawable = prev
70 rec.nextDrawable = next
reedf355df52014-10-12 12:18:40 -070071 rec.curr_x = 0
72 rec.step_x = -15
73 rec.isDone = function (self) return self.curr_x <= -640 end
74 else
reed96affcd2014-10-13 12:38:04 -070075 rec.prevDrawable = next
76 rec.nextDrawable = prev
reedf355df52014-10-12 12:18:40 -070077 rec.curr_x = -640
78 rec.step_x = 15
79 rec.isDone = function (self) return self.curr_x >= 0 end
80 end
81 return rec
82end
83
reed468b1812014-10-19 11:42:54 -070084function sqr(value) return value * value end
85
reed468b1812014-10-19 11:42:54 -070086function set_blur(paint, alpha)
87 local sigma = sqr(1 - alpha) * 20
reed86217d82014-10-25 20:44:40 -070088-- paint:setImageFilter(Sk.newBlurImageFilter(sigma, sigma))
reed468b1812014-10-19 11:42:54 -070089 paint:setAlpha(alpha)
90end
91
reed0d76b952014-10-12 19:05:52 -070092function fade_slide_transition(prev, next, is_forward)
93 local rec = {
reed468b1812014-10-19 11:42:54 -070094 paint = Sk.newPaint(),
reed96affcd2014-10-13 12:38:04 -070095 prevDrawable = prev,
96 nextDrawable = next,
reed0d76b952014-10-12 19:05:52 -070097 proc = function(self, canvas, drawSlideProc)
98 if self:isDone() then
99 drawSlideProc(canvas)
100 return nil
101 end
reed468b1812014-10-19 11:42:54 -0700102
103 set_blur(self.paint, self.prev_a)
104 self.prevDrawable:draw(canvas, self.prev_x, 0, self.paint)
105
106 set_blur(self.paint, self.next_a)
107 self.nextDrawable:draw(canvas, self.next_x, 0, self.paint)
reed0d76b952014-10-12 19:05:52 -0700108 self:step()
109 return self
110 end
111 }
112 if is_forward then
113 rec.prev_x = 0
114 rec.prev_a = 1
115 rec.next_x = 640
116 rec.next_a = 0
117 rec.isDone = function (self) return self.next_x <= 0 end
118 rec.step = function (self)
119 self.next_x = self.next_x - 20
120 self.next_a = (640 - self.next_x) / 640
121 self.prev_a = 1 - self.next_a
122 end
123 else
124 rec.prev_x = 0
125 rec.prev_a = 1
126 rec.next_x = 0
127 rec.next_a = 0
128 rec.isDone = function (self) return self.prev_x >= 640 end
129 rec.step = function (self)
130 self.prev_x = self.prev_x + 20
131 self.prev_a = (640 - self.prev_x) / 640
132 self.next_a = 1 - self.prev_a
133 end
134 end
135 return rec
136end
137
reed18ea7772014-10-11 11:28:07 -0700138--------------------------------------------------------------------------------------
reed9fbc3f32014-10-21 07:12:58 -0700139function make_tmpl(paint, extra_dy)
140 return { paint = paint, extra_dy = extra_dy }
141end
reed18ea7772014-10-11 11:28:07 -0700142
reedbdc49ae2014-10-14 09:34:52 -0700143function SkiaPoint_make_template()
144 local title = {
145 margin_x = 30,
146 margin_y = 100,
147 }
reed9fbc3f32014-10-21 07:12:58 -0700148 title[1] = make_paint("Arial", 1, 50, { a=1, r=1, g=1, b=1 })
reedbdc49ae2014-10-14 09:34:52 -0700149 title[1]:setTextAlign("center")
reed9fbc3f32014-10-21 07:12:58 -0700150 title[2] = make_paint("Arial", 1, 25, { a=1, r=.75, g=.75, b=.75 })
reedbdc49ae2014-10-14 09:34:52 -0700151 title[2]:setTextAlign("center")
reed18ea7772014-10-11 11:28:07 -0700152
reedbdc49ae2014-10-14 09:34:52 -0700153 local slide = {
154 margin_x = 20,
reed9fbc3f32014-10-21 07:12:58 -0700155 margin_y = 25,
reedbdc49ae2014-10-14 09:34:52 -0700156 }
reed9fbc3f32014-10-21 07:12:58 -0700157 slide[1] = make_tmpl(make_paint("Arial", 1, 36, { a=1, r=1, g=1, b=1 }), 18)
158 slide[2] = make_tmpl(make_paint("Arial", 0, 30, { a=1, r=1, g=1, b=1 }), 0)
159 slide[3] = make_tmpl(make_paint("Arial", 0, 24, { a=1, r=.8, g=.8, b=.8 }), 0)
reedbdc49ae2014-10-14 09:34:52 -0700160
161 return {
162 title = title,
163 slide = slide,
164 }
165end
166
167gTemplate = SkiaPoint_make_template()
reed18ea7772014-10-11 11:28:07 -0700168
169gRedPaint = Sk.newPaint()
170gRedPaint:setAntiAlias(true)
171gRedPaint:setColor{a=1, r=1, g=0, b=0 }
172
reed09a1d672014-10-11 13:13:11 -0700173-- animation.proc is passed the canvas before drawing.
174-- The animation.proc returns itself or another animation (which means keep animating)
175-- or it returns nil, which stops the animation.
176--
177local gCurrAnimation
178
reedf355df52014-10-12 12:18:40 -0700179gSlideIndex = 1
180
reed96affcd2014-10-13 12:38:04 -0700181function new_drawable_picture(pic)
182 return {
183 picture = pic,
184 width = pic:width(),
185 height = pic:height(),
186 draw = function (self, canvas, x, y, paint)
187 canvas:drawPicture(self.picture, x, y, paint)
188 end
189 }
190end
191
192function new_drawable_image(img)
193 return {
194 image = img,
195 width = img:width(),
196 height = img:height(),
197 draw = function (self, canvas, x, y, paint)
198 canvas:drawImage(self.image, x, y, paint)
199 end
200 }
201end
reedf355df52014-10-12 12:18:40 -0700202
reed86217d82014-10-25 20:44:40 -0700203function new_drawable_slide(slide)
204 return {
205 slide = slide,
206 draw = function (self, canvas, x, y, paint)
207 if (nil == paint or ("number" == type(paint) and (1 == paint))) then
208 canvas:save()
209 else
210 canvas:saveLayer(paint)
211 end
212 canvas:translate(x, y)
213 drawSlide(canvas, self.slide, gTemplate)
214 canvas:restore()
215 end
216 }
217end
218
219function next_slide()
220 local prev = gSlides[gSlideIndex]
221
222 gSlideIndex = gSlideIndex + 1
223 if gSlideIndex > #gSlides then
224 gSlideIndex = 1
225 end
226
227 spawn_transition(prev, gSlides[gSlideIndex], true)
228end
229
230function prev_slide()
231 local prev = gSlides[gSlideIndex]
232
233 gSlideIndex = gSlideIndex - 1
234 if gSlideIndex < 1 then
235 gSlideIndex = #gSlides
236 end
237
238 spawn_transition(prev, gSlides[gSlideIndex], false)
239end
240
reed468b1812014-10-19 11:42:54 -0700241function convert_to_picture_drawable(slide)
242 local rec = Sk.newPictureRecorder()
243 drawSlide(rec:beginRecording(640, 480), slide, gTemplate)
244 return new_drawable_picture(rec:endRecording())
245end
246
247function convert_to_image_drawable(slide)
248 local surf = Sk.newRasterSurface(640, 480)
249 drawSlide(surf:getCanvas(), slide, gTemplate)
250 return new_drawable_image(surf:newImageSnapshot())
251end
252
reed86217d82014-10-25 20:44:40 -0700253-- gMakeDrawable = convert_to_picture_drawable
254gMakeDrawable = new_drawable_slide
reed468b1812014-10-19 11:42:54 -0700255
reedf355df52014-10-12 12:18:40 -0700256function spawn_transition(prevSlide, nextSlide, is_forward)
257 local transition
258 if is_forward then
259 transition = prevSlide.transition
260 else
261 transition = nextSlide.transition
262 end
263
264 if not transition then
reedd2e7dfb2014-10-13 19:43:17 -0700265 transition = fade_slide_transition
reedf355df52014-10-12 12:18:40 -0700266 end
267
reed468b1812014-10-19 11:42:54 -0700268 local prevDrawable = gMakeDrawable(prevSlide)
269 local nextDrawable = gMakeDrawable(nextSlide)
reed96affcd2014-10-13 12:38:04 -0700270 gCurrAnimation = transition(prevDrawable, nextDrawable, is_forward)
reedf355df52014-10-12 12:18:40 -0700271end
272
273--------------------------------------------------------------------------------------
274
reed09a1d672014-10-11 13:13:11 -0700275function spawn_rotate_animation()
276 gCurrAnimation = {
277 angle = 0,
278 angle_delta = 5,
279 pivot_x = 320,
280 pivot_y = 240,
reedf355df52014-10-12 12:18:40 -0700281 proc = function (self, canvas, drawSlideProc)
282 if self.angle >= 360 then
283 drawSlideProc(canvas)
reed09a1d672014-10-11 13:13:11 -0700284 return nil
285 end
reedf355df52014-10-12 12:18:40 -0700286 canvas:translate(self.pivot_x, self.pivot_y)
287 canvas:rotate(self.angle)
288 canvas:translate(-self.pivot_x, -self.pivot_y)
289 drawSlideProc(canvas)
reed09a1d672014-10-11 13:13:11 -0700290
reedf355df52014-10-12 12:18:40 -0700291 self.angle = self.angle + self.angle_delta
292 return self
reed09a1d672014-10-11 13:13:11 -0700293 end
294 }
295end
296
297function spawn_scale_animation()
298 gCurrAnimation = {
299 scale = 1,
300 scale_delta = .95,
301 scale_limit = 0.2,
302 pivot_x = 320,
303 pivot_y = 240,
reedf355df52014-10-12 12:18:40 -0700304 proc = function (self, canvas, drawSlideProc)
305 if self.scale < self.scale_limit then
306 self.scale = self.scale_limit
307 self.scale_delta = 1 / self.scale_delta
reed09a1d672014-10-11 13:13:11 -0700308 end
reedf355df52014-10-12 12:18:40 -0700309 if self.scale > 1 then
310 drawSlideProc(canvas)
reed09a1d672014-10-11 13:13:11 -0700311 return nil
312 end
reedf355df52014-10-12 12:18:40 -0700313 canvas:translate(self.pivot_x, self.pivot_y)
314 canvas:scale(self.scale, self.scale)
315 canvas:translate(-self.pivot_x, -self.pivot_y)
316 drawSlideProc(canvas)
reed09a1d672014-10-11 13:13:11 -0700317
reedf355df52014-10-12 12:18:40 -0700318 self.scale = self.scale * self.scale_delta
319 return self
reed09a1d672014-10-11 13:13:11 -0700320 end
321 }
322end
323
reed9fbc3f32014-10-21 07:12:58 -0700324local bgPaint = nil
325
326function draw_bg(canvas)
327 if not bgPaint then
328 bgPaint = Sk.newPaint()
329 local grad = Sk.newLinearGradient( 0, 0, { a=1, r=0, g=0, b=.3 },
330 640, 480, { a=1, r=0, g=0, b=.8 })
331 bgPaint:setShader(grad)
332 end
333
334 canvas:drawPaint(bgPaint)
335end
336
reedbdc49ae2014-10-14 09:34:52 -0700337function onDrawContent(canvas, width, height)
338 local matrix = Sk.newMatrix()
339 matrix:setRectToRect(make_rect(0, 0, 640, 480), make_rect(0, 0, width, height), "center")
340 canvas:concat(matrix)
341
reed9fbc3f32014-10-21 07:12:58 -0700342 draw_bg(canvas)
343
reedf355df52014-10-12 12:18:40 -0700344 local drawSlideProc = function(canvas)
reedbdc49ae2014-10-14 09:34:52 -0700345 drawSlide(canvas, gSlides[gSlideIndex], gTemplate)
reed09a1d672014-10-11 13:13:11 -0700346 end
347
reed09a1d672014-10-11 13:13:11 -0700348 if gCurrAnimation then
reedf355df52014-10-12 12:18:40 -0700349 gCurrAnimation = gCurrAnimation:proc(canvas, drawSlideProc)
reed09a1d672014-10-11 13:13:11 -0700350 return true
351 else
reedf355df52014-10-12 12:18:40 -0700352 drawSlideProc(canvas)
reed09a1d672014-10-11 13:13:11 -0700353 return false
354 end
355end
356
357function onClickHandler(x, y)
358 return false
359end
360
361local keyProcs = {
362 n = next_slide,
363 p = prev_slide,
364 r = spawn_rotate_animation,
365 s = spawn_scale_animation,
reedc7663982014-10-21 10:46:01 -0700366 ["="] = function () scale_text_delta(gTemplate, 1) end,
367 ["-"] = function () scale_text_delta(gTemplate, -1) end,
reed09a1d672014-10-11 13:13:11 -0700368}
369
370function onCharHandler(uni)
371 local proc = keyProcs[uni]
372 if proc then
373 proc()
374 return true
375 end
376 return false
377end