summaryrefslogtreecommitdiff
path: root/FrameRender
diff options
context:
space:
mode:
Diffstat (limited to 'FrameRender')
-rw-r--r--FrameRender/FrameRender.c25
-rw-r--r--FrameRender/FrameRender.h10
-rw-r--r--FrameRender/P_Square.c22
-rw-r--r--FrameRender/P_Square.h14
-rw-r--r--FrameRender/P_TransformCenter.c19
-rw-r--r--FrameRender/P_TransformCenter.h14
-rw-r--r--FrameRender/PixelCallback.h20
7 files changed, 124 insertions, 0 deletions
diff --git a/FrameRender/FrameRender.c b/FrameRender/FrameRender.c
new file mode 100644
index 0000000..bf148bd
--- /dev/null
+++ b/FrameRender/FrameRender.c
@@ -0,0 +1,25 @@
+#include "FrameRender.h"
+#include <string.h>
+
+void RenderFrame(RGBImage buffer, const PixelCallback** callbacks, usize sizeCallbacks) {
+ struct PixelContext pc;
+ for (u32 x = 0; x < buffer.width; ++x) {
+ for (u32 y = 0; y < buffer.height; ++y) {
+ pc.x = x;
+ pc.y = y;
+ pc.pixel.a = pc.pixel.r = pc.pixel.g = pc.pixel.b = 0;
+
+ for (usize i = 0; i < sizeCallbacks; ++i) {
+ // Soft context reset
+ if (callbacks[i] == NULL) {
+ pc.x = x;
+ pc.y = y;
+ }
+ else
+ callbacks[i]->callback(callbacks[i]->callback_self, &pc);
+ }
+
+ memcpy(RGBImage_at(buffer, y, x), &pc.pixel, sizeof(pc.pixel));
+ }
+ }
+}
diff --git a/FrameRender/FrameRender.h b/FrameRender/FrameRender.h
new file mode 100644
index 0000000..09037cb
--- /dev/null
+++ b/FrameRender/FrameRender.h
@@ -0,0 +1,10 @@
+#ifndef _FRAME_RENDER
+#define _FRAME_RENDER
+
+#include "../global.h"
+#include "../RGBImage.h"
+#include "PixelCallback.h"
+
+void RenderFrame(RGBImage buffer, const PixelCallback** callbacks, usize sizeCallbacks);
+
+#endif /* _FRAME_RENDER */
diff --git a/FrameRender/P_Square.c b/FrameRender/P_Square.c
new file mode 100644
index 0000000..7865370
--- /dev/null
+++ b/FrameRender/P_Square.c
@@ -0,0 +1,22 @@
+#include "P_Square.h"
+#include "PixelCallback.h"
+#include <stdlib.h>
+#include <string.h>
+
+void Square_callback(Square* self, struct PixelContext* fc) {
+ if (0 <= fc->x && fc->x <= self->width &&
+ 0 <= fc->y && fc->y <= self->height)
+ {
+ ARGB_set(&fc->pixel, self->color);
+ }
+}
+
+PixelCallback* Square_setup(Square obj) {
+ PixelCallback* pca = malloc(sizeof(struct PixelCallback));
+
+ pca->callback = (PixelCallback_callback)Square_callback;
+ pca->callback_self = malloc(sizeof(obj));
+ memcpy(pca->callback_self, &obj, sizeof(obj));
+
+ return pca;
+}
diff --git a/FrameRender/P_Square.h b/FrameRender/P_Square.h
new file mode 100644
index 0000000..1cfbc45
--- /dev/null
+++ b/FrameRender/P_Square.h
@@ -0,0 +1,14 @@
+#ifndef P_SQUARE
+#define P_SQUARE
+
+#include "PixelCallback.h"
+
+typedef struct Square {
+ u32 width;
+ u32 height;
+ color color;
+} Square;
+
+PixelCallback* Square_setup(Square obj);
+
+#endif /* P_SQUARE */
diff --git a/FrameRender/P_TransformCenter.c b/FrameRender/P_TransformCenter.c
new file mode 100644
index 0000000..5388437
--- /dev/null
+++ b/FrameRender/P_TransformCenter.c
@@ -0,0 +1,19 @@
+#include "P_TransformCenter.h"
+#include "PixelCallback.h"
+#include <stdlib.h>
+#include <string.h>
+
+void TransformCenter_callback(TransformCenter* self, struct PixelContext* pc) {
+ pc->x -= self->centerX;
+ pc->y -= self->centerY;
+}
+
+PixelCallback* TransformCenter_setup(TransformCenter obj) {
+ PixelCallback* pca = malloc(sizeof(struct PixelCallback));
+
+ pca->callback = (PixelCallback_callback)TransformCenter_callback;
+ pca->callback_self = malloc(sizeof(obj));
+ memcpy(pca->callback_self, &obj, sizeof(obj));
+
+ return pca;
+}
diff --git a/FrameRender/P_TransformCenter.h b/FrameRender/P_TransformCenter.h
new file mode 100644
index 0000000..ab75c32
--- /dev/null
+++ b/FrameRender/P_TransformCenter.h
@@ -0,0 +1,14 @@
+#ifndef P_TRANSFORMCENTER
+#define P_TRANSFORMCENTER
+
+#include "PixelCallback.h"
+#include "../global.h"
+
+typedef struct TransformCenter {
+ i32 centerX;
+ i32 centerY;
+} TransformCenter;
+
+PixelCallback* TransformCenter_setup(TransformCenter obj);
+
+#endif /* P_TRANSFORMCENTER */
diff --git a/FrameRender/PixelCallback.h b/FrameRender/PixelCallback.h
new file mode 100644
index 0000000..b0aee1f
--- /dev/null
+++ b/FrameRender/PixelCallback.h
@@ -0,0 +1,20 @@
+#ifndef _PIXEL_CALLBACK
+#define _PIXEL_CALLBACK
+
+#include "../global.h"
+#include "../RGBImage.h"
+
+struct PixelContext {
+ i32 x;
+ i32 y;
+ ARGB pixel;
+};
+
+typedef void (*PixelCallback_callback)(void* self, struct PixelContext* pc);
+
+typedef struct PixelCallback {
+ PixelCallback_callback callback;
+ void* callback_self;
+} PixelCallback;
+
+#endif /* _PIXEL_CALLBACK */