// Módulo de imágenes en escala de grises, en formato PGM de texto (P2).
// Sesión 2: conviertan este módulo a un tipo opaco. Ver README.md.
#ifndef IMAGE_H
#define IMAGE_H

#define IMAGE_MAX_VALUE 255

// Los píxeles van fila por fila: el píxel (x, y) es pixels[y * width + x].
// Cada uno vale de 0 (negro) a max_value (blanco).
struct image {
    int width;
    int height;
    int max_value;
    int *pixels;
};

// Crea una imagen con todos sus píxeles en value. Devuelve NULL si algún dato no está en su
// rango o si no hay memoria. Owner: quien llama, que debe liberarla con image_free.
struct image *image_new(int width, int height, int max_value, int value);

// Lee un archivo PGM de texto. Devuelve NULL si no se puede abrir, si no es P2, si sus datos
// están mal o si no hay memoria. Owner: quien llama, que debe liberarla con image_free.
struct image *image_load(const char *name);

// Libera la imagen. Acepta NULL.
void image_free(struct image *img);

// Escribe la imagen en un archivo PGM de texto. Devuelve 1 si pudo y 0 si no.
int image_save(const struct image *img, const char *name);

// Escribe el tamaño y los números de cada píxel, para imágenes pequeñas.
void image_print(const struct image *img);

// Dibuja la imagen en la terminal con letras: más claro, más lleno.
void image_show(const struct image *img);

#endif
