aboutsummaryrefslogtreecommitdiff
path: root/src/vga.c
diff options
context:
space:
mode:
authorJuan J. Martinez <jjm@usebox.net>2023-07-08 12:38:13 +0100
committerJuan J. Martinez <jjm@usebox.net>2023-07-08 12:38:13 +0100
commitf515c558088a232e0796bfb3e46b6d969f5f204a (patch)
tree1bc61eec33716ef496977d6fe3f4efe6d544a186 /src/vga.c
parent445d861069fde835b1207c046594c3c39437b1d3 (diff)
downloadgold-mine-run-f515c558088a232e0796bfb3e46b6d969f5f204a.tar.gz
gold-mine-run-f515c558088a232e0796bfb3e46b6d969f5f204a.zip
Remove clipping and make the loops more efficient
Diffstat (limited to 'src/vga.c')
-rw-r--r--src/vga.c58
1 files changed, 36 insertions, 22 deletions
diff --git a/src/vga.c b/src/vga.c
index df79c7c..98cb404 100644
--- a/src/vga.c
+++ b/src/vga.c
@@ -91,59 +91,73 @@ void set_palette(const uint8_t *palette)
void blit(const uint8_t *sprite, const Rect *dst)
{
- for (int32_t j = dst->y * 320; j < (dst->y + dst->h) * 320; j += 320)
- for (int16_t i = dst->x; i < dst->x + dst->w; i++)
+ uint8_t *dbuffer = buffer + dst->x + dst->y * 320;
+
+ for (int16_t j = 0; j < dst->h; j++)
+ {
+ for (int16_t i = 0; i < dst->w; i++)
{
uint8_t b = *sprite++;
/* transparent */
if (b == TRANSPARENT)
+ {
+ dbuffer++;
continue;
+ }
- /* clipping */
- if (i < 0 || i >= 320 || j < 0 || j >= 200 * 320)
- continue;
-
- buffer[i + j] = b;
+ *dbuffer++ = b;
}
+ dbuffer += 320 - dst->w;
+ }
}
void blit_c(const uint8_t *sprite, const Rect *dst, uint8_t c)
{
- for (int32_t j = dst->y * 320; j < (dst->y + dst->h) * 320; j += 320)
- for (int16_t i = dst->x; i < dst->x + dst->w; i++)
+ uint8_t *dbuffer = buffer + dst->x + dst->y * 320;
+
+ for (int16_t j = 0; j < dst->h; j++)
+ {
+ for (int16_t i = 0; i < dst->w; i++)
{
uint8_t b = *sprite++;
/* transparent */
if (b == TRANSPARENT)
+ {
+ dbuffer++;
continue;
+ }
- /* clipping */
- if (i < 0 || i >= 320 || j < 0 || j >= 200 * 320)
- continue;
-
- buffer[i + j] = b ? c : b;
+ *dbuffer++ = b ? c : b;
}
+ dbuffer += 320 - dst->w;
+ }
}
void blitrc(const uint8_t *sprite, const Rect *src, const Rect *dst)
{
- for (int32_t j = dst->y * 320, sy = src->y * src->w; j < (dst->y + dst->h) * 320; j += 320, sy += src->w)
- for (int16_t i = dst->x, sx = src->x; i < dst->x + dst->w; i++, sx++)
+ uint8_t *dbuffer = buffer + dst->x + dst->y * 320;
+ sprite += src->x + src->y * src->w;
+
+ for (int16_t j = 0; j < dst->h; j++)
+ {
+ for (int16_t i = 0; i < dst->w; i++)
{
- uint8_t b = sprite[sx + sy];
+ uint8_t b = *sprite++;
/* transparent */
if (b == TRANSPARENT)
+ {
+ dbuffer++;
continue;
+ }
- /* clipping */
- if (i < 0 || i >= 320 || j < 0 || j >= 200 * 320)
- continue;
-
- buffer[i + j] = b;
+ *dbuffer++ = b;
}
+ sprite += src->w - dst->w;
+ dbuffer += 320 - dst->w;
+ }
}
void blit_erase(uint8_t c)