// Los filtros de la semana 4, con los píxeles en un solo bloque, fila por fila.
#include "filters.h"

void invert(struct image *img) {
    int total = img->width * img->height;
    for (int i = 0; i < total; i++) {
        img->pixels[i] = img->max_value - img->pixels[i];
    }
}

void threshold(struct image *img, int level) {
    int total = img->width * img->height;
    for (int i = 0; i < total; i++) {
        img->pixels[i] = img->pixels[i] >= level ? img->max_value : 0;
    }
}

void flip_horizontal(struct image *img) {
    for (int y = 0; y < img->height; y++) {
        int *row = img->pixels + y * img->width;
        for (int x = 0; x < img->width / 2; x++) {
            int other = img->width - 1 - x;
            int saved = row[x];
            row[x] = row[other];
            row[other] = saved;
        }
    }
}

void image_stats(const struct image *img, int *min, int *max, double *mean) {
    int total = img->width * img->height;
    long sum = 0;
    *min = img->pixels[0];
    *max = img->pixels[0];
    for (int i = 0; i < total; i++) {
        int value = img->pixels[i];
        if (value < *min) {
            *min = value;
        }
        if (value > *max) {
            *max = value;
        }
        sum = sum + value;
    }
    *mean = (double) sum / total;
}
