diff options
author | kdx <kikoodx@paranoici.org> | 2023-07-27 04:35:47 +0200 |
---|---|---|
committer | kdx <kikoodx@paranoici.org> | 2023-07-27 04:35:47 +0200 |
commit | 3acef62b1b142a523c5d1c5bbff37f9a3faac7a7 (patch) | |
tree | 5006b10f50ee6d51557231e77015818935cce7b6 | |
parent | b71eede70ba687546e8726f42b62b1624b1b2c5b (diff) | |
download | kld-3acef62b1b142a523c5d1c5bbff37f9a3faac7a7.tar.gz |
resizetiled
-rw-r--r-- | main.c | 2 | ||||
-rw-r--r-- | src/image.c | 45 | ||||
-rw-r--r-- | src/image.h | 5 | ||||
-rw-r--r-- | tests.c | 14 |
4 files changed, 64 insertions, 2 deletions
@@ -11,7 +11,7 @@ main(void) kldImage_vflip(img); kldImage_bit3(img); kldImage_resize(img, 1024, 512, 0); - kldImage_resize(img, 2048, 2048, KLD_COLOR(0, 0, 255, 255)); + kldImage_resizetiled(img, 2048, 2048); kldImage_writePAM(img, stdout); kldImage_free(img); return 0; diff --git a/src/image.c b/src/image.c index ec3c98d..6fac9b1 100644 --- a/src/image.c +++ b/src/image.c @@ -184,6 +184,30 @@ kldImage_resize(KldImage *img, size_t w, size_t h, KldColor bg) return 0; } +/* XXX: this can be optimized by modifying the image in place when possible */ +int +kldImage_resizetiled(KldImage *img, size_t w, size_t h) +{ + NULL_SAFETY(-1); + + KldImage *new_img = kldImage_alloc(w, h); + if (new_img == NULL) { + log_error("kldImage_alloc failed"); + return -1; + } + kldImage_copytiled(new_img, img, 0, 0); + + /* move new_img to img */ + free(img->data); + img->width = new_img->width; + img->height = new_img->height; + img->size = new_img->size; + img->data = new_img->data; + free(new_img); + + return 0; +} + int kldImage_writePAM(KldImage *img, FILE *fp) { @@ -266,6 +290,27 @@ kldImage_copy(KldImage *dest, KldImage *src, int x, int y) } void +kldImage_copytiled(KldImage *dest, KldImage *src, int x, int y) +{ + NULL_SAFETY_EX_NO_RV(dest); + NULL_SAFETY_EX_NO_RV(src); + + size_t iy = -y; + size_t dy = 0; + while (dy < dest->height) { + size_t ix = -x; + size_t dx = 0; + while (dx < dest->width) { + kldImage_set(dest, dx, dy, kldImage_get(src, ix, iy)); + dx += 1; + ix += 1; + } + dy += 1; + iy += 1; + } +} + +void kldImage_hflip(KldImage *img) { NULL_SAFETY(); diff --git a/src/image.h b/src/image.h index f9178a7..82e2090 100644 --- a/src/image.h +++ b/src/image.h @@ -21,6 +21,9 @@ KldImage *kldImage_dup(KldImage *img); /* on error, return -1 and make no change */ int kldImage_resize(KldImage *img, size_t w, size_t h, KldColor bg); +/* on error, return -1 and make no change */ +int kldImage_resizetiled(KldImage *img, size_t w, size_t h); + /* return -1 on error */ int kldImage_writePAM(KldImage *img, FILE *fp); @@ -28,6 +31,8 @@ void kldImage_clear(KldImage *img, KldColor color); void kldImage_copy(KldImage *dest, KldImage *src, int x, int y); +void kldImage_copytiled(KldImage *dest, KldImage *src, int x, int y); + /* hflip should be faster than vflip */ void kldImage_hflip(KldImage *img); @@ -53,6 +53,17 @@ alloc_small_resize_free(size_t w, size_t h, bool expect_null) } static void +alloc_small_resizetiled_free(size_t w, size_t h, bool expect_null) +{ + KldImage *img = kldImage_alloc(1, 1); + if ((kldImage_resizetiled(img, w, h) != 0) ^ expect_null) + ok(false, "small_resizetiled_free %lu x %lu", w, h); + else + ok(true, "small_resizetiled_free %lu x %lu", w, h); + kldImage_free(img); +} + +static void load_free(const char *path, bool expect_null) { KldImage *img = kldImage_load(path); @@ -68,6 +79,7 @@ load_free(const char *path, bool expect_null) alloc_dup_free(W, H, B); \ alloc_swapdims_free(W, H, B); \ alloc_small_resize_free(W, H, B); \ + alloc_small_resizetiled_free(W, H, B); \ } while(0) int @@ -77,7 +89,7 @@ main(int argc, char **argv) log_set_level(LOG_FATAL); - plan(53); + plan(65); TEST_BATCH(16, 16, false); TEST_BATCH(16, 1024, false); TEST_BATCH(1024, 16, false); |