78 lines
2.4 KiB
C
78 lines
2.4 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)
|
|
{
|
|
int i;
|
|
char checker;
|
|
char* vram = ML_vram_adress();
|
|
if(y&~63 || (x1<0 && x2<0) || (x1>127 && x2>127)) return;
|
|
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;
|
|
}
|
|
}
|