aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorkdx <kikoodx@paranoici.org>2023-08-07 13:42:00 +0200
committerkdx <kikoodx@paranoici.org>2023-08-07 15:33:59 +0200
commit61cde942fe0e246ba4ff7df58a615e739a4f9366 (patch)
tree67923bddabe9386cf2859170ef56c065df7bfbf9
parentf892633ce689c5ddf71a9b8e259142535a371418 (diff)
downloadkld-61cde942fe0e246ba4ff7df58a615e739a4f9366.tar.gz
sand effect
-rw-r--r--main.c31
-rw-r--r--src/image.c26
-rw-r--r--src/image.h5
3 files changed, 41 insertions, 21 deletions
diff --git a/main.c b/main.c
index aa5c35c..c1b0dd0 100644
--- a/main.c
+++ b/main.c
@@ -1,29 +1,20 @@
#include "image.h"
-#include "myrand.h"
-#include <time.h>
#include <stdlib.h>
int
main(int argc, char **argv)
{
- mysrand(time(NULL));
+ if (argc < 2) {
+ fprintf(stderr, "usage: %s image.png\n", argv[0]);
+ return EXIT_FAILURE;
+ }
- KldImage *cloud = kld_load("samples/cloud.jpg");
- KldImage *sky = kld_load("samples/sky.jpg");
+ KldImage *img = kld_load(argv[1]);
+ kld_sand(img);
+ kld_grayscale(img);
+ kld_chaos3(img);
+ kld_writePAM(img, stdout);
- kld_resize(cloud, sky->width, sky->height, 0);
-
- kld_vflip(cloud);
-
- kld_invert(sky);
- const int m = (argc > 1) ? atoi(argv[1]) : 255;
- kld_mod(sky, KLD_COLOR(m, m, m, 255));
-
- kld_sub(cloud, sky);
- kld_movechans(cloud, KLD_COLOR(3, 3, 2, -1));
- kld_writePAM(cloud, stdout);
-
- kld_free(sky);
- kld_free(cloud);
- return 0;
+ kld_free(img);
+ return EXIT_SUCCESS;
}
diff --git a/src/image.c b/src/image.c
index 02e5ced..4103250 100644
--- a/src/image.c
+++ b/src/image.c
@@ -5,6 +5,7 @@
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
+#include <sys/types.h>
#define NULL_SAFETY_EX(N, X) do { \
if ((N) == NULL) { \
@@ -280,7 +281,7 @@ kld_copy(KldImage *dest, KldImage *src, int x, int y, int w, int h)
dx = x;
}
while (ix < src->width && dx < dest->width && --h != 0) {
- kld_set(dest, dx, dy, kld_get(src, ix, iy));
+ KLD_SET(dest, dx, dy, KLD_GET(src, ix, iy));
dx += 1;
ix += 1;
}
@@ -429,6 +430,29 @@ kld_bit3(KldImage *img)
}
void
+kld_sand(KldImage *img)
+{
+ NULL_SAFETY();
+
+ if (img->height < 2)
+ return;
+ for (ssize_t y = img->height - 2; y >= 0; y--) {
+ for (size_t x = 0; x < img->width; x++) {
+ const KldColor px = kld_get(img, x, y);
+ ssize_t dy = y + 1;
+ if (KLD_COLOR_A(px) &&
+ !KLD_COLOR_A(kld_get(img, x, dy)))
+ {
+ while (!KLD_COLOR_A(kld_get(img, x, dy + 1)))
+ dy += 1;
+ kld_set(img, x, y, 0);
+ kld_set(img, x, dy, px);
+ }
+ }
+ }
+}
+
+void
kld_mod(KldImage *img, KldColor mask)
{
NULL_SAFETY();
diff --git a/src/image.h b/src/image.h
index a919561..67a4bb1 100644
--- a/src/image.h
+++ b/src/image.h
@@ -3,6 +3,9 @@
#include <stddef.h>
#include <stdio.h>
+#define KLD_GET(I, X, Y) ((I)->data[X + Y * (I)->width])
+#define KLD_SET(I, X, Y, V) (I)->data[X + Y * (I)->width] = V
+
/* return NULL on error */
KldImage *kld_alloc(size_t w, size_t h);
@@ -51,6 +54,8 @@ void kld_chaos3(KldImage *img);
void kld_bit3(KldImage *img);
+void kld_sand(KldImage *img);
+
void kld_mod(KldImage *img, KldColor mask);
/* cmd examples: