/* ************************************************************************** */ /* */ /* ML_horizontal_line.c */ /* | Project : libmonochrome */ /* */ /* By: Pierre "PierrotLL" Le Gall */ /* Last updated: 2011/11/22 */ /* */ /* ************************************************************************** */ #include 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; } }