diff options
author | kdx <kikoodx@paranoici.org> | 2023-08-07 13:42:00 +0200 |
---|---|---|
committer | kdx <kikoodx@paranoici.org> | 2023-08-07 15:33:59 +0200 |
commit | 61cde942fe0e246ba4ff7df58a615e739a4f9366 (patch) | |
tree | 67923bddabe9386cf2859170ef56c065df7bfbf9 | |
parent | f892633ce689c5ddf71a9b8e259142535a371418 (diff) | |
download | kld-61cde942fe0e246ba4ff7df58a615e739a4f9366.tar.gz |
sand effect
-rw-r--r-- | main.c | 31 | ||||
-rw-r--r-- | src/image.c | 26 | ||||
-rw-r--r-- | src/image.h | 5 |
3 files changed, 41 insertions, 21 deletions
@@ -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: |