shithub: awhund

Download patch

ref: c0fd082da98081cfc33495a4cf191de9931cfe8d
author: sirjofri <sirjofri@hardbook>
date: Wed Dec 10 18:42:37 EST 2025

adds files

--- /dev/null
+++ b/awhund.c
@@ -1,0 +1,132 @@
+#include <u.h>
+#include <libc.h>
+#include <draw.h>
+#include <event.h>
+#include <geometry.h>
+
+#define NUM 50
+#define STEPS 1
+
+Image *buf = nil;
+Image *red = nil;
+
+double θ = 0;
+double z = 1.;
+int smooth = 1;
+int frame = 0;
+
+char *done = "done";
+
+void
+redraw(void)
+{
+	float snd;
+	float fn;
+	Point v;
+	Point center;
+	
+	if (frame < 0)
+		return;
+	
+	center.x = screen->r.min.x + Dx(screen->r)/2.;
+	center.y = screen->r.min.y + Dy(screen->r)/2.;
+	
+	if (frame > NUM*STEPS) {
+		v = subpt(screen->r.max, stringsize(font, done));
+		string(screen, v, red, ZP, font, done);
+		frame = -1;
+		return;
+	}
+	if (frame == 0) {
+		draw(screen, screen->r, display->black, nil, ZP);
+		string(screen, center, display->white, ZP, font, ".hund");
+		frame++;
+		return;
+	}
+	
+	fn = frame/NUM.;
+	snd = frame%2 ? -1 : 1;
+	θ = snd * 2. * (fn * 0.7 + 0.1);
+	θ += fn * fn * 0.5;
+	z = fn * fn * 5. + .5;
+	
+	v.x = fn*fn*fn * 0.2;
+	v.y = fn * 0.2;
+	
+	Matrix R = {
+		cos(θ), -sin(θ), 0,
+		sin(θ),  cos(θ), 0,
+		0, 0, 1
+	}, S = {
+		z, 0, 0,
+		0, z, 0,
+		0, 0, 1
+	}, T = {
+		1, 0, v.x,
+		0, 1, v.y,
+		0, 0, 1
+	};
+	
+	mulm(S, R);
+	mulm(T, S);
+	
+	Warp w;
+	mkwarp(w, T);
+	
+	affinewarp(buf, buf->r, screen, buf->r.min, w, smooth);
+	drawop(screen, screen->r, buf, buf, screen->r.min, SoverD);
+	frame++;
+}
+
+void
+eresized(int new)
+{
+	if (new && getwindow(display, Refnone) < 0)
+		sysfatal("err: %r");
+	frame = 0;
+	if (buf)
+		freeimage(buf);
+	buf = allocimage(display, screen->r, screen->chan, 0, 0);
+	redraw();
+}
+
+void
+main(int argc, char** argv)
+{
+	Event ev;
+	int e;
+	int timerev;
+	
+	ARGBEGIN{
+	case 's':
+		smooth = 0;
+		break;
+	}ARGEND;
+	
+	if (initdraw(nil, nil, "frac test") < 0)
+		sysfatal("%r");
+	
+	einit(Ekeyboard|Emouse);
+	timerev = etimer(0, 16);
+	
+	red = allocimage(display, Rect(0, 0, 1, 1), screen->chan, 1, 0x22FF22FF);
+
+	eresized(0);
+	
+	for (;;) {
+		e = event(&ev);
+		
+		if (e == Ekeyboard) {
+			if (ev.kbdc == 'q')
+				exits(nil);
+			if (ev.kbdc == 's')
+				smooth = smooth ? 0 : 1;
+			continue;
+		}
+		
+		if (e == timerev) {
+			redraw();
+			continue;
+		}
+	}
+}
--- /dev/null
+++ b/mkfile
@@ -1,0 +1,6 @@
+</$objtype/mkfile
+
+TARG=awhund
+OFILES=awhund.$O
+
+</sys/src/cmd/mkone
--