82 lines
2.7 KiB
C
82 lines
2.7 KiB
C
/* ************************************************************************** */
|
|
/* */
|
|
/* ML_horizontal_line.c */
|
|
/* | Project : libmonochrome */
|
|
/* */
|
|
/* By: Pierre "PierrotLL" Le Gall <legallpierre89@gmail.com> */
|
|
/* Last updated: 2011/11/22 */
|
|
/* */
|
|
/* ************************************************************************** */
|
|
|
|
#include <monochrome/internals.h>
|
|
|
|
void ML_horizontal_line(int y, int x1, int x2, ML_Color color)
|
|
{
|
|
if (y & ~63 || (x1 < 0 && x2 < 0) || (x1 > 127 && x2 > 127))
|
|
return;
|
|
|
|
int i;
|
|
char checker;
|
|
char* vram = ML_vram_address();
|
|
|
|
if (x1 > x2) {
|
|
i = x1;
|
|
x1 = x2;
|
|
x2 = i;
|
|
}
|
|
if (x1 < 0)
|
|
x1 = 0;
|
|
if (x2 > 127)
|
|
x2 = 127;
|
|
switch (color) {
|
|
case ML_BLACK:
|
|
if (x1 >> 3 != x2 >> 3) {
|
|
vram[(y << 4) + (x1 >> 3)] |= 255 >> (x1 & 7);
|
|
vram[(y << 4) + (x2 >> 3)] |= 255 << (7 - (x2 & 7));
|
|
for (i = (x1 >> 3) + 1 ; i < x2 >> 3; i++)
|
|
vram[(y << 4) + i] = 255;
|
|
} else
|
|
vram[(y << 4) + (x1 >> 3)] |= (255 >> (x1 % 8 + 7 - x2 % 8))
|
|
<< (7 - (x2 & 7));
|
|
break;
|
|
case ML_WHITE:
|
|
if (x1 >> 3 != x2 >> 3) {
|
|
vram[(y << 4) + (x1 >> 3)] &= 255 << (8 - (x1 & 7));
|
|
vram[(y << 4) + (x2 >> 3)] &= 255 >> (1 + (x2 & 7));
|
|
for (i = (x1 >> 3) + 1; i < x2 >> 3; i++)
|
|
vram[(y << 4) + i] = 0;
|
|
} else
|
|
vram[(y << 4) + (x1 >> 3)] &= (255 << (8 - (x1 & 7)))
|
|
| (255 >> (1 + (x2 & 7)));
|
|
break;
|
|
case ML_XOR:
|
|
if (x1 >> 3 != x2 >> 3) {
|
|
vram[(y << 4) + (x1 >> 3)] ^= 255 >> (x1 & 7);
|
|
vram[(y << 4) + (x2 >> 3)] ^= 255 << (7 - (x2 & 7));
|
|
for (i = (x1 >> 3) + 1; i < (x2 >> 3); i++)
|
|
vram[(y << 4) + i] ^= 255;
|
|
} else
|
|
vram[(y << 4) + (x1 >> 3)] ^= (255 >> ((x1 & 7) + 7 - (x2 & 7)))
|
|
<< (7 - (x2 & 7));
|
|
break;
|
|
case ML_CHECKER:
|
|
checker = (y & 1 ? 85 : 170);
|
|
if (x1 >> 3 != x2 >> 3) {
|
|
vram[(y << 4) + (x1 >> 3)] &= 255 << (8 - (x1 & 7));
|
|
vram[(y << 4) + (x2 >> 3)] &= 255 >> (1 + (x2 & 7));
|
|
vram[(y << 4) + (x1 >> 3)] |= checker & 255 >> (x1 & 7);
|
|
vram[(y << 4) + (x2 >> 3)] |= checker & 255 << (7 - (x2 & 7));
|
|
for (i = (x1 >> 3) + 1; i < x2 >> 3; i++)
|
|
vram[(y << 4) + i] = checker;
|
|
} else {
|
|
vram[(y << 4) + (x1 >> 3)] &= (255 << (8 - (x1 & 7)))
|
|
| (255 >> (1 + (x2 & 7)));
|
|
vram[(y << 4) + (x1 >> 3)] |= checker
|
|
& (255 >> (x1 % 8 + 7 - x2 % 8)) << (7 - (x2 & 7));
|
|
}
|
|
break;
|
|
default:
|
|
break;
|
|
}
|
|
}
|