aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorkdx <kikoodx@paranoici.org>2023-07-27 04:35:47 +0200
committerkdx <kikoodx@paranoici.org>2023-07-27 04:35:47 +0200
commit3acef62b1b142a523c5d1c5bbff37f9a3faac7a7 (patch)
tree5006b10f50ee6d51557231e77015818935cce7b6
parentb71eede70ba687546e8726f42b62b1624b1b2c5b (diff)
downloadkld-3acef62b1b142a523c5d1c5bbff37f9a3faac7a7.tar.gz
resizetiled
-rw-r--r--main.c2
-rw-r--r--src/image.c45
-rw-r--r--src/image.h5
-rw-r--r--tests.c14
4 files changed, 64 insertions, 2 deletions
diff --git a/main.c b/main.c
index 06324bf..8c5b29e 100644
--- a/main.c
+++ b/main.c
@@ -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);
diff --git a/tests.c b/tests.c
index ab2050f..d35afaf 100644
--- a/tests.c
+++ b/tests.c
@@ -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);