/*
 *	rectangles.c
 *	written by Holmes Futrell
 *	use however you want
*/

#include "SDL.h"
#include <time.h>
#include "common.h"

void
render(void)
{

    Uint8 r, g, b;
    /*  Come up with a random rectangle */
    SDL_Rect rect;
    rect.w = randomInt(64, 128);
    rect.h = randomInt(64, 128);
    rect.x = randomInt(0, SCREEN_WIDTH);
    rect.y = randomInt(0, SCREEN_HEIGHT);

    /* Come up with a random color */
    r = randomInt(50, 255);
    g = randomInt(50, 255);
    b = randomInt(50, 255);

    /*  Fill the rectangle in the color */
    SDL_RenderFill(r, g, b, 255, &rect);

    /* update screen */
    SDL_RenderPresent();

}

int
main(int argc, char *argv[])
{

    SDL_WindowID windowID;
    int done;
    SDL_Event event;

    /* initialize SDL */
    if (SDL_Init(SDL_INIT_VIDEO) < 0) {
        fatalError("Could not initialize SDL");
    }

    /* seed random number generator */
    srand(time(NULL));

    /* create window and renderer */
    windowID =
        SDL_CreateWindow(NULL, 0, 0, SCREEN_WIDTH, SCREEN_HEIGHT,
                         SDL_WINDOW_SHOWN);
    if (windowID == 0) {
        fatalError("Could not initialize Window");
    }
    if (SDL_CreateRenderer(windowID, -1, 0) != 0) {
        fatalError("Could not create renderer");
    }

    /* Fill screen with black */
    SDL_RenderFill(0, 0, 0, 0, NULL);

    /* Enter render loop, waiting for user to quit */
    done = 0;
    while (!done) {
        while (SDL_PollEvent(&event)) {
            if (event.type == SDL_QUIT) {
                done = 1;
            }
        }
        render();
        SDL_Delay(1);
    }

    /* shutdown SDL */
    SDL_Quit();

    return 0;
}
