panning
[gba_blender] / src / polyfill.c
index 856ea5f..18294f5 100644 (file)
@@ -208,6 +208,19 @@ int clip_line(int *x0, int *y0, int *x1, int *y1, int xmin, int ymin, int xmax,
        return 1;
 }
 
+#ifdef ALT_LCLIP
+#define PUTPIXEL(ptr) \
+       do { \
+               if(x0 >= 0 && x0 < fbwidth && y0 >= 0 && y0 < fbheight) { \
+                       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)
+#else  /* !ALT_LCLIP */
 #define PUTPIXEL(ptr) \
        do { \
                uint16_t *pptr = (uint16_t*)((uint32_t)ptr & 0xfffffffe); \
@@ -217,10 +230,14 @@ int clip_line(int *x0, int *y0, int *x1, int *y1, int xmin, int ymin, int xmax,
                        *pptr = (*pptr & 0xff00) | color; \
                } \
        } while(0)
+#endif
 
 void draw_line(int x0, int y0, int x1, int y1, unsigned short color)
 {
        int i, dx, dy, x_inc, y_inc, error;
+#ifdef ALT_LCLIP
+       int y0inc;
+#endif
        unsigned char *fbptr = fb;
 
        fbptr += y0 * fbwidth + x0;
@@ -236,8 +253,14 @@ void draw_line(int x0, int y0, int x1, int y1, unsigned short color)
        }
        if(dy >= 0) {
                y_inc = fbwidth;
+#ifdef ALT_LCLIP
+               y0inc = 1;
+#endif
        } else {
                y_inc = -fbwidth;
+#ifdef ALT_LCLIP
+               y0inc = -1;
+#endif
                dy = -dy;
        }
 
@@ -248,9 +271,15 @@ void draw_line(int x0, int y0, int x1, int y1, unsigned short color)
                        if(error >= 0) {
                                error -= dx * 2;
                                fbptr += y_inc;
+#ifdef ALT_LCLIP
+                               y0 += y0inc;
+#endif
                        }
                        error += dy * 2;
                        fbptr += x_inc;
+#ifdef ALT_LCLIP
+                       x0 += x_inc;
+#endif
                }
        } else {
                error = dx * 2 - dy;
@@ -259,9 +288,15 @@ void draw_line(int x0, int y0, int x1, int y1, unsigned short color)
                        if(error >= 0) {
                                error -= dy * 2;
                                fbptr += x_inc;
+#ifdef ALT_LCLIP
+                               x0 += x_inc;
+#endif
                        }
                        error += dx * 2;
                        fbptr += y_inc;
+#ifdef ALT_LCLIP
+                       y0 += y0inc;
+#endif
                }
        }
 }