diff options
Diffstat (limited to 'src/picture.c')
| -rw-r--r-- | src/picture.c | 20 |
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]; |
