foo
[dos_low3d] / src / polyfill.c
index c5298d4..ff62225 100644 (file)
-#include <stdio.h>\r
-#include <string.h>\r
-#include "3dgfx.h"\r
-#include "util.h"\r
-\r
-static void filltop(struct g3d_vertex *v0, struct g3d_vertex *v1, struct g3d_vertex *v2);\r
-static void fillbot(struct g3d_vertex *v0, struct g3d_vertex *v1, struct g3d_vertex *v2);\r
-\r
-void g3d_polyfill(struct g3d_vertex *verts)\r
-{\r
-       int i, topidx, botidx, mididx;\r
-       int32_t dx, dy, dym;\r
-       struct g3d_vertex vtmp;\r
-\r
-       topidx = botidx = 0;\r
-       for(i=1; i<3; i++) {\r
-               if(verts[i].y < verts[topidx].y) {\r
-                       topidx = i;\r
-               }\r
-               if(verts[i].y > verts[botidx].y) {\r
-                       botidx = i;\r
-               }\r
-       }\r
-       mididx = (topidx + 1) % 3;\r
-       if(mididx == botidx) mididx = (mididx + 1) % 3;\r
-\r
-       dy = verts[botidx].y - verts[topidx].y;\r
-       if(dy == 0) return;\r
-\r
-       dx = verts[botidx].x - verts[topidx].x;\r
-       dym = verts[mididx].y - verts[topidx].y;\r
-       vtmp.x = muldiv(dx, dym, dy) + verts[topidx].x; /* dx * dym / dy + vtop.x */\r
-       vtmp.y = verts[mididx].y;\r
-\r
-       if(verts[topidx].y != verts[mididx].y) {\r
-               filltop(verts + topidx, verts + mididx, &vtmp);\r
-       }\r
-       if(verts[mididx].y != verts[botidx].y) {\r
-               fillbot(verts + mididx, &vtmp, verts + botidx);\r
-       }\r
-}\r
-\r
-static void filltop(struct g3d_vertex *v0, struct g3d_vertex *v1, struct g3d_vertex *v2)\r
-{\r
-       struct g3d_vertex *vtmp;\r
-       int x, xn, y, endy, len;\r
-       int32_t xl, xr, dxl, dxr, dxldy, dxrdy, dy;\r
-       unsigned char *fbptr;\r
-\r
-       if(v1->x > v2->x) {\r
-               vtmp = v1;\r
-               v1 = v2;\r
-               v2 = vtmp;\r
-       }\r
-\r
-       y = v0->y >> 8;\r
-       endy = v1->y >> 8;\r
-       x = v0->x >> 8;\r
-\r
-       fbptr = g3d_fbpixels + y * XRES + x;\r
-\r
-       xl = xr = v0->x;\r
-       dy = v1->y - v0->y;\r
-       dxl = v1->x - v0->x;\r
-       dxr = v2->x - v0->x;\r
-       dxldy = (dxl << 8) / dy;\r
-       dxrdy = (dxr << 8) / dy;\r
-\r
-       while(y++ < endy) {\r
-               len = (xr - xl) >> 8;\r
-               if(len > 0) memset(fbptr, g3d_curcidx, len);\r
-\r
-               xl += dxldy;\r
-               xr += dxrdy;\r
-               xn = xl >> 8;\r
-               fbptr += XRES + (xn - x);\r
-               x = xn;\r
-       }\r
-}\r
-\r
-static void fillbot(struct g3d_vertex *v0, struct g3d_vertex *v1, struct g3d_vertex *v2)\r
-{\r
-       struct g3d_vertex *vtmp;\r
-       int x, xn, y, endy, len;\r
-       int32_t xl, xr, dxl, dxr, dxldy, dxrdy, dy;\r
-       unsigned char *fbptr;\r
-\r
-       if(v0->x > v1->x) {\r
-               vtmp = v0;\r
-               v0 = v1;\r
-               v1 = vtmp;\r
-       }\r
-\r
-       y = v0->y >> 8;\r
-       endy = v2->y >> 8;\r
-       x = v0->x >> 8;\r
-\r
-       fbptr = g3d_fbpixels + y * XRES + x;\r
-\r
-       xl = v0->x;\r
-       xr = v1->x;\r
-       dy = v2->y - v0->y;\r
-       dxl = v2->x - v0->x;\r
-       dxr = v2->x - v1->x;\r
-       dxldy = (dxl << 8) / dy;\r
-       dxrdy = (dxr << 8) / dy;\r
-\r
-       while(y++ < endy) {\r
-               len = (xr - xl) >> 8;\r
-               if(len > 0) memset(fbptr, g3d_curcidx, len);\r
-\r
-               xl += dxldy;\r
-               xr += dxrdy;\r
-               xn = xl >> 8;\r
-               fbptr += XRES + (xn - x);\r
-               x = xn;\r
-       }\r
-}\r
+#include <stdio.h>
+#include <string.h>
+#include "3dgfx.h"
+#include "util.h"
+
+static void filltop(struct g3d_vertex *v0, struct g3d_vertex *v1, struct g3d_vertex *v2);
+static void fillbot(struct g3d_vertex *v0, struct g3d_vertex *v1, struct g3d_vertex *v2);
+
+void g3d_polyfill(struct g3d_vertex *verts)
+{
+       int i, topidx, botidx, mididx;
+       int32_t dx, dy, dym;
+       struct g3d_vertex vtmp;
+
+       topidx = botidx = 0;
+       for(i=1; i<3; i++) {
+               if(verts[i].y < verts[topidx].y) {
+                       topidx = i;
+               }
+               if(verts[i].y > verts[botidx].y) {
+                       botidx = i;
+               }
+       }
+       mididx = (topidx + 1) % 3;
+       if(mididx == botidx) mididx = (mididx + 1) % 3;
+
+       dy = verts[botidx].y - verts[topidx].y;
+       if(dy == 0) return;
+
+       dx = verts[botidx].x - verts[topidx].x;
+       dym = verts[mididx].y - verts[topidx].y;
+       vtmp.x = muldiv(dx, dym, dy) + verts[topidx].x; /* dx * dym / dy + vtop.x */
+       vtmp.y = verts[mididx].y;
+
+       if(verts[topidx].y != verts[mididx].y) {
+               filltop(verts + topidx, verts + mididx, &vtmp);
+       }
+       if(verts[mididx].y != verts[botidx].y) {
+               fillbot(verts + mididx, &vtmp, verts + botidx);
+       }
+}
+
+static void filltop(struct g3d_vertex *v0, struct g3d_vertex *v1, struct g3d_vertex *v2)
+{
+       struct g3d_vertex *vtmp;
+       int x, xn, y, endy, len;
+       int32_t xl, xr, dxl, dxr, dxldy, dxrdy, dy;
+       unsigned char *fbptr;
+
+       if(v1->x > v2->x) {
+               vtmp = v1;
+               v1 = v2;
+               v2 = vtmp;
+       }
+
+       y = v0->y >> 8;
+       endy = v1->y >> 8;
+       if(endy > YRES) endy = YRES;
+       x = v0->x >> 8;
+
+       fbptr = g3d_fbpixels + y * XRES + x;
+
+       xl = xr = v0->x;
+       dy = v1->y - v0->y;
+       dxl = v1->x - v0->x;
+       dxr = v2->x - v0->x;
+       dxldy = (dxl << 8) / dy;
+       dxrdy = (dxr << 8) / dy;
+
+       while(y++ < endy) {
+               if(y > 0) {
+                       len = (xr - xl) >> 8;
+                       if(len > 0) memset(fbptr, g3d_curcidx, len);
+               }
+
+               xl += dxldy;
+               xr += dxrdy;
+               xn = xl >> 8;
+               fbptr += XRES + (xn - x);
+               x = xn;
+       }
+}
+
+static void fillbot(struct g3d_vertex *v0, struct g3d_vertex *v1, struct g3d_vertex *v2)
+{
+       struct g3d_vertex *vtmp;
+       int x, xn, y, endy, len;
+       int32_t xl, xr, dxl, dxr, dxldy, dxrdy, dy;
+       unsigned char *fbptr;
+
+       if(v0->x > v1->x) {
+               vtmp = v0;
+               v0 = v1;
+               v1 = vtmp;
+       }
+
+       y = v0->y >> 8;
+       endy = v2->y >> 8;
+       if(endy > YRES) endy = YRES;
+       x = v0->x >> 8;
+
+       fbptr = g3d_fbpixels + y * XRES + x;
+
+       xl = v0->x;
+       xr = v1->x;
+       dy = v2->y - v0->y;
+       dxl = v2->x - v0->x;
+       dxr = v2->x - v1->x;
+       dxldy = (dxl << 8) / dy;
+       dxrdy = (dxr << 8) / dy;
+
+       while(y++ < endy) {
+               if(y > 0) {
+                       len = (xr - xl) >> 8;
+                       if(len > 0) memset(fbptr, g3d_curcidx, len);
+               }
+
+               xl += dxldy;
+               xr += dxrdy;
+               xn = xl >> 8;
+               fbptr += XRES + (xn - x);
+               x = xn;
+       }
+}