diff options
Diffstat (limited to 'FrameRender')
| -rw-r--r-- | FrameRender/FrameRender.c | 25 | ||||
| -rw-r--r-- | FrameRender/FrameRender.h | 10 | ||||
| -rw-r--r-- | FrameRender/P_Square.c | 22 | ||||
| -rw-r--r-- | FrameRender/P_Square.h | 14 | ||||
| -rw-r--r-- | FrameRender/P_TransformCenter.c | 19 | ||||
| -rw-r--r-- | FrameRender/P_TransformCenter.h | 14 | ||||
| -rw-r--r-- | FrameRender/PixelCallback.h | 20 |
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 */ |
