blob: e96182c2bdcdece5e678a2672f376fe94fec1c55 [file] [log] [blame]
reed86217d82014-10-25 20:44:40 -07001
2gPath = "/skia/trunk/resources/"
3
4function load_file(file)
reed07dada72014-10-29 20:36:05 -07005 local prev_path = package.path
reed86217d82014-10-25 20:44:40 -07006 package.path = package.path .. ";" .. gPath .. file .. ".lua"
7 require(file)
reed07dada72014-10-29 20:36:05 -07008 package.path = prev_path
reedd2e7dfb2014-10-13 19:43:17 -07009end
10
reed86217d82014-10-25 20:44:40 -070011load_file("slides_utils")
reedd2e7dfb2014-10-13 19:43:17 -070012
reedde330ff2014-11-02 19:19:34 -080013gSlides = parse_file(io.open("/skia/trunk/resources/slides_content2.lua", "r"))
reed18ea7772014-10-11 11:28:07 -070014
reedbdc49ae2014-10-14 09:34:52 -070015function make_rect(l, t, r, b)
16 return { left = l, top = t, right = r, bottom = b }
17end
18
19function make_paint(typefacename, stylebits, size, color)
reed18ea7772014-10-11 11:28:07 -070020 local paint = Sk.newPaint();
21 paint:setAntiAlias(true)
reed09a1d672014-10-11 13:13:11 -070022 paint:setSubpixelText(true)
reedbdc49ae2014-10-14 09:34:52 -070023 paint:setTypeface(Sk.newTypeface(typefacename, stylebits))
reed18ea7772014-10-11 11:28:07 -070024 paint:setTextSize(size)
25 paint:setColor(color)
26 return paint
27end
28
reed9e233b22014-11-03 12:18:24 -080029function draw_bullet(canvas, x, y, paint, indent)
30 if 0 == indent then
31 return
32 end
33 local ps = paint:getTextSize()
34 local cx = x - ps * .8
35 local cy = y - ps * .4
36 local radius = ps * .2
37 canvas:drawCircle(cx, cy, radius, paint)
38end
39
reedde330ff2014-11-02 19:19:34 -080040function drawSlide(canvas, slide, master_template)
41 template = master_template.slide -- need to sniff the slide to know if we're title or slide
reedbdc49ae2014-10-14 09:34:52 -070042
43 local x = template.margin_x
44 local y = template.margin_y
reed9e233b22014-11-03 12:18:24 -080045 local scale = 1.25
reedbdc49ae2014-10-14 09:34:52 -070046
reedde330ff2014-11-02 19:19:34 -080047 if slide.blockstyle == "code" then
48 local paint = master_template.codePaint
49 local fm = paint:getFontMetrics()
50 local height = #slide * (fm.descent - fm.ascent)
51 y = (480 - height) / 2
52 for i = 1, #slide do
53 local node = slide[i]
reed9e233b22014-11-03 12:18:24 -080054 y = y - fm.ascent * scale
reedde330ff2014-11-02 19:19:34 -080055 canvas:drawText(node.text, x, y, paint)
reed9e233b22014-11-03 12:18:24 -080056 y = y + fm.descent * scale
reedde330ff2014-11-02 19:19:34 -080057 end
58 return
59 end
60
reedd2e7dfb2014-10-13 19:43:17 -070061 for i = 1, #slide do
62 local node = slide[i]
reed9fbc3f32014-10-21 07:12:58 -070063 local paint = template[node.indent + 1].paint
64 local extra_dy = template[node.indent + 1].extra_dy
reedd2e7dfb2014-10-13 19:43:17 -070065 local fm = paint:getFontMetrics()
reed9e233b22014-11-03 12:18:24 -080066 local x_offset = -fm.ascent * node.indent * 1.25
reedbdc49ae2014-10-14 09:34:52 -070067
reedd2e7dfb2014-10-13 19:43:17 -070068 y = y - fm.ascent * scale
reed9e233b22014-11-03 12:18:24 -080069 draw_bullet(canvas, x + x_offset, y, paint, node.indent)
reedbdc49ae2014-10-14 09:34:52 -070070 canvas:drawText(node.text, x + x_offset, y, paint)
reed9fbc3f32014-10-21 07:12:58 -070071 y = y + fm.descent * scale + extra_dy
72 end
73end
74
reed18ea7772014-10-11 11:28:07 -070075--------------------------------------------------------------------------------------
reed9fbc3f32014-10-21 07:12:58 -070076function make_tmpl(paint, extra_dy)
77 return { paint = paint, extra_dy = extra_dy }
78end
reed18ea7772014-10-11 11:28:07 -070079
reedbdc49ae2014-10-14 09:34:52 -070080function SkiaPoint_make_template()
81 local title = {
82 margin_x = 30,
83 margin_y = 100,
84 }
reed9e233b22014-11-03 12:18:24 -080085 title[1] = make_paint("Arial", 1, 45, { a=1, r=1, g=1, b=1 })
reedbdc49ae2014-10-14 09:34:52 -070086 title[1]:setTextAlign("center")
reed9fbc3f32014-10-21 07:12:58 -070087 title[2] = make_paint("Arial", 1, 25, { a=1, r=.75, g=.75, b=.75 })
reedbdc49ae2014-10-14 09:34:52 -070088 title[2]:setTextAlign("center")
reed18ea7772014-10-11 11:28:07 -070089
reedbdc49ae2014-10-14 09:34:52 -070090 local slide = {
91 margin_x = 20,
reed9fbc3f32014-10-21 07:12:58 -070092 margin_y = 25,
reedbdc49ae2014-10-14 09:34:52 -070093 }
reed9e233b22014-11-03 12:18:24 -080094 slide[1] = make_tmpl(make_paint("Arial", 1, 35, { a=1, r=1, g=1, b=1 }), 18)
95 slide[2] = make_tmpl(make_paint("Arial", 0, 25, { a=1, r=1, g=1, b=1 }), 0)
96 slide[3] = make_tmpl(make_paint("Arial", 0, 20, { a=1, r=.9, g=.9, b=.9 }), 0)
reedbdc49ae2014-10-14 09:34:52 -070097
98 return {
99 title = title,
100 slide = slide,
reed9e233b22014-11-03 12:18:24 -0800101 codePaint = make_paint("Courier", 0, 20, { a=1, r=.9, g=.9, b=.9 }),
reedbdc49ae2014-10-14 09:34:52 -0700102 }
103end
104
105gTemplate = SkiaPoint_make_template()
reed18ea7772014-10-11 11:28:07 -0700106
107gRedPaint = Sk.newPaint()
108gRedPaint:setAntiAlias(true)
109gRedPaint:setColor{a=1, r=1, g=0, b=0 }
110
reed09a1d672014-10-11 13:13:11 -0700111-- animation.proc is passed the canvas before drawing.
112-- The animation.proc returns itself or another animation (which means keep animating)
113-- or it returns nil, which stops the animation.
114--
115local gCurrAnimation
116
reedf355df52014-10-12 12:18:40 -0700117gSlideIndex = 1
118
reed96affcd2014-10-13 12:38:04 -0700119function new_drawable_picture(pic)
120 return {
121 picture = pic,
122 width = pic:width(),
123 height = pic:height(),
124 draw = function (self, canvas, x, y, paint)
125 canvas:drawPicture(self.picture, x, y, paint)
126 end
127 }
128end
129
130function new_drawable_image(img)
131 return {
132 image = img,
133 width = img:width(),
134 height = img:height(),
135 draw = function (self, canvas, x, y, paint)
136 canvas:drawImage(self.image, x, y, paint)
137 end
138 }
139end
reedf355df52014-10-12 12:18:40 -0700140
reed86217d82014-10-25 20:44:40 -0700141function new_drawable_slide(slide)
142 return {
143 slide = slide,
144 draw = function (self, canvas, x, y, paint)
145 if (nil == paint or ("number" == type(paint) and (1 == paint))) then
146 canvas:save()
147 else
148 canvas:saveLayer(paint)
149 end
150 canvas:translate(x, y)
151 drawSlide(canvas, self.slide, gTemplate)
152 canvas:restore()
153 end
154 }
155end
156
157function next_slide()
158 local prev = gSlides[gSlideIndex]
159
160 gSlideIndex = gSlideIndex + 1
161 if gSlideIndex > #gSlides then
162 gSlideIndex = 1
163 end
164
165 spawn_transition(prev, gSlides[gSlideIndex], true)
166end
167
168function prev_slide()
169 local prev = gSlides[gSlideIndex]
170
171 gSlideIndex = gSlideIndex - 1
172 if gSlideIndex < 1 then
173 gSlideIndex = #gSlides
174 end
175
176 spawn_transition(prev, gSlides[gSlideIndex], false)
177end
178
reed468b1812014-10-19 11:42:54 -0700179function convert_to_picture_drawable(slide)
180 local rec = Sk.newPictureRecorder()
181 drawSlide(rec:beginRecording(640, 480), slide, gTemplate)
182 return new_drawable_picture(rec:endRecording())
183end
184
185function convert_to_image_drawable(slide)
186 local surf = Sk.newRasterSurface(640, 480)
187 drawSlide(surf:getCanvas(), slide, gTemplate)
188 return new_drawable_image(surf:newImageSnapshot())
189end
190
reed86217d82014-10-25 20:44:40 -0700191-- gMakeDrawable = convert_to_picture_drawable
192gMakeDrawable = new_drawable_slide
reed468b1812014-10-19 11:42:54 -0700193
reed07dada72014-10-29 20:36:05 -0700194load_file("slides_transitions")
195
reedf355df52014-10-12 12:18:40 -0700196function spawn_transition(prevSlide, nextSlide, is_forward)
197 local transition
198 if is_forward then
reed07dada72014-10-29 20:36:05 -0700199 transition = gTransitionTable[nextSlide.transition]
reedf355df52014-10-12 12:18:40 -0700200 else
reed07dada72014-10-29 20:36:05 -0700201 transition = gTransitionTable[prevSlide.transition]
reedf355df52014-10-12 12:18:40 -0700202 end
203
204 if not transition then
reedd2e7dfb2014-10-13 19:43:17 -0700205 transition = fade_slide_transition
reedf355df52014-10-12 12:18:40 -0700206 end
207
reed468b1812014-10-19 11:42:54 -0700208 local prevDrawable = gMakeDrawable(prevSlide)
209 local nextDrawable = gMakeDrawable(nextSlide)
reed96affcd2014-10-13 12:38:04 -0700210 gCurrAnimation = transition(prevDrawable, nextDrawable, is_forward)
reedf355df52014-10-12 12:18:40 -0700211end
212
213--------------------------------------------------------------------------------------
214
reed09a1d672014-10-11 13:13:11 -0700215function spawn_rotate_animation()
216 gCurrAnimation = {
217 angle = 0,
218 angle_delta = 5,
219 pivot_x = 320,
220 pivot_y = 240,
reedf355df52014-10-12 12:18:40 -0700221 proc = function (self, canvas, drawSlideProc)
222 if self.angle >= 360 then
223 drawSlideProc(canvas)
reed09a1d672014-10-11 13:13:11 -0700224 return nil
225 end
reedf355df52014-10-12 12:18:40 -0700226 canvas:translate(self.pivot_x, self.pivot_y)
227 canvas:rotate(self.angle)
228 canvas:translate(-self.pivot_x, -self.pivot_y)
229 drawSlideProc(canvas)
reed09a1d672014-10-11 13:13:11 -0700230
reedf355df52014-10-12 12:18:40 -0700231 self.angle = self.angle + self.angle_delta
232 return self
reed09a1d672014-10-11 13:13:11 -0700233 end
234 }
235end
236
237function spawn_scale_animation()
238 gCurrAnimation = {
239 scale = 1,
240 scale_delta = .95,
241 scale_limit = 0.2,
242 pivot_x = 320,
243 pivot_y = 240,
reedf355df52014-10-12 12:18:40 -0700244 proc = function (self, canvas, drawSlideProc)
245 if self.scale < self.scale_limit then
246 self.scale = self.scale_limit
247 self.scale_delta = 1 / self.scale_delta
reed09a1d672014-10-11 13:13:11 -0700248 end
reedf355df52014-10-12 12:18:40 -0700249 if self.scale > 1 then
250 drawSlideProc(canvas)
reed09a1d672014-10-11 13:13:11 -0700251 return nil
252 end
reedf355df52014-10-12 12:18:40 -0700253 canvas:translate(self.pivot_x, self.pivot_y)
254 canvas:scale(self.scale, self.scale)
255 canvas:translate(-self.pivot_x, -self.pivot_y)
256 drawSlideProc(canvas)
reed09a1d672014-10-11 13:13:11 -0700257
reedf355df52014-10-12 12:18:40 -0700258 self.scale = self.scale * self.scale_delta
259 return self
reed09a1d672014-10-11 13:13:11 -0700260 end
261 }
262end
263
reed9fbc3f32014-10-21 07:12:58 -0700264local bgPaint = nil
265
266function draw_bg(canvas)
267 if not bgPaint then
268 bgPaint = Sk.newPaint()
269 local grad = Sk.newLinearGradient( 0, 0, { a=1, r=0, g=0, b=.3 },
270 640, 480, { a=1, r=0, g=0, b=.8 })
271 bgPaint:setShader(grad)
272 end
273
274 canvas:drawPaint(bgPaint)
275end
276
reedbdc49ae2014-10-14 09:34:52 -0700277function onDrawContent(canvas, width, height)
278 local matrix = Sk.newMatrix()
279 matrix:setRectToRect(make_rect(0, 0, 640, 480), make_rect(0, 0, width, height), "center")
280 canvas:concat(matrix)
281
reed9fbc3f32014-10-21 07:12:58 -0700282 draw_bg(canvas)
283
reedf355df52014-10-12 12:18:40 -0700284 local drawSlideProc = function(canvas)
reedbdc49ae2014-10-14 09:34:52 -0700285 drawSlide(canvas, gSlides[gSlideIndex], gTemplate)
reed09a1d672014-10-11 13:13:11 -0700286 end
287
reed09a1d672014-10-11 13:13:11 -0700288 if gCurrAnimation then
reedf355df52014-10-12 12:18:40 -0700289 gCurrAnimation = gCurrAnimation:proc(canvas, drawSlideProc)
reed09a1d672014-10-11 13:13:11 -0700290 return true
291 else
reedf355df52014-10-12 12:18:40 -0700292 drawSlideProc(canvas)
reed09a1d672014-10-11 13:13:11 -0700293 return false
294 end
295end
296
297function onClickHandler(x, y)
298 return false
299end
300
301local keyProcs = {
302 n = next_slide,
303 p = prev_slide,
304 r = spawn_rotate_animation,
305 s = spawn_scale_animation,
reedc7663982014-10-21 10:46:01 -0700306 ["="] = function () scale_text_delta(gTemplate, 1) end,
307 ["-"] = function () scale_text_delta(gTemplate, -1) end,
reed09a1d672014-10-11 13:13:11 -0700308}
309
310function onCharHandler(uni)
311 local proc = keyProcs[uni]
312 if proc then
313 proc()
314 return true
315 end
316 return false
317end