@@ -169,7 +169,7 @@ async function load_browser(datasource_name, command="feeds")
169169 var the_html =
170170 '<div class="col-xs-4 mr-2">'
171171 + `<div id="card_snap_${ item . id } " class="card" style="width: ${ scaled_width } rem;">`
172- + `<canvas id="canvas_snap_ ${ item . id } " width="${ canvas_width } " height="${ canvas_height } " class="card-img-top rounded"></canvas >` ;
172+ + `<img id="img_snap_ ${ item . id } " width="${ canvas_width } " height="${ canvas_height } " class="card-img-top rounded" style="width:auto;height:auto"/ >` ;
173173 if ( collector . can_delete ( app_title , item . id ) )
174174 {
175175 the_html += '<button id="delete_snap_' + item . id + '" type="button" style="position:absolute;top:0;right:0;padding:0;" class="btn btn-sm icon">' + x_icon + '</button>' ;
@@ -225,7 +225,7 @@ async function load_browser(datasource_name, command="feeds")
225225 $ ( '#container_snapshots' ) . append ( the_grid ) ;
226226 for ( var z = 0 ; z < app_snaps . length ; z ++ )
227227 {
228- var canvas_id = "canvas_snap_ " + app_snaps [ z ] . id ;
228+ var canvas_id = "img_snap_ " + app_snaps [ z ] . id ;
229229 var delete_id = "delete_snap_" + app_snaps [ z ] . id ;
230230 var export_id = "export_snap_" + app_snaps [ z ] . id ;
231231 var like_id = "like_snap_" + app_snaps [ z ] . id ;
@@ -282,10 +282,10 @@ async function load_browser(datasource_name, command="feeds")
282282 }
283283
284284 canvas . onclick = function ( ) {
285- let id = this . id . match ( / c a n v a s _ s n a p _ ( .* ) / ) [ 1 ] ;
285+ let id = this . id . match ( / i m g _ s n a p _ ( .* ) / ) [ 1 ] ;
286286 collector . show_detail ( app_title , id ) ;
287287 } ;
288- collector . draw_item_into_canvas ( app_title , canvas , app_snaps [ z ] ) ;
288+ collector . draw_item_into_img ( app_title , canvas , app_snaps [ z ] ) ;
289289 }
290290 }
291291
@@ -395,13 +395,13 @@ var collectors = {
395395 get_data_collector ( 'snapshots' ) . set_busy ( false ) ;
396396 }
397397 } ,
398- draw_item_into_canvas : function ( app_title , teaser_canvas , item ) {
398+ draw_item_into_img : function ( app_title , teaser_img , item ) {
399399 if ( app_title == 'auto_save' )
400400 {
401401 var id = item . internal_id ;
402402 var width = 384 ;
403403 var height = 284 ;
404- this . copy_autosnapshot_to_canvas ( auto_snaps [ id ] , teaser_canvas , width , height ) ;
404+ this . copy_autosnapshot_to_img ( auto_snaps [ id ] , teaser_img , width , height ) ;
405405 }
406406 else
407407 {
@@ -413,6 +413,7 @@ var collectors = {
413413 ( version >= 5.1 ? 16 : 8 ) , snapshot_data . length ) ;
414414 }
415415 let thumbnail_data = get_thumbnail_data ( src_data ) ;
416+ var width , height ;
416417 if ( version . startsWith ( "3.3" ) )
417418 {
418419 width = 392 ;
@@ -423,25 +424,36 @@ var collectors = {
423424 width = thumbnail_data [ 0 ] + thumbnail_data [ 1 ] * 256 ; //384;
424425 height = thumbnail_data [ 4 ] + thumbnail_data [ 5 ] * 256 ; //284;
425426 }
426- var ctx = teaser_canvas . getContext ( "2d" ) ;
427- teaser_canvas . width = width ;
428- teaser_canvas . height = height ;
427+
428+ // create temporary off-DOM canvas to convert raw pixel data to an image data URL
429+ var tmp = document . createElement ( 'canvas' ) ;
430+ tmp . width = width ;
431+ tmp . height = height ;
432+ var ctx = tmp . getContext ( "2d" ) ;
429433 if ( ctx != null )
430434 {
431- imgData = ctx . createImageData ( width , height ) ;
432-
435+ var imgData = ctx . createImageData ( width , height ) ;
433436 var data = imgData . data ;
434- snapshot_data = new Uint8Array ( thumbnail_data , 8 /* offset .. skipping width, height */ , data . length ) ;
437+ var snapshot_data = new Uint8Array ( thumbnail_data , 8 /* offset .. skipping width, height */ , data . length ) ;
435438 data . set ( snapshot_data . subarray ( 0 , data . length ) , 0 ) ;
436- ctx . putImageData ( imgData , 0 , 0 ) ;
437-
439+ ctx . putImageData ( imgData , 0 , 0 ) ;
440+
438441 if ( ! version . startsWith ( vc64web_version ) )
439442 {
440- ctx . translate ( 50 , 0 ) ; // translate to rectangle center
441- ctx . rotate ( ( Math . PI / 180 ) * 27 ) ; // rotate
443+ ctx . save ( ) ;
444+ ctx . translate ( 50 , 0 ) ;
445+ ctx . rotate ( ( Math . PI / 180 ) * 27 ) ;
442446 ctx . font = '48px serif' ;
443447 ctx . fillStyle = '#DD0000' ;
444448 ctx . fillText ( 'needs V' + version , 20 , 60 ) ;
449+ ctx . restore ( ) ;
450+ }
451+
452+ try {
453+ teaser_img . src = tmp . toDataURL ( 'image/png' ) ;
454+ } catch ( e ) {
455+ // fallback: leave src empty
456+ console . error ( 'toDataURL failed' , e ) ;
445457 }
446458 }
447459 }
@@ -507,15 +519,20 @@ var collectors = {
507519 return false ;
508520 } ,
509521 //helper method...
510- copy_autosnapshot_to_canvas : function ( snapshot_data , canvas , width , height ) {
511- var ctx = canvas . getContext ( "2d" ) ;
512- canvas . width = width ;
513- canvas . height = height ;
514- imgData = ctx . createImageData ( width , height ) ;
515-
522+ copy_autosnapshot_to_img : function ( snapshot_data , img , width , height ) {
523+ var tmp = document . createElement ( 'canvas' ) ;
524+ tmp . width = width ;
525+ tmp . height = height ;
526+ var ctx = tmp . getContext ( '2d' ) ;
527+ var imgData = ctx . createImageData ( width , height ) ;
516528 var data = imgData . data ;
517529 data . set ( snapshot_data . subarray ( 16 + 8 , data . length ) , 0 ) ;
518- ctx . putImageData ( imgData , 0 , 0 ) ;
530+ ctx . putImageData ( imgData , 0 , 0 ) ;
531+ try {
532+ img . src = tmp . toDataURL ( 'image/png' ) ;
533+ } catch ( e ) {
534+ console . error ( 'toDataURL failed' , e ) ;
535+ }
519536 }
520537
521538 } ,
@@ -816,18 +833,10 @@ var collectors = {
816833 this . set_busy ( false ) ;
817834 }
818835 } ,
819- draw_item_into_canvas : function ( app_title , teaser_canvas , item ) {
820- var ctx = teaser_canvas . getContext ( '2d' ) ;
821- var img = new Image ;
822- img . onload = function ( ) {
823- if ( ctx != null && img != null )
824- {
825- ctx . drawImage ( img , 0 , 0 ) ; // Or at whatever offset you like
826- }
827- } ;
836+ draw_item_into_img : function ( app_title , teaser_img , item ) {
828837 if ( item . screen_shot != null )
829838 {
830- img . src = item . screen_shot ;
839+ teaser_img . src = item . screen_shot ;
831840 }
832841 return ;
833842 } ,
0 commit comments