// Icon bits, thanks to tinydraw /* eslint-disable no-unused-vars */ /* We have functions we expect user to call from command line, so they * appear "unused" to lint */ // font, draw, icon let mode; let pen = 'pixel'; let discard = null; let kule = [0, 0, 0]; // R, G, B var font_height = 22, font_width = 8; var zoom_x = 64, zoom_y = 24, zoom_f = 6; var color = true; let oldLock = false; let sg = null; const top_bar = 20; function clear(m) { sg.setColor(1,1,1).fillRect(0,0, font_width, font_height); } function __setup(m) { mode = m; switch (m) { case 'font': font_height = 22; font_width = 8; zoom_x = 64; zoom_y = 24; zoom_f = 6; break; case 'draw': return; case 'icon': font_height = 48; font_width = 48; zoom_x = 56; zoom_y = 24; zoom_f = 2; break; } } function setup(m) { __setup(m); sg = Graphics.createArrayBuffer(font_width, font_height, 8, {}); clear(); } function icon_big() { zoom_x = 16; zoom_y = 25; zoom_f = 3; } function icon_small() { __setup("icon"); } function updateLock() { if (oldLock) { return; } g.setColor('#fff'); g.fillRect(0, 0, g.getWidth(), 20); g.setFont('Vector', 22); g.setColor('#000'); g.drawString('PLEASE\nUNLOCK', 10, 2); oldLock = true; } Bangle.on("lock", function() { if (Bangle.isLocked()) { updateLock(); } else { oldLock = false; drawUtil(); } }); function nextColor() { kule[0] = Math.random(); kule[1] = Math.random(); kule[2] = Math.random(); } function selectColor(x) { if (color) { let i = Math.floor((x - 32) / 4); kule = toColor(i); return; } let c = 255; if (x < g.getWidth()/2) { c = 0; } kule[0] = c; kule[1] = c; kule[2] = c; } function nextPen () { switch (pen) { case 'circle': pen = 'pixel'; break; case 'pixel': pen = 'line'; break; case 'line': pen = 'square'; break; case 'square': pen = 'circle'; break; default: pen = 'pixel'; break; } drawUtil(); discard = setTimeout(function () { oldX = -1; oldY = -1; console.log('timeout'); discard = null; }, 500); } var oldX = -1, oldY = -1; var line_from = null; function drawBrushIcon () { const w = g.getWidth(); switch (pen) { case 'circle': g.fillCircle(w - 10, 10, 5); break; case 'square': g.fillRect(w - 5, 5, w - 15, 15); break; case 'pixel': g.setPixel(10, 10); g.fillCircle(w - 10, 10, 2); break; case 'crayon': g.drawLine(w - 10, 5, w - 10, 15); g.drawLine(w - 14, 6, w - 10, 12); g.drawLine(w - 6, 6, w - 10, 12); break; case 'line': g.drawLine(w - 5, 5, w - 15, 15); break; } } function drawArea() { g.clear(); if (mode == "draw") return; const w = g.getWidth; g.setColor(0, 0, 0.5); g.fillRect(0, 0, g.getWidth(), g.getHeight()); g.setColor(1, 1, 1); g.fillRect(zoom_x, zoom_y, zoom_x+8*zoom_f, zoom_y+font_height*zoom_f); g.setColor(1, 1, 0.75); for (let y=0; y g.getWidth() - 32 && tap.y < top_bar) { if (tap.b === 1) { if (tapTimer === null) { tapTimer = setTimeout(function () { g.clear(); drawUtil(); oldX = -1; oldY = -1; tapTimer = null; }, 800); } if (discard) { clearTimeout(discard); discard = null; return; } nextPen(); } drawUtil(); return; } else if (tap.y < top_bar) { if (mode == "draw") nextColor(); else selectColor(tap.x); drawUtil(); return; } sg.setColor(kule[0], kule[1], kule[2]); g.setColor(kule[0], kule[1], kule[2]); oldX = to.x; oldY = to.y; if (pen != "line") { do_draw(from, to); } else { if (tap.b == 1) { print(line_from); if (!line_from) { line_from = to; } else { do_draw(line_from, to); line_from = null; } } } drawUtil(); } function dump(n) { function f(i) { return "\\x" + i.toString(16).padStart(2, '0'); } let s = f(0) + f(font_width) + f(font_height) + f(1); // 0..black, 65535..white for (let y = 0; y < font_height; y++) { let v = 0; for (let x = 0; x < font_width; x++) { let p = sg.getPixel(x, y); v = v << 1 | (p==0); } s += f(v); } if (mode == "font") print('show_font("' + s + '");'); var im = sg.asImage("string"); //print('show_unc_icon("'+btoa(im)+'");'); print('show_icon("'+btoa(require('heatshrink').compress(im))+'");'); } setup("icon"); drawArea(); Bangle.setUI({ "mode": "custom", "drag": on_drag, "btn": dump, }); drawUtil(); function show_font(icon) { g.reset().clear(); g.setFont("Vector", 26).drawString("Hellord" + icon, 0, 0); } function show_bin_icon(icon) { g.reset().clear(); g.drawImage(icon, 40, 40); } function show_unc_icon(icon) { show_bin_icon(atob(icon)); } function show_icon(icon) { let unc = require("heatshrink").decompress(atob(icon)); show_bin_icon(unc); } function load_bin_icon(i) { sg.reset().clear(); sg.drawImage(i, 0, 0); drawArea(); } function load_icon(icon) { let unc = require("heatshrink").decompress(atob(icon)); load_bin_icon(unc); } function for_screen() { g.reset().clear(); icon_big(); update(); }