blob: 057d213b856ed698ef04f16d70c15c3602c5e88c [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
reedde330ff2014-11-02 19:19:34 -080029function drawSlide(canvas, slide, master_template)
30 template = master_template.slide -- need to sniff the slide to know if we're title or slide
reedbdc49ae2014-10-14 09:34:52 -070031
32 local x = template.margin_x
33 local y = template.margin_y
34
reedde330ff2014-11-02 19:19:34 -080035 if slide.blockstyle == "code" then
36 local paint = master_template.codePaint
37 local fm = paint:getFontMetrics()
38 local height = #slide * (fm.descent - fm.ascent)
39 y = (480 - height) / 2
40 for i = 1, #slide do
41 local node = slide[i]
42 y = y - fm.ascent
43 canvas:drawText(node.text, x, y, paint)
44 y = y + fm.descent
45 end
46 return
47 end
48
reed9fbc3f32014-10-21 07:12:58 -070049 local scale = 1.25
reedd2e7dfb2014-10-13 19:43:17 -070050 for i = 1, #slide do
51 local node = slide[i]
reed9fbc3f32014-10-21 07:12:58 -070052 local paint = template[node.indent + 1].paint
53 local extra_dy = template[node.indent + 1].extra_dy
reedd2e7dfb2014-10-13 19:43:17 -070054 local fm = paint:getFontMetrics()
reedbdc49ae2014-10-14 09:34:52 -070055 local x_offset = -fm.ascent * node.indent
56
reedd2e7dfb2014-10-13 19:43:17 -070057 y = y - fm.ascent * scale
reedbdc49ae2014-10-14 09:34:52 -070058 canvas:drawText(node.text, x + x_offset, y, paint)
reed9fbc3f32014-10-21 07:12:58 -070059 y = y + fm.descent * scale + extra_dy
60 end
61end
62
reed18ea7772014-10-11 11:28:07 -070063--------------------------------------------------------------------------------------
reed9fbc3f32014-10-21 07:12:58 -070064function make_tmpl(paint, extra_dy)
65 return { paint = paint, extra_dy = extra_dy }
66end
reed18ea7772014-10-11 11:28:07 -070067
reedbdc49ae2014-10-14 09:34:52 -070068function SkiaPoint_make_template()
69 local title = {
70 margin_x = 30,
71 margin_y = 100,
72 }
reed9fbc3f32014-10-21 07:12:58 -070073 title[1] = make_paint("Arial", 1, 50, { a=1, r=1, g=1, b=1 })
reedbdc49ae2014-10-14 09:34:52 -070074 title[1]:setTextAlign("center")
reed9fbc3f32014-10-21 07:12:58 -070075 title[2] = make_paint("Arial", 1, 25, { a=1, r=.75, g=.75, b=.75 })
reedbdc49ae2014-10-14 09:34:52 -070076 title[2]:setTextAlign("center")
reed18ea7772014-10-11 11:28:07 -070077
reedbdc49ae2014-10-14 09:34:52 -070078 local slide = {
79 margin_x = 20,
reed9fbc3f32014-10-21 07:12:58 -070080 margin_y = 25,
reedbdc49ae2014-10-14 09:34:52 -070081 }
reed9fbc3f32014-10-21 07:12:58 -070082 slide[1] = make_tmpl(make_paint("Arial", 1, 36, { a=1, r=1, g=1, b=1 }), 18)
83 slide[2] = make_tmpl(make_paint("Arial", 0, 30, { a=1, r=1, g=1, b=1 }), 0)
84 slide[3] = make_tmpl(make_paint("Arial", 0, 24, { a=1, r=.8, g=.8, b=.8 }), 0)
reedbdc49ae2014-10-14 09:34:52 -070085
86 return {
87 title = title,
88 slide = slide,
reedde330ff2014-11-02 19:19:34 -080089 codePaint = make_paint("Courier", 0, 24, { a=1, r=.9, g=.9, b=.9 }),
reedbdc49ae2014-10-14 09:34:52 -070090 }
91end
92
93gTemplate = SkiaPoint_make_template()
reed18ea7772014-10-11 11:28:07 -070094
95gRedPaint = Sk.newPaint()
96gRedPaint:setAntiAlias(true)
97gRedPaint:setColor{a=1, r=1, g=0, b=0 }
98
reed09a1d672014-10-11 13:13:11 -070099-- animation.proc is passed the canvas before drawing.
100-- The animation.proc returns itself or another animation (which means keep animating)
101-- or it returns nil, which stops the animation.
102--
103local gCurrAnimation
104
reedf355df52014-10-12 12:18:40 -0700105gSlideIndex = 1
106
reed96affcd2014-10-13 12:38:04 -0700107function new_drawable_picture(pic)
108 return {
109 picture = pic,
110 width = pic:width(),
111 height = pic:height(),
112 draw = function (self, canvas, x, y, paint)
113 canvas:drawPicture(self.picture, x, y, paint)
114 end
115 }
116end
117
118function new_drawable_image(img)
119 return {
120 image = img,
121 width = img:width(),
122 height = img:height(),
123 draw = function (self, canvas, x, y, paint)
124 canvas:drawImage(self.image, x, y, paint)
125 end
126 }
127end
reedf355df52014-10-12 12:18:40 -0700128
reed86217d82014-10-25 20:44:40 -0700129function new_drawable_slide(slide)
130 return {
131 slide = slide,
132 draw = function (self, canvas, x, y, paint)
133 if (nil == paint or ("number" == type(paint) and (1 == paint))) then
134 canvas:save()
135 else
136 canvas:saveLayer(paint)
137 end
138 canvas:translate(x, y)
139 drawSlide(canvas, self.slide, gTemplate)
140 canvas:restore()
141 end
142 }
143end
144
145function next_slide()
146 local prev = gSlides[gSlideIndex]
147
148 gSlideIndex = gSlideIndex + 1
149 if gSlideIndex > #gSlides then
150 gSlideIndex = 1
151 end
152
153 spawn_transition(prev, gSlides[gSlideIndex], true)
154end
155
156function prev_slide()
157 local prev = gSlides[gSlideIndex]
158
159 gSlideIndex = gSlideIndex - 1
160 if gSlideIndex < 1 then
161 gSlideIndex = #gSlides
162 end
163
164 spawn_transition(prev, gSlides[gSlideIndex], false)
165end
166
reed468b1812014-10-19 11:42:54 -0700167function convert_to_picture_drawable(slide)
168 local rec = Sk.newPictureRecorder()
169 drawSlide(rec:beginRecording(640, 480), slide, gTemplate)
170 return new_drawable_picture(rec:endRecording())
171end
172
173function convert_to_image_drawable(slide)
174 local surf = Sk.newRasterSurface(640, 480)
175 drawSlide(surf:getCanvas(), slide, gTemplate)
176 return new_drawable_image(surf:newImageSnapshot())
177end
178
reed86217d82014-10-25 20:44:40 -0700179-- gMakeDrawable = convert_to_picture_drawable
180gMakeDrawable = new_drawable_slide
reed468b1812014-10-19 11:42:54 -0700181
reed07dada72014-10-29 20:36:05 -0700182load_file("slides_transitions")
183
reedf355df52014-10-12 12:18:40 -0700184function spawn_transition(prevSlide, nextSlide, is_forward)
185 local transition
186 if is_forward then
reed07dada72014-10-29 20:36:05 -0700187 transition = gTransitionTable[nextSlide.transition]
reedf355df52014-10-12 12:18:40 -0700188 else
reed07dada72014-10-29 20:36:05 -0700189 transition = gTransitionTable[prevSlide.transition]
reedf355df52014-10-12 12:18:40 -0700190 end
191
192 if not transition then
reedd2e7dfb2014-10-13 19:43:17 -0700193 transition = fade_slide_transition
reedf355df52014-10-12 12:18:40 -0700194 end
195
reed468b1812014-10-19 11:42:54 -0700196 local prevDrawable = gMakeDrawable(prevSlide)
197 local nextDrawable = gMakeDrawable(nextSlide)
reed96affcd2014-10-13 12:38:04 -0700198 gCurrAnimation = transition(prevDrawable, nextDrawable, is_forward)
reedf355df52014-10-12 12:18:40 -0700199end
200
201--------------------------------------------------------------------------------------
202
reed09a1d672014-10-11 13:13:11 -0700203function spawn_rotate_animation()
204 gCurrAnimation = {
205 angle = 0,
206 angle_delta = 5,
207 pivot_x = 320,
208 pivot_y = 240,
reedf355df52014-10-12 12:18:40 -0700209 proc = function (self, canvas, drawSlideProc)
210 if self.angle >= 360 then
211 drawSlideProc(canvas)
reed09a1d672014-10-11 13:13:11 -0700212 return nil
213 end
reedf355df52014-10-12 12:18:40 -0700214 canvas:translate(self.pivot_x, self.pivot_y)
215 canvas:rotate(self.angle)
216 canvas:translate(-self.pivot_x, -self.pivot_y)
217 drawSlideProc(canvas)
reed09a1d672014-10-11 13:13:11 -0700218
reedf355df52014-10-12 12:18:40 -0700219 self.angle = self.angle + self.angle_delta
220 return self
reed09a1d672014-10-11 13:13:11 -0700221 end
222 }
223end
224
225function spawn_scale_animation()
226 gCurrAnimation = {
227 scale = 1,
228 scale_delta = .95,
229 scale_limit = 0.2,
230 pivot_x = 320,
231 pivot_y = 240,
reedf355df52014-10-12 12:18:40 -0700232 proc = function (self, canvas, drawSlideProc)
233 if self.scale < self.scale_limit then
234 self.scale = self.scale_limit
235 self.scale_delta = 1 / self.scale_delta
reed09a1d672014-10-11 13:13:11 -0700236 end
reedf355df52014-10-12 12:18:40 -0700237 if self.scale > 1 then
238 drawSlideProc(canvas)
reed09a1d672014-10-11 13:13:11 -0700239 return nil
240 end
reedf355df52014-10-12 12:18:40 -0700241 canvas:translate(self.pivot_x, self.pivot_y)
242 canvas:scale(self.scale, self.scale)
243 canvas:translate(-self.pivot_x, -self.pivot_y)
244 drawSlideProc(canvas)
reed09a1d672014-10-11 13:13:11 -0700245
reedf355df52014-10-12 12:18:40 -0700246 self.scale = self.scale * self.scale_delta
247 return self
reed09a1d672014-10-11 13:13:11 -0700248 end
249 }
250end
251
reed9fbc3f32014-10-21 07:12:58 -0700252local bgPaint = nil
253
254function draw_bg(canvas)
255 if not bgPaint then
256 bgPaint = Sk.newPaint()
257 local grad = Sk.newLinearGradient( 0, 0, { a=1, r=0, g=0, b=.3 },
258 640, 480, { a=1, r=0, g=0, b=.8 })
259 bgPaint:setShader(grad)
260 end
261
262 canvas:drawPaint(bgPaint)
263end
264
reedbdc49ae2014-10-14 09:34:52 -0700265function onDrawContent(canvas, width, height)
266 local matrix = Sk.newMatrix()
267 matrix:setRectToRect(make_rect(0, 0, 640, 480), make_rect(0, 0, width, height), "center")
268 canvas:concat(matrix)
269
reed9fbc3f32014-10-21 07:12:58 -0700270 draw_bg(canvas)
271
reedf355df52014-10-12 12:18:40 -0700272 local drawSlideProc = function(canvas)
reedbdc49ae2014-10-14 09:34:52 -0700273 drawSlide(canvas, gSlides[gSlideIndex], gTemplate)
reed09a1d672014-10-11 13:13:11 -0700274 end
275
reed09a1d672014-10-11 13:13:11 -0700276 if gCurrAnimation then
reedf355df52014-10-12 12:18:40 -0700277 gCurrAnimation = gCurrAnimation:proc(canvas, drawSlideProc)
reed09a1d672014-10-11 13:13:11 -0700278 return true
279 else
reedf355df52014-10-12 12:18:40 -0700280 drawSlideProc(canvas)
reed09a1d672014-10-11 13:13:11 -0700281 return false
282 end
283end
284
285function onClickHandler(x, y)
286 return false
287end
288
289local keyProcs = {
290 n = next_slide,
291 p = prev_slide,
292 r = spawn_rotate_animation,
293 s = spawn_scale_animation,
reedc7663982014-10-21 10:46:01 -0700294 ["="] = function () scale_text_delta(gTemplate, 1) end,
295 ["-"] = function () scale_text_delta(gTemplate, -1) end,
reed09a1d672014-10-11 13:13:11 -0700296}
297
298function onCharHandler(uni)
299 local proc = keyProcs[uni]
300 if proc then
301 proc()
302 return true
303 end
304 return false
305end