From ec79d1e09a9cbeb6de6f1debf712eaa91ac68a1d Mon Sep 17 00:00:00 2001 From: antifallobst Date: Tue, 21 Mar 2023 00:38:33 +0100 Subject: [PATCH] implemented basic masking --- main.c | 27 +++++++++++++++++++-------- paris_mask.png | Bin 0 -> 7027 bytes 2 files changed, 19 insertions(+), 8 deletions(-) create mode 100644 paris_mask.png diff --git a/main.c b/main.c index 3cc3b68..09a7d2f 100644 --- a/main.c +++ b/main.c @@ -9,6 +9,8 @@ #define DEBUG_BUILD 0 +#define MASK_VALUE 50000 + typedef struct { uint32_t width; uint32_t height; @@ -16,9 +18,10 @@ typedef struct { uint32_t new_height; uint32_t* buffer; uint32_t* dist_buffer; + uint32_t* mask_buffer; } image_T; -uint32_t pixel_distance(uint32_t pixel_a, uint32_t pixel_b) { +uint32_t pixel_distance(uint32_t pixel_a, uint32_t pixel_b, uint32_t pixel_m) { uint8_t r_a = (pixel_a) & 0xFF; uint8_t g_a = (pixel_a >> 8) & 0xFF; uint8_t b_a = (pixel_a >> 16) & 0xFF; @@ -27,10 +30,14 @@ uint32_t pixel_distance(uint32_t pixel_a, uint32_t pixel_b) { uint8_t g_b = (pixel_b >> 8) & 0xFF; uint8_t b_b = (pixel_b >> 16) & 0xFF; + uint8_t r_m = (pixel_m) & 0xFF; + uint32_t dist = (uint32_t)sqrt(pow(r_a - r_b, 2) + pow(g_a - g_b, 2) + pow(b_a - b_b, 2)); + if (r_m > 0) { dist += MASK_VALUE; } + #if DEBUG_BUILD printf(" %x %x %x --> %x %x %x = %d\n", r_a, g_a, b_a, r_b, g_b, b_b, dist); #endif @@ -38,10 +45,11 @@ uint32_t pixel_distance(uint32_t pixel_a, uint32_t pixel_b) { return dist; } -image_T* image_load(const char* filename) { +image_T* image_load(const char* filename, const char* filename_mask) { printf("loading '%s'...\n", filename); image_T* image = malloc(sizeof(image_T)); + image->mask_buffer = img_load_pixels(filename_mask, (int*)&image->width, (int*)&image->height, IMG_FMT_RGBA32); image->buffer = img_load_pixels(filename, (int*)&image->width, (int*)&image->height, IMG_FMT_RGBA32); image->dist_buffer = calloc(image->width * image->height, sizeof(uint32_t)); image->new_width = image->width; @@ -52,6 +60,7 @@ void image_destruct(image_T* image) { printf("destructing resources\n"); img_free_pixels(image->buffer); + img_free_pixels(image->mask_buffer); free(image->dist_buffer); free(image); } @@ -77,7 +86,7 @@ void image_calculate_dist_buffer(image_T* image) { int32_t shortest_dist = -1; for (int i = (x > 0 ? -1 : 0); i < (x < image->new_width-1 ? 2 : 1); i++) { - uint32_t dist = pixel_distance(pixel, last_row[x + i]) + dist_last_row[x + i]; + uint32_t dist = pixel_distance(pixel, last_row[x + i], image->mask_buffer[(y * image->width) + x + i]) + dist_last_row[x + i]; if (shortest_dist == -1 || shortest_dist > dist) { shortest_dist = (int32_t)dist; @@ -110,7 +119,6 @@ uint32_t image_find_best_line(image_T* image) { if (shortest_dist == -1 || shortest_dist > row[x]) { shortest_dist = (int32_t)row[x]; line_id = x; - printf("id: %d dist: %d\n", x, row[x]); } } @@ -133,11 +141,13 @@ void image_cut_line(image_T* image, uint32_t line_id) { } x += offset; memcpy(&image->buffer[(image->width * y) + x], &image->buffer[(image->width * y) + x + 1], (image->new_width - x) * sizeof(uint32_t)); + memcpy(&image->mask_buffer[(image->width * y) + x], &image->mask_buffer[(image->width * y) + x + 1], (image->new_width - x) * sizeof(uint32_t)); gfx_color(0, 0xFF, 0); gfx_point(x, y); - gfx_flush(); } image->new_width -= 1; + + gfx_flush(); } void image_dump(image_T* image) { @@ -166,7 +176,7 @@ void image_dump(image_T* image) { } gfx_color(0, 0, 0); - for (int y = 0; y < image->new_height; y++) { + for (int y = 0; y < image->new_height*2; y++) { gfx_point(image->new_width, y); } @@ -196,14 +206,15 @@ void image_dump(image_T* image) { int main() { printf("Line Cutter - Juniorcamp Informatik\n"); - image_T* image = image_load("../paris.png"); + image_T* image = image_load("../paris.png", "../paris_mask.png"); gfx_open(800, 600, "Juniorcamp Informatik - Line Cutter"); + image_dump(image); bool running = true; while(running) { - image_dump(image); char c = gfx_wait(); + image_dump(image); switch (c) { case 's': { image_calculate_dist_buffer(image); diff --git a/paris_mask.png b/paris_mask.png new file mode 100644 index 0000000000000000000000000000000000000000..16ecf93a90a9cf97e499460fde5b40497f37914f GIT binary patch literal 7027 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 literal 0 HcmV?d00001