]> git.lizzy.rs Git - plan9front.git/blobdiff - sys/src/cmd/rotate.c
Libflac: Tell it that we have stdint.h so it finds SIZE_MAX
[plan9front.git] / sys / src / cmd / rotate.c
index 5c4d4fa942719d7080289a3f345e7d3fd6cf9959..f595b982652ff30fc36a5de8155c0d1a756895bf 100644 (file)
@@ -10,27 +10,13 @@ rot90(Memimage *m)
        ulong chan;
        uchar *s, *d;
        Memimage *w;
-       char buf[12];
 
-       bpp = m->depth/8;
+       bpp = (m->depth+7)/8;
        chan = m->chan;
        switch(chan){
-       default:
-               sysfatal("can't handle channel type %s", chantostr(buf, chan));
-       case RGB15:
-               bpp = 2;
-       case CMAP8:
-       case GREY8:
-       case RGB16:
-       case RGB24:
-       case RGBA32:
-       case ARGB32:
-       case XRGB32:
-               break;
        case GREY1:
        case GREY2:
        case GREY4:
-               bpp = 1;
                if((w = allocmemimage(m->r, GREY8)) == nil)
                        sysfatal("allocmemimage: %r");
                memimagedraw(w, w->r, m, m->r.min, nil, ZP, S);
@@ -41,7 +27,8 @@ rot90(Memimage *m)
 
        dx = Dx(m->r);
        dy = Dy(m->r);
-       if((w = allocmemimage(Rect(m->r.min.x, m->r.min.y, dy, dx), m->chan)) == nil)
+       if((w = allocmemimage(Rect(m->r.min.x, m->r.min.y, 
+               m->r.min.x+dy, m->r.min.y+dx), m->chan)) == nil)
                sysfatal("allocmemimage: %r");
        line = w->width*sizeof(ulong);
        for(y=0; y<dy; y++){
@@ -74,7 +61,7 @@ rot90(Memimage *m)
 }
 
 Memimage*
-rot180(Memimage *m)
+upsidedown(Memimage *m)
 {
        uchar *s, *d, *t;
        int w, y, dy;
@@ -94,16 +81,10 @@ rot180(Memimage *m)
        return m;
 }
 
-Memimage*
-rot270(Memimage *m)
-{
-       return rot90(rot180(m));
-}
-
 void
 usage(void)
 {
-       fprint(2, "usage: %s -r degree [ file ]\n", argv0);
+       fprint(2, "usage: %s [ -r degree ] [ -u | -l ] [ file ]\n", argv0);
        exits("usage");
 }
 
@@ -112,10 +93,18 @@ main(int argc, char *argv[])
 {
        Memimage *m;
        int fd, r;
+       char f;
 
+       f = 0;
        r = 0;
        fd = 0;
        ARGBEGIN {
+       case 'u':
+               f = 'u';
+               break;
+       case 'l':
+               f = 'l';
+               break;
        case 'r':
                r = atoi(EARGF(usage()));
                break;
@@ -130,15 +119,18 @@ main(int argc, char *argv[])
        memimageinit();
        if((m = readmemimage(fd)) == nil)
                sysfatal("readmemimage: %r");
+       if(f == 'u' || f == 'l'){
+               m = upsidedown(m);
+               if(f == 'l')
+                       r = 180;
+       }
        switch(r % 360){
-       case 90:
+       case 270:
                m = rot90(m);
-               break;
        case 180:
-               m = rot180(m);
-               break;
-       case 270:
-               m = rot270(m);
+               m = rot90(m);
+       case 90:
+               m = rot90(m);
                break;
        }
        if(writememimage(1, m) < 0)