From faa3f941d0d3989a0a15a7daee9a32e2a218afe3 Mon Sep 17 00:00:00 2001 From: beriff Date: Wed, 4 Mar 2026 19:21:37 +0700 Subject: [PATCH] feat: pipe frambuffer to canvas --- src/core/raster.c | 18 +++++++++++++++-- src/core/raster.h | 6 +++++- src/main.c | 45 +++++++++++++++++++++---------------------- src/ui/vektorcanvas.c | 11 ++++++----- src/ui/vektorcanvas.h | 2 +- 5 files changed, 50 insertions(+), 32 deletions(-) diff --git a/src/core/raster.c b/src/core/raster.c index 73b48c2..bc4b62e 100644 --- a/src/core/raster.c +++ b/src/core/raster.c @@ -34,7 +34,7 @@ void vektor_edgebuffer_flatten_polygon(EdgeBuffer *buffer, VektorPolygon *pg) { } inline VektorFramebuffer vektor_framebuffer_new(unsigned int W, unsigned int H) { - VektorFramebuffer fb = {.width = W, .height = H, .pixels = calloc(W * H * 3, 1)}; + VektorFramebuffer fb = {.width = W, .height = H, .pixels = calloc(W * H * 4, 1)}; return fb; } @@ -43,10 +43,11 @@ inline void vektor_framebuffer_putpixel(VektorFramebuffer *fb, int x, int y, uns if ((unsigned)x >= fb->width || (unsigned)y >= fb->height) return; - int i = (y * fb->width + x) * 3; + int i = (y * fb->width + x) * 4; fb->pixels[i + 0] = r; fb->pixels[i + 1] = g; fb->pixels[i + 2] = b; + fb->pixels[i + 3] = 255; } void vektor_framebuffer_drawline(VektorFramebuffer *fb, V2 a, V2 b, unsigned char r, unsigned char g, @@ -77,4 +78,17 @@ void vektor_framebuffer_drawline(VektorFramebuffer *fb, V2 a, V2 b, unsigned cha y0 += sy; } } +} + +void vektor_framebuffer_drawto(VektorFramebuffer* fb, VektorCanvas* target) { + for(int x = 0; x < fb->width; x++) { + for(int y = 0; y < fb->height; y++) { + + int i = (y * fb->width + x) * 4; + target->canvasPixels[i+0] = (guchar)fb->pixels[i+0]; + target->canvasPixels[i+1] = (guchar)fb->pixels[i+1]; + target->canvasPixels[i+2] = (guchar)fb->pixels[i+2]; + target->canvasPixels[i+3] = (guchar)fb->pixels[i+3]; + } + } } \ No newline at end of file diff --git a/src/core/raster.h b/src/core/raster.h index 6a9f19e..f747d1b 100644 --- a/src/core/raster.h +++ b/src/core/raster.h @@ -2,6 +2,8 @@ #define RASTER_H_ #include "primitives.h" +#include "../ui/vektorcanvas.h" + #include "stddef.h" #include "vector.h" @@ -26,7 +28,7 @@ void vektor_edgebuffer_flatten_polygon(EdgeBuffer *buffer, VektorPolygon *line); typedef struct { unsigned int width; unsigned int height; - unsigned char *pixels; // Flat RGB8 array + unsigned char *pixels; // Flat RGBA8 array } VektorFramebuffer; VektorFramebuffer vektor_framebuffer_new(unsigned int width, unsigned int height); @@ -37,4 +39,6 @@ void vektor_framebuffer_putpixel(VektorFramebuffer *fb, int x, int y, unsigned c void vektor_framebuffer_drawline(VektorFramebuffer *fb, V2 a, V2 b, unsigned char r, unsigned char g, unsigned char bl); +void vektor_framebuffer_drawto(VektorFramebuffer* fb, VektorCanvas* canvas); + #endif // RASTER_H_ diff --git a/src/main.c b/src/main.c index 74073c9..c90a17f 100644 --- a/src/main.c +++ b/src/main.c @@ -10,36 +10,18 @@ static void on_map(GtkWidget *window, gpointer user_data) { vektor_uictrl_map((VektorWidgetState *)user_data); } -static void activate(GtkApplication *app, gpointer user_data) { - - VektorWidgetState *widget_state = - (VektorWidgetState *)malloc(sizeof(VektorWidgetState)); - vektor_uictrl_init(app, widget_state); - - VektorCanvas *canvas = (VektorCanvas *)malloc(sizeof(VektorCanvas)); - vektor_canvas_init(widget_state, canvas); - VektorCanvasColor red = vektor_color_new(255, 0, 0, 255); - vektor_canvas_fill(canvas, &red); - vektor_canvas_update(canvas); - - g_signal_connect(widget_state->window, "map", G_CALLBACK(on_map), - widget_state); - - gtk_window_present(widget_state->window); -} - void write_ppm(const char *path, const VektorFramebuffer *fb) { FILE *f = fopen(path, "wb"); if (!f) abort(); fprintf(f, "P6\n%d %d\n255\n", fb->width, fb->height); - fwrite(fb->pixels, 1, fb->width * fb->height * 3, f); + fwrite(fb->pixels, 1, fb->width * fb->height * 4, f); fclose(f); } -int main(int argc, char **argv) { - VektorFramebuffer fb = vektor_framebuffer_new(256, 256); +static void activate(GtkApplication *app, gpointer user_data) { + VektorFramebuffer fb = vektor_framebuffer_new(400, 400); EdgeBuffer edges = {0}; VektorPolygon pg = *vektor_polygon_new(); @@ -50,10 +32,27 @@ int main(int argc, char **argv) { vektor_edgebuffer_flatten_polygon(&edges, &pg); for (size_t i = 0; i < edges.count; i++) { - vektor_framebuffer_drawline(&fb, edges.edges[i].p1, edges.edges[i].p2, 255, 255, 255); + vektor_framebuffer_drawline(&fb, edges.edges[i].p1, edges.edges[i].p2, 0, 0, 0); } - write_ppm("out.ppm", &fb); + VektorWidgetState *widget_state = + (VektorWidgetState *)malloc(sizeof(VektorWidgetState)); + vektor_uictrl_init(app, widget_state); + + VektorCanvas *canvas = (VektorCanvas *)malloc(sizeof(VektorCanvas)); + vektor_canvas_init(widget_state, canvas); + vektor_canvas_fill(canvas, vektor_color_new(255,0,0,255)); + vektor_framebuffer_drawto(&fb, canvas); + vektor_canvas_update(canvas); + + g_signal_connect(widget_state->window, "map", G_CALLBACK(on_map), + widget_state); + + gtk_window_present(widget_state->window); +} + +int main(int argc, char **argv) { + //write_ppm("out.ppm", &fb); GtkApplication *app; int status; diff --git a/src/ui/vektorcanvas.c b/src/ui/vektorcanvas.c index 8de05a8..e59d012 100644 --- a/src/ui/vektorcanvas.c +++ b/src/ui/vektorcanvas.c @@ -25,6 +25,7 @@ void vektor_canvas_init(VektorWidgetState *state, VektorCanvas *canvasOut) { // g_object_unref(bytes); } +/* Generate new texture based on canvasPixels*/ void vektor_canvas_update(VektorCanvas *canvas) { g_bytes_unref(canvas->canvasPixelBytes); canvas->canvasPixelBytes = @@ -39,14 +40,14 @@ void vektor_canvas_update(VektorCanvas *canvas) { GDK_PAINTABLE(canvas->canvasTexture)); } -void vektor_canvas_fill(VektorCanvas *canvas, VektorCanvasColor *color) { +void vektor_canvas_fill(VektorCanvas *canvas, VektorCanvasColor color) { for (int x = 0; x < VKTR_CANVAS_WIDTH; x++) { for (int y = 0; y < VKTR_CANVAS_HEIGHT; y++) { int i = (y * VKTR_CANVAS_WIDTH + x) * 4; - canvas->canvasPixels[i + 0] = color->r; - canvas->canvasPixels[i + 1] = color->g; - canvas->canvasPixels[i + 2] = color->b; - canvas->canvasPixels[i + 3] = color->a; + canvas->canvasPixels[i + 0] = color.r; + canvas->canvasPixels[i + 1] = color.g; + canvas->canvasPixels[i + 2] = color.b; + canvas->canvasPixels[i + 3] = color.a; } } } diff --git a/src/ui/vektorcanvas.h b/src/ui/vektorcanvas.h index bc9300d..5e8edbb 100644 --- a/src/ui/vektorcanvas.h +++ b/src/ui/vektorcanvas.h @@ -24,7 +24,7 @@ typedef struct VektorCanvasColor { void vektor_canvas_init(VektorWidgetState *state, VektorCanvas *canvasOut); void vektor_canvas_update(VektorCanvas *canvas); -void vektor_canvas_fill(VektorCanvas *canvas, VektorCanvasColor *color); +void vektor_canvas_fill(VektorCanvas *canvas, VektorCanvasColor color); VektorCanvasColor vektor_color_new(guchar r, guchar g, guchar b, guchar a);