ref: f1547b9353c2276936f35a9c75f4eb3974ad87fa
parent: fbd2be563dc2460c707017485ca43ce42a5b946d
author: phil9 <telephil9@gmail.com>
date: Thu Nov 25 00:50:00 EST 2021
add ipipeto() helper this function pipes an image through a command and return the resulting image
--- a/a.h
+++ b/a.h
@@ -14,3 +14,4 @@
uchar* readfile(char*, int*);
int writefile(char*, char*, int);
int fileformat(char*);
+Image* ipipeto(Image*, char*);
--- a/utils.c
+++ b/utils.c
@@ -123,3 +123,42 @@
werrstr("unknown image type %s", s);return -1;
}
+
+Image*
+ipipeto(Image *in, char *cmd)
+{+ Image *out;
+ int ifd[2], ofd[2];
+ char *argv[4] = { "rc", "-c", cmd, nil };+
+ out = nil;
+ if(pipe(ifd) < 0)
+ return nil;
+ if(pipe(ofd) < 0){+ close(ifd[0]);
+ close(ifd[1]);
+ return nil;
+ }
+ switch(rfork(RFFDG|RFPROC|RFNOWAIT)){+ case -1:
+ goto Err;
+ case 0:
+ dup(ifd[1], 0);
+ dup(ofd[1], 1);
+ close(ifd[1]);
+ close(ifd[0]);
+ close(ofd[1]);
+ close(ofd[0]);
+ exec("/bin/rc", argv);+ _exits("exec");+ }
+ if(writeimage(ifd[0], in, 1) < 0)
+ goto Err;
+ out = readimage(display, ofd[0], 1);
+Err:
+ close(ifd[0]);
+ close(ifd[1]);
+ close(ofd[0]);
+ close(ofd[1]);
+ return out;
+}
--- a/view.c
+++ b/view.c
@@ -239,51 +239,17 @@
Image*
rotate(int op)
{- static char *oparg[] = {- [Mhflip] = "-l",
- [Mvflip] = "-u",
- [Mrotleft] = "-r 270",
- [Mrotright] = "-r 90",
+ static char *opcmd[] = {+ [Mhflip] = "rotate -l",
+ [Mvflip] = "rotate -u",
+ [Mrotleft] = "rotate -r 270",
+ [Mrotright] = "rotate -r 90",
};
- Image *i;
- int ifd[2], ofd[2];
- char *argv[3] = { "rotate", oparg[op], nil };-
- if(pipe(ifd) < 0)
+ if(op < 0 || op > 3){+ werrstr("invalid rotate op");return nil;
- if(pipe(ofd) < 0){- close(ifd[0]);
- close(ifd[1]);
- return nil;
}
- switch(rfork(RFFDG|RFPROC|RFNOWAIT)){- case -1:
- close(ifd[0]);
- close(ifd[1]);
- close(ofd[0]);
- close(ofd[1]);
- return nil;
- case 0:
- dup(ifd[1], 0);
- dup(ofd[1], 1);
- close(ifd[1]);
- close(ifd[0]);
- close(ofd[1]);
- close(ofd[0]);
- exec("/bin/rotate", argv);- _exits("exec");- }
- if(writeimage(ifd[0], img, 1) < 0){- i = nil;
- goto End;
- }
- i = readimage(display, ofd[0], 1);
-End:
- close(ifd[0]);
- close(ifd[1]);
- close(ofd[0]);
- close(ofd[1]);
- return i;
+ return ipipeto(img, opcmd[op]);
}
void
--
⑨