i/o changes and starting box_blur

This commit is contained in:
Andrew Haynes
2026-03-09 19:41:48 -04:00
parent 8f66878367
commit f6bc756839
3 changed files with 91 additions and 37 deletions
+91 -32
View File
@@ -1,5 +1,6 @@
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#include <unistd.h>
@@ -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);
}