1
1
import { EventEmitter } from 'events' ;
2
2
import { APNG , Frame } from './structs' ;
3
3
4
- export default class Player extends EventEmitter {
4
+ class Player extends EventEmitter {
5
5
public context : CanvasRenderingContext2D ;
6
6
7
+ /**
8
+ * animation playback rate
9
+ */
7
10
public playbackRate = 1.0 ;
8
11
9
12
private _apng : APNG ;
@@ -34,14 +37,25 @@ export default class Player extends EventEmitter {
34
37
}
35
38
}
36
39
40
+ /**
41
+ * current frame number
42
+ */
37
43
public get currentFrameNumber ( ) {
38
44
return this . _currentFrameNumber ;
39
45
}
40
46
47
+ /**
48
+ * current frame
49
+ */
41
50
public get currentFrame ( ) {
42
51
return this . _apng . frames [ this . _currentFrameNumber ] ;
43
52
}
44
53
54
+ /**
55
+ * move to next frame and render it on context
56
+ *
57
+ * Use this method to manual, frame by frame, rendering.
58
+ */
45
59
public renderNextFrame ( ) {
46
60
this . _currentFrameNumber =
47
61
( this . _currentFrameNumber + 1 ) % this . _apng . frames . length ;
@@ -93,14 +107,23 @@ export default class Player extends EventEmitter {
93
107
94
108
// playback
95
109
110
+ /**
111
+ * playback is paused
112
+ */
96
113
public get paused ( ) {
97
114
return this . _paused ;
98
115
}
99
116
117
+ /**
118
+ * playback is ended
119
+ */
100
120
public get ended ( ) {
101
121
return this . _ended ;
102
122
}
103
123
124
+ /**
125
+ * start or resume playback
126
+ */
104
127
public play ( ) {
105
128
this . emit ( 'play' ) ;
106
129
@@ -133,13 +156,19 @@ export default class Player extends EventEmitter {
133
156
requestAnimationFrame ( tick ) ;
134
157
}
135
158
159
+ /**
160
+ * pause playback
161
+ */
136
162
public pause ( ) {
137
163
if ( ! this . _paused ) {
138
164
this . emit ( 'pause' ) ;
139
165
this . _paused = true ;
140
166
}
141
167
}
142
168
169
+ /**
170
+ * stop playback and rewind to start
171
+ */
143
172
public stop ( ) {
144
173
this . emit ( 'stop' ) ;
145
174
this . _numPlays = 0 ;
@@ -151,3 +180,187 @@ export default class Player extends EventEmitter {
151
180
this . renderNextFrame ( ) ;
152
181
}
153
182
}
183
+
184
+ interface Player {
185
+ /**
186
+ * playback started
187
+ */
188
+ addListener ( event : 'play' , listener : ( ) => void ) : this;
189
+ /**
190
+ * frame played
191
+ */
192
+ addListener (
193
+ event : 'frame' ,
194
+ listener : ( currentFrameNumber : number ) => void ,
195
+ ) : this;
196
+ /**
197
+ * playback paused
198
+ */
199
+ addListener ( event : 'pause' , listener : ( ) => void ) : this;
200
+ /**
201
+ * playback stopped
202
+ */
203
+ addListener ( event : 'stop' , listener : ( ) => void ) : this;
204
+ /**
205
+ * playback ended (for APNG with finite count of plays)
206
+ */
207
+ addListener ( event : 'end' , listener : ( ) => void ) : this;
208
+
209
+ /**
210
+ * playback started
211
+ */
212
+ on ( event : 'play' , listener : ( ) => void ) : this;
213
+ /**
214
+ * frame played
215
+ */
216
+ on ( event : 'frame' , listener : ( currentFrameNumber : number ) => void ) : this;
217
+ /**
218
+ * playback paused
219
+ */
220
+ on ( event : 'pause' , listener : ( ) => void ) : this;
221
+ /**
222
+ * playback stopped
223
+ */
224
+ on ( event : 'stop' , listener : ( ) => void ) : this;
225
+ /**
226
+ * playback ended (for APNG with finite count of plays)
227
+ */
228
+ on ( event : 'end' , listener : ( ) => void ) : this;
229
+
230
+ /**
231
+ * playback started
232
+ */
233
+ once ( event : 'play' , listener : ( ) => void ) : this;
234
+ /**
235
+ * frame played
236
+ */
237
+ once ( event : 'frame' , listener : ( currentFrameNumber : number ) => void ) : this;
238
+ /**
239
+ * playback paused
240
+ */
241
+ once ( event : 'pause' , listener : ( ) => void ) : this;
242
+ /**
243
+ * playback stopped
244
+ */
245
+ once ( event : 'stop' , listener : ( ) => void ) : this;
246
+ /**
247
+ * playback ended (for APNG with finite count of plays)
248
+ */
249
+ once ( event : 'end' , listener : ( ) => void ) : this;
250
+
251
+ /**
252
+ * playback started
253
+ */
254
+ removeListener ( event : 'play' , listener : ( ) => void ) : this;
255
+ /**
256
+ * frame played
257
+ */
258
+ removeListener (
259
+ event : 'frame' ,
260
+ listener : ( currentFrameNumber : number ) => void ,
261
+ ) : this;
262
+ /**
263
+ * playback paused
264
+ */
265
+ removeListener ( event : 'pause' , listener : ( ) => void ) : this;
266
+ /**
267
+ * playback stopped
268
+ */
269
+ removeListener ( event : 'stop' , listener : ( ) => void ) : this;
270
+ /**
271
+ * playback ended (for APNG with finite count of plays)
272
+ */
273
+ removeListener ( event : 'end' , listener : ( ) => void ) : this;
274
+
275
+ /**
276
+ * playback started
277
+ */
278
+ off ( event : 'play' , listener : ( ) => void ) : this;
279
+ /**
280
+ * frame played
281
+ */
282
+ off ( event : 'frame' , listener : ( currentFrameNumber : number ) => void ) : this;
283
+ /**
284
+ * playback paused
285
+ */
286
+ off ( event : 'pause' , listener : ( ) => void ) : this;
287
+ /**
288
+ * playback stopped
289
+ */
290
+ off ( event : 'stop' , listener : ( ) => void ) : this;
291
+ /**
292
+ * playback ended (for APNG with finite count of plays)
293
+ */
294
+ off ( event : 'end' , listener : ( ) => void ) : this;
295
+
296
+ /**
297
+ * playback started
298
+ */
299
+ emit ( event : 'play' ) : boolean ;
300
+ /**
301
+ * frame played
302
+ */
303
+ emit ( event : 'frame' , currentFrameNumber : number ) : boolean ;
304
+ /**
305
+ * playback paused
306
+ */
307
+ emit ( event : 'pause' ) : boolean ;
308
+ /**
309
+ * playback stopped
310
+ */
311
+ emit ( event : 'stop' ) : boolean ;
312
+ /**
313
+ * playback ended (for APNG with finite count of plays)
314
+ */
315
+ emit ( event : 'end' ) : boolean ;
316
+
317
+ /**
318
+ * playback started
319
+ */
320
+ prependListener ( event : 'play' , listener : ( ) => void ) : this;
321
+ /**
322
+ * frame played
323
+ */
324
+ prependListener (
325
+ event : 'frame' ,
326
+ listener : ( currentFrameNumber : number ) => void ,
327
+ ) : this;
328
+ /**
329
+ * playback paused
330
+ */
331
+ prependListener ( event : 'pause' , listener : ( ) => void ) : this;
332
+ /**
333
+ * playback stopped
334
+ */
335
+ prependListener ( event : 'stop' , listener : ( ) => void ) : this;
336
+ /**
337
+ * playback ended (for APNG with finite count of plays)
338
+ */
339
+ prependListener ( event : 'end' , listener : ( ) => void ) : this;
340
+
341
+ /**
342
+ * playback started
343
+ */
344
+ prependOnceListener ( event : 'play' , listener : ( ) => void ) : this;
345
+ /**
346
+ * frame played
347
+ */
348
+ prependOnceListener (
349
+ event : 'frame' ,
350
+ listener : ( currentFrameNumber : number ) => void ,
351
+ ) : this;
352
+ /**
353
+ * playback paused
354
+ */
355
+ prependOnceListener ( event : 'pause' , listener : ( ) => void ) : this;
356
+ /**
357
+ * playback stopped
358
+ */
359
+ prependOnceListener ( event : 'stop' , listener : ( ) => void ) : this;
360
+ /**
361
+ * playback ended (for APNG with finite count of plays)
362
+ */
363
+ prependOnceListener ( event : 'end' , listener : ( ) => void ) : this;
364
+ }
365
+
366
+ export default Player ;
0 commit comments