p_draw: Added basic single pixel draw command
authorLukas Krickl <lukas@krickl.dev>
Mon, 23 Feb 2026 21:54:52 +0000 (22:54 +0100)
committerLukas Krickl <lukas@krickl.dev>
Mon, 23 Feb 2026 21:54:52 +0000 (22:54 +0100)
src/p_draw.h
src/p_r_sdl/p_draw.c
src/p_r_sdl/p_init.c
src/p_r_sdl/p_window.c
src/p_r_sdl/p_window.h
src/r_color.c
src/r_color.h
src/r_render.c
src/r_render.h

index 13eaeb3353913e4a74abf282fa262e0ee73b30ac..c1f73e3986df0860dffc76abd658bc2b81e00a67 100644 (file)
@@ -6,6 +6,17 @@
 
 
 /* draws a singel pixel directly to the screen */
-void p_draw_pixel(i32 x, i32 y, struct r_color color);
+void p_draw_pixel(i32 x, i32 y, r_color color);
+
+/* clears the current screen buffer */
+void p_draw_clear(void);
+
+/* inits the draw of a frame */
+void p_draw_begin(void);
+/* ends a frame draw */
+void p_draw_end(void);
+
+/* presents the current frame */
+void p_draw_present(void);
 
 #endif
index b8dd58edec67e0e9f54cd46d51074f42508e55a2..d4196c5d3f3dfd321d8fd8250d2c423ce24e98ce 100644 (file)
@@ -1,7 +1,33 @@
 #include "../p_draw.h"
+#include "p_window.h"
+#include "../u_assert.h"
 
-void p_draw_pixel(i32 x, i32 y, struct r_color color) {
-       LRTS_UNUSED(x);
-       LRTS_UNUSED(y);
-       LRTS_UNUSED(color);
+void p_draw_begin(void) {
+}
+
+void p_draw_end(void) {
+}
+
+void p_draw_clear(void) {
+       SDL_FillSurfaceRect(r_target, NULL, 0x000000FF);
+}
+
+void p_draw_pixel(i32 x, i32 y, r_color color) {
+       u32 *pixel = LRTS_NULL;
+       /* drop the draw if out of bounds */
+       if (x < 0 || x > r_target->w) {
+               return;
+       }
+       if (y < 0 || y > r_target->h) {
+               return;
+       }
+
+ pixel = (unsigned int*)(((char*)r_target->pixels) + r_target->pitch * y + x);
+ *pixel = color;
+}
+
+void p_draw_present(void) {
+       SDL_Surface* screen = SDL_GetWindowSurface(p_main_window);
+       SDL_BlitSurface(r_target, NULL, screen, NULL);
+       SDL_UpdateWindowSurface(p_main_window);
 }
index fe05c0e8e6b96daa2135df03f4f33ec41c701356..35b32853962e6b79f7e52f2b56b8266a9365132f 100644 (file)
@@ -13,18 +13,25 @@ int p_render_init(void) {
                exit(-1);
        }
 
-       p_main_window = SDL_CreateWindow(lrts_cfg()->name, 640, 640, 0);
+       p_main_window = SDL_CreateWindow(lrts_cfg()->name, R_WIDTH, R_HEIGHT, 0);
        if (p_main_window == LRTS_NULL) {
                u_log(U_LOG_ERR, "Failed to create window: %s\n", SDL_GetError());
                exit(-1);
        }
 
+       r_target = SDL_CreateSurface(R_WIDTH, R_HEIGHT, SDL_PIXELFORMAT_RGBX8888);
+       if (r_target == LRTS_NULL) {
+               u_log(U_LOG_ERR, "Failed to create surface: %s\n", SDL_GetError());
+               exit(-1);
+       }
+
        u_log(U_LOG_DEBUG, "Init successful\n");
 
        return 0;
 }
 
 int p_renderer_finish(void) {
+       SDL_DestroySurface(r_target);
        SDL_DestroyWindow(p_main_window);
        SDL_Quit();
        u_log(U_LOG_DEBUG, "Exiting...\n");
index 78bc01cd98e8d0c425c48d1baf67558e7e3cdde7..249e54ad20c692c6c4f7b08649098498e93b577d 100644 (file)
@@ -2,6 +2,8 @@ SDL_Window *p_main_window;
 
 #include "../u_defs.h"
 
+SDL_Surface *r_target;
+
 int p_poll_events() {
        SDL_Event e;
        while (SDL_PollEvent(&e)) {
index d281ac88069956c59b109b9d8217952d09b4be72..c71e23b0c36a8a38e794d5ed41995e5b846e6ebc 100644 (file)
@@ -5,4 +5,7 @@
 
 extern SDL_Window *p_main_window;
 
+/* main surface to render to */
+extern SDL_Surface *r_target;
+
 #endif
index f22a9b2724ecaa606cf67112aa0e4d8213e7ee31..8b137891791fe96927ad78e64b0aad7bded08bdc 100644 (file)
@@ -1,9 +1 @@
 
-struct r_color r_color(u8 r, u8 g, u8 b, u8 a) {
-       struct r_color c;
-       c.r = r;
-       c.g = g;
-       c.b = b;
-       c.a = a;
-       return c;
-}
index a968e9ffe897fe1ade6d9b64c246e1a1d0e3ee41..3a56e481248ef02ce6bb366630ee433a827b0dd5 100644 (file)
@@ -3,13 +3,6 @@
 
 #include "u_defs.h"
 
-struct r_color {
-       u8 r;
-       u8 g;
-       u8 b;
-       u8 a;
-};
-
-struct r_color r_color(u8 r, u8 g, u8 b, u8 a);
+typedef u32 r_color;
 
 #endif
index 8c9e827b9d3ac06a53ee90aa85071f58b65f6804..58c0972d1c25381f5fd6baba67bac25cad99c650 100644 (file)
@@ -3,7 +3,11 @@
 #include "p_draw.h"
 
 void r_render_frame() {
-       struct r_color c = r_color(0, 0, 0, 0xFF);
+       p_draw_begin();
+       p_draw_clear();
 
-       p_draw_pixel(0, 0, c);
+       p_draw_pixel(0, 0, 0xFF0000FF);
+
+       p_draw_end();
+       p_draw_present();
 }
index 741be96bc250b76417cfbd43919b89b71258a563..4cf94bbfa1a4bf6de3d6ba40f1d51991e99778d3 100644 (file)
@@ -1,6 +1,10 @@
 #ifndef R_RENDER_H__
 #define R_RENDER_H__
 
+/* internal rendering resolution */
+#define R_WIDTH 800
+#define R_HEIGHT 600
+
 void r_render_frame();
 
 #endif