// Módulo de imágenes en escala de grises, en formato PGM de texto (P2).
// Es un tipo opaco: quien lo usa solo tiene punteros y solo llama a estas funciones.
// Cada píxel vale de 0 (negro) a max_value (blanco).
#ifndef IMAGE_H
#define IMAGE_H

#define IMAGE_MAX_VALUE 255

typedef struct image Image;

// 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.
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.
Image *image_load(const char *name);

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

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

// Devuelven el ancho, el alto y el valor que significa blanco.
int image_width(const Image *img);
int image_height(const Image *img);
int image_max_value(const Image *img);

// Devuelve el píxel de la columna x y la fila y.
// Exige: 0 <= x < ancho y 0 <= y < alto.
int image_get(const Image *img, int x, int y);

// Cambia el píxel de la columna x y la fila y.
// Exige: 0 <= x < ancho, 0 <= y < alto y 0 <= value <= max_value.
void image_set(Image *img, int x, int y, int value);

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

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

#endif
