feat: add canvas prototype
This commit is contained in:
@@ -15,7 +15,8 @@ gtk = dependency('gtk4', required: true)
|
|||||||
src = files(
|
src = files(
|
||||||
'src/main.c',
|
'src/main.c',
|
||||||
'src/matrix.c',
|
'src/matrix.c',
|
||||||
'src/ui/uicontroller.c'
|
'src/ui/uicontroller.c',
|
||||||
|
'src/ui/vektorcanvas.c'
|
||||||
)
|
)
|
||||||
|
|
||||||
executable(
|
executable(
|
||||||
|
|||||||
@@ -3,6 +3,7 @@
|
|||||||
#include "stdlib.h"
|
#include "stdlib.h"
|
||||||
|
|
||||||
#include "./ui/uicontroller.h"
|
#include "./ui/uicontroller.h"
|
||||||
|
#include "./ui/vektorcanvas.h"
|
||||||
|
|
||||||
|
|
||||||
static void on_map(GtkWidget* window, gpointer user_data) {
|
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));
|
VektorWidgetState* widget_state = (VektorWidgetState*)malloc(sizeof(VektorWidgetState));
|
||||||
vektor_uictrl_init(app, widget_state);
|
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);
|
g_signal_connect(widget_state->window, "map", G_CALLBACK(on_map), widget_state);
|
||||||
|
|
||||||
gtk_window_present(widget_state->window);
|
gtk_window_present(widget_state->window);
|
||||||
|
|||||||
@@ -14,6 +14,7 @@ void vektor_uictrl_init(GtkApplication* app, VektorWidgetState* stateOut) {
|
|||||||
|
|
||||||
stateOut->window = GTK_WINDOW(gtk_builder_get_object(builder, "main_window"));
|
stateOut->window = GTK_WINDOW(gtk_builder_get_object(builder, "main_window"));
|
||||||
stateOut->workspacePaned = GTK_PANED(gtk_builder_get_object(builder, "workspace_paned"));
|
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_application(stateOut->window, app);
|
||||||
gtk_window_set_title(stateOut->window, "Vektor");
|
gtk_window_set_title(stateOut->window, "Vektor");
|
||||||
|
|||||||
@@ -9,8 +9,9 @@ all the widgets used in internal logic of the program
|
|||||||
*/
|
*/
|
||||||
typedef struct VektorWidgetState {
|
typedef struct VektorWidgetState {
|
||||||
GtkWindow* window;
|
GtkWindow* window;
|
||||||
|
|
||||||
GtkPaned* workspacePaned;
|
GtkPaned* workspacePaned;
|
||||||
|
GtkPicture* workspaceCanvas;
|
||||||
|
|
||||||
//GtkWidget* Workspace
|
//GtkWidget* Workspace
|
||||||
} VektorWidgetState;
|
} VektorWidgetState;
|
||||||
|
|
||||||
|
|||||||
65
src/ui/vektorcanvas.c
Normal file
65
src/ui/vektorcanvas.c
Normal file
@@ -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;
|
||||||
|
}
|
||||||
31
src/ui/vektorcanvas.h
Normal file
31
src/ui/vektorcanvas.h
Normal file
@@ -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
|
||||||
@@ -40,8 +40,11 @@
|
|||||||
|
|
||||||
<!--Main viewport area-->
|
<!--Main viewport area-->
|
||||||
<child>
|
<child>
|
||||||
<object class="GtkFrame" id="workspace">
|
<object class="GtkPicture" id="workspace">
|
||||||
<property name="label">Workspace</property>
|
<property name="content-fit">cover</property>
|
||||||
|
<property name="hexpand">true</property>
|
||||||
|
<property name="vexpand">true</property>
|
||||||
|
|
||||||
</object>
|
</object>
|
||||||
</child>
|
</child>
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user