gint/src/render-fx/dline.c

64 lines
1.3 KiB
C

#define GINT_NEED_VRAM
#include <gint/display.h>
#include <gint/defs/util.h>
#include <display/fx.h>
/* dhline() - optimized drawing of a horizontal line using a rectangle mask */
void dhline(int x1, int x2, int y, color_t color)
{
if((uint)y >= 64) return;
if(x1 > x2) swap(x1, x2);
/* Get the masks for the [x1, x2] range */
uint32_t m[4];
masks(x1, x2, m);
uint32_t *data = vram + (y << 2);
if(color == color_white)
{
data[0] &= ~m[0];
data[1] &= ~m[1];
data[2] &= ~m[2];
data[3] &= ~m[3];
}
else if(color == color_black)
{
data[0] |= m[0];
data[1] |= m[1];
data[2] |= m[2];
data[3] |= m[3];
}
else if(color == color_invert)
{
data[0] ^= m[0];
data[1] ^= m[1];
data[2] ^= m[2];
data[3] ^= m[3];
}
}
/* dvline() - optimized drawing of a vertical line */
void dvline(int y1, int y2, int x, color_t color)
{
if((uint)x >= 128) return;
if(y1 > y2) swap(y1, y2);
uint32_t *base = vram + (y1 << 2) + (x >> 5);
uint32_t *lword = base + ((y2 - y1 + 1) << 2);
uint32_t mask = 1 << (~x & 31);
if(color == color_white)
{
while(lword > base) lword -= 4, *lword &= ~mask;
}
else if(color == color_black)
{
while(lword > base) lword -= 4, *lword |= mask;
}
else if(color == color_invert)
{
while(lword > base) lword -= 4, *lword ^= mask;
}
}