fixed 8bit writes to vmem, unaligned data buffers, and started on
[gba_blender] / src / polyfill.c
index 11e70fd..856ea5f 100644 (file)
@@ -41,6 +41,7 @@ void polyfill_flat(struct pvertex *varr, int vnum, unsigned char col)
        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;
@@ -92,7 +93,20 @@ void polyfill_flat(struct pvertex *varr, int vnum, unsigned char col)
                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;
        }
@@ -194,6 +208,16 @@ int clip_line(int *x0, int *y0, int *x1, int *y1, int xmin, int ymin, int xmax,
        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;
@@ -220,7 +244,7 @@ void draw_line(int x0, int y0, int x1, int y1, unsigned short color)
        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;
@@ -231,7 +255,7 @@ void draw_line(int x0, int y0, int x1, int y1, unsigned short color)
        } else {
                error = dx * 2 - dy;
                for(i=0; i<=dy; i++) {
-                       *fbptr = color;
+                       PUTPIXEL(fbptr);
                        if(error >= 0) {
                                error -= dy * 2;
                                fbptr += x_inc;