#include #include #include #include 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; }