aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMistivia <i@mistivia.com>2025-06-10 07:33:35 +0800
committerMistivia <i@mistivia.com>2025-06-10 07:33:35 +0800
commit2a5dcfb26f536d705a8f71548b24b2262ca7715e (patch)
tree183a497f90ba1a2c05a37a280a7afbdb91555f9b
parent2aff272bd665705ae70eb7a34fa658e45d65269d (diff)
anti alias
-rw-r--r--Makefile2
-rw-r--r--src/main.c8
-rw-r--r--src/picture.c20
-rw-r--r--src/picture.h1
-rw-r--r--src/vecmath.c10
-rw-r--r--src/vecmath.h2
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