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);
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++){
}
Memimage*
-rot180(Memimage *m)
+upsidedown(Memimage *m)
{
uchar *s, *d, *t;
int w, y, dy;
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");
}
{
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;
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)