#define GINT_NEED_VRAM #include #include #include /* dhline() - optimized drawing of a horizontal line using a rectangle mask */ void dhline(int x1, int x2, int y, color_t color) { if((uint)y >= 64) return; if(x1 > x2) swap(x1, x2); /* Get the masks for the [x1, x2] range */ uint32_t m[4]; masks(x1, x2, m); uint32_t *data = vram + (y << 2); if(color == color_white) { data[0] &= ~m[0]; data[1] &= ~m[1]; data[2] &= ~m[2]; data[3] &= ~m[3]; } else if(color == color_black) { data[0] |= m[0]; data[1] |= m[1]; data[2] |= m[2]; data[3] |= m[3]; } else if(color == color_invert) { data[0] ^= m[0]; data[1] ^= m[1]; data[2] ^= m[2]; data[3] ^= m[3]; } } /* dvline() - optimized drawing of a vertical line */ void dvline(int y1, int y2, int x, color_t color) { if((uint)x >= 128) return; if(y1 > y2) swap(y1, y2); uint32_t *base = vram + (y1 << 2) + (x >> 5); uint32_t *lword = base + ((y2 - y1 + 1) << 2); uint32_t mask = 1 << (~x & 31); if(color == color_white) { while(lword > base) lword -= 4, *lword &= ~mask; } else if(color == color_black) { while(lword > base) lword -= 4, *lword |= mask; } else if(color == color_invert) { while(lword > base) lword -= 4, *lword ^= mask; } }