2016-04-21 23:31:00 +02:00
|
|
|
/* ************************************************************************** */
|
|
|
|
/* */
|
|
|
|
/* ML_vertical_line.c */
|
2016-04-22 07:06:40 +02:00
|
|
|
/* | Project : libmonochrome */
|
2016-04-21 23:31:00 +02:00
|
|
|
/* */
|
|
|
|
/* By: Pierre "PierrotLL" Le Gall <legallpierre89@gmail.com> */
|
|
|
|
/* Last updated: 2011/11/22 */
|
|
|
|
/* */
|
|
|
|
/* ************************************************************************** */
|
|
|
|
|
|
|
|
#include <monochrome/internals.h>
|
|
|
|
|
|
|
|
void ML_vertical_line(int x, int y1, int y2, ML_Color color)
|
|
|
|
{
|
|
|
|
int i, j;
|
2016-05-29 02:59:52 +02:00
|
|
|
char checker, byte, *vram = ML_vram_address();
|
2016-04-21 23:31:00 +02:00
|
|
|
if(x&~127 || (y1<0 && y2<0) || (y1>63 && y2>63)) return;
|
|
|
|
if(y1 > y2)
|
|
|
|
{
|
|
|
|
int tmp = y1;
|
|
|
|
y1 = y2;
|
|
|
|
y2 = tmp;
|
|
|
|
}
|
|
|
|
if(y1 < 0) y1 = 0;
|
|
|
|
if(y2 > 63) y2 = 63;
|
|
|
|
|
|
|
|
i = (y1<<4)+(x>>3);
|
|
|
|
j = (y2<<4)+(x>>3);
|
2016-05-29 02:59:52 +02:00
|
|
|
switch (color)
|
2016-04-21 23:31:00 +02:00
|
|
|
{
|
|
|
|
case ML_BLACK:
|
|
|
|
byte = 128>>(x&7);
|
|
|
|
for( ; i<=j ; i+=16)
|
|
|
|
vram[i] |= byte;
|
|
|
|
break;
|
|
|
|
case ML_WHITE:
|
|
|
|
byte = ~(128>>(x&7));
|
|
|
|
for( ; i<=j ; i+=16)
|
|
|
|
vram[i] &= byte;
|
|
|
|
break;
|
|
|
|
case ML_XOR:
|
|
|
|
byte = 128>>(x&7);
|
|
|
|
for( ; i<=j ; i+=16)
|
|
|
|
vram[i] ^= byte;
|
|
|
|
break;
|
|
|
|
case ML_CHECKER:
|
|
|
|
byte = 128>>(x&7);
|
2016-05-29 02:59:52 +02:00
|
|
|
checker = (y1 & 1) ^ (x & 1);
|
2016-04-21 23:31:00 +02:00
|
|
|
for( ; i<=j ; i+=16)
|
|
|
|
{
|
|
|
|
if(checker) vram[i] &= ~byte;
|
|
|
|
else vram[i] |= byte;
|
|
|
|
checker = !checker;
|
|
|
|
}
|
|
|
|
break;
|
2016-05-29 02:59:52 +02:00
|
|
|
default:
|
|
|
|
break;
|
2016-04-21 23:31:00 +02:00
|
|
|
}
|
|
|
|
}
|