/* ************************************************************************** */ /* */ /* ML_vertical_line.c */ /* | Project : libmonochrome */ /* */ /* By: Pierre "PierrotLL" Le Gall */ /* Last updated: 2011/11/22 */ /* */ /* ************************************************************************** */ #include void ML_vertical_line(int x, int y1, int y2, ML_Color color) { int i, j; char checker, byte, *vram = ML_vram_address(); 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); switch (color) { 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); checker = (y1 & 1) ^ (x & 1); for( ; i<=j ; i+=16) { if(checker) vram[i] &= ~byte; else vram[i] |= byte; checker = !checker; } break; default: break; } }