From 335bf9edb5ce0154c07869c051c00c9e00d83025 Mon Sep 17 00:00:00 2001 From: Gordon Williams Date: Fri, 4 Apr 2025 11:11:39 +0100 Subject: [PATCH] clockbg 0.07: Added 'rings'and 'tris' background styles --- apps/clockbg/ChangeLog | 3 ++- apps/clockbg/README.md | 2 ++ apps/clockbg/lib.js | 40 +++++++++++++++++++++++------ apps/clockbg/metadata.json | 4 +-- apps/clockbg/screenshot4.png | Bin 0 -> 5280 bytes apps/clockbg/screenshot5.png | Bin 0 -> 3428 bytes apps/clockbg/settings.js | 47 ++++++++++++++++++++++++++++++++--- 7 files changed, 82 insertions(+), 14 deletions(-) create mode 100644 apps/clockbg/screenshot4.png create mode 100644 apps/clockbg/screenshot5.png diff --git a/apps/clockbg/ChangeLog b/apps/clockbg/ChangeLog index a370befc0..7350c6bac 100644 --- a/apps/clockbg/ChangeLog +++ b/apps/clockbg/ChangeLog @@ -5,4 +5,5 @@ 'Plasma' generative background Add a 'view' option in settings menu to view the current background 0.05: Random square+plasma speed improvements (~2x faster) -0.06: 25% speed improvement if Math.randInt exists (2v25 fw) \ No newline at end of file +0.06: 25% speed improvement if Math.randInt exists (2v25 fw) +0.07: Added 'rings'and 'tris' background styles \ No newline at end of file diff --git a/apps/clockbg/README.md b/apps/clockbg/README.md index 6573ae165..4a3cd70da 100644 --- a/apps/clockbg/README.md +++ b/apps/clockbg/README.md @@ -16,6 +16,8 @@ You can either: * `Image` - choose from a previously uploaded image * `Squares` - a randomly generated pattern of squares in the selected color palette * `Plasma` - a randomly generated 'plasma' pattern of squares in the selected color palette (random noise with a gaussian filter applied) + * `Rings` - randomly generated rings in the selected color palette + * `Tris` - randomly generated overlapping triangles in the selected color palette ## Usage in code diff --git a/apps/clockbg/lib.js b/apps/clockbg/lib.js index 256f2f372..0b8fd5996 100644 --- a/apps/clockbg/lib.js +++ b/apps/clockbg/lib.js @@ -5,14 +5,35 @@ exports.reload = function() { settings = Object.assign({ style : "randomcolor", colors : ["#F00","#0F0","#00F"] - },require("Storage").readJSON("clockbg.json")||{}); + },require("Storage").readJSON("clockbg.json",1)||{}); if (settings.style=="image") settings.img = require("Storage").read(settings.fn); else if (settings.style=="randomcolor") { settings.style = "color"; let n = (0|(Math.random()*settings.colors.length)) % settings.colors.length; settings.color = settings.colors[n]; - delete settings.colors; + } else if (settings.style=="rings") { // 45 ms + settings.style = "image"; + let bg = Graphics.createArrayBuffer(g.getWidth(),g.getHeight(),1,{msb:true}); + var x,y,r,ri=Math.randInt,s=bg.getWidth()-20; + for (var i=0;i<10;i++) { + x = 10+ri(s);y=10+ri(s);r=10+ri(40); + bg.drawCircle(x,y,r).drawCircle(x,y,r-1).drawCircle(x,y,r-2).drawCircle(x,y,r-3); + } + bg.palette = new Uint16Array([g.toColor(settings.colors[0]),g.toColor(settings.colors[1])]); + settings.img = bg; + settings.imgOpt = {}; + } else if (settings.style=="tris") { // 58ms + settings.style = "image"; + let cols = settings.colors, ri = Math.randInt, r = ri(settings.colors.length), bpp = (cols.length>4)?4:2; + cols = cols.slice(r).concat(cols.slice(0,r)); // rotate palette + let bg = Graphics.createArrayBuffer(88,88,bpp,{msb:true}); + bg.palette = new Uint16Array(1<g.toColor(c))); + let c = cols.length-1, rp = (function(r){"ram";return r()-10}).bind(null,ri.bind(null,bg.getWidth()+20)), a = [0,0,0,0,0,0]; + for (var i=1;i<9;i++) bg.setColor(1+ri(c)).fillPoly(a.map(rp)); + settings.img = bg; + settings.imgOpt = {scale:g.getWidth()/88}; } else if (settings.style=="squares") { // 32ms settings.style = "image"; let bpp = (settings.colors.length>4)?4:2; @@ -24,8 +45,7 @@ exports.reload = function() { bg.palette = new Uint16Array(1<g.toColor(c))); settings.img = bg; - settings.imgOpt = {scale:16}; - delete settings.colors; + settings.imgOpt = {scale:g.getWidth()/11}; } else if (settings.style=="plasma") { // ~47ms settings.style = "image"; let bg = Graphics.createArrayBuffer(16,16,4,{msb:true}); @@ -42,12 +62,11 @@ exports.reload = function() { bg.palette = new Uint16Array(16); bg.palette.set(settings.colors.map(c=>g.toColor(c))); settings.img = bg; - settings.imgOpt = {scale:11}; - delete settings.colors; + settings.imgOpt = {scale:g.getWidth()/16}; } + delete settings.colors; // not needed now //console.log("bg",Date.now()-t); }; -exports.reload(); // Fill a rectangle with the current background style, rect = {x,y,w,h} // eg require("clockbg").fillRect({x:10,y:10,w:50,h:50}) @@ -62,4 +81,9 @@ exports.fillRect = function(rect,y,x2,y2) { console.log("clockbg: No background set!"); g.setBgColor(g.theme.bg).clearRect(rect); } -}; \ No newline at end of file +}; + +// load background +exports.reload(); + +//exports.fillRect(Bangle.appRect); // testing \ No newline at end of file diff --git a/apps/clockbg/metadata.json b/apps/clockbg/metadata.json index ba6fb6712..1824f23b2 100644 --- a/apps/clockbg/metadata.json +++ b/apps/clockbg/metadata.json @@ -1,10 +1,10 @@ { "id": "clockbg", "name": "Clock Backgrounds", "shortName":"Backgrounds", - "version": "0.06", + "version": "0.07", "description": "Library that allows clocks to include a custom background (generated on demand or uploaded).", "icon": "app.png", - "screenshots": [{"url":"screenshot.png"},{"url":"screenshot2.png"},{"url":"screenshot3.png"}], + "screenshots": [{"url":"screenshot.png"},{"url":"screenshot2.png"},{"url":"screenshot3.png"},{"url":"screenshot4.png"},{"url":"screenshot5.png"}], "type": "module", "readme": "README.md", "provides_modules" : ["clockbg"], diff --git a/apps/clockbg/screenshot4.png b/apps/clockbg/screenshot4.png new file mode 100644 index 0000000000000000000000000000000000000000..d5d64a602c8e4b1e7d1a60b989a079bdd43e2a1d GIT binary patch literal 5280 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 { + menu[getColorsImage(col)] = () => { + settings.style = "rings"; + settings.colors = col; + saveSettings(); + showMainMenu(); + }; + }); + E.showMenu(menu); + }, + /*LANG*/"Tris" : function() { + var cols = [ // 2/4/8/16 (8/16 both use 4bpp) + ["#00f","#05f","#0bf","#0fd","#0f7","#0f1","#3f0","#9f0","#ff0","#f90","#f30","#f01","#f07","#f0d","#b0f","#50f"], + ["#00f","#0bf","#0f7","#3f0","#ff0","#f30","#f07","#b0f"], + ["#0ef","#6f0","#f10","#90f"], + ["#09f","#1f0","#f60","#e0f"], + ["#000","#444","#888","#fff"] + // Please add some more! + ]; + var menu = {"":{title:/*LANG*/"Colors", back:showModeMenu}}; + cols.forEach(col => { + menu[getColorsImage(col)] = () => { + settings.style = "tris"; + settings.colors = col; + saveSettings(); + showMainMenu(); + }; + }); + E.showMenu(menu); + }, }); }