feat: add rasterization primitives

This commit is contained in:
2026-03-04 15:41:20 +05:30
parent e7b99ed918
commit 1c3fc0c4bd
18 changed files with 386 additions and 152 deletions

View File

@@ -1,32 +1,34 @@
#include "uicontroller.h"
#include "gtk/gtk.h"
void vektor_uictrl_init(GtkApplication* app, VektorWidgetState* stateOut) {
GtkBuilder* builder = gtk_builder_new();
GError* error = NULL;
void vektor_uictrl_init(GtkApplication *app, VektorWidgetState *stateOut) {
GtkBuilder *builder = gtk_builder_new();
GError *error = NULL;
g_print("%s\n", g_get_current_dir());
g_print("%s\n", g_get_current_dir());
// TODO: .ui files as resources instead of sketchy relative paths
if(!gtk_builder_add_from_file(builder, "./ui/main.ui", &error)) {
g_error("Fatal: %s", error->message);
}
// TODO: .ui files as resources instead of sketchy relative paths
if (!gtk_builder_add_from_file(builder, "./ui/main.ui", &error)) {
g_error("Fatal: %s", error->message);
}
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"));
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");
gtk_window_set_default_size(stateOut->window, 800, 600);
gtk_window_set_application(stateOut->window, app);
gtk_window_set_title(stateOut->window, "Vektor");
gtk_window_set_default_size(stateOut->window, 800, 600);
g_object_unref(builder);
g_object_unref(builder);
}
void vektor_uictrl_map(VektorWidgetState* state) {
void vektor_uictrl_map(VektorWidgetState *state) {
// set the workspace divider to 7:3 ratio
int window_width = gtk_widget_get_width(GTK_WIDGET(state->window));
g_print("%i", window_width);
gtk_paned_set_position(state->workspacePaned, 800 * .7);
// set the workspace divider to 7:3 ratio
int window_width = gtk_widget_get_width(GTK_WIDGET(state->window));
g_print("%i", window_width);
gtk_paned_set_position(state->workspacePaned, 800 * .7);
}

View File

@@ -8,14 +8,14 @@ Global application widget state, holding references to
all the widgets used in internal logic of the program
*/
typedef struct VektorWidgetState {
GtkWindow* window;
GtkPaned* workspacePaned;
GtkPicture* workspaceCanvas;
//GtkWidget* Workspace
GtkWindow *window;
GtkPaned *workspacePaned;
GtkPicture *workspaceCanvas;
// GtkWidget* Workspace
} VektorWidgetState;
void vektor_uictrl_init(GtkApplication* app, VektorWidgetState* stateOut);
void vektor_uictrl_map(VektorWidgetState* state);
void vektor_uictrl_init(GtkApplication *app, VektorWidgetState *stateOut);
void vektor_uictrl_map(VektorWidgetState *state);
#endif

View File

@@ -1,65 +1,57 @@
#include "gtk/gtk.h"
#include "vektorcanvas.h"
#include "uicontroller.h"
#include "vektorcanvas.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);
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
);
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));
gtk_picture_set_paintable(canvasOut->canvasWidget,
GDK_PAINTABLE(canvasOut->canvasTexture));
//g_object_unref(bytes);
// 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);
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
);
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));
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;
}
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;
VektorCanvasColor c = {.r = cr, .g = cg, .b = cb, .a = ca};
return c;
}

View File

@@ -4,27 +4,27 @@
#include "uicontroller.h"
typedef struct VektorCanvas {
GtkPicture* canvasWidget;
GtkPicture *canvasWidget;
// texture related stuff
guchar* canvasPixels;
GdkTexture* canvasTexture;
GBytes* canvasPixelBytes;
// texture related stuff
guchar *canvasPixels;
GdkTexture *canvasTexture;
GBytes *canvasPixelBytes;
int width;
int height;
int width;
int height;
} VektorCanvas;
typedef struct VektorCanvasColor {
guchar r;
guchar g;
guchar b;
guchar a;
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);
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);