blob: f706a296590606450a92ba55c6e31a805e462d10 [file] [log] [blame]
reed1b6ab442014-11-03 19:55:41 -08001gShowBounds = false
reed86217d82014-10-25 20:44:40 -07002
3gPath = "/skia/trunk/resources/"
4
5function load_file(file)
reed07dada72014-10-29 20:36:05 -07006 local prev_path = package.path
reed86217d82014-10-25 20:44:40 -07007 package.path = package.path .. ";" .. gPath .. file .. ".lua"
8 require(file)
reed07dada72014-10-29 20:36:05 -07009 package.path = prev_path
reedd2e7dfb2014-10-13 19:43:17 -070010end
11
reed86217d82014-10-25 20:44:40 -070012load_file("slides_utils")
reedd2e7dfb2014-10-13 19:43:17 -070013
reedde330ff2014-11-02 19:19:34 -080014gSlides = parse_file(io.open("/skia/trunk/resources/slides_content2.lua", "r"))
reed18ea7772014-10-11 11:28:07 -070015
reedbdc49ae2014-10-14 09:34:52 -070016function make_rect(l, t, r, b)
17 return { left = l, top = t, right = r, bottom = b }
18end
19
20function make_paint(typefacename, stylebits, size, color)
reed18ea7772014-10-11 11:28:07 -070021 local paint = Sk.newPaint();
22 paint:setAntiAlias(true)
reed09a1d672014-10-11 13:13:11 -070023 paint:setSubpixelText(true)
reedbdc49ae2014-10-14 09:34:52 -070024 paint:setTypeface(Sk.newTypeface(typefacename, stylebits))
reed18ea7772014-10-11 11:28:07 -070025 paint:setTextSize(size)
26 paint:setColor(color)
27 return paint
28end
29
reed9e233b22014-11-03 12:18:24 -080030function draw_bullet(canvas, x, y, paint, indent)
31 if 0 == indent then
32 return
33 end
34 local ps = paint:getTextSize()
35 local cx = x - ps * .8
36 local cy = y - ps * .4
37 local radius = ps * .2
38 canvas:drawCircle(cx, cy, radius, paint)
39end
40
reed1b6ab442014-11-03 19:55:41 -080041function stroke_rect(canvas, rect, color)
42 local paint = Sk.newPaint()
43 paint:setStroke(true);
44 paint:setColor(color)
45 canvas:drawRect(rect, paint)
46end
47
reedde330ff2014-11-02 19:19:34 -080048function drawSlide(canvas, slide, master_template)
49 template = master_template.slide -- need to sniff the slide to know if we're title or slide
reedbdc49ae2014-10-14 09:34:52 -070050
51 local x = template.margin_x
52 local y = template.margin_y
reed9e233b22014-11-03 12:18:24 -080053 local scale = 1.25
reedbdc49ae2014-10-14 09:34:52 -070054
reedde330ff2014-11-02 19:19:34 -080055 if slide.blockstyle == "code" then
56 local paint = master_template.codePaint
57 local fm = paint:getFontMetrics()
58 local height = #slide * (fm.descent - fm.ascent)
59 y = (480 - height) / 2
60 for i = 1, #slide do
61 local node = slide[i]
reed9e233b22014-11-03 12:18:24 -080062 y = y - fm.ascent * scale
reedde330ff2014-11-02 19:19:34 -080063 canvas:drawText(node.text, x, y, paint)
reed9e233b22014-11-03 12:18:24 -080064 y = y + fm.descent * scale
reedde330ff2014-11-02 19:19:34 -080065 end
66 return
67 end
68
reedd2e7dfb2014-10-13 19:43:17 -070069 for i = 1, #slide do
70 local node = slide[i]
reed9fbc3f32014-10-21 07:12:58 -070071 local paint = template[node.indent + 1].paint
72 local extra_dy = template[node.indent + 1].extra_dy
reedd2e7dfb2014-10-13 19:43:17 -070073 local fm = paint:getFontMetrics()
reed9e233b22014-11-03 12:18:24 -080074 local x_offset = -fm.ascent * node.indent * 1.25
reedbdc49ae2014-10-14 09:34:52 -070075
reed1b6ab442014-11-03 19:55:41 -080076 local bounds = make_rect(x + x_offset, y, 620, 640)
77 local blob, newBottom = Sk.newTextBlob(node.text, bounds, paint)
78 draw_bullet(canvas, x + x_offset, y - fm.ascent, paint, node.indent)
79 canvas:drawTextBlob(blob, 0, 0, paint)
80 y = newBottom + paint:getTextSize() * .5
81
82 if gShowBounds then
83 bounds.bottom = newBottom
84 stroke_rect(canvas, bounds, {a=1,r=0,g=1,b=0})
85 stroke_rect(canvas, blob:bounds(), {a=1,r=1,g=0,b=0})
86 end
87
reed9fbc3f32014-10-21 07:12:58 -070088 end
89end
90
reed18ea7772014-10-11 11:28:07 -070091--------------------------------------------------------------------------------------
reed9fbc3f32014-10-21 07:12:58 -070092function make_tmpl(paint, extra_dy)
93 return { paint = paint, extra_dy = extra_dy }
94end
reed18ea7772014-10-11 11:28:07 -070095
reedbdc49ae2014-10-14 09:34:52 -070096function SkiaPoint_make_template()
97 local title = {
98 margin_x = 30,
99 margin_y = 100,
100 }
reed9e233b22014-11-03 12:18:24 -0800101 title[1] = make_paint("Arial", 1, 45, { a=1, r=1, g=1, b=1 })
reedbdc49ae2014-10-14 09:34:52 -0700102 title[1]:setTextAlign("center")
reed9fbc3f32014-10-21 07:12:58 -0700103 title[2] = make_paint("Arial", 1, 25, { a=1, r=.75, g=.75, b=.75 })
reedbdc49ae2014-10-14 09:34:52 -0700104 title[2]:setTextAlign("center")
reed18ea7772014-10-11 11:28:07 -0700105
reedbdc49ae2014-10-14 09:34:52 -0700106 local slide = {
107 margin_x = 20,
reed9fbc3f32014-10-21 07:12:58 -0700108 margin_y = 25,
reedbdc49ae2014-10-14 09:34:52 -0700109 }
reed9e233b22014-11-03 12:18:24 -0800110 slide[1] = make_tmpl(make_paint("Arial", 1, 35, { a=1, r=1, g=1, b=1 }), 18)
111 slide[2] = make_tmpl(make_paint("Arial", 0, 25, { a=1, r=1, g=1, b=1 }), 0)
112 slide[3] = make_tmpl(make_paint("Arial", 0, 20, { a=1, r=.9, g=.9, b=.9 }), 0)
reedbdc49ae2014-10-14 09:34:52 -0700113
114 return {
115 title = title,
116 slide = slide,
reed9e233b22014-11-03 12:18:24 -0800117 codePaint = make_paint("Courier", 0, 20, { a=1, r=.9, g=.9, b=.9 }),
reedbdc49ae2014-10-14 09:34:52 -0700118 }
119end
120
121gTemplate = SkiaPoint_make_template()
reed18ea7772014-10-11 11:28:07 -0700122
123gRedPaint = Sk.newPaint()
124gRedPaint:setAntiAlias(true)
125gRedPaint:setColor{a=1, r=1, g=0, b=0 }
126
reed09a1d672014-10-11 13:13:11 -0700127-- animation.proc is passed the canvas before drawing.
128-- The animation.proc returns itself or another animation (which means keep animating)
129-- or it returns nil, which stops the animation.
130--
131local gCurrAnimation
132
reedf355df52014-10-12 12:18:40 -0700133gSlideIndex = 1
134
reed96affcd2014-10-13 12:38:04 -0700135function new_drawable_picture(pic)
136 return {
137 picture = pic,
138 width = pic:width(),
139 height = pic:height(),
140 draw = function (self, canvas, x, y, paint)
141 canvas:drawPicture(self.picture, x, y, paint)
142 end
143 }
144end
145
146function new_drawable_image(img)
147 return {
148 image = img,
149 width = img:width(),
150 height = img:height(),
151 draw = function (self, canvas, x, y, paint)
152 canvas:drawImage(self.image, x, y, paint)
153 end
154 }
155end
reedf355df52014-10-12 12:18:40 -0700156
reed86217d82014-10-25 20:44:40 -0700157function new_drawable_slide(slide)
158 return {
159 slide = slide,
160 draw = function (self, canvas, x, y, paint)
161 if (nil == paint or ("number" == type(paint) and (1 == paint))) then
162 canvas:save()
163 else
164 canvas:saveLayer(paint)
165 end
166 canvas:translate(x, y)
167 drawSlide(canvas, self.slide, gTemplate)
168 canvas:restore()
169 end
170 }
171end
172
173function next_slide()
174 local prev = gSlides[gSlideIndex]
175
176 gSlideIndex = gSlideIndex + 1
177 if gSlideIndex > #gSlides then
178 gSlideIndex = 1
179 end
180
181 spawn_transition(prev, gSlides[gSlideIndex], true)
182end
183
184function prev_slide()
185 local prev = gSlides[gSlideIndex]
186
187 gSlideIndex = gSlideIndex - 1
188 if gSlideIndex < 1 then
189 gSlideIndex = #gSlides
190 end
191
192 spawn_transition(prev, gSlides[gSlideIndex], false)
193end
194
reed468b1812014-10-19 11:42:54 -0700195function convert_to_picture_drawable(slide)
196 local rec = Sk.newPictureRecorder()
197 drawSlide(rec:beginRecording(640, 480), slide, gTemplate)
198 return new_drawable_picture(rec:endRecording())
199end
200
201function convert_to_image_drawable(slide)
202 local surf = Sk.newRasterSurface(640, 480)
203 drawSlide(surf:getCanvas(), slide, gTemplate)
204 return new_drawable_image(surf:newImageSnapshot())
205end
206
reed86217d82014-10-25 20:44:40 -0700207-- gMakeDrawable = convert_to_picture_drawable
208gMakeDrawable = new_drawable_slide
reed468b1812014-10-19 11:42:54 -0700209
reed07dada72014-10-29 20:36:05 -0700210load_file("slides_transitions")
211
reedf355df52014-10-12 12:18:40 -0700212function spawn_transition(prevSlide, nextSlide, is_forward)
213 local transition
214 if is_forward then
reed07dada72014-10-29 20:36:05 -0700215 transition = gTransitionTable[nextSlide.transition]
reedf355df52014-10-12 12:18:40 -0700216 else
reed07dada72014-10-29 20:36:05 -0700217 transition = gTransitionTable[prevSlide.transition]
reedf355df52014-10-12 12:18:40 -0700218 end
219
220 if not transition then
reedd2e7dfb2014-10-13 19:43:17 -0700221 transition = fade_slide_transition
reedf355df52014-10-12 12:18:40 -0700222 end
223
reed468b1812014-10-19 11:42:54 -0700224 local prevDrawable = gMakeDrawable(prevSlide)
225 local nextDrawable = gMakeDrawable(nextSlide)
reed96affcd2014-10-13 12:38:04 -0700226 gCurrAnimation = transition(prevDrawable, nextDrawable, is_forward)
reedf355df52014-10-12 12:18:40 -0700227end
228
229--------------------------------------------------------------------------------------
230
reed09a1d672014-10-11 13:13:11 -0700231function spawn_rotate_animation()
232 gCurrAnimation = {
233 angle = 0,
234 angle_delta = 5,
235 pivot_x = 320,
236 pivot_y = 240,
reedf355df52014-10-12 12:18:40 -0700237 proc = function (self, canvas, drawSlideProc)
238 if self.angle >= 360 then
239 drawSlideProc(canvas)
reed09a1d672014-10-11 13:13:11 -0700240 return nil
241 end
reedf355df52014-10-12 12:18:40 -0700242 canvas:translate(self.pivot_x, self.pivot_y)
243 canvas:rotate(self.angle)
244 canvas:translate(-self.pivot_x, -self.pivot_y)
245 drawSlideProc(canvas)
reed09a1d672014-10-11 13:13:11 -0700246
reedf355df52014-10-12 12:18:40 -0700247 self.angle = self.angle + self.angle_delta
248 return self
reed09a1d672014-10-11 13:13:11 -0700249 end
250 }
251end
252
253function spawn_scale_animation()
254 gCurrAnimation = {
255 scale = 1,
256 scale_delta = .95,
257 scale_limit = 0.2,
258 pivot_x = 320,
259 pivot_y = 240,
reedf355df52014-10-12 12:18:40 -0700260 proc = function (self, canvas, drawSlideProc)
261 if self.scale < self.scale_limit then
262 self.scale = self.scale_limit
263 self.scale_delta = 1 / self.scale_delta
reed09a1d672014-10-11 13:13:11 -0700264 end
reedf355df52014-10-12 12:18:40 -0700265 if self.scale > 1 then
266 drawSlideProc(canvas)
reed09a1d672014-10-11 13:13:11 -0700267 return nil
268 end
reedf355df52014-10-12 12:18:40 -0700269 canvas:translate(self.pivot_x, self.pivot_y)
270 canvas:scale(self.scale, self.scale)
271 canvas:translate(-self.pivot_x, -self.pivot_y)
272 drawSlideProc(canvas)
reed09a1d672014-10-11 13:13:11 -0700273
reedf355df52014-10-12 12:18:40 -0700274 self.scale = self.scale * self.scale_delta
275 return self
reed09a1d672014-10-11 13:13:11 -0700276 end
277 }
278end
279
reed9fbc3f32014-10-21 07:12:58 -0700280local bgPaint = nil
281
282function draw_bg(canvas)
283 if not bgPaint then
284 bgPaint = Sk.newPaint()
285 local grad = Sk.newLinearGradient( 0, 0, { a=1, r=0, g=0, b=.3 },
286 640, 480, { a=1, r=0, g=0, b=.8 })
287 bgPaint:setShader(grad)
288 end
289
290 canvas:drawPaint(bgPaint)
291end
292
reedbdc49ae2014-10-14 09:34:52 -0700293function onDrawContent(canvas, width, height)
294 local matrix = Sk.newMatrix()
295 matrix:setRectToRect(make_rect(0, 0, 640, 480), make_rect(0, 0, width, height), "center")
296 canvas:concat(matrix)
297
reed9fbc3f32014-10-21 07:12:58 -0700298 draw_bg(canvas)
299
reedf355df52014-10-12 12:18:40 -0700300 local drawSlideProc = function(canvas)
reedbdc49ae2014-10-14 09:34:52 -0700301 drawSlide(canvas, gSlides[gSlideIndex], gTemplate)
reed09a1d672014-10-11 13:13:11 -0700302 end
303
reed09a1d672014-10-11 13:13:11 -0700304 if gCurrAnimation then
reedf355df52014-10-12 12:18:40 -0700305 gCurrAnimation = gCurrAnimation:proc(canvas, drawSlideProc)
reed09a1d672014-10-11 13:13:11 -0700306 return true
307 else
reedf355df52014-10-12 12:18:40 -0700308 drawSlideProc(canvas)
reed09a1d672014-10-11 13:13:11 -0700309 return false
310 end
311end
312
313function onClickHandler(x, y)
314 return false
315end
316
317local keyProcs = {
318 n = next_slide,
319 p = prev_slide,
320 r = spawn_rotate_animation,
321 s = spawn_scale_animation,
reedc7663982014-10-21 10:46:01 -0700322 ["="] = function () scale_text_delta(gTemplate, 1) end,
323 ["-"] = function () scale_text_delta(gTemplate, -1) end,
reed1b6ab442014-11-03 19:55:41 -0800324
325 b = function () gShowBounds = not gShowBounds end,
reed09a1d672014-10-11 13:13:11 -0700326}
327
328function onCharHandler(uni)
329 local proc = keyProcs[uni]
330 if proc then
331 proc()
332 return true
333 end
334 return false
335end