@@ -8,6 +8,7 @@ self.nextIsRaf = false;
88self . lastCurrentTimeReceivedAt = Date . now ( ) ;
99self . targetFps = 30 ;
1010self . libassMemoryLimit = 0 ; // in MiB
11+ self . renderOnDemand = false ; // determines if only rendering on demand
1112
1213self . width = 0 ;
1314self . height = 0 ;
@@ -86,15 +87,19 @@ self.setTrack = function (content) {
8687 // Tell libass to render the new track
8788 self . octObj . createTrack ( "/sub.ass" ) ;
8889 self . ass_track = self . octObj . track ;
89- self . getRenderMethod ( ) ( ) ;
90+ if ( ! self . renderOnDemand ) {
91+ self . getRenderMethod ( ) ( ) ;
92+ }
9093} ;
9194
9295/**
9396 * Remove subtitle track.
9497 */
9598self . freeTrack = function ( ) {
9699 self . octObj . removeTrack ( ) ;
97- self . getRenderMethod ( ) ( ) ;
100+ if ( ! self . renderOnDemand ) {
101+ self . getRenderMethod ( ) ( ) ;
102+ }
98103} ;
99104
100105/**
@@ -135,10 +140,14 @@ self.setCurrentTime = function (currentTime) {
135140 self . lastCurrentTimeReceivedAt = Date . now ( ) ;
136141 if ( ! self . rafId ) {
137142 if ( self . nextIsRaf ) {
138- self . rafId = self . requestAnimationFrame ( self . getRenderMethod ( ) ) ;
143+ if ( ! self . renderOnDemand ) {
144+ self . rafId = self . requestAnimationFrame ( self . getRenderMethod ( ) ) ;
145+ }
139146 }
140147 else {
141- self . getRenderMethod ( ) ( ) ;
148+ if ( ! self . renderOnDemand ) {
149+ self . getRenderMethod ( ) ( ) ;
150+ }
142151
143152 // Give onmessage chance to receive all queued messages
144153 setTimeout ( function ( ) {
@@ -163,7 +172,9 @@ self.setIsPaused = function (isPaused) {
163172 }
164173 else {
165174 self . lastCurrentTimeReceivedAt = Date . now ( ) ;
166- self . rafId = self . requestAnimationFrame ( self . getRenderMethod ( ) ) ;
175+ if ( ! self . renderOnDemand ) {
176+ self . rafId = self . requestAnimationFrame ( self . getRenderMethod ( ) ) ;
177+ }
167178 }
168179 }
169180} ;
@@ -191,39 +202,77 @@ self.render = function (force) {
191202 }
192203} ;
193204
194- self . blendRender = function ( force ) {
195- self . rafId = 0 ;
196- self . renderPending = false ;
205+ self . blendRenderTiming ( timing , force ) {
197206 var startTime = performance . now ( ) ;
198207
199208 var renderResult = self . octObj . renderBlend ( self . getCurrentTime ( ) + self . delay , force ) ;
200- if ( renderResult . changed != 0 || force ) {
201- var canvases = [ ] ;
202- var buffers = [ ] ;
203209
204- if ( renderResult . image ) {
205- // make a copy, as we should free the memory so subsequent calls can utilize it
206- var result = new Uint8Array ( HEAPU8 . subarray ( renderResult . image , renderResult . image + renderResult . dest_width * renderResult . dest_height * 4 ) ) ;
210+ var canvases = [ ] ;
211+ var buffers = [ ] ;
207212
208- canvases = [ { w : renderResult . dest_width , h : renderResult . dest_height , x : renderResult . dest_x , y : renderResult . dest_y , buffer : result . buffer } ] ;
209- buffers = [ result . buffer ] ;
210- }
213+ if ( renderResult . image ) {
214+ // make a copy, as we should free the memory so subsequent calls can utilize it
215+ var result = new Uint8Array ( HEAPU8 . subarray ( renderResult . image , renderResult . image + renderResult . dest_width * renderResult . dest_height * 4 ) ) ;
216+
217+ canvases = [ { w : renderResult . dest_width , h : renderResult . dest_height , x : renderResult . dest_x , y : renderResult . dest_y , buffer : result . buffer } ] ;
218+ buffers = [ result . buffer ] ;
219+ }
220+
221+ return {
222+ changed : renderResult . changed || force || false ,
223+ time : Date . now ( ) ,
224+ spentTime : performance . now ( ) - startTime ,
225+ blendTime : renderResult . blend_time ,
226+ canvases : canvases ,
227+ buffers : buffers
228+ }
229+ }
211230
231+ self . blendRender = function ( force ) {
232+ self . rafId = 0 ;
233+ self . renderPending = false ;
234+
235+ var rendered = self . blendRenderTiming ( self . getCurrentTime ( ) + self . delay , force ) ;
236+ if ( rendered . changed ) {
212237 postMessage ( {
213238 target : 'canvas' ,
214239 op : 'renderCanvas' ,
215- time : Date . now ( ) ,
216- spentTime : performance . now ( ) - startTime ,
217- blendTime : renderResult . blend_time ,
218- canvases : canvases
219- } , buffers ) ;
240+ time : rendered . time ,
241+ spentTime : rendered . spentTime ,
242+ blendTime : rendered . blendTime ,
243+ canvases : rendered . canvases
244+ } , rendered . buffers ) ;
220245 }
221246
222247 if ( ! self . _isPaused ) {
223248 self . rafId = self . requestAnimationFrame ( self . blendRender ) ;
224249 }
225250} ;
226251
252+ self . oneshotRender = function ( lastRenderedTime , renderNow ) {
253+ var eventStart = renderNow ? lastRenderedTime : self . _find_next_event_start ( lastRenderedTime ) ;
254+ var eventFinish = - 1.0 , emptyFinish = - 1.0 ;
255+ var rendered = { } ;
256+ if ( eventStart >= 0 ) {
257+ self . _libassjs_find_event_stop_times ( eventStart , self . eventFinish , self . emptyFinish ) ;
258+ eventFinish = Module . getValue ( self . eventFinish , 'double' ) ;
259+ emptyFinish = Module . getValue ( self . emptyFinish , 'double' ) ;
260+
261+ rendered = self . blendRenderTiming ( eventStart , true ) ;
262+ }
263+
264+ postMessage ( {
265+ target : 'canvas' ,
266+ op : 'oneshot-result' ,
267+ eventStart : eventStart ,
268+ eventFinish : eventFinish ,
269+ emptyFinish : emptyFinish ,
270+ spentTime : rendered . spentTime || 0 ,
271+ blendTime : rendered . blendTime || 0 ,
272+ canvases : rendered . canvases || [ ]
273+ } , rendered . buffers || [ ] ) ;
274+ }
275+
227276self . fastRender = function ( force ) {
228277 self . rafId = 0 ;
229278 self . renderPending = false ;
@@ -508,7 +557,9 @@ function onMessageFromMainEmscriptenThread(message) {
508557 Module . canvas . boundingClientRect = message . data . boundingClientRect ;
509558 }
510559 self . resize ( message . data . width , message . data . height ) ;
511- self . getRenderMethod ( ) ( ) ;
560+ if ( ! self . renderOnDemand ) {
561+ self . getRenderMethod ( ) ( ) ;
562+ }
512563 } else throw 'ey?' ;
513564 break ;
514565 }
@@ -552,12 +603,16 @@ function onMessageFromMainEmscriptenThread(message) {
552603 self . targetFps = message . data . targetFps || self . targetFps ;
553604 self . libassMemoryLimit = message . data . libassMemoryLimit || self . libassMemoryLimit ;
554605 self . libassGlyphLimit = message . data . libassGlyphLimit || 0 ;
606+ self . renderOnDemand = message . data . renderOnDemand || false ;
555607 removeRunDependency ( 'worker-init' ) ;
556608 postMessage ( {
557609 target : "ready" ,
558610 } ) ;
559611 break ;
560612 }
613+ case 'oneshot' :
614+ self . oneshotRender ( message . data . lastRendered , message . data . renderNow || false ) ;
615+ break ;
561616 case 'destroy' :
562617 self . octObj . quitLibrary ( ) ;
563618 break ;
0 commit comments