@@ -12,7 +12,6 @@ var baseUrl = getUrl.protocol + "//" + getUrl.host + getUrl.pathname;
1212window . maplibregl = maplibregl ;
1313export const map = ( window . map = new maplibregl . Map ( {
1414 container : "map" , // container id
15- hash : "map" ,
1615 antialias : true ,
1716 style : {
1817 version : 8 ,
@@ -273,46 +272,77 @@ function addShield(row, network, ref) {
273272 cell . appendChild ( img ) ;
274273}
275274
275+ function getShieldImage ( network , ref ) {
276+ let shield_id = `shield\n${ network } =${ ref } ` ;
277+ let shieldCanvas = getShieldCanvas ( shield_id ) ;
278+ let img = document . createElement ( "img" ) ;
279+ img . srcset = `${ shieldCanvas . toDataURL ( "image/png" ) } ${ PXR } x` ;
280+ return img ;
281+ }
282+
276283const PXR = gfx . getPixelRatio ( ) ;
277284
278- let table = document . querySelector ( "#shield-table" ) ;
279-
280- for ( let network of networks ) {
281- let row = table . insertRow ( ) ;
282- row . insertCell ( ) . append ( `${ network } ` ) ;
283- for ( let ref of refs ) {
284- performance . mark ( `start-${ network } ` ) ;
285- let cell = row . insertCell ( ) ;
286- let shield_id = `shield\n${ network } =${ ref } ` ;
287- let shieldCanvas = getShieldCanvas ( shield_id ) ;
288- let img = document . createElement ( "img" ) ;
289- img . src = shieldCanvas . toDataURL ( "image/png" ) ;
290- img . width = shieldCanvas . width / PXR ;
291- img . height = shieldCanvas . height / PXR ;
292- performance . mark ( `stop-${ network } ` ) ;
293- performance . measure ( `${ network } ` , `start-${ network } ` , `stop-${ network } ` ) ;
294- cell . appendChild ( img ) ;
285+ const iterShields = function * ( ) {
286+ for ( const network of networks ) {
287+ yield { network, refs } ;
295288 }
296- let perfEntries = performance . getEntriesByName ( `${ network } ` ) ;
297- var perfDuration = 0 ;
298- for ( let perf of perfEntries ) {
299- perfDuration += perf . duration ;
289+ yield {
290+ network : "US:PA:Allegheny:Belt" ,
291+ refs : [
292+ "Red Belt" ,
293+ "Orange Belt" ,
294+ "Yellow Belt" ,
295+ "Green Belt" ,
296+ "Blue Belt" ,
297+ "Purple Belt" ,
298+ ] ,
299+ } ;
300+ yield {
301+ network : "US:MO:Taney:Branson" ,
302+ refs : [ "Red Route" , "Yellow Route" , "Blue Route" ] ,
303+ } ;
304+ } ;
305+
306+ const renderAllShields = async ( ) => {
307+ const allShields = Array . from ( iterShields ( ) ) ;
308+ const progress = document . querySelector ( "#progress-overlay progress" ) ;
309+ progress . max = allShields . flatMap ( ( d ) => d . refs ) . length ;
310+ const columns = Math . max ( ...allShields . flatMap ( ( d ) => d . refs . length ) ) ;
311+ const table = document . querySelector ( "#shield-table" ) . createTBody ( ) ;
312+ for ( const { network, refs } of allShields ) {
313+ const tr = table . insertRow ( ) ;
314+ tr . insertCell ( ) . append ( `${ network } ` ) ;
315+ for ( const ref of refs ) {
316+ performance . mark ( `start-${ network } ` ) ;
317+ tr . insertCell ( ) . append ( getShieldImage ( network , ref ) ) ;
318+ progress . value += 1 ;
319+ performance . mark ( `stop-${ network } ` ) ;
320+ performance . measure ( `${ network } ` , `start-${ network } ` , `stop-${ network } ` ) ;
321+ }
322+ let perfEntries = performance . getEntriesByName ( `${ network } ` ) ;
323+ var perfDuration = 0 ;
324+ for ( let perf of perfEntries ) {
325+ perfDuration += perf . duration ;
326+ }
327+ let shieldRate = Math . round ( ( 1000 * perfEntries . length ) / perfDuration ) ;
328+ if ( tr . cells . length < 1 + columns ) {
329+ const gap = columns - tr . cells . length + 1 ;
330+ tr . insertCell ( ) . colSpan = gap ;
331+ }
332+ tr . insertCell ( ) . append ( `${ shieldRate } shields/sec` ) ;
333+
334+ await Promise . all (
335+ Array . from ( tr . querySelectorAll ( "img" ) , ( img ) =>
336+ img . decode ( ) . catch (
337+ ( ) =>
338+ /* occasionally fails for no reason */
339+ new Promise ( requestAnimationFrame )
340+ )
341+ )
342+ ) ;
300343 }
301- let shieldRate = Math . round ( ( 1000 * perfEntries . length ) / perfDuration ) ;
302- row . insertCell ( ) . append ( `${ shieldRate } shields/sec` ) ;
303- }
344+ } ;
304345
305- let row = table . insertRow ( ) ;
306- row . insertCell ( ) . append ( `Pittsburgh` ) ;
307- addShield ( row , "US:PA:Allegheny:Belt" , "Red Belt" ) ;
308- addShield ( row , "US:PA:Allegheny:Belt" , "Orange Belt" ) ;
309- addShield ( row , "US:PA:Allegheny:Belt" , "Yellow Belt" ) ;
310- addShield ( row , "US:PA:Allegheny:Belt" , "Green Belt" ) ;
311- addShield ( row , "US:PA:Allegheny:Belt" , "Blue Belt" ) ;
312- addShield ( row , "US:PA:Allegheny:Belt" , "Purple Belt" ) ;
313-
314- row = table . insertRow ( ) ;
315- row . insertCell ( ) . append ( `Branson, MO` ) ;
316- addShield ( row , "US:MO:Taney:Branson" , "Red Route" ) ;
317- addShield ( row , "US:MO:Taney:Branson" , "Yellow Route" ) ;
318- addShield ( row , "US:MO:Taney:Branson" , "Blue Route" ) ;
346+ await renderAllShields ( ) . finally ( ( ) =>
347+ document . querySelector ( "#progress-overlay" ) . remove ( )
348+ ) ;
0 commit comments