shithub: view

Download patch

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