diff --git a/.DS_Store b/.DS_Store index b664519..8daf6bd 100644 Binary files a/.DS_Store and b/.DS_Store differ diff --git a/.clang-tidy b/.clang-tidy-off similarity index 85% rename from .clang-tidy rename to .clang-tidy-off index 98dddea..de4715f 100644 --- a/.clang-tidy +++ b/.clang-tidy-off @@ -1,8 +1,3 @@ -# --- -# Checks: 'bugprone-*,modernize-*,performance-*,readability-*' -# WarningsAsErrors: '' -# --- - --- # Enable a broad range of useful C checks Checks: > diff --git a/src/main.c b/src/main.c index 386aa21..7b3a5e8 100644 --- a/src/main.c +++ b/src/main.c @@ -1,5 +1,6 @@ #include #include +#include #include #include @@ -36,6 +37,11 @@ typedef struct char fmt[3]; } Image; +typedef struct +{ + unsigned int red, green, blue; +} Pixel; + static inline unsigned int set_alpha(const unsigned int clr, const unsigned char alpha_value) { @@ -128,30 +134,39 @@ ppm_encode(const char* file, Image* img) img->len = img->width * img->height; fscanf(fptr, "%d", &max_val); fgetc(fptr); - unsigned int* buf = malloc(img->len * sizeof(unsigned int)); - if (!buf) return nullptr; + unsigned char* img_buf = malloc(img->len * 3); + if (!img_buf) return nullptr; + unsigned int* clr_buf = malloc(img->len * sizeof(unsigned int)); + if (!clr_buf) + { + free(img_buf); + return nullptr; + } if (fmt[1] == '3') { for (int i = 0; i < img->len; i++) { fscanf(fptr, "%hhu %hhu %hhu", &red, &green, &blue); - buf[i] = encode(red, green, blue); + clr_buf[i] = encode(red, green, blue); } } else if (fmt[1] == '6') { + fread(img_buf, 3, img->len, fptr); + for (int i = 0; i < img->len; i++) { - fread(&red, sizeof(unsigned char), 1, fptr); - fread(&green, sizeof(unsigned char), 1, fptr); - fread(&blue, sizeof(unsigned char), 1, fptr); - buf[i] = encode(red, green, blue); + red = img_buf[i * 3]; + green = img_buf[i * 3 + 1]; + blue = img_buf[i * 3 + 2]; + clr_buf[i] = encode(red, green, blue); } } fclose(fptr); + free(img_buf); printf("Encoding done!\n"); - return buf; + return clr_buf; } static inline void @@ -166,6 +181,9 @@ ppm_apply_brightness(unsigned int* buf, const Image img, const float factor) static inline void ppm_decode(const unsigned int* buf, const Image img) { + unsigned char red, green, blue; + unsigned char* dst_buf = malloc(img.len * 3); + if (!dst_buf) return; printf("Starting decode...\n"); FILE* fptr; @@ -178,9 +196,9 @@ ppm_decode(const unsigned int* buf, const Image img) { for (int i = 0; i < img.len; i++) { - unsigned char red = decode_r(buf[i]); - unsigned char green = decode_g(buf[i]); - unsigned char blue = decode_b(buf[i]); + red = decode_r(buf[i]); + green = decode_g(buf[i]); + blue = decode_b(buf[i]); fprintf(fptr, "%d %d %d ", red, green, blue); if (i % 7 == 0) { @@ -192,15 +210,14 @@ ppm_decode(const unsigned int* buf, const Image img) { for (int i = 0; i < img.len; i++) { - unsigned char red = decode_r(buf[i]); - unsigned char green = decode_g(buf[i]); - unsigned char blue = decode_b(buf[i]); - fwrite(&red, 1, 1, fptr); - fwrite(&green, 1, 1, fptr); - fwrite(&blue, 1, 1, fptr); + dst_buf[i * 3] = decode_r(buf[i]); + dst_buf[i * 3 + 1] = decode_g(buf[i]); + dst_buf[i * 3 + 2] = decode_b(buf[i]); } + fwrite(dst_buf, 1, img.len * 3, fptr); } fclose(fptr); + free(dst_buf); printf("Decode Done!\n"); } @@ -218,6 +235,9 @@ channel_mask(const unsigned int clr, const char keep) case 'b': return clr & (BYTE_A | BYTE_B); break; + default: + return 0; + break; } return 0; } @@ -228,7 +248,7 @@ chromatic_circular_shift(const unsigned int clr, const int n) unsigned int red = decode_r(clr); unsigned int green = decode_g(clr); unsigned int blue = decode_b(clr); - + if (n > 8) return 0; red = ((red << n) | (red >> (SHIFT_8 - n))) & BYTE; green = ((green << n) | (green >> (SHIFT_8 - n))) & BYTE; blue = ((blue << n) | (blue >> (SHIFT_8 - n))) & BYTE; @@ -310,30 +330,69 @@ rotate(unsigned int* buf, Image* img, int len) return mask; } +static inline int +get_neighbor_idx(int curr_idx, int width, char* direction) +{ + if (strncmp(direction, "above", 5) == 0) return curr_idx - width; + if (strncmp(direction, "below", 5) == 0) return curr_idx + width; + if (strncmp(direction, "right", 5) == 0) return curr_idx + 1; + if (strncmp(direction, "left", 4) == 0) return curr_idx + 1; + + return curr_idx; +} + +static inline int +is_valid(int x, int y, int width, int height) +{ + if (x < 0 || x >= width) return 0; + if (y < 0 || y >= height) return 0; + return 1; +} + +static inline unsigned int +brightness_mirror(unsigned int clr) +{ + unsigned char red = decode_r(clr); + unsigned char blue = decode_b(clr); + unsigned char green = (red + blue) / 2; + return encode(red, green, blue); +} + +static inline unsigned int +get_pixel_safe(unsigned int* buf, int x, int y, int width, int height) +{ + if (is_valid(x, y, width, height)) + { + return buf[(y * width + x)]; + } + return 0; +} + +static inline unsigned int* +box_blur(unsigned int* src_buf, Image* img, int len) +{ + unsigned int* dst_buf = malloc(len * sizeof(unsigned int)); + // Loop every pixel + for (int i = 0; i < len; i++) + { + + } + free(src_buf); + return dst_buf; +} + int main() { Image img = { .width = 3, .height = 2, .name = "../color.ppm", - .fmt = "P3", + .fmt = "P6", .len = 0 }; - unsigned int* buf = ppm_encode("../assets/8ktest.ppm", &img); + unsigned int* buf = ppm_encode("../assets/wtest_p6.ppm.ppm", &img); if (buf) { - ppm_apply_brightness(buf, img, 2); - - for (int i = 0; i < img.len; i++) - { - buf[i] = channel_mask(buf[i], 'r'); - // buf[i] = chromatic_circular_shift(buf[i], (rand() % - // 5)); buf[i] = constrast_adjustment(buf[i], .1f); - // buf[i] = adjust_brightness(buf[i], 1.5f); - // buf[i] = swap_rb(buf[i]); - // buf[i] = to_grayscale(buf[i]); - } - // buf = rotate(buf, &image, image.len); ppm_decode(buf, img); free(buf); }