// Módulo de imágenes en escala de grises, en formato PGM de texto (P2).
// Este archivo dice qué ofrece el módulo; image.c dice cómo lo hace.
#ifndef IMAGE_H
#define IMAGE_H

#define IMAGE_MAX_WIDTH 64
#define IMAGE_MAX_HEIGHT 64
#define IMAGE_MAX_VALUE 255

// Los píxeles en uso son pixels[y][x], con 0 <= y < height y 0 <= x < width.
// Cada uno vale de 0 (negro) a max_value (blanco).
// Una imagen con width igual a 0 es inválida: así avisan los errores.
struct image {
    int width;
    int height;
    int max_value;
    int pixels[IMAGE_MAX_HEIGHT][IMAGE_MAX_WIDTH];
};

// Devuelve una imagen con todos sus píxeles en value, o una inválida si algún dato
// no está en su rango.
struct image image_new(int width, int height, int max_value, int value);

// Igual, pero toma los píxeles de values, fila por fila (width * height elementos).
struct image image_from_values(int width, int height, int max_value, const int values[]);

// Devuelve 1 si la imagen es válida y 0 si no.
int image_is_valid(struct image img);

// Devuelve 1 si tienen el mismo tamaño, el mismo max_value y los mismos píxeles.
int image_equal(struct image a, struct image b);

// Lee un archivo PGM de texto. Devuelve una imagen inválida si no se puede abrir, si
// no es P2, si no cabe o si sus datos están mal.
struct image image_load(const char name[]);

// Escribe la imagen en un archivo PGM de texto. Devuelve 1 si pudo y 0 si no.
int image_save(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(struct image img);

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

#endif
