X-Git-Url: http://git.mutantstargoat.com/user/nuclear/?a=blobdiff_plain;f=src%2Fpolyfill.c;h=856ea5f2204c5f045174cfbd3763a10fb84b9092;hb=3eebc6b38f3ad1fd082ae9d4d3263c42c384951c;hp=11e70fd383ea1a0c568222c3f96de966409245d7;hpb=c702b53199b0daae33e67b0d398b460995cd374e;p=gba_blender diff --git a/src/polyfill.c b/src/polyfill.c index 11e70fd..856ea5f 100644 --- a/src/polyfill.c +++ b/src/polyfill.c @@ -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;