diff -r 287d82efe5f2 sys/src/cmd/rotate.c --- a/sys/src/cmd/rotate.c Mon Jan 13 23:22:35 2020 +0000 +++ b/sys/src/cmd/rotate.c Sun Feb 16 19:37:26 2020 +0100 @@ -3,6 +3,49 @@ #include #include +double +round(double n) +{ + return floor(n + 0.5); +} + +Point +rotatept(Point p, double θ, Point c) +{ + Point r; + + p = subpt(p, c); + r.x = round(p.x*cos(θ) - p.y*sin(θ)); + r.y = round(p.x*sin(θ) + p.y*cos(θ)); + r = addpt(r, c); + return r; +} + +Memimage* +rotate(Memimage *m, double θ) +{ + Memimage *w; + Rectangle r; + Point p, c; + + if((w = allocmemimage(m->r, m->chan)) == nil) + sysfatal("allocmemimage: %r"); + memfillcolor(w, DTransparent); + c = divpt(addpt(m->r.min, m->r.max), 2); + for(r = m->r; r.min.y < m->r.max.y; r.min.y++){ + r.min.x = m->r.min.x; + r.max.y = r.min.y+1; + for(; r.min.x < m->r.max.x; r.min.x++){ + r.max.x = r.min.x+1; + p = rotatept(r.min, θ, c); + if(ptinrect(p, m->r)) + memimagedraw(w, r, m, p, nil, ZP, S); + } + } + freememimage(m); + return w; +} + Memimage* rot90(Memimage *m) { @@ -92,10 +135,11 @@ main(int argc, char *argv[]) { Memimage *m; - int fd, r; + int fd, r, wasright; char f; f = 0; + wasright = 0; r = 0; fd = 0; ARGBEGIN { @@ -131,8 +175,11 @@ m = rot90(m); case 90: m = rot90(m); + wasright++; break; } + if(!wasright) + m = rotate(m, -r*PI/180); if(writememimage(1, m) < 0) sysfatal("writememimage: %r"); exits(0);