diff --git a/meson.build b/meson.build index 24a1390..3c37359 100644 --- a/meson.build +++ b/meson.build @@ -9,7 +9,9 @@ project( ) sources = [ + 'src/image.c', 'src/main.c', + 'src/ppm.c', ] executable( diff --git a/src/image.c b/src/image.c new file mode 100644 index 0000000..f09016f --- /dev/null +++ b/src/image.c @@ -0,0 +1,20 @@ +#include "image.h" + +#include + +struct image *create_image(size_t w, size_t h) { + // FIXME: not checking for overflow + struct image *i = malloc(w * h * sizeof(*i->buf) + sizeof(*i)); + + if (!i) + return NULL; + + i->w = w; + i->h = h; + + return i; +} + +void destroy_image(struct image *image) { + free(image); +} diff --git a/src/image.h b/src/image.h new file mode 100644 index 0000000..6b94d52 --- /dev/null +++ b/src/image.h @@ -0,0 +1,19 @@ +#ifndef IMAGE_H +#define IMAGE_H + +#include + +struct image { + size_t w; + size_t h; + struct pixel { + unsigned char r; + unsigned char g; + unsigned char b; + } buf[]; +}; + +struct image *create_image(size_t w, size_t h); +void destroy_image(struct image *image); + +#endif /* !IMAGE_H */ diff --git a/src/main.c b/src/main.c index 9b6bdc2..3abaeb9 100644 --- a/src/main.c +++ b/src/main.c @@ -1,3 +1,6 @@ +#include "image.h" +#include "ppm.h" + int main(void) { return 0; } diff --git a/src/ppm.c b/src/ppm.c new file mode 100644 index 0000000..5696c18 --- /dev/null +++ b/src/ppm.c @@ -0,0 +1,22 @@ +#include "ppm.h" + +#include +#include "image.h" + +void print_ppm(const struct image *image, FILE *f) { + // Header + fputs("P3\n", f); + fprintf(f, "%zu %zu\n", image->w, image->h); + fputs("255\n", f); + + // One row per line + for (size_t i = 0; i < image->h; ++i) { + for (size_t j = 0; j < image->w; ++j) { + if (j != 0) + fputc(' ', f); + const struct pixel *p = &image->buf[i * image->w + j]; + fprintf(f, "%hhu %hhu %hhu", p->r, p->g, p->b); + } + fputc('\n', f); + } +} diff --git a/src/ppm.h b/src/ppm.h new file mode 100644 index 0000000..d4a2dcd --- /dev/null +++ b/src/ppm.h @@ -0,0 +1,10 @@ +#ifndef PPM_H +#define PPM_H + +#include + +struct image; // Forward declaration + +void print_ppm(const struct image *image, FILE *f); + +#endif /* !PPM_H */