173 lines
4.0 KiB
C
173 lines
4.0 KiB
C
#include <stdio.h>
|
|
#include <stdint.h>
|
|
#include <stdbool.h>
|
|
#include <SDL.h>
|
|
|
|
bool is_running = false;
|
|
|
|
SDL_Window* window = NULL;
|
|
SDL_Renderer* renderer = NULL;
|
|
|
|
uint32_t* color_buffer = NULL;
|
|
SDL_Texture* color_buffer_texture = NULL;
|
|
|
|
int window_width = 800;
|
|
int window_height = 600;
|
|
|
|
bool initialize_window(void) {
|
|
if (SDL_Init(SDL_INIT_EVERYTHING) != 0) {
|
|
fprintf(stderr, "Error initializing SDL.\n");
|
|
return false;
|
|
}
|
|
|
|
// Set width and height of the SDL window with the max screen resolution
|
|
SDL_DisplayMode display_mode;
|
|
SDL_GetCurrentDisplayMode(0, &display_mode);
|
|
window_width = display_mode.w;
|
|
window_height = display_mode.h;
|
|
|
|
// Create a SDL Window
|
|
window = SDL_CreateWindow(
|
|
NULL,
|
|
SDL_WINDOWPOS_CENTERED,
|
|
SDL_WINDOWPOS_CENTERED,
|
|
window_width,
|
|
window_height,
|
|
SDL_WINDOW_BORDERLESS
|
|
);
|
|
if (!window) {
|
|
fprintf(stderr, "Error creating SDL window.\n");
|
|
return false;
|
|
}
|
|
|
|
// Create a SDL renderer
|
|
renderer = SDL_CreateRenderer(window, -1, 0);
|
|
if (!renderer) {
|
|
fprintf(stderr, "Error creating SDL renderer.\n");
|
|
return false;
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
void setup(void) {
|
|
// Allocate the required memory in bytes to hold the color buffer
|
|
color_buffer = (uint32_t*) malloc(sizeof(uint32_t) * window_width * window_height);
|
|
|
|
// Creating a SDL texture that is used to display the color buffer
|
|
color_buffer_texture = SDL_CreateTexture(
|
|
renderer,
|
|
SDL_PIXELFORMAT_ARGB8888,
|
|
SDL_TEXTUREACCESS_STREAMING,
|
|
window_width,
|
|
window_height
|
|
);
|
|
}
|
|
|
|
void process_input(void) {
|
|
SDL_Event event;
|
|
SDL_PollEvent(&event);
|
|
|
|
switch (event.type) {
|
|
case SDL_QUIT:
|
|
is_running = false;
|
|
break;
|
|
case SDL_KEYDOWN:
|
|
if (event.key.keysym.sym == SDLK_ESCAPE)
|
|
is_running = false;
|
|
break;
|
|
}
|
|
}
|
|
|
|
void update(void) {
|
|
// TODO:
|
|
}
|
|
|
|
void draw_rect(int xpos, int ypos, int width, int height, uint32_t color) {
|
|
for (int y = ypos; y < (ypos + height); y++) {
|
|
for (int x = xpos; x < (xpos + width); x++) {
|
|
color_buffer[(window_width * y) + x] = color;
|
|
}
|
|
}
|
|
}
|
|
|
|
void draw_grid(void) {
|
|
// TODO:
|
|
uint32_t color = 0xc0c0c0;
|
|
bool draw_line = false;
|
|
int grid_spacing = 40;
|
|
|
|
/*for (int y = 0; y < window_height; y++) {
|
|
draw_line = !(y % grid_spacing);
|
|
for (int x = 0; x < window_width; x++) {
|
|
if (draw_line || !(x % grid_spacing)) {
|
|
color_buffer[(window_width * y) + x] = color;
|
|
}
|
|
}
|
|
}*/
|
|
for (int y = 0; y < window_height; y = y + grid_spacing) {
|
|
for (int x = 0; x < window_width; x++) {
|
|
color_buffer[(window_width * y) + x] = color;
|
|
}
|
|
}
|
|
for (int x = 0; x < window_width; x = x + grid_spacing) {
|
|
for (int y = 0; y < window_height; y++) {
|
|
color_buffer[(window_width * y) + x] = color;
|
|
}
|
|
}
|
|
}
|
|
|
|
void render_color_buffer(void) {
|
|
SDL_UpdateTexture(
|
|
color_buffer_texture,
|
|
NULL,
|
|
color_buffer,
|
|
(int)(window_width * sizeof(uint32_t))
|
|
);
|
|
SDL_RenderCopy(renderer, color_buffer_texture, NULL, NULL);
|
|
}
|
|
|
|
void clear_color_buffer(uint32_t color) {
|
|
for (int y = 0; y < window_height; y++) {
|
|
for (int x = 0; x < window_width; x++) {
|
|
color_buffer[(window_width * y) + x] = color;
|
|
}
|
|
}
|
|
}
|
|
|
|
void render(void) {
|
|
SDL_SetRenderDrawColor(renderer, 0, 0, 0, 255);
|
|
SDL_RenderClear(renderer);
|
|
|
|
draw_grid();
|
|
draw_rect(20, 120, 150, 100, 0xFFFF00);
|
|
|
|
render_color_buffer();
|
|
clear_color_buffer(0xFF000000);
|
|
|
|
SDL_RenderPresent(renderer);
|
|
}
|
|
|
|
void destroy_window(void) {
|
|
free(color_buffer);
|
|
SDL_DestroyRenderer(renderer);
|
|
SDL_DestroyWindow(window);
|
|
SDL_Quit();
|
|
}
|
|
|
|
int main(int argc, char *argv[]) {
|
|
is_running = initialize_window();
|
|
|
|
setup();
|
|
|
|
while (is_running) {
|
|
process_input();
|
|
update();
|
|
render();
|
|
}
|
|
|
|
destroy_window();
|
|
|
|
return 0;
|
|
}
|