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
--
⑨