fait ja c ei sovi yhteen

📅 2022-11-29T18:03:49.128Z
👁️ 137 katselukertaa
🔓 Julkinen


#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define WIDTH 800
#define HEIGHT 600

typedef struct color {
    int r;
    int g;
    int b;
} COLOR;

static COLOR pixels[WIDTH][HEIGHT];

static COLOR RED = { .r = 255, .g = 0, .b = 0 };

void
fill_with_color(COLOR *pixels, COLOR color)
{
    for (int i = 0; i < WIDTH * HEIGHT; ++i) {
        pixels[i] = color;
    }
}

int
write_ppm_file(COLOR *pixels, char *filename)
{
    FILE *file = fopen(filename, "w+");
    int ret_code = 0;

    if (file == NULL) {
        ret_code = -1;
        goto defer;
    }

    fprintf(file, "P3\n%d %d\n255\n", WIDTH, HEIGHT);

    for (int y = 0; y < HEIGHT; ++y) {
        for (int x = 0; x < WIDTH; ++x) {
            COLOR current = pixels[y * WIDTH + x];
            fprintf(file, "%d %d %d\n", current.r, current.g, current.b);
        }
    }

    if (ferror(file)) {
        ret_code = -1;
        goto defer;
    }

defer:
    if (file) fclose(file);
    return ret_code;
}

char *
parse_filename(int argc, char **argv)
{
    char *filename = "output.ppm";
    
    if (argc > 1)
        filename = strncat(argv[argc - 1], ".ppm", 5);

    return filename;
}

void
write_error(char *msg)
{
    printf("[\033[;31mERROR\033[0m] %s", msg);
}

void
write_success(char *msg)
{
    printf("[\033[;32mSUCCESS\033[0m] %s", msg);
}

int 
main(int argc, char **argv) 
{
    char *filename = parse_filename(argc, argv);

    fill_with_color(*pixels, RED);
    
    if (write_ppm_file(*pixels, filename) == -1) {
        write_error("Failed to write file!");
        return 1;
    }

    char *info_msg = (char *) malloc(256 * sizeof(char));
    sprintf(info_msg, "Wrote %d pixels to %s", WIDTH * HEIGHT, filename);
    write_success(info_msg);
    free(info_msg);

    return 0;
}