diff --git a/apps.json b/apps.json index bb37a489a..8ab683361 100644 --- a/apps.json +++ b/apps.json @@ -216,6 +216,32 @@ {"name":"wclock.img","url":"clock-word-icon.js","evaluate":true} ] }, + { "id": "fontclock", + "name": "Font Clock", + "icon": "fontclock.png", + "version":"0.01", + "description": "Choose the font and design of clock face from a library of available designs", + "tags": "clock", + "type":"clock", + "allow_emulator":true, + "readme": "README.md", + "custom":"custom.html", + "storage": [ + {"name":"fontclock.app.js","url":"fonclock.js"}, + {"name":"fontclock.img","url":"fontclock-icon.js","evaluate":true}, + {"name":"fontclock.hand.js","url":"fontclock.hand.js"}, + {"name":"fontclock.thinhand.js","url":"fontclock.thinhand.js"}, + {"name":"fontclock.thickhand.js","url":"fontclock.thickhand.js"}, + {"name":"fontclock.hourscriber.js","url":"fontclock.hourscriber.js"}, + {"name":"fontclock.font.js","url":"fontclock.font.js"}, + {"name":"fontclock.font.abril_ff50.js","url":"fontclock.font.abril_ff50.js"}, + {"name":"fontclock.font.cpstc58.js","url":"fontclock.font.cpstc58.js"}, + {"name":"fontclock.font.mntn25.js","url":"fontclock.font.mntn25.js"}, + {"name":"fontclock.font.mntn50.js","url":"fontclock.font.mntn50.js"}, + {"name":"fontclock.font.vector25.js","url":"fontclock.font.vector25.js"}, + {"name":"fontclock.font.vector50.js","url":"fontclock.font.vector50.js"} + ] + }, { "id": "slidingtext", "name": "Sliding Clock", "icon": "slidingtext.png", diff --git a/apps/fontclock/ChangeLog b/apps/fontclock/ChangeLog new file mode 100644 index 000000000..d53df991b --- /dev/null +++ b/apps/fontclock/ChangeLog @@ -0,0 +1 @@ +0.01: Initial Release diff --git a/apps/fontclock/README.md b/apps/fontclock/README.md new file mode 100644 index 000000000..cbdb2a3f8 --- /dev/null +++ b/apps/fontclock/README.md @@ -0,0 +1,43 @@ +# Sweep Clock + +The Sweep Clock provides a clock with a perfectly smooth sweep second hand with a single Numeral Display. + + + +## Usage + +### Button 1 + +Use Button 1 (the top right button) to change the numeral type + +| Default clock face | Roman Numeral Font | No Digits | +| ---- | ---- | ---- | +|  |  |  | + + + +### Button 3 +Button 3 (bottom right button) is used to change the colour + +| Red | Grey | Purple | +| ---- | ---- | ---- | +|  |  |  | + +### Button 4 +Button 4 (bottom left of screen) is used to change the date positioning (or to remove from the screen) + +| Top Right | Bottom Right | Bottom Left | Top Left | +| ---- | ---- | ---- | ---- | +|  |  |  |  | + +## Further Details + +For further details of design and working please visit [The Project Page](https://www.notion.so/adrianwkirk/Sweep-hand-clock-6aa5b6b3d1074d4e87fc947975b1e4b7) + +## Requests + +Reach out to adrian@adriankirk.com if you have feature requests or notice bugs. + +## Creator + +Made by [Adrian Kirk](mailto:adrian@adriankirk.com) \ No newline at end of file diff --git a/apps/fontclock/app.png b/apps/fontclock/app.png new file mode 100644 index 000000000..763c00b1d Binary files /dev/null and b/apps/fontclock/app.png differ diff --git a/apps/fontclock/custom.html b/apps/fontclock/custom.html new file mode 100644 index 000000000..92fe4b619 --- /dev/null +++ b/apps/fontclock/custom.html @@ -0,0 +1,200 @@ + +
+ + + + +Please select watch display
+ +| + + | +
+
+ |
+
Click
+ + + + + + diff --git a/apps/fontclock/display-01.png b/apps/fontclock/display-01.png new file mode 100644 index 000000000..e7100a25f Binary files /dev/null and b/apps/fontclock/display-01.png differ diff --git a/apps/fontclock/display-02.png b/apps/fontclock/display-02.png new file mode 100644 index 000000000..b7c8e81b1 Binary files /dev/null and b/apps/fontclock/display-02.png differ diff --git a/apps/fontclock/display-03.png b/apps/fontclock/display-03.png new file mode 100644 index 000000000..9cbe80544 Binary files /dev/null and b/apps/fontclock/display-03.png differ diff --git a/apps/fontclock/display-04.png b/apps/fontclock/display-04.png new file mode 100644 index 000000000..c8dbdeabb Binary files /dev/null and b/apps/fontclock/display-04.png differ diff --git a/apps/fontclock/display-05.png b/apps/fontclock/display-05.png new file mode 100644 index 000000000..b716443a9 Binary files /dev/null and b/apps/fontclock/display-05.png differ diff --git a/apps/fontclock/fontclock-icon.js b/apps/fontclock/fontclock-icon.js new file mode 100644 index 000000000..d9bdd8c65 --- /dev/null +++ b/apps/fontclock/fontclock-icon.js @@ -0,0 +1 @@ +require("heatshrink").decompress(atob("lEowkA/4AGmYIHABHzmVCCaE0kUin4TPmUimQTQ+UzmcvJ6EjCaP/kYABCaEymYTl+Q7SMgITTmQTQPAK0RMgITm+QTS+ciPCcikQpPY4MjmYTO+czmcyHh4TCmcvJ54nCPCBjBJx4oECc8zJ6ATTn48RE4YTTHh4SDH4ImRFBwTGFBgTGFBgSGFBYmHUgITRmcyFBASFAoUjE5PzkQLBHJxiDAQP/GxAA==")) diff --git a/apps/fontclock/fontclock.font.abril_ff50.js b/apps/fontclock/fontclock.font.abril_ff50.js new file mode 100644 index 000000000..d61a2ca49 --- /dev/null +++ b/apps/fontclock/fontclock.font.abril_ff50.js @@ -0,0 +1,87 @@ +var NumeralFont = require("fontclock.font.js"); + +const DIM_30x38 = [30,38]; +const DIM_49x38 = [49,38]; + +class DigitNumeralFont extends NumeralFont{ + constructor(){ + super(); + // dimension map provides the dimensions of the character for + // each number for plotting and collision detection + + /*this.dimension_map = { + 3 : [30,38], + 6 : [30,38], + 9 : [30,38], + 12: [49,38] + };*/ + this.widths = atob("DRIhFRwdHhsfGh8fDQ=="); + this.font = atob("AAAAAAAAAAAAAAAAAAAAAAAH4AAAAAAD/AAAAAAB/4AAAAAAf+AAAAAAH/gAAAAAB/4AAAAAAf+AAAAAAD/AAAAAAA/gAAAAAABgAAAAAAAAAAAAAAAAAAAAAAAAHAAAAAAAPwAAAAAAf8AAAAAA/+AAAAAB/8AAAAAD/wAAAAAH/gAAAAAP/AAAAAAf+AAAAAA/8AAAAAB/4AAAAAD/wAAAAAH/gAAAAAP/AAAAAAH+AAAAAAB8AAAAAAAIAAAAAAAAAAAAAAAAAAH/8AAAAAP//8AAAAP///wAAAH///+AAAD////4AAB/////AAA/////wAAf////+AAH/////wAD/////8AA//////AAP/gAA/wADwAAAAeAA4AAAADgAMAAAAA4ADAAAAAOAAwAAAADgAMAAAAA4ADgAAAAeAA/gAAA/AAP/////wAD/////8AAf/////AAH/////gAA/////4AAH////8AAB////+AAAP////AAAA////gAAAD///gAAAAH//AAAAAAAAAAAAGAAAAAwABgAAAAMAAYAAAADAAGAAAAAwADgAAAAMAA//////AAP/////wAD/////8AA//////AAP/////wAD/////8AA//////AAP/////wAD/////8AA//////AAP/////wAAAAAAAMAAAAAAADAAAAAAAAwAAAAAAAMAAAAAAAAAAAAAAAAAAAHwAAD8AAH/AAB/AAD/wAA/wAA/+AAf8AAf/gAP/AAH/4AH/wAD/+AD/8AA//gB//AAOPwA//wADD4Aff8AAwAAPn/AAMAAPx/wADAAH8f8AA4AH+H/AAPgP/B/wAD///gf8AA///4H/AAP//8B/wAD//+Af8AAf//AH/AAH//wB/wAA//4A/8AAH/4Af/AAA/8A//wAAD8Af/8AAAAAD+AAAAAAAAAAAAAAAAAAAAAAAAPwAAA/gAP+AAAf8AD/wAAP/gB/+AAH/4Af/wAB/+AH/8AAf/gB//AAP/4wP/wAD/8OD+OAAw/DgPDgAMDAwAA4ADAAcAAOAAwAHAADgAOAH4AA4AD///AAeAA///+A/AAP/////wAD/////8AA//9///AAP//f//gAB//n//4AAf/w//+AAD/8P//AAAf+B//gAAB+AP/wAAAAAB/4AAAAAADwAAAAAAAAAAAAAAAeAAAAAAAfgAAAAAAf4AAAAAAPmAAAAAAPhgAAAAAPwYAAAAAPwGAAAAAHwBgAAAAHwAYDAAAH4AGAwAAH4ABgMAAH4AAYDAAD4AAGAwAD/////8AA//////AAP/////wAD/////8AA//////AAP/////wAD/////8AA//////AAP/////wAD/////8AAAAAAYDAAAAAAGAwAAAAABgMAAAAAAYBAAAAAB/4AAAAAAf+AAAAAAAAAAAAAAAD4AAAAAAB/gAAAAAA/8AAP//wf/gAD//8H/4AA//3B//AAP8Bgf/wAD/A4D/8AAfwOA/jgAH8DAH44AB/gwAAOAAf4MAADgAH+DAAA4AB/g4AAeAAf8PwA/AAH/D///wAB/w///8AAf8P///AAD/j///wAA/4f//4AAP+H//+AAH/A///AAD/wP//gAA/gB//wAAAAAH/4AAAAAAfwAAAAAAAAAAAAAAAAAAAAAD//wAAAAH///AAAAH///8AAAD////gAAD////8AAB/////gAAf////4AAP/////AAH/////wAB/////8AA//////gAP8B4AD4AD4A4AAOAA4AMAADgAOAHAAA4ADABwAAOAAwAcAAHgAMAH4AP4ADD5///8AA5/f///AAP/////wAD/////8AAf/v//+AAH/7///AAA/+f//wAAH/H//4AAA/gf/4AAABgD/8AAAAAAH4AAAAAAAAAAAAAAAAAAAAf/wAAAAAP/8AAAAAD/8AAAAAA/8AAAAAAP+AAA/AAD/gAA/4AA/4AA//AAP+AAf/wAD/gAf/+AA/4AP//gAP+AH//4AD/gD//+AA/4B///gAP+B/+BwAD/g/8AAAA/4f8AAAAP+P8AAAAD/n8AAAAA/78AAAAAP/+AAAAAD/+AAAAAA/+AAAAAAP+AAAAAAD/AAAAAAAAAAAAAAAAAAAAAAAAAAAP+AAAB/gH/4AAA/8D//AAAf/h//wAAP/8f/+AAH//v//gAB//7//8AAf/////AAP/////wAD/////+AA//////gAP//+AB4ADgAeAAOAAwADgADgAMAA4AA4ADAAOAAOAA4AHwADgAP//+AD4AD/////+AA//////AAP/////wAD//7//8AAf/+///AAH//P//gAA//x//4AAH/4f/8AAA/8D/+AAAD8Af/AAAAAAB/AAAAAAAAAAAAA/gAAAAAA//APwAAA//8H+AAAf//j/wAAP//4/+AAD///f/gAB/////8AAf//+//AAP///v/wAD///7+eAA////PjgAPgAPwA4ADgAA4AOAAwAAOADgAMAADgA4ADAAA4AeAAwAAcAfgAPAAeA/wAD/////8AA//////AAP/////gAB/////wAAf////8AAD////+AAAf////AAAH////gAAAf///gAAAD///gAAAAH//AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD8AH4AAAB/gD/AAAAf8B/4AAAP/Af+AAAD/wH/gAAA/8B/4AAAH/Af+AAAB/wD/AAAAP4A/gAAAAwABgAAAAAAAA=="); + var scale = 1; // size multiplier for this font + this.size = 50+(scale<<8)+(1<<16); + this.y_offset = -12; + /* scale + this.widths = atob("ExkuHicoKiYrJCsrEw=="); + this.font = atob("AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB/AAAAAAAAAAf+AAAAAAAAAB/8AAAAAAAAAP/4AAAAAAAAA//gAAAAAAAAD/+AAAAAAAAAP/4AAAAAAAAA//gAAAAAAAAD/+AAAAAAAAAP/wAAAAAAAAAf/AAAAAAAAAA/4AAAAAAAAAB+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAA8AAAAAAAAAAfwAAAAAAAAAP/AAAAAAAAAH/8AAAAAAAAD/+AAAAAAAAB//AAAAAAAAA//gAAAAAAAAf/wAAAAAAAAP/4AAAAAAAAH/8AAAAAAAAD/+AAAAAAAAB//AAAAAAAAA//gAAAAAAAAf/wAAAAAAAAP/4AAAAAAAAH/8AAAAAAAAD/+AAAAAAAAB//AAAAAAAAA//gAAAAAAAAH/wAAAAAAAAAf4AAAAAAAAAB8AAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAB//wAAAAAAAB///8AAAAAAAf///+AAAAAAH////+AAAAAB/////+AAAAAP/////8AAAAB//////4AAAAP//////wAAAB///////gAAAP///////AAAA///////8AAAH///////4AAAf///////gAAB////////AAAP///////8AAA////////wAAD+AAAAAA/gAAPAAAAAAAeAAA4AAAAAAA4AAHgAAAAAADgAAcAAAAAAAOAABwAAAAAAA4AAHAAAAAAADgAAcAAAAAAAOAAB4AAAAAAA4AADgAAAAAAHgAAPgAAAAAB+AAA/8AAAAA/wAAD////////AAAP///////8AAAf///////wAAB///////+AAAD///////4AAAP///////AAAAf//////8AAAB///////gAAAD//////8AAAAH//////gAAAAP/////8AAAAAP/////AAAAAAf////4AAAAAAP///8AAAAAAAH//+AAAAAAAAADAAAAAAAAAAAAAAAAAAAIAAAAAAAAAABwAAAAAADAAAHAAAAAAAMAAAcAAAAAAAwAABwAAAAAADAAAHAAAAAAAMAAAcAAAAAAAwAABgAAAAAADAAAP///////8AAA////////wAAD////////AAAP///////8AAA////////wAAD////////AAAP///////8AAB////////wAAH////////AAAf///////8AAB////////wAAH////////AAAf///////8AAB////////wAAH////////AAAAAAAAAAAMAAAAAAAAAAAwAAAAAAAAAADAAAAAAAAAAAMAAAAAAAAAAAwAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAcAAAAAAAAAAP+AAAAf8AAAD/8AAAD/wAAAf/4AAAf/AAAD//gAAD/8AAAP//AAAf/wAAB//8AAD//AAAH//wAAf/8AAA///AAD//wAAD//4AAf//AAAP//gAD//8AAA8P+AAfv/wAADg/wAD8//AAAcB8AAfj/8AABwAAAD+P/wAAHAAAAfw//AAAcAAAH+D/8AABwAAA/4P/wAAHgAAP/A//AAAfAAD/4D/8AAB/AD//AP/wAAD////8A//AAAP////gD/8AAA////8AP/wAAD////gA//AAAP///8AD/8AAAf///wAP/wAAB///+AA//AAAD///wAH/8AAAP//+AAf/wAAAf//wAD//AAAA//+AAf/8AAAB//wAP//wAAAD/8AD///AAAAA8AAP//8AAAAAAAA/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAABwAAAP8AAAAA/4AAD/8AAAAH/wAAP/4AAAA//gAB//wAAAH/+AAH//gAAA//8AAf/+AAAH//wAD//8AAAf//AAH//wAAB//8AAf//AAAP//gAB//8AAA//+BwD/D4AADw/4GAP8HgAAOD/A4APwOAABwHwDgAAA4AAHAAAOAAADgAAcAAA4AAAOAABwAAHgAAA4AAHgAA+AAADgAAfAAH8AAAeAAB/wD/4AAD4AAH////4AAfgAAf////+B/+AAA////////wAAD///3////AAAP///f///8AAA///9////wAAD///j///+AAAH//+P///4AAAf//w////gAAA///B///8AAAB//4H///gAAAD//AP//+AAAAH/4Af//wAAAAH+AA//+AAAAAAAAB//gAAAAAAAAD/4AAAAAAAAAA4AAAAAAAAAAAAAAAAAAAAAAfAAAAAAAAAAH8AAAAAAAAAA/wAAAAAAAAAP3AAAAAAAAAD+cAAAAAAAAA/hwAAAAAAAAH4HAAAAAAAAB+AcAAAAAAAAfwBwAAAAAAAH8AHAAAAAAAB/AAcAAAAAAAPwABwAAAAAAD+AAHADAAAAA/gAAcAMAAAAP4AABwAwAAAD+AAAHADAAAAfwAAAcAMAAAH8AAABwAwAAB////////AAAP///////8AAA////////wAAD////////AAAP///////8AAA////////wAAD////////AAAP///////8AAA////////wAAD////////AAAP///////8AAA////////wAAD////////AAAP///////8AAAAAAAABwAwAAAAAAAAHADAAAAAAAAAcAMAAAAAAAABwAwAAAAAAAAHADAAAAAAAAAcAAAAAAAAAB//gAAAAAAAAH/+AAAAAAAAAf/4AAAAAAAAAAAAAAAAAAAAAB+AAAAAAAAAAf+AAAAAAAAAD/+AAAAAAAAAf/8AAAH///4B//wAAA////gH//gAAD///+A//+AAAP/ABwB//8AAA/8AHAH//wAAD/wA4Af//AAAH/gDgB/9+AAAf+AOAD/h4AAB/4AwAH+DgAAH/gHAAHAOAAAf/AcAAAA4AAB/8BwAAADgAAH/wHAAAAOAAAf/AeAAAA4AAB/+B8AAAHgAAD/4H4AAB+AAAP/gf////4AAA/+B/////AAAD/8H////8AAAP/wP////wAAA//A/////AAAD/8D////4AAAP/4P////gAAA//gf///8AAAD/+B////wAAAP/wD///+AAAB/+AH///wAAAP/wAf///AAAB/gAA///wAAAAAAAA//+AAAAAAAAA//gAAAAAAAAAfwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD//wAAAAAAAH///4AAAAAAB////8AAAAAA/////4AAAAAH/////4AAAAB//////wAAAAP//////gAAAB///////AAAAP//////8AAAB///////4AAAH///////gAAA////////AAAD///////8AAAf///////wAAB////////AAAP/4B+AAD+AAA/4AHgAAD4AAD8AA4AAAHgAAPgAHgAAAOAAA8AAcAAAA4AAHgABwAAADgAAcAAPAAAAOAABwAA8AAAA4AAHAADwAAAHgAAcAAPwAAD+AABwPw/////4AADg/z/////AAAPD/P////8AAA//+/////wAAD//7////+AAAP//n////4AAAf//f////gAAB//5////8AAAD//j////gAAAP/+H///+AAAAf/wf///wAAAA//A///+AAAAA/wB///gAAAAAYAB//8AAAAAAAAA/+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/gAAAAAAAD//+AAAAAAAAP//4AAAAAAAA//8AAAAAAAAD//AAAAAAAAAP/4AAAAAAAAA//gAAAH+AAAD/8AAAB/8AAAP/wAAAf/4AAA//AAAH//wAAD/8AAA///AAAP/wAAH//+AAA//AAA///4AAD/8AAP///gAAP/wAB///+AAA//AAP///4AAD/8AB////gAAP/wAP///+AAA//AD//wD4AAD/8Af/4ADAAAP/wD/8AAAAAA//Af/AAAAAAD/8D/wAAAAAAP/wf8AAAAAAA//H/gAAAAAAD/8/4AAAAAAAP/3+AAAAAAAA///gAAAAAAAD//8AAAAAAAAP//AAAAAAAAA//wAAAAAAAAD/8AAAAAAAAAP/gAAAAAAAAA/4AAAAAAAAAAAAAAAAAAAAAAAAAAD/wAAAAAH8AA//wAAAAB/8AH//wAAAAf/8A///AAAAD//4H//+AAAAf//g///8AAAD///D///wAAAP//8f///gAAB///5///+AAAH///n///8AAAf///////wAAD////////AAAP///////8AAA////////4AAD////////gAAP////gAB+AAB+AAP4AAB4AAHgAAfAAADgAAeAAA8AAAOAABwAADwAAA4AAHAAAPAAADgAAcAAA8AAAOAAB4AADwAAA4AAH4AAfgAAHgAAP////gAB+AAA////////4AAD////////gAAP///////8AAA////////wAAD////////AAAH///n///8AAAf//+f///gAAA///5///+AAAD///D///4AAAH//4P///AAAAP//gf//4AAAAf/4A///AAAAA//AB//4AAAAAfgAD//AAAAAAAAAD/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/4AAAAAAAAAf/8AA+AAAAAH//8AP+AAAAA///4B/8AAAAH///4P/4AAAA////h//wAAAH////H//gAAA////+f/+AAAD////5//4AAAf////3//wAAB/////f//AAAH////9//8AAA/////z/j4AAD/////H+HgAAP////8PgOAAA/gAAfwAA4AADwAAAPAADgAAeAAAA8AAOAAB4AAABwAA4AAHAAAAHAADgAAcAAAA4AAeAABwAAADgAD4AAHgAAAeAAfgAAeAAADwAH8AAA+AAA+AH/wAAD////////AAAP///////4AAA////////gAAD///////8AAAH///////wAAAf//////+AAAA///////4AAAD///////AAAAH//////4AAAAP//////AAAAAf/////wAAAAA/////8AAAAAA/////gAAAAAA////wAAAAAAAf//wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPwAAfgAAAAAB/wAD/gAAAAAP/gAf/AAAAAB/+AD/8AAAAAH/8AP/4AAAAAf/wA//gAAAAD//AD/+AAAAAP/8AP/4AAAAAf/wA//gAAAAB/+AD/+AAAAAH/4AP/wAAAAAP/AAf+AAAAAAf4AA/wAAAAAAIAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=="); + var scale = 1; // size multiplier for this font + this.size = 70+(scale<<8)+(1<<16); + this.y_offset = -15 + */ + + // font size 90 + /*this.dimension_map = { + 1 : [50,70], + 2 : [50,70], + 3 : [50,70], + 4 : [50,70], + 5 : [50,70], + 6 : [54,70], + 7 : [54,70], + 8 : [54,70], + 9 : [54,70], + 10: [87,70], + 11: [87,70], + 12: [87,70] + }; + + this.widths = atob("GCA8JjI0NjE3Ljc3GA=="); + this.font = atob("AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMAAAAAAAAAAAAAD/gAAAAAAAAAAAAH/4AAAAAAAAAAAAP/8AAAAAAAAAAAAf/8AAAAAAAAAAAAf/+AAAAAAAAAAAAf/+AAAAAAAAAAAA//+AAAAAAAAAAAA//+AAAAAAAAAAAA//+AAAAAAAAAAAA//+AAAAAAAAAAAAf/+AAAAAAAAAAAAf/+AAAAAAAAAAAAf/8AAAAAAAAAAAAP/4AAAAAAAAAAAAH/4AAAAAAAAAAAAD/gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHAAAAAAAAAAAAAA/AAAAAAAAAAAAAH/AAAAAAAAAAAAA//AAAAAAAAAAAAH//AAAAAAAAAAAA//8AAAAAAAAAAAH//gAAAAAAAAAAA//8AAAAAAAAAAAH//gAAAAAAAAAAA//8AAAAAAAAAAAH//gAAAAAAAAAAA//8AAAAAAAAAAAH//gAAAAAAAAAAA//8AAAAAAAAAAAH//AAAAAAAAAAAA//4AAAAAAAAAAAH//AAAAAAAAAAAA//4AAAAAAAAAAAH//AAAAAAAAAAAA//4AAAAAAAAAAAH//AAAAAAAAAAAA//4AAAAAAAAAAAH//AAAAAAAAAAAA//4AAAAAAAAAAAD//AAAAAAAAAAAAD/4AAAAAAAAAAAAD/AAAAAAAAAAAAAD4AAAAAAAAAAAAADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAH///AAAAAAAAAAB////8AAAAAAAAAP/////gAAAAAAAA//////4AAAAAAAD//////+AAAAAAAH///////gAAAAAAP///////wAAAAAAf///////4AAAAAA////////8AAAAAB////////+AAAAAD/////////AAAAAH/////////gAAAAH/////////wAAAAP/////////wAAAAP/////////4AAAAf/////////4AAAAf/////////4AAAAf/////////8AAAA//////////8AAAA///gAAAAf/8AAAA/wAAAAAAAH+AAAA+AAAAAAAAB+AAAB8AAAAAAAAAeAAAB4AAAAAAAAAeAAAB4AAAAAAAAAOAAAB4AAAAAAAAAOAAABwAAAAAAAAAOAAABwAAAAAAAAAOAAABwAAAAAAAAAOAAAB4AAAAAAAAAOAAAB4AAAAAAAAAeAAAB4AAAAAAAAAeAAAB8AAAAAAAAA+AAAA+AAAAAAAAB+AAAA/4AAAAAAAP8AAAA////AAB///8AAAA//////////8AAAAf/////////8AAAAf/////////4AAAAf/////////4AAAAP/////////wAAAAP/////////wAAAAH/////////gAAAAH/////////gAAAAD/////////AAAAAB////////+AAAAAA////////8AAAAAAf///////8AAAAAAP///////wAAAAAAH///////gAAAAAAB///////AAAAAAAAf/////8AAAAAAAAH/////gAAAAAAAAA////8AAAAAAAAAAB///AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOAAAAAAAAAAAAAAOAAAAAAAAAcAAAAOAAAAAAAAAcAAAAeAAAAAAAAAcAAAAeAAAAAAAAAcAAAAcAAAAAAAAAcAAAAcAAAAAAAAAcAAAAcAAAAAAAAAcAAAAcAAAAAAAAAcAAAAcAAAAAAAAAcAAAA//////////8AAAA//////////8AAAA//////////8AAAA//////////8AAAA//////////8AAAA//////////8AAAA//////////8AAAA//////////8AAAB//////////8AAAB//////////8AAAB//////////8AAAB//////////8AAAB//////////8AAAB//////////8AAAB//////////8AAAB//////////8AAAB//////////8AAAB//////////8AAAB//////////8AAAAAAAAAAAAAAcAAAAAAAAAAAAAAcAAAAAAAAAAAAAAcAAAAAAAAAAAAAAcAAAAAAAAAAAAAAcAAAAAAAAAAAAAAcAAAAAAAAAAAAAAcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAH/AAAAAB/8AAAAAf/wAAAAD/8AAAAB//4AAAAH/8AAAAD//4AAAAP/8AAAAH//8AAAAf/8AAAAH//8AAAA//8AAAAP//8AAAB//8AAAAP//8AAAD//8AAAAf//8AAAH//8AAAAf//8AAAP//8AAAA///8AAAf//8AAAA///8AAA///8AAAA///4AAB/f/8AAAA+D/4AAD+f/8AAAA8D/wAAH8f/8AAAB4D/gAAP8f/8AAAB4AOAAAf4f/8AAABwAAAAA/wf/8AAABwAAAAB/wf/8AAABwAAAAD/gf/8AAABwAAAAP/Af/8AAAB4AAAAf+Af/8AAAB4AAAB/+Af/8AAAB8AAAH/8Af/8AAAB+AAAf/4Af/8AAAB/gAH//wAf/8AAAB//////wAf/8AAAA//////gAf/8AAAA//////AAf/8AAAA/////+AAf/8AAAA/////+AAf/8AAAA/////8AAf/8AAAAf////4AAf/8AAAAf////wAAf/8AAAAP////gAAf/8AAAAP////gAA//8AAAAH////AAA//8AAAAH///+AAB//8AAAAD///4AAD//8AAAAB///wAAH//8AAAAA///gAAf//8AAAAAf/+AAD///8AAAAAD/4AAP///8AAAAAAAAAAP///8AAAAAAAAAAHAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/gAAAAAAD8AAAAD/4AAAAAAP/gAAAP/+AAAAAA//wAAAf//AAAAAB//4AAAf//gAAAAD//8AAA///gAAAAH//8AAA///wAAAAH//8AAA///4AAAAP//8AAA///4AAAAf//8AAA///4AAAAf//8AAA///8AAAAf//8AAA///8AAAA///8AAA///8AAAA///8BwAf/j+AAAA///4BwAf/A+AAAA+D/4BwAP/AeAAAA4D/wBwAD/AeAAAB4D/gBwAAAAOAAABwAAADwAAAAOAAABwAAADwAAAAOAAABwAAADwAAAAOAAABwAAAHgAAAAOAAAB4AAAHwAAAAOAAAB4AAAP4AAAAeAAAB+AAA/4AAAAeAAAB/wAD/+AAAA+AAAB//////AAAB+AAAB//////wAAP+AAAB///////gH/+AAAB//////////8AAAA////9/////8AAAA////9/////8AAAA////8/////8AAAA////4/////4AAAAf///4/////4AAAAf///4/////4AAAAf///wf////wAAAAP///gf////wAAAAP///gP////gAAAAH///AP////gAAAAD//+AH////AAAAAB//8AD///+AAAAAAf/4AD///8AAAAAAH/AAB///4AAAAAAAAAAA///wAAAAAAAAAAAP//AAAAAAAAAAAAD/8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPAAAAAAAAAAAAAAfAAAAAAAAAAAAAB/AAAAAAAAAAAAAH/AAAAAAAAAAAAAf/AAAAAAAAAAAAB/nAAAAAAAAAAAAD+HAAAAAAAAAAAAP8HAAAAAAAAAAAA/wHAAAAAAAAAAAD/AHAAAAAAAAAAAH8AHAAAAAAAAAAAf4AHAAAAAAAAAAB/gAHAAAAAAAAAAH+AAHAAAAAAAAAAf4AAHAAAAAAAAAA/gAAHAAAAAAAAAD/AAAHAAcAAAAAAP8AAAHAAcAAAAAA/wAAAHAAcAAAAAD/AAAAHAAcAAAAAH+AAAAHAAcAAAAAf4AAAAHAAcAAAAB/gAAAAHAAcAAAAH+AAAAAHAAcAAAAP/////////8AAAA//////////8AAAA//////////8AAAA//////////8AAAA//////////8AAAA//////////8AAAA//////////8AAAA//////////8AAAA//////////8AAAA//////////8AAAA//////////8AAAA//////////8AAAA//////////8AAAA//////////8AAAA//////////8AAAA//////////8AAAA//////////8AAAA//////////8AAAAAAAAAAAHAAcAAAAAAAAAAAHAAcAAAAAAAAAAAHAAcAAAAAAAAAAAHAAcAAAAAAAAAAAHAAcAAAAAAAAAAAHAAcAAAAAAAAAAAHAAAAAAAAAAAAAAHAAAAAAAAAAAAAf//gAAAAAAAAAAAf//gAAAAAAAAAAAf//gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB/gAAAAAAAAAAAAH/8AAAAAAAAAAAAP/+AAAAAAAAAAAAf//AAAAAAAAAAAAf//gAAAAf////gA///wAAAA/////wA///wAAAA/////wA///4AAAA///4HgA///4AAAA//AAHgA///4AAAA//AAPAA///8AAAAf/gAPAA///8AAAAf/gAOAA///+AAAAf/gAeAAf/g+AAAAf/wAeAAP/geAAAAf/wAcAAH/geAAAAf/wAcAAD+AOAAAAf/wAcAAAAAOAAAAf/4AcAAAAAOAAAAf/4AcAAAAAOAAAAP/4A8AAAAAOAAAAP/4A8AAAAAOAAAAP/8A+AAAAAeAAAAP/8AfAAAAA+AAAAP/8AfgAAAB+AAAAP/8Af8AAAf+AAAAP/+Af/////+AAAAP/+Af/////8AAAAP/+Af/////8AAAAP/+Af/////8AAAAH//Af/////8AAAAH//AP/////4AAAAH//AP/////4AAAAH//AP/////4AAAAH//AH/////wAAAAH//AH/////wAAAAH//AH/////gAAAAH//AD/////AAAAAP/+AB/////AAAAA//8AA////+AAAAB//gAA////8AAAAB/wAAAP///4AAAAAAAAAAH///gAAAAAAAAAAB//+AAAAAAAAAAAAf/4AAAAAAAAAAAAAYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAH//wAAAAAAAAAAD////gAAAAAAAAAf////4AAAAAAAAD//////AAAAAAAAP//////gAAAAAAA///////4AAAAAAB///////8AAAAAAH///////+AAAAAAP////////AAAAAAf////////gAAAAA/////////gAAAAB/////////wAAAAD/////////wAAAAD/////////4AAAAH/////////4AAAAP/////////8AAAAP/////////8AAAAf/////////8AAAAf/////////8AAAAf//wD/gAA/+AAAA//gAH4AAAD+AAAA/8AAPgAAAA+AAAA/wAAPAAAAAeAAAA/AAAeAAAAAOAAAA+AAAcAAAAAOAAAB8AAA8AAAAAOAAAB4AAA4AAAAAOAAAB4AAB4AAAAAOAAAB4AAB8AAAAAeAAABwAAB8AAAAAeAAABwAAB+AAAAA+AAABwAAB/AAAAD+AAABwAMB/+AAD/+AAAB4D/h//////8AAAB4D/x//////8AAAB8D/5//////8AAAA///5//////8AAAA///8//////4AAAA///8//////4AAAA///8//////wAAAAf//8//////wAAAAf//8f/////gAAAAP//8f/////gAAAAP//8P/////AAAAAH//8P////+AAAAAD//4H////8AAAAAB//wD////4AAAAAA//gB////wAAAAAAP/AA////gAAAAAAAQAAP//+AAAAAAAAAAAB//wAAAAAAAAAAAAD4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAf///AAAAAAAAAAA////AAAAAAAAAAA///+AAAAAAAAAAA///gAAAAAAAAAAA///AAAAAAAAAAAA//+AAAAAAAAAAAA//8AAAAAAAAAAAA//8AAAAAP/AAAAA//4AAAAA//gAAAA//4AAAAD//wAAAA//4AAAAP//4AAAA//4AAAAf//8AAAA//4AAAA///8AAAA//4AAAD///+AAAA//4AAAH///+AAAA//4AAAP///+AAAA//4AAA////+AAAA//4AAB////+AAAA//4AAD////+AAAA//4AAH////+AAAA//4AAP////+AAAA//4AA/////+AAAA//4AB///gD+AAAA//4AD//8AAeAAAA//4AH//gAAAAAAA//4AP/+AAAAAAAA//4Af/4AAAAAAAA//4A//gAAAAAAAA//4D/+AAAAAAAAA//4H/4AAAAAAAAA//4P/gAAAAAAAAA//4f+AAAAAAAAAA//4/8AAAAAAAAAA//5/wAAAAAAAAAA////AAAAAAAAAAA///8AAAAAAAAAAA///4AAAAAAAAAAA///gAAAAAAAAAAA//+AAAAAAAAAAAA//4AAAAAAAAAAAA//wAAAAAAAAAAAA//AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/+AAAAAAAAPAAAH//wAAAAAAD/8AAP//4AAAAAAP//AA///+AAAAAA///gB///+AAAAAB///wB////AAAAAD///4D////gAAAAD///8H////wAAAAH///8H////wAAAAP///+P////4AAAAP///+P////4AAAAf////P////4AAAAf////f////8AAAAf////f////8AAAA/////f////8AAAA//////////8AAAA//////////+AAAA//////////+AAAA///////8f/+AAAB//////gAAH+AAAB/4AB/+AAAA+AAAB+AAAH8AAAAeAAAB8AAAD4AAAAeAAAB4AAAD4AAAAOAAAB4AAAB4AAAAOAAABwAAABwAAAAOAAAB4AAAB4AAAAOAAAB4AAAB4AAAAOAAAB4AAAD4AAAAOAAAB8AAAH8AAAAeAAAB/gAAP8AAAA+AAAB//////AAAD+AAAA//////+AA/+AAAA//////////+AAAA//////////+AAAA//////////8AAAA/////f////8AAAAf////f////8AAAAf////f////8AAAAf////P////4AAAAP///+P////4AAAAP///+H////4AAAAH///8H////wAAAAH///4H////wAAAAD///4D////gAAAAB///wB////gAAAAA///gA////AAAAAAf//AAf//+AAAAAAH/8AAP//4AAAAAAA/AAAH//wAAAAAAAAAAAB/+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMAAAAAAAAAAAAAP/+AAAAAAAAAAAB///gAAfgAAAAAAH///4AD/4AAAAAAP///8AH/+AAAAAA/////AP//AAAAAA/////gf//gAAAAB/////gf//gAAAAD/////w///wAAAAH/////4///wAAAAH/////4///4AAAAP/////8///4AAAAP/////8///8AAAAf/////8///8AAAAf/////+f//8AAAAf/////+f/z8AAAA//////+P/g+AAAA//////+H/geAAAA//////+D/AeAAAA//gAH/+AAAOAAAB/gAAAD+AAAOAAAB+AAAAA+AAAOAAAB8AAAAA+AAAOAAAB4AAAAAeAAAOAAAB4AAAAAeAAAOAAABwAAAAAcAAAeAAABwAAAAAcAAAeAAABwAAAAA8AAA+AAAB4AAAAA4AAB+AAAB4AAAAB4AAH+AAAB8AAAAHwAAf8AAAB+AAAAPgAD/8AAAA/4AAD/AD//8AAAA//////////4AAAA//////////4AAAA//////////4AAAAf/////////wAAAAf/////////wAAAAf/////////gAAAAP/////////AAAAAP/////////AAAAAH////////+AAAAAH////////8AAAAAD////////4AAAAAB////////wAAAAAA////////AAAAAAAf//////+AAAAAAAH//////4AAAAAAAD//////gAAAAAAAAf////8AAAAAAAAAH////gAAAAAAAAAAP//wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMAAAAMAAAAAAAAB/gAAD/gAAAAAAAH/4AAH/4AAAAAAAP/8AAP/8AAAAAAAP/8AAf/8AAAAAAAf/+AAf/+AAAAAAAf/+AAf/+AAAAAAAf/+AA//+AAAAAAAf/+AA//+AAAAAAAf/+AA//+AAAAAAAf/+AA//+AAAAAAAf/+AAf/+AAAAAAAf/+AAf/+AAAAAAAP/8AAf/8AAAAAAAP/8AAP/4AAAAAAAH/4AAH/4AAAAAAAD/gAAD/gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=="); + var scale = 1; // size multiplier for this font + this.size=90+(scale<<8)+(1<<16); + this.y_offset = -20 + */ + + } + getDimensions(hour){ + //return this.dimension_map[hour]; + switch (hour){ + case 10: + case 11: + case 12: + return DIM_49x38; + default: + return DIM_30x38; + + } + } + hour_txt(hour){ return hour.toString(); } + draw(hour_txt,x,y){ + /* going to leave this in here for future testing. + uncomment this so that it draws a box behind the string + so we can guess the digit dimensions*/ + /*var dim = [30,38]; + g.setColor(0.5,0,0); + g.fillPoly([x,y, + x+dim[0],y, + x+dim[0],y+dim[1], + x,y+dim[1] + ]); + g.setColor(1.0,1.0,1.0);*/ + g.setFontAlign(-1.0,-1.0,0); + g.setFontCustom(this.font, 46, this.widths, this.size); + g.drawString(hour_txt,x,y+this.y_offset ); + } + getName(){return "Digit";} +} + +module.exports = [DigitNumeralFont]; \ No newline at end of file diff --git a/apps/fontclock/fontclock.font.cpstc58.js b/apps/fontclock/fontclock.font.cpstc58.js new file mode 100644 index 000000000..6e91349ab --- /dev/null +++ b/apps/fontclock/fontclock.font.cpstc58.js @@ -0,0 +1,59 @@ +var NumeralFont = require("fontclock.font.js"); + +const DIM_20x58 = [20,58]; +const DIM_30x58 = [30,58]; +const DIM_40x58 = [40,58]; +const DIM_50x58 = [50,58]; +class DigitNumeralFont extends NumeralFont{ + constructor(){ + super(); + // dimension map provides the dimesions of the character for + // each number for plotting and collision detection + this.font = atob("AAAA/+AAAAAAB///wAAAAB////8AAAA/////+AAAP/////8AAD//////8AAf/8AAf/8AD/8AAAH/4Af+AAAAD/wD/gAAAAD/gf4AAAAAH+D/AAAAAAP8P4AAAAAAf5/AAAAAAA/n4AAAAAAB+/gAAAAAAH/+AAAAAAAf/wAAAAAAA//AAAAAAAD/8AAAAAAAP/4AAAAAAB//gAAAAAAH9+AAAAAAAfn8AAAAAAD+fwAAAAAAP4/gAAAAAB/D/AAAAAAP8H/AAAAAB/gP+AAAAAf8Af/AAAAH/gA//gAAD/8AB//8AH//gAB//////8AAB//////AAAB/////wAAAA////4AAAAAP//4AAAAAAAAAAAAAAGAAAAAAAAA8AAAAAAAAH8AAAAAAAA/wAAAAAAAH+AAAAAAAA/wAAAAAAAH+AAAAAAAA/wAAAAAAAH////////w/////////H////////8/////////3//////////////////8AAAAAAAAAAAAAAAAAADAAAAAAAAAcQAAAAAAAHzwAAAAAAA/PwAAAAAAH9/AAAAAAB/34AAAAAAP/fgAAAAAD//+AAAAAAf//wAAAAAH///AAAAAA///8AAAAAH///4AAAAB/4//gAAAAP/D/+AAAAD/wP34AAAAf+A/fwAAAD/wD8/gAAA/8APz/AAAH/gA/H+AAB/4AD8f8AAP/AAPw/8AD/wAA/B/+A/+AAD8D////wAAPwH///8AAA/AH///gAAD8AH//4AAAPwAH/+AAAAAAAAAAAAAAD8AAAAAAAAPwAAAAAAAA/AAgAAAAD/8AHAAAAAP/wB8AAAAA//APwAAAAD/8D/AAAAAP/wf8AAAAB//H/wAAAAH/8//gAAAAfv//+AAAAD+///8AAAAP7//fwAAAB/P/w/gAAAP8/+D/AAAB/j/wH+AAAP8P8AP8AAB/w/gAf8AAf+D4AA/8AH/wPAAB////+AwAAD////gCAAAH///8AAAAAH///AAAAAAD//wAAAAAAA/wAAAAAAAAAAAAAAAAAAAQAAAAAAAAHAAAAAAAAD8AAAAAAAA/wAAAAAAAP/AAAAAAAD/8AAAAAAB//wAAAAAAf//AAAAAAH//8AAAAAB//PwAAAAAf/w/AAAAAP/8D8AAAAD//APwAAAA//gA/AAAAP/4AD8AAAH/+AAPwAAB//gAA/AAAf/4AAD8AAH/8AAAPwAD//AAAA/AAP/wAAAD8AA/8AAAAPwAD/AAAAA/gAPgAAA/////4AAAD////+AAAAP////wAAAA/////AAAAD////8AAAAAA/AAAAAAAAD8AAAAAAAAPwAAAAAAAAAAAAAA8AAAAAAAB/wAAAAAAD//AAAAAP///8AAAAA////wAAAAD////AAAAAP///8AAAAA//4PwAAAAH/8A/gAAAAf/wB+AAAAB+/AH4AAAAP78AfwAAAA/vwA/AAAAH8/AD+AAAA/z8AP8AAAD+PwAf4AAAf4/AA/wAAH/D8AD/gAA/4PwAH/gAf/A/AAP/8f/4AAAAf////AAAAAf///wAAAAA///8AAAAAAf//AAAAAAAH/gAAAAAAAAAAAAAAAAH/4AAAAAAP//8AAAAAD///+AAAAB////8AAAAf////8AAAH//8f/4AAA//8AD/wAAP//AAD/gAB//wAAH/AAP/+AAAH+AB//wAAAP4AP/+AAAAfwB//wAAAB/AP9/AAAAD+B/n4AAAAH4H8/gAAAAfg/j8AAAAB/H8PwAAAAH8fw/AAAAAPz+D8AAAAA/P4PwAAAAD9/A/AAAAAf38D8AAAAB/fgP4AAAAH5+A/gAAAAfv4B/AAAAD+/gH8AAAAPz+AP4AAAB/PwA/wAAAP8/AB/gAAB/gAAD/AAAP8AAAP+AAD/gAAAf+AA/8AAAA//gf/gAAAA////8AAAAB////gAAAAB///4AAAAAB//+AAAAAAA//AAAAAAAAAAAAPwAAAAAAAA/AAAAAAAAD8AAAAAAAAfwAAAAAAAP/AAAAAAAH/8AAAAAAD//wAAAAAD///AAAAAB///8AAAAA///vwAAAA///w/AAAAP//wD8AAAP//4APwAAH//8AA/AAD//+AAD8AD//+AAAPwB///AAAA/A///gAAAD8f//wAAAAP///4AAAAA///4AAAAAD//8AAAAAAP/+AAAAAAA/+AAAAAAAD/AAAAAAAAPgAAAAAAAAwAAAAAAAAAAAAAAAAAAAAAAAD/AAAAAAAH//wAAAAAB///wAAAAAf///wAAAAD////wAAAAf////gAAAH/wAf/AAAA/8AAP+AAAD/AAAf8AAAf4AAAf4AAD/AAAA/gB/P4AAAB/A///AAAAH8H//8AAAAP4///gAAAAfn//+AAAAB+f//wAAAAH/+B/AAAAAf/4H8AAAAA//APwAAAAD/8A/AAAAAP/4H8AAAAB/fw/wAAAAH9///gAAAAfj//+AAAAB+P//4AAAAP4P//wAAAA/gf//gAAAH8APD/AAAA/wAAH8AAAH+AAAf8AAA/wAAA/4AAH/AAAB/4AB/4AAAD/8A//AAAAH////wAAAAP///+AAAAAP///gAAAAAP//4AAAAAAH/+AAAAAAAAAAAAAAA/wAAAAAAA//8AAAAAAP//+AAAAAD///8AAAAA////8AAAAH////4AAAA/+AD/wAAAH/AAD/gAAA/4AAD/AAAH+AAAH+AAAfwAAAP8APz+AAAAfwA/P4AAAA/gH9/AAAAD+Af34AAAAH4B+fgAAAAfwH7+AAAAA/A/v4AAAAD8D+/AAAAAPwPz8AAAAA/B/PwAAAAD8P8/gAAAAPw/j+AAAAA/H8H4AAAAH8/wfgAAAAf3+B/AAAAB+fwH8AAAAP//AP4AAAB//4A/wAAAH//AB/gAAA//4AD/AAAP//AAH+AAB//wAAf+AAf/+AAAf/AP//gAAA/////8AAAB/////AAAAB////wAAAAB///4AAAAAB//4AAAAAAAAAAAAAAA="); + this.widths = atob("Jg8dGiAaKBsoKA=="); + } + getDimensions(hour){ + switch(hour){ + case 1: + return DIM_20x58; + case 2: + case 3: + case 4: + case 5: + case 7: + return DIM_30x58; + case 6: + case 8: + case 9: + case 11: + case 12: + return DIM_40x58; + case 10: + return DIM_50x58; + default: + return DIM_30x58; + } + } + hour_txt(hour){ return hour.toString(); } + draw(hour_txt,x,y){ + /* going to leave this in here for future testing. + uncomment this so that it draws a box behind the string + so we can guess the digit dimensions + dim = [50,58]; + g.setColor(0.5,0,0); + g.fillPoly([x,y, + x+dim[0],y, + x+dim[0],y+dim[1], + x,y+dim[1] + ]); + g.setColor(1.0,1.0,1.0);*/ + //g.setFontCopasetic40x58Numeric(); + //g.setFontAlign(-1,-1,0); + g.setFontAlign(-1,-1,0); + g.setFontCustom(this.font, 48, this.widths, 58); + g.drawString(hour_txt,x,y); + } + getName(){return "Digit";} +} + +module.exports = [DigitNumeralFont]; \ No newline at end of file diff --git a/apps/fontclock/fontclock.font.js b/apps/fontclock/fontclock.font.js new file mode 100644 index 000000000..10b063ca5 --- /dev/null +++ b/apps/fontclock/fontclock.font.js @@ -0,0 +1,26 @@ +/** + * We want to be able to change the font so we set up + * pure virtual for all fonts implementtions to use + */ +class NumeralFont { + /** + * The screen dimensions of what we are going to + * display for the given hour. + */ + getDimensions(hour){return [0,0];} + /** + * The characters that are going to be returned for + * the hour. + */ + hour_txt(hour){ return ""; } + /** + * method to draw text at the required coordinates + */ + draw(hour_txt,x,y){ return "";} + /** + * Called from the settings loader to identify the font + */ + getName(){return "";} +} + +module.exports = NumeralFont; \ No newline at end of file diff --git a/apps/fontclock/fontclock.font.json b/apps/fontclock/fontclock.font.json new file mode 100644 index 000000000..3f111ba1b --- /dev/null +++ b/apps/fontclock/fontclock.font.json @@ -0,0 +1,23 @@ +{ + "name": "Vector 4", + "numerals": [12,3,6,9], + "fonts": ["vector50"], + "radius": 75, + "color_schemes" : [ + { + "name": "black", + "background" : [0.0,0.0,0.0], + "second_hand": [1.0,0.0,0.0], + }, + { + "name": "red", + "background" : [1.0,0.0,0.0], + "second_hand": [1.0,1.0,0.0] + }, + { + "name": "grey", + "background" : [0.5,0.5,0.5], + "second_hand": [0.0,0.0,0.0] + } + ] +} \ No newline at end of file diff --git a/apps/fontclock/fontclock.font.mntn25.js b/apps/fontclock/fontclock.font.mntn25.js new file mode 100644 index 000000000..e7abac8bf --- /dev/null +++ b/apps/fontclock/fontclock.font.mntn25.js @@ -0,0 +1,76 @@ +var NumeralFont = require("fontclock.font.js"); + +const DIM_25x25 = [25,25]; +const DIM_10x25 = [10,25]; +const DIM_20x25 = [20,25]; +const DIM_31x25 = [31,25]; +const DIM_15x25 = [15,25]; + +class DigitNumeralFont extends NumeralFont{ + constructor(){ + super(); + // dimension map provides the dimensions of the character for + // each number for plotting and collision detection + + /*this.dimension_map = { + 0 : [25,25], + 1 : [10,25], + 2 : [15,25], + 3 : [15,25], + 4 : [15,25], + 5 : [15,25], + 6 : [20,25], + 7 : [15,25], + 8 : [20,25], + 9 : [20,25], + 10 : [31,25], + 11 : [20,25], + 12: [25,25] + };*/ + this.widths = atob("BgsVCw8PEBEUEBQUBw=="); + this.font = atob("AAAAAAAAAAAAp9bgAAAAAAAAAAAADr+vAAAAAAAAAAAAAOv68AAAAAAAAAAAAA6/rwAAAAAAAAAAAADr+fAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAXwAAAAAAAAAAAAXz//wAAAAAAAAAXz//7q+AAAAAAAXz//8q+//wAAAAXz//8q+//yr3wAXz//8q+//yr3//ZAL/8q+//yr3//ZMAAAW+//2q3//ZQAAAAAC/2q3//pQAAAAAAAAF3//pQAAAAAAAAAAAnpQAAAAAAAAAAAAAAAAABL3//tgQAAAAAAAAj//su9//0gAAAAAC7/vv///73/gAAAAB/8/9u7u7/+34AAAA78/r/////c/+9QAAf9/P/LvLu/+///AADu/++//+7/7Pv79QAv37+/sQAAb/7978AF/f3vwAAAAD+/v+4Aj9779QAAAADs+/vwCP3vv1AAAAAOz7+/AF/P3fsAAAAC+/v94AL9+/v5AAAD/9/f/QAP3+/8/9ze/7+/v2AAj9+//Lztu+/P//AAAP/f3P////6//fcAAAL/z/y7u7vv7PoAAAAD/+z////9z/oAAAAAAK//3LvO/+QAAAAAAAAH3///6zAAAAAAAAAAAAAAAAAAAAAAC96fQAAAAAAAAAAAAL769AAAAAAAAAAAAAvvr5ZmZmZmZmZmAAC++v//////////8AAL76/bu7u7u7u7uwAAvvr/7u7u7u7u7uAAC++v/u7u7u7u7u4AAL76/KqqqqqqqqqgAAvvr///////////AAAjQlVVVVVVVVVVUAAAAAAAAAAAAAAAAAAAhTAAAAAAAAAyUlAAD7+udQAAAAHfv68AAPv777AAAAX/+/rwAC+/y/kAAAn+77+vAAb8/q9gAB79//v68ACf7frzAF/9/t+/rwAH/d+/QK/u/P/7+vAAX8/t/u/f/P7Pv68AAvv7+uzv3vz/+/rwAA/P3///z/v/Pr+vAACPv9u67939EOv68AAA/6///7/3AA6/rwAAAv/Ku+/iAADr+fAAAACu//5gAAAAAAAAAAAAAAAAAAAAAAAAAAhTAAAAAAAAAAIrIAD7+udgAAAAGo379gAPr7/rAAAAAfv935AB+vvvcjMkFQ/Pv+sAT6/d9K/r+vDs+/3QB/zvvzr+v68Nz7+/AJ/d+/Ov6/rx3Pv78Ab779+I/N/PX8+/zwAvv8/P/5/v7/z7/+AA+/z+m/r7/Kv9/PkACvv7///8+//7398gAB/9/bvvzvy8/89wAABv++/93+nf/b+gAAAALv/e/9//3v+wAAAAAASd21AVrcogAAAAAAAAAAAb753JAAAAAAAAAALP/frusAAAAAAAAE3/zO+u6wAAAAAABe/7z/367rAAAAAAf/+9/7vvrusAAAAG/+rv+s/9+u6wAAAAra//rf+5367rAAAABv/q7/q//vrusAAAAK2v/5z/w1+u6wAAAAb/6d/7IAX67rAAAACsr/+AL//vru//4AAG/+YAAaqr+u7aqgAAnUAAAD///67v//AAAAAAAABVWPruxVUAAAAAAAAAACtphgAAAAAAAAAAAAAAAAAAAAA0U3d3d3d1AADMAAAL76//////0ACr9AAAvvr9zMzMyABd/vAAC++v7u7u7qAPz79QAL76//////wPz975AAvvr8rN7Oyw+vv+wAC++vQN37/ODs+/vgAL769A6/v9wN37+/AAvvr0Dq+/3Q/Pv78AC++vQN38/vv8+/3QAL769Ar8397+7/36AAvvr0Bfv8/s/7/PMAC++vQA77+9/a+fwAAL769ABP3f///f8gAAVnSRAAb/mrzP8wAAAAAAAAAC3///wQAAAAAAAAAAAAJiAAAAAAAAAAA2ZmZiAAAAAAAAAK7//////+YAAAAAA//Lu7u7up77AAAABP+//+7u7v/5/QAAAP7fyN///+y/+/cAAH+/n/2qqqvv7vzwAA/f3+r/////v8+/cAD7+/v82rye38/e6wBPv9zrn9388fv7/NAI/O+va+/Pzw3Pv68Aj93689z7/dDc+vrwBPv+v06/z90Pz7++AA+/3vnO/Pz+/PvuwAD7+/o4/O/56/38+QAN/v5QP8/f//7PzxAAP89QAL+f3czfj6AAAK9wAAH/v///z/EAAADQAAAC79q879EAAAAAAAAAAJ3//YAAAAAAAAAAAAAAAAAAAAAL3p9AAAAAAAAAAAAAvvr0AAAAAAAAAAAAC++vQAAAAAAAAAAAAL769AAAAAAAAFrgAAvvr0AAAAAFrv/9AAC++vQAAFvv/9u98AAL769Wvv/8u9//6gAArN7//8u+//67z/AACv/8u+//27z//roAAFu+//273//rvP/wAAv/273//rvP//xxAABb3//rvP//xxAAAAAL/rvP//thAAAAAAAAXP/+thAAAAAAAAAACutgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGt/qYCvv2kAAAAAAb/69/+/+vP/AAAAAT+z//q/8//6/8QAAP8/7u9/P+7z/v7AADv36//+/v///778gAfv7/Lr/7++3/vz6AG+/7+/9+/v//Pz+0Aj8789d77+/Ds+/zwCf3Pryvuv68N36+vAJ/c+vK+6/rwzfr68An9z68r7r+vDN+vrwCPzvz1v+z78ez6+/AE+/7//fzv3+/Pv98AD7+/ne+/v57e/e/QAO7v3//9/u/v+vr2AAT9/7u9+v68uvz/AAAM/O////v///z/EAAACv+6vP/+u6z/IAAAAATP//1H3//7IAAAAAAAABAAAAEAAAAAAAAABJkwAAAAAAAAAAAAr///+gAAAAEQAAAB783dvP0QAADNAAAA37/93/n8AAC79QAAT5/c/9358wBt/vAADu/v+8/+79Afz79QAPn7+//Pv58Pv975AD+f7/zP3fjw+vv+wAf7789T+/6vTs+/vgCf3fvyP8/789z7+/AG+++/SP7Pvw+fr74AL5/e+837+/X3+v3AAPv7+//d3d797/35AA3+7/vMzMzK75+/MAA/r97//////r/fwAAAz5/7uqqqqt/d8gAAAe/N//////6v9gAAAACv/bqqqr3/4gAAAAAAOM/////aUAAAAAAAAAAAAAAAAAAAAAAAAAAQEQABARAAAAAAAABvvuoF+u6wAAAAAAAG++6gX67rAAAAAAAAb77qBfrusAAAAAAABvvuoF+u6wAAAAAAAE16pwPXunAAAAAAAAAAAAAAAAAAAA=="); + var scale = 1; // size multiplier for this font + this.size = 25+(scale<<8)+(4<<16); + this.y_offset = 0; + + } + getDimensions(hour){ + //return this.dimension_map[hour]; + switch(hour){ + case 0: + case 12: + return DIM_25x25; + case 1: + return DIM_10x25; + case 6: + case 8: + case 9: + case 11: + return DIM_20x25; + case 10: + return DIM_31x25; + default: + return DIM_15x25; + } + } + hour_txt(hour){ return hour.toString(); } + draw(hour_txt,x,y){ + /* going to leave this in here for future testing. + uncomment this so that it draws a box behind the string + so we can guess the digit dimensions*/ + /*var dim = [30,25]; + g.setColor(0.5,0,0); + g.fillPoly([x,y, + x+dim[0],y, + x+dim[0],y+dim[1], + x,y+dim[1] + ]); + g.setColor(1.0,1.0,1.0);*/ + g.setFontAlign(-1.0,-1.0,0); + g.setFontCustom(this.font, 46, this.widths, this.size); + g.drawString(hour_txt,x,y+this.y_offset ); + } + getName(){return "Digit";} +} + +module.exports = [DigitNumeralFont]; \ No newline at end of file diff --git a/apps/fontclock/fontclock.font.mntn50.js b/apps/fontclock/fontclock.font.mntn50.js new file mode 100644 index 000000000..43b8aeb9b --- /dev/null +++ b/apps/fontclock/fontclock.font.mntn50.js @@ -0,0 +1,56 @@ +var NumeralFont = require("fontclock.font.js"); + +const DIM_30x47 = [30,47]; +const DIM_49x47 = [49,47]; +const DIM_37x47 = [37,47]; +class DigitNumeralFont extends NumeralFont{ + constructor(){ + super(); + // dimension map provides the dimensions of the character for + // each number for plotting and collision detection + + /*this.dimension_map = { + 3 : [30,47], + 6 : [37,47], + 9 : [37,47], + 12: [49,47] + };*/ + this.widths = atob("DRYqFR0fHyMnICgnDQ=="); + this.font = atob("AAAAAAAAAAAAAAAAAAAAAAAAAAAAAChkoAAAAAAAAAAAAAvP7wAAAAAAAAAAAAC8/vAAAAAAAAAAAAALz+8AAAAAAAAAAAAAvP7wAAAAAAAAAAAAC8/vAAAAAAAAAAAAALz+8AAAAAAAAAAAAAvP7wAAAAAAAAAAAAC8/vAAAAAAAAAAAAALz+8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAH/AAAAAAAAAAAAAB//8AAAAAAAAAAAAf///gAAAAAAAAAAH///5LAAAAAAAAAB///+S/8AAAAAAAAf///kv//wAAAAAAH///5L///4AAAAAB///+S///+G8AAAAf///kv///hv/wAAH///5L///4b///AAP//+S///+G///5AAA//kv///hv//+QAAAD5L///4b///kAAAAAC///+G///5AAAAAAA///hv//+QAAAAAAAD/4b///kAAAAAAAAAKG///5AAAAAAAAAAAv//+QAAAAAAAAAAAD//kAAAAAAAAAAAAAP5AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVAAAAAAAAAAAAAC////4AAAAAAAAAAL//////gAAAAAAAAP//6Vr//8AAAAAAAH/9Gv/pH/9AAAAAAD/4v////4v/AAAAAA/8///////P/AAAAAP9v/4BUC//n/AAAAD/f/m///+b/3/AAAAv3/n/////2/3+AAAH9/3//+r//9/39AAA/v9/+G/+S/9/78AAD9/f+f///9v9/fwAAvf3/f/////f9/fgAD9/vz/4AAv/P78/AAf/39/0AAAH/f3/9AC9/f78AAAAD+/f34ALz+9/QAAAAH9+/PgA/Pvz8AAAAAPz+8/AD99/PgAAAAAvP338AP739+AAAAAC9/ffwA/ff34AAAAAL399/AD8+/PwAAAAA/P7z8APz/9/AAAAAD9//PgAvf37/AAAAA//39+AB+/Pz/AAAAP8/P70AD9/v3/wAAP/f79/AAP39/3/////3/f38AAf79/2////5/3+/QAA/f9/9r//p/9/78AAB/f9//5Rb//f9/QAAD/f9v/////n/f8AAAD/f/b////n/3/AAAAD/f/4WqlL/9/wAAAAH/X//////9f9AAAAAH/1/////9f/QAAAAAC/+H///0v/gAAAAAAB//+QAb//0AAAAAAAAf//////0AAAAAAAAAB/////QAAAAAAAAAAAAa6QAAAAAAAAAAAAAAAAAAAAAAAAClopAAAAAAAAAAAAAPvz4AAAAAAAAAAAAA+/PgAAAAAAAAAAAAD78+AAAAAAAAAAAAAPvz4AAAAAAAAAAAAA+/PgAAAAAAAAAAAAD78///////////wAAPvz///////////AAA+/P6qqqqqqqqqoAAD78///////////gAAPvz///////////AAA+/P//////////8AAD78+AAAAAAAAAAAAAPvz///////////AAA+/P//////////8AAD78/qqqqqqqqqqgAAPvz//////////+AAA+/P//////////8AAD68///////////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHgAAAAAAAAAAAAAAA/PQAAAAAAAG8+vAAD9+/ZAAAAAC/z+8AAP/3+9AAAAA//P7wAB+/PvwAAAAf/8/vAAL3+9/AAAAL/bz+8AA/P/z8AAAD/r/P7wAD9+/PgAAB/7/8/vAAP379+AAAv+//z+8AA/vf30AAP+/9vP7wAD+9/vQAH/v+v8/vAAP7399AD/7/f/z+8AA/fv30A/7/3//P7wAD9+/Pgv+/7/28/vAALz+9/v/v9/9/z+8AAvP3+//v/v+v/P7wAB+/f3/7/v/f/8/vAAD+/v4H/3/3/bz+8AAP39///7/2/0vP7wAAf79v/9/9/8C8/vAAA/f9G5/+v+ALz+8AAC/f/7//f/QAvP7wAAD/P///r/wAC8/vAAAH/n//n/0AALz+8AAAH/5Ab/8AAAvP7wAAAH////9AAAB8tfAAAAC///9AAAAAAAAAAAAAK/kAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAALyQAAAAAAAAABj4AA/P7gAAAAAAAu/PwAD9+/fQAAAAH3+9/AAP73+8AAAAAfv378AB+/PvwAAAAA//P70AL3+9/AAAAAD+9/fgA/P7z8KWiloPz78+AD8+/Pg/vP7wvP/z8APz78+D+8/vC8/vPwA/fv34P7z+8L3+8/AD99/fQ/vP7wvf738AP3399D+8/vB9/ffwA/ff30P7z+8H3+9/AD9+/fg/vf30vP738APz/8/D9+/Pj8+/PwA/P77//z/9//778+AC+/f3//f3+/9/f74AD+/v3/+/v6/f7+/AAPz9/5b9/f+b/fz8AAv79////+v//3+/gAA/f9///3/f/9/38AAC/f+RR/3/Rlv9/gAAD/f////3////f8AAAD/b////3///3/AAAAH/2//X/5//n/0AAAAD/+lr///lb/8AAAAAC////9////+AAAAAAAv//9Af//+AAAAAAAABaQAAAaQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB7z58AAAAAAAAAAAB//P7wAAAAAAAAAAC//8/vAAAAAAAAAAC//rz+8AAAAAAAAAD//X/P7wAAAAAAAAH//X/8/vAAAAAAAAH//b//z+8AAAAAAAH//L/+vP7wAAAAAAL/+P/9f8/vAAAAAAL/+f/9f/z+8AAAAAL/9f/8v//P7wAAAAD/9f/4v/68/vAAAAAP9v/4//4vz+8AAAAA8v/5//0v/P7wAAAAAv/1//1//8/vAAAAAP/1//x///z+8AAAAA/y//i//wvP7wAAAADi//i//gC8/vAAAAAD//X//gALz+8AAAAA//X//QAAvP7wAAAAD/L//Af//8/vv/gAAOL/+AC///z+///AAAP/+AAH///P7//8AAD/9AAAAAC8/vAAAAAP9AAAB///z+///AAA4AAAAL///P7//8AAAAAAAAKqr8/vaqgAAAAAAAAAALz+8AAAAAAAAAAAAAvPrwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFAAAAAAAAAAAAAAAA8AAAD14//////0AAL8AAAPvz//////gACf8AAA+/P/////+AAvfwAAD78+AAAAAAAD/vwAAPvz//////gA39/AAA+/P/////+AP3++AAD78/qqqqqgA/fz8AAPvz//////Qt/vvwAA+/P/////+D78/vQAD78//////4P739+AAPvz4A9ufPQ/Pvz8AA+/PgH3+9+C8+vPwAD78+Avf/z0L3+9/AAPvz4C8//fAff338AA+/PgLz7+8B9/vfwAD78+AvPv7wL3+9/AAPvz4D8+/fg/P/z8AA+/PgLz+8/D9+/PwAD78+AvP77///39+AAPvz4B+/P3/9/v/wAA+/PgD9+/3/f39/AAD78+AP38/0L/f78AAPvz4Av79///39/QAA+/PgA/f8//9//8AAD78+AB/f9L5f9/QAAPvz4AD/f/6//f8AAA+/PgAD/P///3/AAAD289AAH/j//y/wAAAAAAAAAH/9AH/8AAAAAAAAAAD////+AAAAAAAAAAAB///+AAAAAAAAAAAAAGvpAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAa////6QAAAAAAAAB///////+AAAAAAAB/////////gAAAAAA//kAAAABv/0AAAAAP/X//////n/0AAAAD/b///////6/0AAAA/3//6qqqv/9/wAAAL9/9a////kv9/wAAB/P+v//////P9/QAAP6/f///////P+/AAA/P3/5AAAAf/fz8AAP3+/2/////3/v74AA/f79//////79/fwAD/+/f/6qqr/3++/AAvf39/Pz799//3+9AD8/vfw/vf/w/fv38APz/8/D/9+/D8+/PwA/fvz4ff734L3/9/AD99/fS8//fQff738AP3399Lz799B9/ffwA/ff30vPv7wH3+9/AD9+/Pj8+/vQvP7z8APz68+Lz79+D8+/PwA/P338vP7z8f779+AB+/f/x+/f//+/f70AD+9/fD+9/f/7/+/AAP3+/QP3+/b2/f38AA/fz8Av/3///7//gAB/v3QA/f3///v38AAD9/gAC/v2//b+/gAAH9+AAD+/+AL/r8AAAP+wAAH+v///6/QAAAP0AAAP/f//9/4AAAAfQAAAP/lvlv+AAAAAkAAAAL//r//QAAAAAAAAAAD////wAAAAAAAAAAAAv//gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPrz4AAAAAAAAAAAAA+/PgAAAAAAAAAAAAD78+AAAAAAAAAAAAAPvz4AAAAAAAAAAAAA+/PgAAAAAAAAAAAAD78+AAAAAAAAAAAAAPvz4AAAAAAAAAGAAA+/PgAAAAAAAB/8AAD78+AAAAAAAv//wAAPvz4AAAAAL///4AAA+/PgAAAC///+G8AAD78+AAAv///hv/wAAPvz4AL///4b///AAA+/Pm///+G///9EAAD79////Rv//+R/wAAPr///0f///kv//AAA///9H///5L///4AAD//R///+S///+GwAAPkf///kv///hv/AAAL///5L///4b//8AAD//+W///+G///9AAAP/hv///Rv//+QAAAAob///0f///kAAAAAC///9H///5AAAAAAAP//R///+QAAAAAAAA/kf///kAAAAAAAAAAL///5AAAAAAAAAAAP//+QAAAAAAAAAAAA//kAAAAAAAAAAAAAD4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAf//0AL//9AAAAAAAf///+L////QAAAAAP/+r////r//wAAAAD/0v5f/4r6b/wAAAA/6///n////1/wAAAP9////3////9/gAAC/f/gG/3/kB/9/AAAP7/b/9/3//+f+/AAC/f3//9/v///f79AAP39/+/9/f///f38AA/v/9uf+/v/n+/vwAL79/f/v38//38/vQA/P77//f7z///78/AD8//Pz9/vfw/Prz8AP379+H79+/D8/vfwA/vf30Pvz68L399/AD+9/fQ+/Prwff378AP7399D78+vB9/fvwA/vf30Pvz68H39+/AD+9/fQ+/Prwff378AP7399D78+vB9/fvwA/vf30Pvz+8H39+/AD9+/fg/vP7wvf338APz/8/D+8/vT8/vfwA/P77/v339//378/AC9/f7//P77/+/f34AH++/r/9/f3/r9/vQAP39/0H++v4D/f38AA/v+///39///+/fwAA/f9///39//+v39AAD/v9b5/v+b+P+/wAAD/f/6//v/6//r8AAAH/f////7///2/gAAAL/X//3/3//5/4AAAAH/5FC//9BB/+AAAAAH//////////QAAAAAB////A////QAAAAAAAK/5AAG/5QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAf//QAAAAAAAAAAAAv///4AAAAAAAAAAAf////9AAAABQAAAAH/0aR/9AAAAPQAAAB/2//+v9AAAC/AAAAf9////f8AAA3/AAAD/f/Qf/f4AAL38AAAv3/P/n/fwAAv78AAD+/r//3/fwAd/fwAAv7+///7+/AD9/vgAD9/f8pv3+/Af39/AAP7//v//v38Lf778AB+/f3/9/f/w//P70AL3++/r+9/vT99/fgA/P7z8Pz79+Pz78/AD9+/Pgvf/z4vPrz8AP3799B9/vPi9/vfwA/vf30D7+8+H399/AD9+/fQff/z4ff338AP3799C8+/fS8/vfwA/P7z4P73+8Pz/8/AD8/vfw//fvw/fvz8AL39//n3+8/P79/fgAP/39/6VVVv/f7/8AA/f7+//////3+/fwAD+/f9/////9/79/AAH9/f+FVVVRv9/P0AAP3+f///////f9/AAAf3/f//////7/P0AAA/3/W////+j/3/AAAA/7/+lVVVr/9/wAAAB/3///////+f9AAAAB/9//////+L/QAAAAB//QVVVVQv/wAAAAAA/////////4AAAAAAAf///////4AAAAAAAABv////+gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB89fAHz18AAAAAAAAPz78AvP7wAAAAAAAA/PvwC8/vAAAAAAAAD8+/ALz+8AAAAAAAAPz78AvP7wAAAAAAAA/PvwC8/vAAAAAAAAD8+/ALz+8AAAAAAAAPz78AvP7wAAAAAAAA/PvwC8/vAAAAAAAAC8+vALz68AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=="); + var scale = 1; // size multiplier for this font + this.size = 50+(scale<<8)+(2<<16); + this.y_offset = -2; + + } + getDimensions(hour){ + switch(hour){ + case 3: + return DIM_30x47; + case 12: + return DIM_49x47; + default: + return DIM_37x47; + } + //return this.dimension_map[hour]; + } + hour_txt(hour){ return hour.toString(); } + draw(hour_txt,x,y){ + /* going to leave this in here for future testing. + uncomment this so that it draws a box behind the string + so we can guess the digit dimensions + var dim = [37,47]; + g.setColor(0.5,0,0); + g.fillPoly([x,y, + x+dim[0],y, + x+dim[0],y+dim[1], + x,y+dim[1] + ]); + g.setColor(1.0,1.0,1.0);*/ + g.setFontAlign(-1.0,-1.0,0); + g.setFontCustom(this.font, 46, this.widths, this.size); + g.drawString(hour_txt,x,y+this.y_offset ); + } + getName(){return "Digit";} +} + +module.exports = [DigitNumeralFont]; \ No newline at end of file diff --git a/apps/fontclock/fontclock.font.vector25.js b/apps/fontclock/fontclock.font.vector25.js new file mode 100644 index 000000000..0c66b1d07 --- /dev/null +++ b/apps/fontclock/fontclock.font.vector25.js @@ -0,0 +1,55 @@ +var NumeralFont = require("fontclock.font.js"); + +const DIM_14x22 = [14,22]; +const DIM_27x22 = [27,22]; +class DigitNumeralFont extends NumeralFont{ + constructor(){ + super(); + // dimension map provides the dimesions of the character for + // each number for plotting and collision detection + /*this.dimension_map = { + 1 : [14,22], + 2 : [14,22], + 3 : [14,22], + 4 : [14,22], + 5 : [14,22], + 6 : [14,22], + 7 : [14,22], + 8 : [14,22], + 9 : [14,22], + 10: [27,22], + 11: [27,22], + 12: [27,22] + };*/ + } + getDimensions(hour){ + if (hour < 10){ + return DIM_14x22; + } else { + return DIM_27x22; + } + } + hour_txt(hour){ return hour.toString(); } + draw(hour_txt,x,y){ + if(hour_txt == null) + return; + + /* going to leave this in here for future testing. + uncomment this so that it draws a box behind the string + so we can guess the digit dimensions + var dim = [14,22]; + g.setColor(0.5,0,0); + g.fillPoly([x,y, + x+dim[0],y, + x+dim[0],y+dim[1], + x,y+dim[1] + ]); + g.setColor(1.0,1.0,1.0);*/ + g.setFontAlign(-1,-1,0); + g.setFont("Vector",25); + g.drawString(hour_txt,x,y); + } + getName(){return "Digit";} +} + +module.exports = [DigitNumeralFont]; \ No newline at end of file diff --git a/apps/fontclock/fontclock.font.vector50.js b/apps/fontclock/fontclock.font.vector50.js new file mode 100644 index 000000000..85466958f --- /dev/null +++ b/apps/fontclock/fontclock.font.vector50.js @@ -0,0 +1,42 @@ +var NumeralFont = require("fontclock.font.js"); + +const DIM_28x44 = [28,44]; +const DIM_54x44 = [54,44]; + +class DigitNumeralFont extends NumeralFont{ + constructor(){ + super(); + // dimension map provides the dimesions of the character for + // each number for plotting and collision detection + } + getDimensions(hour){ + if (hour < 10){ + return DIM_28x44; + } else { + return DIM_54x44; + } + } + hour_txt(hour){ return hour.toString(); } + draw(hour_txt,x,y){ + if(hour_txt == null) + return; + + /* going to leave this in here for future testing. + uncomment this so that it draws a box behind the string + so we can guess the digit dimensions + var dim = [14,22]; + g.setColor(0.5,0,0); + g.fillPoly([x,y, + x+dim[0],y, + x+dim[0],y+dim[1], + x,y+dim[1] + ]); + g.setColor(1.0,1.0,1.0);*/ + g.setFontAlign(-1,-1,0); + g.setFont("Vector",50); + g.drawString(hour_txt,x,y); + } + getName(){return "Digit";} +} + +module.exports = [DigitNumeralFont]; \ No newline at end of file diff --git a/apps/fontclock/fontclock.hand.js b/apps/fontclock/fontclock.hand.js new file mode 100644 index 000000000..c5ab2e769 --- /dev/null +++ b/apps/fontclock/fontclock.hand.js @@ -0,0 +1,10 @@ +class Hand { + /** + * Pure virtual class for all Hand classes to extend. + * a hand class will have 1 main function + * moveTo which will move the hand to the given angle. + */ + moveTo(angle){} +} + +module.exports = Hand; \ No newline at end of file diff --git a/apps/fontclock/fontclock.hourscriber.js b/apps/fontclock/fontclock.hourscriber.js new file mode 100644 index 000000000..38f960da3 --- /dev/null +++ b/apps/fontclock/fontclock.hourscriber.js @@ -0,0 +1,137 @@ + +const TWO_PI = 2* Math.PI; + +// The problem with the trig inverse functions on +// a full circle is that the sector information will be lost +// Choosing to use arcsin because you can get back the +// sector with the help of the original coordinates +function reifyasin(x,y,asin_angle){ + if(x >= 0 && y >= 0){ + return asin_angle; + } else if(x >= 0 && y < 0){ + return Math.PI - asin_angle; + } else if(x < 0 && y < 0){ + return Math.PI - asin_angle; + } else { + return TWO_PI + asin_angle; + } +} + +// rebase and angle so be between -pi and pi +// rather than 0 to 2PI +function rebaseNegative(angle){ + if(angle > Math.PI){ + return angle - TWO_PI; + } else { + return angle; + } +} + +// rebase an angle so that it is between 0 to 2pi +// rather than -pi to pi +function rebasePositive(angle){ + if(angle < 0){ + return angle + TWO_PI; + } else { + return angle; + } +} + +/** + * The Hour Scriber is responsible for drawing the numeral + * on the screen at the requested angle. + * It allows for the font to be changed on the fly. + */ +class HourScriber { + constructor(radius, numeral_font, draw_test, bg_colour_supplier, numeral_colour_supplier, hour){ + this.radius = radius; + this.numeral_font = numeral_font; + this.draw_test = draw_test; + this.curr_numeral_font = numeral_font; + this.bg_colour_supplier = bg_colour_supplier; + this.numeral_colour_supplier = numeral_colour_supplier; + this.hours = hour; + this.curr_hour_x = -1; + this.curr_hour_y = -1; + this.curr_hours = -1; + this.curr_hour_str = null; + this.last_draw_time = null; + } + setNumeralFont(numeral_font){ + this.numeral_font = numeral_font; + } + toString(){ + return "HourScriber{numeralfont=" + this.numeral_font.getName() + ",hours=" + this.hours + "}"; + } + draw(){ + var changed = false; + if(this.curr_hours != this.hours || this.curr_numeral_font !=this.numeral_font){ + var background = this.bg_colour_supplier(); + g.setColor(background[0],background[1],background[2]); + this.curr_numeral_font.draw(this.curr_hour_str, + this.curr_hour_x, + this.curr_hour_y); + //console.log("erasing old hour"); + var hours_frac = this.hours / 12; + var angle = TWO_PI*hours_frac; + var dimensions = this.numeral_font.getDimensions(this.hours); + // we set the radial coord to be in the middle + // of the drawn text. + var width = dimensions[0]; + var height = dimensions[1]; + var delta_center_x = this.radius*Math.sin(angle) - width/2; + var delta_center_y = this.radius*Math.cos(angle) + height/2; + this.curr_hour_x = screen_center_x + delta_center_x; + this.curr_hour_y = screen_center_y - delta_center_y; + this.curr_hour_str = this.numeral_font.hour_txt(this.hours); + // now work out the angle of the beginning and the end of the + // text box so we know when to redraw + // bottom left angle + var x1 = delta_center_x; + var y1 = delta_center_y; + var r1 = Math.sqrt(x1*x1 + y1*y1); + var angle1 = reifyasin(x1,y1,Math.asin(x1/r1)); + // bottom right angle + var x2 = delta_center_x; + var y2 = delta_center_y - height; + var r2 = Math.sqrt(x2*x2 + y2*y2); + var angle2 = reifyasin(x2,y2,Math.asin(x2/r2)); + // top left angle + var x3 = delta_center_x + width; + var y3 = delta_center_y; + var r3 = Math.sqrt(x3*x3 + y3*y3); + var angle3 = reifyasin(x3,y3, Math.asin(x3/r3)); + // top right angle + var x4 = delta_center_x + width; + var y4 = delta_center_y - height; + var r4 = Math.sqrt(x4*x4 + y4*y4); + var angle4 = reifyasin(x4,y4,Math.asin(x4/r4)); + if(Math.min(angle1,angle2,angle3,angle4) < Math.PI && Math.max(angle1,angle2,angle3,angle4) > 1.5*Math.PI){ + angle1 = rebaseNegative(angle1); + angle2 = rebaseNegative(angle2); + angle3 = rebaseNegative(angle3); + angle3 = rebaseNegative(angle4); + this.angle_from = rebasePositive( Math.min(angle1,angle2,angle3,angle4) ); + this.angle_to = rebasePositive( Math.max(angle1,angle2,angle3,angle4) ); + } else { + this.angle_from = Math.min(angle1,angle2,angle3,angle4); + this.angle_to = Math.max(angle1,angle2,angle3,angle4); + } + //console.log(angle1 + "/" + angle2 + " / " + angle3 + " / " + angle4); + //console.log( this.angle_from + " to " + this.angle_to); + this.curr_hours = this.hours; + this.curr_numeral_font = this.numeral_font; + changed = true; + } + if(changed || + this.draw_test(this.angle_from, this.angle_to, this.last_draw_time) ){ + var numeral_color = this.numeral_colour_supplier(); + g.setColor(numeral_color[0],numeral_color[1],numeral_color[2]); + this.numeral_font.draw(this.curr_hour_str,this.curr_hour_x,this.curr_hour_y); + this.last_draw_time = new Date(); + //console.log("redraw digit:" + this.hours); + } + } +} + +module.exports = HourScriber; \ No newline at end of file diff --git a/apps/fontclock/fontclock.js b/apps/fontclock/fontclock.js new file mode 100644 index 000000000..25260c42c --- /dev/null +++ b/apps/fontclock/fontclock.js @@ -0,0 +1,432 @@ +/** +* Adrian Kirk 2021-03 +* Simple Clock showing 1 numeral for the hour +* with a smooth sweep second. +*/ + +var ThinHand = require("fontclock.thinhand.js"); +var ThickHand = require("fontclock.thickhand.js"); +var HourScriber = require("fontclock.hourscriber.js"); + +const screen_center_x = g.getWidth()/2; +const screen_center_y = 10 + (g.getHeight()+10)/2; +const TWO_PI = 2* Math.PI; + + +SETTING_PREFIX = "fontclock"; +// load the date formats and languages required +const FONTS_FILE = SETTING_PREFIX +".font.json"; +const DEFAULT_FONTS = [ "cpstc58" ]; +const DEFAULT_NUMERALS = [12,3,6,9]; +const DEFAULT_RADIUS = 70; +var color_schemes = [ + { + name: "black", + background : [0.0,0.0,0.0], + } +]; +var fonts = DEFAULT_NUMERALS; +var numerals = DEFAULT_NUMERALS; +var radius = DEFAULT_RADIUS; +try{ + var fonts_info = require("Storage").readJSON(FONTS_FILE); + if(fonts_info != null){ + console.log("loaded font:" + JSON.stringify(fonts_info)); + fonts = fonts_info.fonts; + numerals = fonts_info.numerals; + radius = fonts_info.radius; + color_schemes = fonts_info.color_schemes; + } else { + fonts = DEFAULT_FONTS; + numerals = DEFAULT_NUMERALS; + radius = DEFAULT_RADIUS; + console.log("no fonts loaded defaulting to:" + fonts); + } +} catch(e){ + console.log("failed to load fonts:" + e); +} +if(fonts == null || fonts.length == 0){ + fonts = DEFAULT_FONTS; + console.log("defaulting fonts to locale:" + fonts); +} + +let color_scheme_index = 0; + +// The force draw is set to true to force all objects to redraw themselves +let force_redraw = true; +let bg_colour_supplier = ()=>color_schemes[color_scheme_index].background; +var WHITE = [1.0,1.0,1.0]; +function default_white(color){ + if(color == null){ + return WHITE + } else { + return color; + } +} + +// The seconds hand is the main focus and is set to redraw on every cycle +let seconds_hand = new ThinHand(screen_center_x, + screen_center_y, + 95, + 0, + (angle, last_draw_time) => false, + bg_colour_supplier, + ()=>default_white(color_schemes[color_scheme_index].second_hand)); + +// The minute hand is set to redraw at a 250th of a circle, +// when the second hand is ontop or slighly overtaking +// or when a force_redraw is called +const minute_hand_angle_tolerance = TWO_PI/25 +let minutes_hand_redraw = function(angle, last_draw_time){ + return force_redraw || (seconds_hand.angle > angle && + Math.abs(seconds_hand.angle - angle) < minute_hand_angle_tolerance && + new Date().getTime() - last_draw_time.getTime() > 500); +}; + +let minutes_hand = new ThinHand(screen_center_x, + screen_center_y, + 80, minute_hand_angle_tolerance, + minutes_hand_redraw, + bg_colour_supplier, + ()=>default_white(color_schemes[color_scheme_index].minute_hand)); +// The hour hand is a thick hand so we have to redraw when the minute hand +// overlaps from its behind angle coverage to its ahead angle coverage. +let hour_hand_redraw = function(angle_from, angle_to, last_draw_time){ + return force_redraw || (seconds_hand.angle >= angle_from && + seconds_hand.angle <= angle_to && + new Date().getTime() - last_draw_time.getTime() > 500); +}; +let hours_hand = new ThickHand(screen_center_x, + screen_center_y, + 40, + TWO_PI/600, + hour_hand_redraw, + bg_colour_supplier, + () => default_white(color_schemes[color_scheme_index].hour_hand), + 5, + 4); + +function draw_clock(){ + var date = new Date(); + draw_background(); + draw_hour_digits(); + draw_seconds(date); + draw_mins(date); + draw_hours(date); + force_redraw = false; +} +// drawing the second the millisecond as we need the fine gradation +// for the sweep second hand. +function draw_seconds(date){ + var seconds = date.getSeconds() + date.getMilliseconds()/1000; + var seconds_frac = seconds / 60; + var seconds_angle = TWO_PI*seconds_frac; + seconds_hand.moveTo(seconds_angle); +} +// drawing the minute includes the second and millisec to make the +// movement as continuous as possible. +function draw_mins(date,seconds_angle){ + var mins = date.getMinutes() + date.getSeconds()/60 + date.getMilliseconds()/(60*1000); + var mins_frac = mins / 60; + var mins_angle = TWO_PI*mins_frac; + var redraw = minutes_hand.moveTo(mins_angle); + if(redraw){ + //console.log("redraw mins"); + } +} + +function draw_hours(date){ + var hours = (date.getHours() % 12) + date.getMinutes()/60 + date.getSeconds()/3600; + var hours_frac = hours / 12; + var hours_angle = TWO_PI*hours_frac; + var redraw = hours_hand.moveTo(hours_angle); + if(redraw){ + //console.log("redraw hours"); + } +} + + + +let numeral_fonts = []; +for(var i=0; i< fonts.length; i++) { + var file = SETTING_PREFIX +".font." + fonts[i] + ".js" + console.log("loading font set:" + fonts[i] + "->" + file); + var loaded_fonts = require(file); + for (var j = 0; j < loaded_fonts[j]; j++) { + var loaded_font = new loaded_fonts[j]; + numeral_fonts.push(loaded_font); + console.log("loaded font name:" + loaded_font.getName()) + } +} + +let numeral_fonts_index = 0; +const ONE_POINT_FIVE_PI = 1.5*Math.PI; +/** +* predicate for deciding when the digit has to be redrawn +*/ +let hour_numeral_redraw = function(angle_from, angle_to, last_draw_time){ + var seconds_hand_angle = seconds_hand.angle; + // we have to cope with the 12 problem where the + // left side of the box has a value almost 2PI and the right + // side has a small positive value. The values are rebased so + // that they can be compared + if(angle_from > angle_to && angle_from > ONE_POINT_FIVE_PI){ + angle_from = angle_from - TWO_PI; + if(seconds_hand_angle > Math.PI) + seconds_hand_angle = seconds_hand_angle - TWO_PI; + } + //console.log("initial:" + angle_from + "/" + angle_to + " seconds " + seconds_hand_angle); + var redraw = force_redraw || + (seconds_hand_angle >= angle_from && seconds_hand_angle <= angle_to && seconds_hand.last_draw_time.getTime() > last_draw_time.getTime()) || + (minutes_hand.last_draw_time.getTime() > last_draw_time.getTime()); + if(redraw){ + //console.log(angle_from + "/" + angle_to + " seconds " + seconds_hand_angle); + } + return redraw; +}; + +// now add the numbers to the clock face +var numeral_colour_supplier = () => default_white(color_schemes[color_scheme_index].numeral); +var hour_scribers = []; +console.log("numerals:" + numerals + " length:" + numerals.length) +console.log("radius:" + radius) +for(var digit_idx=0; digit_idx