From 2a5dcfb26f536d705a8f71548b24b2262ca7715e Mon Sep 17 00:00:00 2001 From: Mistivia Date: Tue, 10 Jun 2025 07:33:35 +0800 Subject: anti alias --- Makefile | 2 +- src/main.c | 8 +++++--- src/picture.c | 20 ++++++++++++++++++++ src/picture.h | 1 + src/vecmath.c | 10 ++++++++++ src/vecmath.h | 2 ++ 6 files changed, 39 insertions(+), 4 deletions(-) diff --git a/Makefile b/Makefile index 402d621..5009f17 100644 --- a/Makefile +++ b/Makefile @@ -1,2 +1,2 @@ all: - gcc -g -fsanitize=address -lm src/*.c -o main + gcc -O2 -flto -lm src/*.c -o main diff --git a/src/main.c b/src/main.c index 6e37e37..71ced79 100644 --- a/src/main.c +++ b/src/main.c @@ -143,8 +143,8 @@ Color calc_color(Vec3f v) { int main() { init_color(); - int img_w = 1280; - int img_h = 720; + int img_w = 1280*2; + int img_h = 720*2; Picture pic = new_picture(img_w, img_h); for (int x = 0; x < img_w; x++) { for (int y = 0; y < img_h; y++) { @@ -153,8 +153,10 @@ int main() { set_pixel(pic, screen_pos, calc_color(v)); } } - writeBMP("test.bmp", pic); + Picture newpic = picture_downscale_2x(pic); + writeBMP("test.bmp", newpic); delete_picture(pic); + delete_picture(newpic); return 0; } diff --git a/src/picture.c b/src/picture.c index 52deb0e..ebb1fec 100644 --- a/src/picture.c +++ b/src/picture.c @@ -17,6 +17,11 @@ void delete_picture(Picture pic) { free(pic.buffer); } +Color get_pixel(Picture pic, Vec2i pos) { + int idx = pos.y * pic.width * 3 + pos.x * 3; + return (Color) { pic.buffer[idx+2], pic.buffer[idx+1], pic.buffer[idx] }; +} + void set_pixel(Picture pic, Vec2i pos, Color c) { int idx = pos.y * pic.width * 3 + pos.x * 3; pic.buffer[idx] = c.b; @@ -37,6 +42,21 @@ void normalize_picture(Picture pic) { } } +Picture picture_downscale_2x(Picture pic) { + Picture newpic = new_picture(pic.width / 2, pic.height / 2); + for (int x = 0; x < newpic.width; x++) { + for (int y = 0; y < newpic.height; y++) { + Color pixels[4]; + pixels[0] = get_pixel(pic, (Vec2i){2*x, 2*y}); + pixels[1] = get_pixel(pic, (Vec2i){2*x+1, 2*y}); + pixels[2] = get_pixel(pic, (Vec2i){2*x, 2*y+1}); + pixels[3] = get_pixel(pic, (Vec2i){2*x+1, 2*y+1}); + set_pixel(newpic, (Vec2i){x,y}, pixel_avg4(pixels)); + } + } + return newpic; +} + static bool fwrite_word16le(FILE* fp, uint16_t x) { uint8_t buf[2]; diff --git a/src/picture.h b/src/picture.h index fec5d36..5e50926 100644 --- a/src/picture.h +++ b/src/picture.h @@ -17,6 +17,7 @@ void delete_picture(Picture pic); void set_pixel(Picture pic, Vec2i pos, Color c); void normalize_picture(Picture pic); +Picture picture_downscale_2x(Picture pic); bool writeBMP(const char* filename, Picture pic); diff --git a/src/vecmath.c b/src/vecmath.c index 8f1c43d..c3230f6 100644 --- a/src/vecmath.c +++ b/src/vecmath.c @@ -46,3 +46,13 @@ Color icolor(int32_t rgb) { void vec3f_show(const char *name, Vec3f v) { printf("%s(%f,%f,%f)\n", name, v.x, v.y, v.z); } + +Color pixel_avg4(Color pixels[4]) { + float r = 0,g = 0,b = 0; + for (int i = 0; i < 4; i++) { + r += pixels[i].r; + g += pixels[i].g; + b += pixels[i].b; + } + return (Color) {r/4.0, g/4.0, b/4.0}; +} diff --git a/src/vecmath.h b/src/vecmath.h index 3b6f5b6..c797b94 100644 --- a/src/vecmath.h +++ b/src/vecmath.h @@ -28,6 +28,8 @@ Vec3f vec3f_neg(Vec3f v); Vec3f vec3f_normalize(Vec3f vec); Vec3f vec3f_mul(float a, Vec3f v); void vec3f_show(const char *name, Vec3f v); + Color icolor(int32_t rgb); +Color pixel_avg4(Color pixels[4]); #endif -- cgit v1.0