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;
+ }
+}
--
⑨