shithub: brokentoys

Download patch

ref: 51ac274721ac93459bc108b5315b66bb798d2abe
parent: f64d365463e5d7b8c0d06bbf0930eeb96d1130a3
author: rodri <rgl@antares-labs.eu>
date: Sun Apr 27 19:34:52 EDT 2025

image: add unary ops

--- /dev/null
+++ b/image/com.c
@@ -1,0 +1,38 @@
+#include <u.h>
+#include <libc.h>
+#include <draw.h>
+#include <memdraw.h>
+#include "fns.h"
+
+static int
+opcom(uchar b)
+{
+	return ~b;
+}
+
+static void
+usage(void)
+{
+	fprint(2, "usage: %s\n", argv0);
+	exits(nil);
+}
+
+void
+main(int argc, char *argv[])
+{
+	Memimage *img;
+
+	ARGBEGIN{
+	default: usage();
+	}ARGEND;
+	if(argc != 0)
+		usage();
+
+	img = ereadmemimage(0);
+	imgunaop(img, opcom, 0);
+
+	ewritememimage(1, img);
+	freememimage(img);
+
+	exits(nil);
+}
--- a/image/fns.h
+++ b/image/fns.h
@@ -9,3 +9,4 @@
 Memimage *ereadmemimage(int);
 int ewritememimage(int, Memimage*);
 void imgbinop(Memimage*, Memimage*, int(*)(uchar, uchar), int);
+void imgunaop(Memimage*, int(*)(uchar), int);
--- a/image/mkfile
+++ b/image/mkfile
@@ -6,6 +6,7 @@
 	add\
 	sub\
 	sobel\
+	com\
 
 OFILES=\
 	utils.$O\
--- a/image/utils.c
+++ b/image/utils.c
@@ -98,3 +98,19 @@
 		*p1++ = c;
 	}
 }
+
+void
+imgunaop(Memimage *i1, int(*op)(uchar), int saturate)
+{
+	uchar *p1, *p1e;
+	int c;
+
+	p1 = i1->data->bdata;
+	p1e = p1 + Dx(i1->r)*Dy(i1->r)*i1->nchan;
+	while(p1 < p1e){
+		c = op(*p1);
+		if(saturate)
+			c = clamp(c, 0, 0xFF);
+		*p1++ = c;
+	}
+}
--