summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorVito Caputo <vcaputo@pengaru.com>2022-05-23 22:09:21 -0700
committerVito Caputo <vcaputo@pengaru.com>2022-05-23 22:55:56 -0700
commitcefe94062f9f3d9687be42277a5e9caf9db9af68 (patch)
treee29880e86519dd5dc2798c072024559cd3567a1d /src
parentf1c36777bdf0464129e8c2e00bb9339868376043 (diff)
modules/shapes: various small fixups
- clear padding when {letter,pillar}boxed - limit costly rendering to shape size area when boxed - fix <= inclusion tests in circle and rhombus: s/<=/</
Diffstat (limited to 'src')
-rw-r--r--src/modules/shapes/shapes.c48
1 files changed, 36 insertions, 12 deletions
diff --git a/src/modules/shapes/shapes.c b/src/modules/shapes/shapes.c
index 6159684..c4ce8f4 100644
--- a/src/modules/shapes/shapes.c
+++ b/src/modules/shapes/shapes.c
@@ -15,7 +15,7 @@
*/
/* The impetus for adding this is a desire for adding a variety of shapes
- * to modueles/checkers. I had started open-coding shapes like circle,
+ * to modules/checkers. I had started open-coding shapes like circle,
* rhombus, pinwheel, and star, directly into checkers with a new style=
* setting for choosing which to use instead of the plain filled square.
*
@@ -56,7 +56,6 @@
*/
-
#include <errno.h>
#include <math.h>
#include <stdlib.h>
@@ -121,6 +120,28 @@ static void shapes_render_fragment(void *context, unsigned ticks, unsigned cpu,
unsigned xoff = (fragment->width - size) >> 1;
unsigned yoff = (fragment->height - size) >> 1;
+ if (!fragment->cleared) {
+ /* when {letter,pillar}boxed we need to clear the padding */
+ if (xoff) {
+ for (int y = 0; y < fragment->height; y++) {
+ for (int x = 0; x < xoff; x++)
+ til_fb_fragment_put_pixel_unchecked(fragment, 0, fragment->x + x, fragment->y + y, 0x0);
+ for (int x = fragment->width - (size + xoff); x < fragment->width; x++)
+ til_fb_fragment_put_pixel_unchecked(fragment, 0, fragment->x + x, fragment->y + y, 0x0);
+ }
+ }
+
+ if (yoff) {
+ for (int y = 0; y < yoff; y++)
+ for (int x = 0; x < fragment->width; x++)
+ til_fb_fragment_put_pixel_unchecked(fragment, 0, fragment->x + x, fragment->y + y, 0x0);
+
+ for (int y = fragment->height - (size + yoff); y < fragment->height; y++)
+ for (int x = 0; x < fragment->width; x++)
+ til_fb_fragment_put_pixel_unchecked(fragment, 0, fragment->x + x, fragment->y + y, 0x0);
+ }
+ }
+
/* eventually these should probably get broken out into functions,
* but it's not too unwieldy for now.
*/
@@ -130,9 +151,9 @@ static void shapes_render_fragment(void *context, unsigned ticks, unsigned cpu,
r_sq *= r_sq;
- for (int y = yoff, Y = -(size >> 1); y < fragment->height; y++, Y++) {
- for (int x = xoff, X = -(size >> 1); x < fragment->width; x++, X++) {
- if (Y*Y+X*X <= r_sq)
+ for (int y = yoff, Y = -(size >> 1); y < yoff + size; y++, Y++) {
+ for (int x = xoff, X = -(size >> 1); x < xoff + size; x++, X++) {
+ if (Y*Y+X*X < r_sq)
til_fb_fragment_put_pixel_unchecked(fragment, TIL_FB_DRAW_FLAG_TEXTURABLE, fragment->x + x, fragment->y + y, 0xffffffff);
else if (!fragment->cleared)
til_fb_fragment_put_pixel_unchecked(fragment, 0, fragment->x + x, fragment->y + y, 0x0);
@@ -147,9 +168,9 @@ static void shapes_render_fragment(void *context, unsigned ticks, unsigned cpu,
float X, Y;
Y = -1.f;
- for (unsigned y = yoff; y < fragment->height; y++, Y += s) {
+ for (unsigned y = yoff; y < yoff + size; y++, Y += s) {
X = -1.f;
- for (unsigned x = xoff; x < fragment->width; x++, X += s) {
+ for (unsigned x = xoff; x < xoff + size; x++, X += s) {
float rad = atan2f(Y, X) + (float)ticks * .001f;
float r = cosf(5.f * rad) * .5f + .5f;
@@ -165,10 +186,13 @@ static void shapes_render_fragment(void *context, unsigned ticks, unsigned cpu,
case SHAPES_TYPE_RHOMBUS: {
int r = (size >> 1);
+ int X, Y;
- for (unsigned y = yoff, Y = -(size >> 1); y < fragment->height; y++, Y++) {
- for (unsigned x = xoff, X = -(size >> 1); x < fragment->width; x++, X++) {
- if (abs(Y)+abs(X) <= r)
+ Y = -(size >> 1);
+ for (unsigned y = yoff; y < yoff + size; y++, Y++) {
+ X = -(size >> 1);
+ for (unsigned x = xoff; x < xoff + size; x++, X++) {
+ if (abs(Y) + abs(X) < r)
til_fb_fragment_put_pixel_unchecked(fragment, TIL_FB_DRAW_FLAG_TEXTURABLE, fragment->x + x, fragment->y + y, 0xffffffff);
else if (!fragment->cleared)
til_fb_fragment_put_pixel_unchecked(fragment, 0, fragment->x + x, fragment->y + y, 0x0);
@@ -183,9 +207,9 @@ static void shapes_render_fragment(void *context, unsigned ticks, unsigned cpu,
float X, Y;
Y = -1.f;
- for (unsigned y = yoff; y < fragment->height; y++, Y += s) {
+ for (unsigned y = yoff; y < yoff + size; y++, Y += s) {
X = -1.f;
- for (unsigned x = xoff; x < fragment->width; x++, X += s) {
+ for (unsigned x = xoff; x < xoff + size; x++, X += s) {
float rad = atan2f(Y, X) + (float)ticks * .001f;
float r = (M_2_PI * asinf(sinf(5 * rad) * .5f + .5f)) * .5f + .5f;
/* ^^^^^^^^^^^^^^^^^^^ approximates a triangle wave */
© All Rights Reserved