ref: ee5d653d61460a31666dc0bf8c9b011832a0e431
parent: 0cd1f6455c02fe0c2ade3e630debb315f054b253
author: jmq <jmq@jmq.sh>
date: Thu Apr 10 01:56:01 EDT 2025
start pill
--- a/main.c
+++ b/main.c
@@ -412,6 +412,7 @@
static void
handlekeyboard(int kbdc)
{+ // bindings.c:/^runbindings/
runbindings(BKeyboard, CurrentKeyboard = kbdc);
}
--- /dev/null
+++ b/pill/mkfile
@@ -1,0 +1,9 @@
+< /$objtype/mkfile
+
+TARG=pill
+OFILES= \
+ pill.$O
+
+BIN=$home/bin/$objtype
+
+< /sys/src/cmd/mkone
--- /dev/null
+++ b/pill/pill.c
@@ -1,0 +1,175 @@
+#include <u.h>
+#include <libc.h>
+#include <draw.h>
+#include <event.h>
+
+#define STEPS 3600
+#define RADIUS .95
+#define MIN(a, b) ((a) < (b) ? (a) : (b))
+#define RAD2DEG(r_) ((180.0)/PI * (r_))
+#define DEG2RAD(r_) (PI/(180.0) * (r_))
+#define BACKGROUNDCOLOR 0x22272EFF
+#define RECTANGLE(w, h) ((Rectangle){(Point){(0),(0)}, (Point){(w),(h)}})+
+Image * Circle = nil;
+uint CircleBPL = 0;
+u32int * RawCircle = nil;
+uint RawCircleSize = 0;
+Image * Background = nil;
+int RunApp = 1;
+
+static unsigned int
+hsv2rgb(float h, float s, float v)
+{+ // Taken from Computer Graphics: Principle and Practice
+ unsigned int rgb;
+ float f, p, q, t, r = 0.0, g = 0.0, b = 0.0;
+ int i;
+
+ h = RAD2DEG(h);
+ if (h == 360.0)
+ h = 0.0;
+
+ h /= 60.0;
+ i = (int)floor(h);
+ f = h - i;
+ p = v * (1.0 - s);
+ q = v * (1.0 - (s * f));
+ t = v * (1.0 - (s * (1.0 - f)));
+
+ switch(i)
+ {+ case 0:
+ r = v;
+ g = t;
+ b = p;
+ break;
+ case 1:
+ r = q;
+ g = v;
+ b = p;
+ break;
+ case 2:
+ r = p;
+ g = v;
+ b = t;
+ break;
+ case 3:
+ r = p;
+ g = q;
+ b = v;
+ break;
+ case 4:
+ r = t;
+ g = p;
+ b = v;
+ break;
+ case 5:
+ r = v;
+ g = p;
+ b = t;
+ break;
+ default:
+ break;
+ }
+
+ rgb = (0xff & (uint)(b));
+ rgb |= (0xff & (uint)(g)) << 8;
+ rgb |= (0xff & (uint)(r)) << 16;
+ return rgb << 8;
+}
+
+static void
+updatecircle(void)
+{+ float t, i, l, s;
+ Point c, e;
+
+ if (Circle != nil) {+ freeimage(Circle);
+ }
+ Circle = allocimage(display, RECTANGLE(Dx(screen->r), Dy(screen->r)), RGBA32, 1, BACKGROUNDCOLOR);
+ if (Circle == nil)
+ sysfatal("initcanvas: %r");+ if (RawCircle != nil) {+ free(RawCircle);
+ }
+ CircleBPL = bytesperline(Circle->r, Circle->depth);
+ RawCircleSize = CircleBPL * Dy(Circle->r);
+ RawCircle = malloc(RawCircleSize);
+ unloadimage(Circle, Circle->r, (uchar *)RawCircle, RawCircleSize);
+
+ c.x = Dx(Circle->r)/2;
+ c.y = Dy(Circle->r)/2;
+
+ l = MIN(Dx(screen->r), Dy(screen->r));
+ l *= RADIUS/2.0;
+
+ i = 1/(l*2);
+ for(t = 0.0; t < (2*PI); t += i) {+ for (s = 0; s < l; s += 0.1) {+ e.x = c.x + s * cos(t);
+ e.y = c.y + s * sin(t);
+ RawCircle[Dx(Circle->r) * e.y + e.x] = hsv2rgb(t, 1, (s/l)*100.0);
+ }
+ }
+
+ loadimage(Circle, Circle->r, (uchar *)RawCircle, RawCircleSize);
+}
+
+static void
+drawcanvas(void)
+{+ draw(screen, screen->r, Background, nil, ZP);
+ draw(screen, screen->r, Circle, nil, ZP);
+}
+
+void
+setbackground(ulong col)
+{ + if (Background != nil)
+ freeimage(Background);
+
+ Background = allocimage(display, RECTANGLE(1, 1), RGBA32, 1, col);
+ if (Background == nil)
+ sysfatal("setbackground: %r");+}
+
+static void
+initcanvas(void)
+{+ updatecircle();
+ setbackground(BACKGROUNDCOLOR);
+ drawcanvas();
+}
+
+void
+eresized(int)
+{ + if(getwindow(display, Refnone) < 0)
+ sysfatal("getwindow: %r");+ initcanvas();
+}
+
+void
+main(int argc, char * argv[])
+{+ Event e;
+
+ USED(argc);
+ USED(argv);
+
+ if (initdraw(nil, nil, "pill") < 0)
+ sysfatal("initdraw: %r\n");+ einit(Emouse | Ekeyboard);
+ initcanvas();
+ for (;RunApp;) {+ switch(event(&e)) {+ case Ekeyboard:
+ if (e.kbdc == 'q') {+ RunApp = 0;
+ }
+ break;
+ }
+ }
+}
\ No newline at end of file
--
⑨