diff --git a/meson.build b/meson.build index f71b976..3d5d91e 100644 --- a/meson.build +++ b/meson.build @@ -15,7 +15,8 @@ gtk = dependency('gtk4', required: true) src = files( 'src/main.c', 'src/matrix.c', - 'src/ui/uicontroller.c' + 'src/ui/uicontroller.c', + 'src/ui/vektorcanvas.c' ) executable( diff --git a/src/main.c b/src/main.c index 52803dd..183b766 100644 --- a/src/main.c +++ b/src/main.c @@ -3,6 +3,7 @@ #include "stdlib.h" #include "./ui/uicontroller.h" +#include "./ui/vektorcanvas.h" static void on_map(GtkWidget* window, gpointer user_data) { @@ -14,6 +15,12 @@ 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); diff --git a/src/ui/uicontroller.c b/src/ui/uicontroller.c index 64847ac..6755d78 100644 --- a/src/ui/uicontroller.c +++ b/src/ui/uicontroller.c @@ -14,6 +14,7 @@ void vektor_uictrl_init(GtkApplication* app, VektorWidgetState* stateOut) { stateOut->window = GTK_WINDOW(gtk_builder_get_object(builder, "main_window")); stateOut->workspacePaned = GTK_PANED(gtk_builder_get_object(builder, "workspace_paned")); + stateOut->workspaceCanvas = GTK_PICTURE(gtk_builder_get_object(builder, "workspace")); gtk_window_set_application(stateOut->window, app); gtk_window_set_title(stateOut->window, "Vektor"); diff --git a/src/ui/uicontroller.h b/src/ui/uicontroller.h index 72a2de8..addc9ed 100644 --- a/src/ui/uicontroller.h +++ b/src/ui/uicontroller.h @@ -9,8 +9,9 @@ all the widgets used in internal logic of the program */ typedef struct VektorWidgetState { GtkWindow* window; - GtkPaned* workspacePaned; + GtkPicture* workspaceCanvas; + //GtkWidget* Workspace } VektorWidgetState; diff --git a/src/ui/vektorcanvas.c b/src/ui/vektorcanvas.c new file mode 100644 index 0000000..cdbfcbc --- /dev/null +++ b/src/ui/vektorcanvas.c @@ -0,0 +1,65 @@ +#include "gtk/gtk.h" + +#include "vektorcanvas.h" +#include "uicontroller.h" + +#define VKTR_CANVAS_WIDTH 400 +#define VKTR_CANVAS_HEIGHT 400 +#define VKTR_CANVAS_SIZE (VKTR_CANVAS_WIDTH * VKTR_CANVAS_HEIGHT * 4) + +void vektor_canvas_init(VektorWidgetState* state, VektorCanvas* canvasOut) { + canvasOut->canvasWidget = state->workspaceCanvas; + canvasOut->width = VKTR_CANVAS_WIDTH; + canvasOut->height = VKTR_CANVAS_HEIGHT; + canvasOut->canvasPixels = g_malloc0(VKTR_CANVAS_SIZE); + + canvasOut->canvasPixelBytes = g_bytes_new(canvasOut->canvasPixels, VKTR_CANVAS_SIZE); + canvasOut->canvasTexture = gdk_memory_texture_new( + VKTR_CANVAS_WIDTH, + VKTR_CANVAS_HEIGHT, + GDK_MEMORY_R8G8B8A8, + canvasOut->canvasPixelBytes, + VKTR_CANVAS_WIDTH * 4 + ); + + gtk_picture_set_paintable(canvasOut->canvasWidget, GDK_PAINTABLE(canvasOut->canvasTexture)); + + //g_object_unref(bytes); +} + +void vektor_canvas_update(VektorCanvas* canvas) { + g_bytes_unref(canvas->canvasPixelBytes); + canvas->canvasPixelBytes = g_bytes_new(canvas->canvasPixels, VKTR_CANVAS_SIZE); + + g_object_unref(canvas->canvasTexture); + canvas->canvasTexture = gdk_memory_texture_new( + canvas->width, canvas->height, + GDK_MEMORY_R8G8B8A8, + canvas->canvasPixelBytes, + canvas->width * 4 + ); + + gtk_picture_set_paintable(canvas->canvasWidget, GDK_PAINTABLE(canvas->canvasTexture)); +} + +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; + } + } +} + +VektorCanvasColor vektor_color_new(guchar cr, guchar cg, guchar cb, guchar ca) { + VektorCanvasColor c = { + .r = cr, + .g = cg, + .b = cb, + .a = ca + }; + return c; +} \ No newline at end of file diff --git a/src/ui/vektorcanvas.h b/src/ui/vektorcanvas.h new file mode 100644 index 0000000..f9d9aab --- /dev/null +++ b/src/ui/vektorcanvas.h @@ -0,0 +1,31 @@ +#ifndef VKTR_CANVAS_H +#define VKTR_CANVAS_H + +#include "uicontroller.h" + +typedef struct VektorCanvas { + GtkPicture* canvasWidget; + + // texture related stuff + guchar* canvasPixels; + GdkTexture* canvasTexture; + GBytes* canvasPixelBytes; + + int width; + int height; +} VektorCanvas; + +typedef struct VektorCanvasColor { + guchar r; + guchar g; + guchar b; + guchar a; +} VektorCanvasColor; + +void vektor_canvas_init(VektorWidgetState* state, VektorCanvas* canvasOut); +void vektor_canvas_update(VektorCanvas* canvas); +void vektor_canvas_fill(VektorCanvas* canvas, VektorCanvasColor* color); + +VektorCanvasColor vektor_color_new(guchar r, guchar g, guchar b, guchar a); + +#endif \ No newline at end of file diff --git a/ui/main.ui b/ui/main.ui index 2a47398..a1bd344 100644 --- a/ui/main.ui +++ b/ui/main.ui @@ -40,8 +40,11 @@ - - Workspace + + cover + true + true +