summaryrefslogtreecommitdiff
path: root/FrameRender
diff options
context:
space:
mode:
Diffstat (limited to 'FrameRender')
-rw-r--r--FrameRender/P_Checker.c26
-rw-r--r--FrameRender/P_Checker.h14
-rw-r--r--FrameRender/P_Circle.c20
-rw-r--r--FrameRender/P_Circle.h13
-rw-r--r--FrameRender/P_Image.c22
-rw-r--r--FrameRender/P_Image.h13
-rw-r--r--FrameRender/P_Square.c2
-rw-r--r--FrameRender/P_TransformRotate.c23
-rw-r--r--FrameRender/P_TransformRotate.h13
9 files changed, 145 insertions, 1 deletions
diff --git a/FrameRender/P_Checker.c b/FrameRender/P_Checker.c
new file mode 100644
index 0000000..74862f0
--- /dev/null
+++ b/FrameRender/P_Checker.c
@@ -0,0 +1,26 @@
+#include "P_Checker.h"
+#include "PixelCallback.h"
+#include <stdlib.h>
+#include <string.h>
+
+void Checker_callback(Checker* self, struct PixelContext* fc) {
+ u32 x = fc->x / self->squareSize;
+ u32 y = fc->y / self->squareSize;
+
+ if ((x + y) % 2 == 0) {
+ ARGB_merge(&fc->pixel, self->colorA);
+ }
+ else {
+ ARGB_merge(&fc->pixel, self->colorB);
+ }
+}
+
+PixelCallback* Checker_setup(Checker obj) {
+ PixelCallback* pca = malloc(sizeof(struct PixelCallback));
+
+ pca->callback = (PixelCallback_callback)Checker_callback;
+ pca->callback_self = malloc(sizeof(obj));
+ memcpy(pca->callback_self, &obj, sizeof(obj));
+
+ return pca;
+}
diff --git a/FrameRender/P_Checker.h b/FrameRender/P_Checker.h
new file mode 100644
index 0000000..731e55a
--- /dev/null
+++ b/FrameRender/P_Checker.h
@@ -0,0 +1,14 @@
+#ifndef P_CHECKER_PATTERN
+#define P_CHECKER_PATTERN
+
+#include "PixelCallback.h"
+
+typedef struct Checker {
+ u32 squareSize;
+ color colorA;
+ color colorB;
+} Checker;
+
+PixelCallback* Checker_setup(Checker obj);
+
+#endif /* P_CHECKER_PATTERN */
diff --git a/FrameRender/P_Circle.c b/FrameRender/P_Circle.c
new file mode 100644
index 0000000..421904d
--- /dev/null
+++ b/FrameRender/P_Circle.c
@@ -0,0 +1,20 @@
+#include "P_Circle.h"
+#include "PixelCallback.h"
+#include <stdlib.h>
+#include <string.h>
+
+void Circle_callback(Circle* self, struct PixelContext* fc) {
+ if (fc->x * fc->x + fc->y *fc->y <= self->radius * self->radius) {
+ ARGB_merge(&fc->pixel, self->color);
+ }
+}
+
+PixelCallback* Circle_setup(Circle obj) {
+ PixelCallback* pca = malloc(sizeof(struct PixelCallback));
+
+ pca->callback = (PixelCallback_callback)Circle_callback;
+ pca->callback_self = malloc(sizeof(obj));
+ memcpy(pca->callback_self, &obj, sizeof(obj));
+
+ return pca;
+}
diff --git a/FrameRender/P_Circle.h b/FrameRender/P_Circle.h
new file mode 100644
index 0000000..1a6af4a
--- /dev/null
+++ b/FrameRender/P_Circle.h
@@ -0,0 +1,13 @@
+#ifndef P_CIRCLE
+#define P_CIRCLE
+
+#include "PixelCallback.h"
+
+typedef struct Circle {
+ u32 radius;
+ color color;
+} Circle;
+
+PixelCallback* Circle_setup(Circle obj);
+
+#endif /* P_CIRCLE */
diff --git a/FrameRender/P_Image.c b/FrameRender/P_Image.c
new file mode 100644
index 0000000..b95bbd7
--- /dev/null
+++ b/FrameRender/P_Image.c
@@ -0,0 +1,22 @@
+#include "P_Image.h"
+#include "PixelCallback.h"
+#include <stdlib.h>
+#include <string.h>
+
+void Image_callback(Image* self, struct PixelContext* fc) {
+ if (0 <= fc->x && fc->x < self->img.width * self->scale &&
+ 0 <= fc->y && fc->y < self->img.height * self->scale)
+ {
+ ARGB_mergeARGB(&fc->pixel, *RGBImage_at(self->img, fc->y / self->scale, fc->x / self->scale));
+ }
+}
+
+PixelCallback* Image_setup(Image obj) {
+ PixelCallback* pca = malloc(sizeof(struct PixelCallback));
+
+ pca->callback = (PixelCallback_callback)Image_callback;
+ pca->callback_self = malloc(sizeof(obj));
+ memcpy(pca->callback_self, &obj, sizeof(obj));
+
+ return pca;
+}
diff --git a/FrameRender/P_Image.h b/FrameRender/P_Image.h
new file mode 100644
index 0000000..609a7cf
--- /dev/null
+++ b/FrameRender/P_Image.h
@@ -0,0 +1,13 @@
+#ifndef P_IMAGE
+#define P_IMAGE
+
+#include "PixelCallback.h"
+
+typedef struct Image {
+ RGBImage img;
+ double scale;
+} Image;
+
+PixelCallback* Image_setup(Image obj);
+
+#endif /* P_IMAGE */
diff --git a/FrameRender/P_Square.c b/FrameRender/P_Square.c
index 7865370..f5dbef7 100644
--- a/FrameRender/P_Square.c
+++ b/FrameRender/P_Square.c
@@ -7,7 +7,7 @@ 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);
+ ARGB_merge(&fc->pixel, self->color);
}
}
diff --git a/FrameRender/P_TransformRotate.c b/FrameRender/P_TransformRotate.c
new file mode 100644
index 0000000..562c814
--- /dev/null
+++ b/FrameRender/P_TransformRotate.c
@@ -0,0 +1,23 @@
+#include "P_TransformRotate.h"
+#include "PixelCallback.h"
+#include <math.h>
+#include <stdlib.h>
+#include <string.h>
+
+void TransformRotate_callback(TransformRotate* self, struct PixelContext* pc) {
+ u32 xR = pc->x * cos(self->angle) + pc->y * sin(self->angle);
+ u32 yR = - pc->x * sin(self->angle) + pc->y * cos(self->angle);
+
+ pc->x = xR;
+ pc->y = yR;
+}
+
+PixelCallback* TransformRotate_setup(TransformRotate obj) {
+ PixelCallback* pca = malloc(sizeof(struct PixelCallback));
+
+ pca->callback = (PixelCallback_callback)TransformRotate_callback;
+ pca->callback_self = malloc(sizeof(obj));
+ memcpy(pca->callback_self, &obj, sizeof(obj));
+
+ return pca;
+}
diff --git a/FrameRender/P_TransformRotate.h b/FrameRender/P_TransformRotate.h
new file mode 100644
index 0000000..0a2cc88
--- /dev/null
+++ b/FrameRender/P_TransformRotate.h
@@ -0,0 +1,13 @@
+#ifndef P_TRANSFORMROTATE
+#define P_TRANSFORMROTATE
+
+#include "PixelCallback.h"
+#include "../global.h"
+
+typedef struct TransformRotate {
+ double angle;
+} TransformRotate;
+
+PixelCallback* TransformRotate_setup(TransformRotate obj);
+
+#endif /* P_TRANSFORMROTATE */