// 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.
//
// Desde esta semana, las imágenes se pasan por puntero. Las funciones que pueden fallar
// devuelven 1 si pudieron y 0 si no. Si fallan, no cambian *img.
#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). Las demás casillas no se usan, y
// pueden tener cualquier valor.
struct image {
    int width;
    int height;
    int max_value;
    int pixels[IMAGE_MAX_HEIGHT][IMAGE_MAX_WIDTH];
};

// Llena *img con todos sus píxeles en value. Falla si algún dato no está en su rango.
int image_new(struct image *img, int width, int height, int max_value, int value);

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

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

// Lee un archivo PGM de texto en *img. Falla si no se puede abrir, si no es P2, si no
// cabe o si sus datos están mal.
int image_load(struct image *img, const char *name);

// Escribe la imagen en un archivo PGM de texto. Falla si no puede escribirlo.
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
