1+ library ;
2+
3+ import 'dart:typed_data' ;
4+ import 'dart:convert' ;
5+
6+ import 'dart:html' ;
7+
8+ import 'package:wallpaper/wallpaper.dart' ;
9+ import 'package:wallpaper_generator/wallpaper_generator.dart' ;
10+ // import 'package:worker_database/worker_database.dart';
11+
12+ class WallpaperWorker {
13+
14+ // Initialize the wallpaper worker (Execute this method inside the worker)
15+ static void initialize (){
16+ // Database for already generated wallpaper
17+ // WorkerDatabase wdb = WorkerDatabase<ByteBuffer, String>("WallpaperDB", "wallpaperBytesData");
18+
19+ // Get the worker scope
20+ final DedicatedWorkerGlobalScope workerScope = DedicatedWorkerGlobalScope .instance;
21+
22+ // Listen for any message
23+ workerScope.onMessage.listen ((MessageEvent event) async {
24+
25+ var data = event.data;
26+
27+ // Map the inputs from the message event
28+ if (data is Map ) {
29+
30+ // Generate and post the wallpaper bitmap as response
31+ if (data['wallpaper' ] != null ) {
32+
33+ // Generate the wallpaper object
34+ String wallpaperRawJson = jsonEncode (data['wallpaper' ]);
35+ Wallpaper ? wallpaper = Wallpaper .fromRawJson (wallpaperRawJson);
36+
37+ // Fetch already generated if any
38+ /*ByteBuffer? resCache = await wdb.tryFetch(wallpaper.toRawJson());
39+ if(resCache != null){
40+ print("Wallpaper Cache Hit from DB, posted to main thread.");
41+ Uint8List byteArray = Uint8List.view(resCache);
42+ workerScope.postMessage({'wallpaperBytes' : byteArray }, [byteArray.buffer]);
43+ return;
44+ }*/
45+
46+ // Generate the wallpaper
47+ Uint8List ? res = await generateWallpaper (wallpaper);
48+ if (res != null ) {
49+ print ("Wallpaper Generated, posted to main thread." );
50+ // await wdb.tryPut(wallpaper.toRawJson(), res.buffer);
51+ workerScope.postMessage ({'wallpaperBytes' : res }, [res.buffer]);
52+ } else {
53+ print ("Wallpaper not Generated, something not doing well" );
54+ workerScope.postMessage (null );
55+ }
56+ }
57+ }
58+ });
59+ }
60+
61+ // Generate the wallpaper into a byte array
62+ // this format is friendly to postMessage despite BitmapImage or OffscreenCanvas
63+ // cause for some reason in dart this object are set to null after despite they
64+ // are "transferable"... idk. Bruteforcing to Uint8List works like a charm.
65+ static Future <Uint8List ?> generateWallpaper (Wallpaper ? wallpaper) async {
66+
67+ // Check if the wallpaper is not null
68+ if (wallpaper == null ) {
69+ print ("Wallpaper is null, cannot generate a null wallpaper." );
70+ return null ;
71+ }
72+
73+ // Generate the wallpaper
74+ Uint8List ? imageBytes = await WallpaperGenerator .generateWallpaper (wallpaper);
75+ if (imageBytes == null ) {
76+ print ("Generated image is null, there it was an error in the wallpaper generation." );
77+ return null ;
78+ }
79+
80+ return imageBytes;
81+ }
82+ }
0 commit comments