int32_t x, y0, y1, dx, dy, slope, fx, fy;
short *tab, start, len;
unsigned char *fbptr;
+ uint16_t *pptr, pcol = ((uint16_t)col << 8) | (uint16_t)col;
vlast = varr + vnum - 1;
top = fbheight;
len = scantab[1][i] - start;
if(len > 0) {
- memset(fbptr + start, col, len);
+ if(start & 1) {
+ pptr = (uint16_t*)(fbptr + (start & 0xfffe));
+ *pptr = (*pptr & 0xff) | ((uint16_t)col << 8);
+ len--;
+ start++;
+ }
+ pptr = (uint16_t*)(fbptr + start);
+ while(len > 1) {
+ *pptr++ = pcol;
+ len -= 2;
+ }
+ if(len) {
+ *pptr = (*pptr & 0xff00) | col;
+ }
}
fbptr += fbwidth;
}
return 1;
}
+#define PUTPIXEL(ptr) \
+ do { \
+ uint16_t *pptr = (uint16_t*)((uint32_t)ptr & 0xfffffffe); \
+ if((uint32_t)ptr & 1) { \
+ *pptr = (*pptr & 0xff) | (color << 8); \
+ } else { \
+ *pptr = (*pptr & 0xff00) | color; \
+ } \
+ } while(0)
+
void draw_line(int x0, int y0, int x1, int y1, unsigned short color)
{
int i, dx, dy, x_inc, y_inc, error;
if(dx > dy) {
error = dy * 2 - dx;
for(i=0; i<=dx; i++) {
- *fbptr = color;
+ PUTPIXEL(fbptr);
if(error >= 0) {
error -= dx * 2;
fbptr += y_inc;
} else {
error = dx * 2 - dy;
for(i=0; i<=dy; i++) {
- *fbptr = color;
+ PUTPIXEL(fbptr);
if(error >= 0) {
error -= dy * 2;
fbptr += x_inc;