Skip to content

Commit 044cf77

Browse files
committed
use img instead of canvas in media snapshot browser
1 parent 60f5432 commit 044cf77

2 files changed

Lines changed: 43 additions & 34 deletions

File tree

js/vc64_browser.js

Lines changed: 42 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -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(/canvas_snap_(.*)/)[1];
285+
let id = this.id.match(/img_snap_(.*)/)[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
},

sw.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
const url_root_path= self.location.pathname.replace("/sw.js","");
22
const core_version = '5.1.3'; //has to be the same as the version in Emulator/config.h
3-
const ui_version = '2025_11_13'+url_root_path.replace("/","_");
3+
const ui_version = '2025_12_05'+url_root_path.replace("/","_");
44
const needs_shared_array_buffer=false; //true when it runs in separat worker thread
55
const cache_name = `${core_version}@${ui_version}`;
66
const settings_cache = 'settings';

0 commit comments

Comments
 (0)