aboutsummaryrefslogtreecommitdiff
path: root/src/picture.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/picture.c')
-rw-r--r--src/picture.c20
1 files changed, 20 insertions, 0 deletions
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];