ref: cc9f77d9164026cadceff38e977439c516453743
author: glenda <glenda@9front.local>
date: Tue Jan 11 09:02:42 EST 2022
Draws a grid.
--- /dev/null
+++ b/README
@@ -1,0 +1,7 @@
+Simple program to draw beizer curves. To be used as a testbed to experament with antialiasing for fonts.
+
+Currently draws a grid.
+
+Next Select grid points with mouse and pass to redraw as a ctl point
+
+Next Next Select already selected ctlpoint and drag to new grid position. When dragging call redraw 3 times the slected curve the previous and remaininf curves then flush.
\ No newline at end of file
--- /dev/null
+++ b/bez.c
@@ -1,0 +1,158 @@
+#include <u.h>
+#include <libc.h>
+#include <thread.h>
+#include <draw.h>
+#include <mouse.h>
+#include <keyboard.h>
+
+// 7c bez.c && 7l -o bez bez.7
+
+#define GRIDSIZE 50
+
+
+//Channel* ptchan;
+Mousectl* mctl;
+Keyboardctl* kctl;
+
+Rectangle
+getgridrect(void)
+{
+ Rectangle grid;
+ Point size, origin;
+ int shortxy, sqsize, cellsize;
+
+ origin = screen->r.min;
+ size = Pt(Dx(screen->r), Dy(screen->r));
+ shortxy = (size.x >= size.y) ? size.y : size.x;
+ sqsize = shortxy - (shortxy % GRIDSIZE);
+ cellsize = sqsize / GRIDSIZE;
+
+ grid.min.x = origin.x + (size.x - sqsize) / 2;
+ grid.min.y = origin.y + (size.y - sqsize) / 2;
+ grid.max.x = grid.min.x + (cellsize * GRIDSIZE);
+ grid.max.y = grid.min.y + (cellsize * GRIDSIZE);
+
+ return grid;
+}
+
+void
+redraw(void)
+{
+ Rectangle gridrect, R1;
+ Point P1, P2;
+ int cellsize, i;
+ int ctlpts [GRIDSIZE * GRIDSIZE + 1];
+
+ memset(ctlpts, 0, GRIDSIZE * GRIDSIZE * sizeof(int));
+
+ // ctlpts[0] is starting point of linked list.
+
+ gridrect = getgridrect();
+ cellsize = (gridrect.max.x - gridrect.min.x) / GRIDSIZE;
+
+ //Draw Grid
+ draw(screen, screen->r, display->black, nil, ZP);
+ for(i = 1; i < GRIDSIZE; i++){
+ P1.x = gridrect.min.x + i * cellsize;
+ P1.y = gridrect.min.y;
+ P2.x = gridrect.min.x + i * cellsize;
+ P2.y = gridrect.max.y;
+ line(screen, P1, P2, 0, 0, 0.1, display->white, ZP);
+ P1.x = gridrect.min.x;
+ P1.y = gridrect.min.y + i * cellsize;
+ P2.x = gridrect.max.x;
+ P2.y = gridrect.min.y + i * cellsize;
+ line(screen, P1, P2, 0, 0, 0.1, display->white, ZP);
+ }
+ for (i = 1; i < GRIDSIZE * GRIDSIZE +1; i++){
+ if (ctlpts[i] == 1){
+ R1.min.x = gridrect.min.x + ((i - 1) % GRIDSIZE) * cellsize;
+ R1.min.y = gridrect.min.y + ((i - 1) / GRIDSIZE) * cellsize;
+ R1.max.x = R1.min.x + cellsize;
+ R1.max.y = R1.min.y + cellsize;
+ draw(screen, R1, display->white, nil, ZP);
+ }
+ }
+ flushimage(display, 1);
+}
+
+
+void
+terminate(void)
+{
+ closekeyboard(kctl);
+ closemouse(mctl);
+ closedisplay(display);
+ threadexitsall(nil);
+}
+
+void
+resizethread(void* arg)
+{
+ redraw();
+ Mousectl*mctl = arg;
+ for(;;){
+ recvul(mctl->resizec);
+ if(getwindow(display, Refnone) < 0)
+ sysfatal("getwindow: %r");
+ redraw();
+ }
+
+}
+
+void
+keyboardthread(void* arg)
+{
+ Keyboardctl *kctl = arg;
+ Rune r;
+ for(;;){
+ recv(kctl->c, &r);
+ switch(r){
+ case Kdel:
+ case Kesc:
+ case 'q' :
+ terminate();
+ break;
+ }
+ }
+}
+
+void
+mousethread(void* arg)
+{
+ Mousectl*mctl = arg;
+ Mouse m;
+ for(;;){
+ recv(mctl->c, &m);
+ if(m.buttons){
+// if mpos inside rect {gridrectmin , gridrectmax}
+// divide mpos.x by gridsize and mpos.y by gridsize
+ }
+ }
+}
+
+void
+threadmain(int, char*argv[])
+{
+ Mouse m;
+ mctl = initmouse("/dev/mouse", nil);
+ if(mctl == nil)
+ sysfatal("initmouse: %r");
+ kctl = initkeyboard("/dev/cons");
+ if(kctl == nil)
+ sysfatal("initkeyboard: %r");
+ if(initdraw(nil, nil, argv[0]) < 0)
+ sysfatal("initdraw: %r");
+
+// ptchannel = chancreate(GRIDSIZE * GRIDSIZE + 1 * sizeof(int), 0);
+
+ threadcreate(resizethread, mctl, 8*1024);
+ threadcreate(mousethread, mctl, 8*1024);
+ threadcreate(keyboardthread, kctl, 8*1024);
+
+// for(;;){
+// recv(ptchan)
+// }
+
+ threadexits(nil);
+}
--- /dev/null
+++ b/mkfile
@@ -1,0 +1,7 @@
+</$objtype/mkfile
+
+BIN=$home/bin/$objtype
+TARG=bez
+OFILES=bez.$O
+
+</sys/src/cmd/mkone