46 #define ABS(x) ((x) < 0 ? -(x) : (x)) 47 #define SGN(x) ((x) < 0 ? -1 : 1) 48 #define MIN(a,b) ((a) < (b) ? (a) : (b)) 49 #define MAX(a,b) ((a) > (b) ? (a) : (b)) 54 #define INDEX_FORWARD(index) \ 55 index = (index + 1) % vertex_list->length; 60 #define INDEX_BACKWARD(index) \ 61 index = (index - 1 + vertex_list->length) % vertex_list->length; 66 #define INDEX_MOVE(index,direction) \ 68 index = (index + 1) % vertex_list->length; \ 70 index = (index - 1 + vertex_list->length) % vertex_list->length; 73 #undef DEBUG_DRAW_SECTOR 104 static const U32BIT sd_tan_table_32[45] = {
105 0x00000000, 0x0477ef65, 0x08f0914a, 0x0d6a98a2, 0x11e6b93a, 0x1665a834,
106 0x1ae81c75, 0x1f6ecf19, 0x23fa7bf0, 0x288be1f7, 0x2d23c3d7, 0x31c2e86e,
107 0x366a1b58, 0x3b1a2d82, 0x3fd3f5c2, 0x4498517a, 0x49682546, 0x4e445dae,
108 0x532defed, 0x5825dabe, 0x5d2d273c, 0x6244e9d4, 0x676e4342, 0x6caa61ad,
109 0x71fa81d2, 0x775ff04d, 0x7cdc0afd, 0x82704286, 0x881e1bfb, 0x8de732af,
110 0x93cd3a2c, 0x99d20064, 0x9ff77016, 0xa63f9376, 0xacac9714, 0xb340cd1d,
111 0xb9feb0ec, 0xc0e8eb10, 0xc80255b6, 0xcf4e01a3, 0xd6cf3bc1, 0xde89935d,
112 0xe680e123, 0xeeb94f05, 0xf7376129
116 static const U32BIT hd_tan_table_32[55] = {
117 0x00000000, 0x03245453, 0x06492628, 0x096ef351, 0x0c963a3d, 0x0fbf7a44,
118 0x12eb3402, 0x1619e99d, 0x194c1f25, 0x1c825ae1, 0x1fbd25b3, 0x22fd0b6d,
119 0x26429b3a, 0x298e67ff, 0x2ce108cc, 0x303b194a, 0x339d3a35, 0x370811de,
120 0x3a7c4cb2, 0x3dfa9dcd, 0x4183bf96, 0x45187469, 0x48b9874a, 0x4c67ccae,
121 0x50242348, 0x53ef74f6, 0x57cab7b9, 0x5bb6eec6, 0x5fb52bad, 0x63c68fa3,
122 0x67ec4ce7, 0x6c27a846, 0x7079facf, 0x74e4b3af, 0x79695a3a, 0x7e099038,
123 0x82c71466, 0x87a3c547, 0x8ca1a444, 0x91c2d926, 0x9709b604, 0x9c78bb9d,
124 0xa2129e4c, 0xa7da4b90, 0xadd2f051, 0xb3ffffff, 0xba653ca2, 0xc106c00a,
125 0xc7e90651, 0xcf10f9e8, 0xd684016b, 0xde480f9b, 0xe663b5dd, 0xeede39b2,
130 static const U32BIT hd_tan_table_rev_32[36] = {
131 0x00000000, 0x065aee12, 0x0cb6da04, 0x1314c252, 0x1975a6b9, 0x1fda88d3,
132 0x26446cbd, 0x2cb459bd, 0x332b5af0, 0x39aa7ff3, 0x4032dda4, 0x46c58ed6,
133 0x4d63b51d, 0x540e799d, 0x5ac70de0, 0x618eacc4, 0x68669b69, 0x6f502a36,
134 0x764cb5f0, 0x7d5da8e0, 0x84847c12, 0x8bc2b8a5, 0x9319f942, 0x9a8beba1,
135 0xa21a523c, 0xa9c7061e, 0xb193f8df, 0xb98336ca, 0xc196e938, 0xc9d15927,
136 0xd234f206, 0xdac444d2, 0xe3820b81, 0xec712cbf, 0xf594c01d, 0xfef012a6
152 static void FreePolygon(
S_POLYGON *polygon);
205 S32BIT mx1 = *x1, my1 = *y1, mx2 = *x2, my2 = *y2;
206 S32BIT dx = mx2 - mx1, adx =
ABS(dx), hadx = adx/2, sdx =
SGN(dx);
207 S32BIT dy = my2 - my1, ady =
ABS(dy), hady = ady/2, sdy =
SGN(dy);
208 S32BIT factor = adx * ady;
209 S32BIT t0 = 0, t1 = factor, r;
215 r = -mx1 * ady * sdx;
216 if (r >= 0 && r <= factor)
229 r = (dla_canvas->
width-1 - mx1) * ady * sdx;
230 if (t0 <= t1 && r >= 0 && r <= factor)
243 r = -my1 * adx * sdy;
244 if (t0 <= t1 && r >= 0 && r <= factor)
257 r = (dla_canvas->
height-1 - my1) * adx * sdy;
258 if (t0 <= t1 && r >= 0 && r <= factor)
272 *x2 = *x1 + (t1 + hady) / ady * sdx;
273 *x1 += (t0 + hady) / ady * sdx;
274 *y2 = *y1 + (t1 + hadx) / adx * sdy;
275 *y1 += (t0 + hadx) / adx * sdy;
301 success = ClipPolygonLeft(polygon);
302 success = success && ClipPolygonRight(polygon);
303 success = success && ClipPolygonTop(polygon);
304 success = success && ClipPolygonBottom(polygon);
331 while (!clipped && cp != NULL)
349 while (success && cp != NULL)
364 printf(
"current point: (%d, %d)\n", cx, cy);
365 printf(
"next point: (%d, %d)\n", nx, ny);
368 if (cx >= 0 && nx < 0)
372 printf(
"(0, %d)\n", cy - cx * (cy - ny) / (cx - nx));
374 success = AppendPoint(&ppl, 0, cy - cx * (cy - ny) / (cx - nx));
377 else if (cx < 0 && nx >= 0)
381 printf(
"(0, %d)\n", ny - nx * (cy - ny) / (cx - nx));
383 success = AppendPoint(&ppl, 0, ny - nx * (cy - ny) / (cx - nx));
386 printf(
"(%d, %d)\n", nx, ny);
388 success = success && AppendPoint(&ppl, nx, ny);
391 else if (cx >= 0 && nx >= 0)
394 printf(
"(%d, %d)\n", nx, ny);
396 success = AppendPoint(&ppl, nx, ny);
413 FreePointList(new_list);
445 width = dla_canvas->
width;
450 while (!clipped && cp != NULL)
468 while (success && cp != NULL)
483 printf(
"current point: (%d, %d)\n", cx, cy);
484 printf(
"next point: (%d, %d)\n", nx, ny);
487 if (cx < width && nx >= width)
491 printf(
"(%d, %d)\n", width,
492 cy + (width - cx) * (cy - ny) / (cx - nx));
494 success = AppendPoint(&ppl, width, cy + (width - cx) * (cy - ny) / (cx - nx));
497 else if (cx >= width && nx < width)
501 printf(
"(%d, %d)\n", width, ny + (width - 1 - nx) * (cy - ny) / (cx - nx));
503 success = AppendPoint(&ppl, width, ny + (width - nx) * (cy - ny) / (cx - nx));
506 printf(
"(%d, %d)\n", nx, ny);
508 success = success && AppendPoint(&ppl, nx, ny);
511 else if (cx < width && nx < width)
514 printf(
"(%d, %d)\n", nx, ny);
516 success = AppendPoint(&ppl, nx, ny);
533 FreePointList(new_list);
567 while (!clipped && cp != NULL)
585 while (success && cp != NULL)
600 printf(
"current point: (%d, %d)\n", cx, cy);
601 printf(
"next point: (%d, %d)\n", nx, ny);
604 if (cy >= 0 && ny < 0)
608 printf(
"(%d, 0)\n", cx - cy * (cx - nx) / (cy - ny));
610 success = AppendPoint(&ppl, cx - cy * (cx - nx) / (cy - ny), 0);
613 else if (cy < 0 && ny >= 0)
617 printf(
"(%d, 0)\n", nx - ny * (cx - nx) / (cy - ny));
619 success = AppendPoint(&ppl, nx - ny * (cx - nx) / (cy - ny), 0);
622 printf(
"(%d, %d)\n", nx, ny);
624 success = success && AppendPoint(&ppl, nx, ny);
627 else if (cy >= 0 && ny >= 0)
630 printf(
"(%d, %d)\n", nx, ny);
632 success = AppendPoint(&ppl, nx, ny);
649 FreePointList(new_list);
681 height = dla_canvas->
height;
686 while (!clipped && cp != NULL)
688 if (cp->
point.
y >= height)
704 while (success && cp != NULL)
719 printf(
"current point: (%d, %d)\n", cx, cy);
720 printf(
"next point: (%d, %d)\n", nx, ny);
723 if (cy < height && ny >= height)
728 cx + (height - cy) * (cx - nx) / (cy - ny), height);
730 success = AppendPoint(&ppl, cx + (height - cy) * (cx - nx) / (cy - ny), height);
733 else if (cy >= height && ny < height)
737 printf(
"(%d, %d)\n", nx + (height - ny) * (cx - nx) / (cy - ny), height);
739 success = AppendPoint(&ppl, nx + (height - ny) * (cx - nx) / (cy - ny), height);
742 printf(
"(%d, %d)\n", nx, ny);
744 success = success && AppendPoint(&ppl, nx, ny);
747 else if (cy < height && ny < height)
750 printf(
"(%d, %d)\n", nx, ny);
752 success = AppendPoint(&ppl, nx, ny);
769 FreePointList(new_list);
800 for (i = 0; success && i < num_points; ++i)
802 success = AppendPoint(&ppl, points[i].x, points[i].y);
804 printf(
"AppendPoint(%d, %d).rc = %d\n",
805 points[i].x, points[i].y, success);
813 FreePolygon(polygon);
826 static void FreePolygon(
S_POLYGON *polygon)
874 if ( ClipPolygon(polygon) && polygon->
num_points > 0 )
894 FillConvexPolygon(&point_list_header, colour);
904 printf(
"ClipPolygon failed\n");
929 if ( x1 < 0 ) x1 = 0;
930 if ( x2 > dla_canvas->
width ) x2 = dla_canvas->
width;
931 if ( y1 < 0 ) y1 = 0;
934 if (x2 > x1 && y2 > y1)
936 stride = dla_canvas->
bf_stride /
sizeof(DLAColor);
937 sp = dla_canvas->
cols + (y1 * stride) + x1;
939 for (i = y1; i != y2; ++i)
941 DLA_MEMSET( sp, colour, x2 );
964 printf(
"DrawLine(%d, %d, %d, %d, %d)\n", x1, y1, x2, y2, width);
969 if ((x1 < 0 && x2 < 0) ||
970 (y1 < 0 && y2 < 0) ||
971 (x1 >= dla_canvas->
width && x2 >= dla_canvas->
width) ||
979 y1 = y1 < 0 ? 0 : y1;
980 y2 = y2 < 0 ? 0 : y2;
981 y1 = y1 >= dla_canvas->
height ? dla_canvas->
height-1 : y1;
982 y2 = y2 >= dla_canvas->
height ? dla_canvas->
height-1 : y2;
983 DrawThinLine(x1, y1, x2, y2, colour);
988 x1 = x1 < 0 ? 0 : x1;
989 x2 = x2 < 0 ? 0 : x2;
990 x1 = x1 >= dla_canvas->
width ? dla_canvas->
width-1 : x1;
991 x2 = x2 >= dla_canvas->
width ? dla_canvas->
width-1 : x2;
992 DrawThinLine(x1, y1, x2, y2, colour);
994 else if (ClipLine(&x1, &y1, &x2, &y2))
996 DrawThinLine(x1, y1, x2, y2, colour);
1001 U16BIT wl = width / 2, ws = (width + 1) / 2;
1003 if ((x1 + ws <= 0 && x2 + ws <= 0) ||
1004 (y1 + ws <= 0 && y2 + ws <= 0) ||
1005 (x1 - wl >= dla_canvas->
width && x2 - wl >= dla_canvas->
width) ||
1006 (y1 - wl >= dla_canvas->
height && y2 - wl >= dla_canvas->
height))
1010 #ifdef SIMPLE_LINES_AS_RECTANGLES 1016 FillSimpleRectangle(x1 - wl, y1, x1 + ws, y2, colour);
1020 FillSimpleRectangle(x1 - wl, y2, x1 + ws, y1, colour);
1024 FillCircle(x1, y1, ws+wl, colour);
1025 FillCircle(x2, y2, ws+wl, colour);
1032 FillSimpleRectangle(x1, y1 - wl, x2, y1 + ws, colour);
1036 FillSimpleRectangle(x2, y1 - wl, x1, y1 + ws, colour);
1040 FillCircle(x1, y1, ws+wl, colour);
1041 FillCircle(x2, y2, ws+wl, colour);
1046 DrawFatLine(x1, y1, x2, y2, ws+wl, colour);
1074 if (
ABS(y2-y1) >
ABS(x2-x1))
1094 delta_y =
ABS(y2 - y1);
1109 for (x = x1; x <= x2; ++x)
1112 assert(x>=0 && x<dla_canvas->height);
1113 assert(y>=0 && y<dla_canvas->width);
1114 PutPixel(y, x, colour);
1116 error = error + delta_y;
1117 if (error * 2 >= delta_x)
1126 for (x = x1; x <= x2; ++x)
1129 assert(x>=0 && x<dla_canvas->width);
1130 assert(y>=0 && y<dla_canvas->height);
1131 PutPixel(x, y, colour);
1132 error = error + delta_y;
1133 if (error * 2 >= delta_x)
1174 d = 41*adx + 94*ady;
1178 d = 41*ady + 94*adx;
1182 a = (width * ady * 100 + d) / (2*d);
1184 b = (width * adx * 100 + d) / (2*d);
1189 corner[0].
x = x1 + a;
1190 corner[0].
y = y1 - b;
1191 corner[1].
x = x1 - a;
1192 corner[1].
y = y1 + b;
1193 corner[2].
x = x2 - a;
1194 corner[2].
y = y2 + b;
1195 corner[3].
x = x2 + a;
1196 corner[3].
y = y2 - b;
1200 corner[0].
x = x1 - a;
1201 corner[0].
y = y1 - b;
1202 corner[1].
x = x1 + a;
1203 corner[1].
y = y1 + b;
1204 corner[2].
x = x2 + a;
1205 corner[2].
y = y2 + b;
1206 corner[3].
x = x2 - a;
1207 corner[3].
y = y2 - b;
1211 if ( ConvertPolygon(corner, 4, &polygon)
1212 && FillPolygon(&polygon, colour) )
1214 FreePolygon(&polygon);
1218 FillCircle(x1 + 1, y1 + 1, width, colour);
1219 FillCircle(x2 + 1, y2 + 1, width, colour);
1233 if (
ABS(y2-y1) >
ABS(x2-x1))
1253 delta_y =
ABS(y2 - y1);
1268 for (x = x1; x <= x2; ++x)
1271 FillCircle(y, x, width, colour);
1272 error = error + delta_y;
1273 if (error * 2 >= delta_x)
1282 for (x = x1; x <= x2; ++x)
1285 FillCircle(x, y, width, colour);
1286 error = error + delta_y;
1287 if (error * 2 >= delta_x)
1305 static void DrawHorizontalLineList(
S_HLINE_LIST *hline_list, DLAColor colour)
1310 DLAColor *ScreenPtr;
1312 stride = dla_canvas->
bf_stride /
sizeof(DLAColor);
1315 ScreenPtr = dla_canvas->
cols + hline_list->
y_start * stride;
1319 hline = hline_list->
hline;
1322 length = hline_list->
length;
1323 while (length-- > 0) {
1329 printf(
"line from %d of %d\n", hline->
x_start, Width);
1332 DLA_MEMSET( ScreenPtr + hline->
x_start, colour, width );
1334 ScreenPtr += stride;
1350 S32BIT cx, cy, rx, ry, px, py;
1351 S32BIT x_change, y_change;
1357 DLAColor *spb, *spt;
1361 stride = dla_canvas->
bf_stride /
sizeof(DLAColor);
1374 two_a2 = 2 * rx * rx;
1375 two_b2 = 2 * ry * ry;
1383 x_change = ry * ry * (1 - 2 * rx);
1386 stop_x = two_b2 * rx;
1389 spt = dla_canvas->
cols + cy * stride;
1390 spb = spt + yadj * stride;
1392 while (stop_x >= stop_y)
1397 t = cx + px + 1 + xadj;
1398 t = t >= dla_canvas->
width ? dla_canvas->
width : t;
1402 if (cy - py >= 0 && cy - py < dla_canvas->height)
1404 DLA_MEMSET( spt + f, colour, t );
1406 if (cy + py + yadj >= 0 && cy + py + yadj < dla_canvas->height)
1408 DLA_MEMSET( spb + f, colour, t );
1418 if (2*error + x_change > 0)
1434 y_change = rx * rx * (1 - 2 * ry);
1437 stop_y = two_a2 * ry;;
1439 spt = dla_canvas->
cols + (cy-py) * stride;
1440 spb = dla_canvas->
cols + (cy+py+yadj) * stride;
1442 while (stop_x <= stop_y)
1448 if (2 * error + y_change > 0)
1454 t = t >= dla_canvas->
width ? dla_canvas->
width : t;
1458 if (cy - py >= 0 && cy - py < dla_canvas->height)
1460 DLA_MEMSET( spt + f, colour, t );
1462 if (cy + py + yadj >= 0 && cy + py + yadj < dla_canvas->height)
1464 DLA_MEMSET( spb + f, colour, t );
1492 S32BIT cx, cy, rx, ry, px, py;
1493 S32BIT x_change, y_change;
1512 two_a2 = 2 * rx * rx;
1513 two_b2 = 2 * ry * ry;
1521 x_change = ry * ry * (1 - 2 * rx);
1524 stop_x = two_b2 * rx;
1527 while (stop_x >= stop_y)
1531 PutPixel(cx+px+xadj, cy+py+yadj, colour);
1532 PutPixel(cx-px, cy+py+yadj, colour);
1533 PutPixel(cx-px, cy-py, colour);
1534 PutPixel(cx+px+xadj, cy-py, colour);
1538 FillCircle(cx+px+xadj, cy+py+yadj, width, colour);
1539 FillCircle(cx-px, cy+py+yadj, width, colour);
1540 FillCircle(cx-px, cy-py, width, colour);
1541 FillCircle(cx+px+xadj, cy-py, width, colour);
1548 if (2*error + x_change > 0)
1564 y_change = rx * rx * (1 - 2 * ry);
1567 stop_y = two_a2 * ry;;
1569 while (stop_x <= stop_y)
1573 PutPixel(cx+px+xadj, cy+py+yadj, colour);
1574 PutPixel(cx-px, cy+py+yadj, colour);
1575 PutPixel(cx-px, cy-py, colour);
1576 PutPixel(cx+px+xadj, cy-py, colour);
1580 FillCircle(cx+px+xadj, cy+py+yadj, width, colour);
1581 FillCircle(cx-px, cy+py+yadj, width, colour);
1582 FillCircle(cx-px, cy-py, width, colour);
1583 FillCircle(cx+px+xadj, cy-py, width, colour);
1590 if (2 * error + y_change > 0)
1619 S32BIT hsx, hsy, hex, hey;
1636 QUADRANT_START_BEFORE_END,
1637 QUADRANT_END_BEFORE_START
1653 end = start + arc - 1;
1659 GetHitPoints(rx, ry, start, &hsx, &hsy);
1660 GetHitPoints(rx, ry, end, &hex, &hey);
1662 hsx += cx + xadj * (hsx > 0);
1663 hex += cx + xadj * (hex > 0);
1664 hsy += cy + yadj * (hsy > 0);
1665 hey += cy + yadj * (hey > 0);
1671 for (i = 0; i < 4; ++i)
1673 quadrant_type[i] = QUADRANT_EMPTY;
1677 for (i = qs + 1; i < qe; ++i)
1679 quadrant_type[i] = QUADRANT_FULL;
1681 quadrant_type[qs] = QUADRANT_START;
1682 quadrant_type[qe] = QUADRANT_END;
1686 for (i = qs + 1; i < qe + 4; ++i)
1688 quadrant_type[i%4] = QUADRANT_FULL;
1690 quadrant_type[qs] = QUADRANT_START;
1691 quadrant_type[qe] = QUADRANT_END;
1697 quadrant_type[qs] = QUADRANT_START_BEFORE_END;
1701 for (i = qs + 1; i < qe + 4; ++i)
1703 quadrant_type[i%4] = QUADRANT_FULL;
1705 quadrant_type[qs] = QUADRANT_END_BEFORE_START;
1710 printf(
"quadrants: %s %s %s %s\n",
1711 quadrant_type[0] == QUADRANT_FULL ?
"QUADRANT_FULL" :
1712 quadrant_type[0] == QUADRANT_EMPTY ?
"QUADRANT_EMPTY" :
1713 quadrant_type[0] == QUADRANT_START ?
"QUADRANT_START" :
1714 quadrant_type[0] == QUADRANT_END ?
"QUADRANT_END" :
1715 quadrant_type[0] == QUADRANT_START_BEFORE_END ?
"QUADRANT_START_BEFORE_END" :
1716 quadrant_type[0] == QUADRANT_END_BEFORE_START ?
"QUADRANT_END_BEFORE_START" :
"UNKNOWN",
1717 quadrant_type[1] == QUADRANT_FULL ?
"QUADRANT_FULL" :
1718 quadrant_type[1] == QUADRANT_EMPTY ?
"QUADRANT_EMPTY" :
1719 quadrant_type[1] == QUADRANT_START ?
"QUADRANT_START" :
1720 quadrant_type[1] == QUADRANT_END ?
"QUADRANT_END" :
1721 quadrant_type[1] == QUADRANT_START_BEFORE_END ?
"QUADRANT_START_BEFORE_END" :
1722 quadrant_type[1] == QUADRANT_END_BEFORE_START ?
"QUADRANT_END_BEFORE_START" :
"UNKNOWN",
1723 quadrant_type[2] == QUADRANT_FULL ?
"QUADRANT_FULL" :
1724 quadrant_type[2] == QUADRANT_EMPTY ?
"QUADRANT_EMPTY" :
1725 quadrant_type[2] == QUADRANT_START ?
"QUADRANT_START" :
1726 quadrant_type[2] == QUADRANT_END ?
"QUADRANT_END" :
1727 quadrant_type[2] == QUADRANT_START_BEFORE_END ?
"QUADRANT_START_BEFORE_END" :
1728 quadrant_type[2] == QUADRANT_END_BEFORE_START ?
"QUADRANT_END_BEFORE_START" :
"UNKNOWN",
1729 quadrant_type[3] == QUADRANT_FULL ?
"QUADRANT_FULL" :
1730 quadrant_type[3] == QUADRANT_EMPTY ?
"QUADRANT_EMPTY" :
1731 quadrant_type[3] == QUADRANT_START ?
"QUADRANT_START" :
1732 quadrant_type[3] == QUADRANT_END ?
"QUADRANT_END" :
1733 quadrant_type[3] == QUADRANT_START_BEFORE_END ?
"QUADRANT_START_BEFORE_END" :
1734 quadrant_type[3] == QUADRANT_END_BEFORE_START ?
"QUADRANT_END_BEFORE_START" :
"UNKNOWN");
1738 two_a2 = 2 * rx * rx;
1739 two_b2 = 2 * ry * ry;
1750 S64AssignS32(&x_change, ry);
1751 S64MultiplyS32(&x_change, ry);
1752 S64MultiplyS32(&x_change, 1 - 2 * rx);
1755 S64AssignS32(&y_change, rx);
1756 S64MultiplyS32(&y_change, rx);
1759 S64AssignS32(&stop_x, two_b2);
1760 S64MultiplyS32(&stop_x, rx);
1763 S64AssignS32(&stop_y, 0);
1766 S64AssignS32(&error, 0);
1769 while (S64CompareS64(&stop_x, &stop_y) >= 0)
1771 if ((quadrant_type[0] == QUADRANT_FULL) ||
1772 (quadrant_type[0] == QUADRANT_START && py2 <= hsy) ||
1773 (quadrant_type[0] == QUADRANT_END && py2 >= hey) ||
1774 (quadrant_type[0] == QUADRANT_START_BEFORE_END && (py2 <= hsy && py2 >= hey)) ||
1775 (quadrant_type[0] == QUADRANT_END_BEFORE_START && (py2 <= hsy || py2 >= hey)))
1779 PutPixel(px1, py2, colour);
1783 FillCircle(px1, py2, width, colour);
1786 if ((quadrant_type[1] == QUADRANT_FULL) ||
1787 (quadrant_type[1] == QUADRANT_START && py2 >= hsy) ||
1788 (quadrant_type[1] == QUADRANT_END && py2 <= hey) ||
1789 (quadrant_type[1] == QUADRANT_START_BEFORE_END && (py2 >= hsy && py2 <= hey)) ||
1790 (quadrant_type[1] == QUADRANT_END_BEFORE_START && (py2 >= hsy || py2 <= hey)))
1794 PutPixel(px2, py2, colour);
1798 FillCircle(px2, py2, width, colour);
1801 if ((quadrant_type[2] == QUADRANT_FULL) ||
1802 (quadrant_type[2] == QUADRANT_START && py1 >= hsy) ||
1803 (quadrant_type[2] == QUADRANT_END && py1 <= hey) ||
1804 (quadrant_type[2] == QUADRANT_START_BEFORE_END && (py1 >= hsy && py1 <= hey)) ||
1805 (quadrant_type[2] == QUADRANT_END_BEFORE_START && (py1 >= hsy || py1 <= hey)))
1809 PutPixel(px2, py1, colour);
1813 FillCircle(px2, py1, width, colour);
1816 if ((quadrant_type[3] == QUADRANT_FULL) ||
1817 (quadrant_type[3] == QUADRANT_START && py1 <= hsy) ||
1818 (quadrant_type[3] == QUADRANT_END && py1 >= hey) ||
1819 (quadrant_type[3] == QUADRANT_START_BEFORE_END && (py1 <= hsy && py1 >= hey)) ||
1820 (quadrant_type[3] == QUADRANT_END_BEFORE_START && (py1 <= hsy || py1 >= hey)))
1824 PutPixel(px1, py1, colour);
1828 FillCircle(px1, py1, width, colour);
1836 S64AddS32(&stop_y, two_a2);
1839 S64AddS64(&error, &y_change);
1842 S64AddS32(&y_change, two_a2);
1845 S64AssignS32(&zero, 0);
1846 S64AssignS32(&temp_check, 0);
1847 S64AddS64(&temp_check, &error);
1848 S64AddS64(&temp_check, &error);
1849 S64AddS64(&temp_check, &x_change);
1851 if (S64CompareS64(&temp_check, &zero) > 0)
1857 S64SubtractS32(&stop_x, two_b2);
1860 S64AddS64(&error, &x_change);
1863 S64AddS32(&x_change, two_b2);
1877 S64AssignS32(&x_change, ry);
1878 S64MultiplyS32(&x_change, ry);
1881 S64AssignS32(&y_change, rx);
1882 S64MultiplyS32(&y_change, rx);
1883 S64MultiplyS32(&y_change, 1 - 2 * ry);
1886 S64AssignS32(&stop_x, 0);
1889 S64AssignS32(&stop_y, two_a2);
1890 S64MultiplyS32(&stop_y, ry);
1893 S64AssignS32(&error, 0);
1896 while (S64CompareS64(&stop_x, &stop_y) <= 0)
1898 if ((quadrant_type[0] == QUADRANT_FULL) ||
1899 (quadrant_type[0] == QUADRANT_START && px1 <= hsx) ||
1900 (quadrant_type[0] == QUADRANT_END && px1 >= hex) ||
1901 (quadrant_type[0] == QUADRANT_START_BEFORE_END && (px1 <= hsx && px1 >= hex)) ||
1902 (quadrant_type[0] == QUADRANT_END_BEFORE_START && (px1 <= hsx || px1 >= hex)))
1906 PutPixel(px1, py2, colour);
1910 FillCircle(px1, py2, width, colour);
1913 if ((quadrant_type[1] == QUADRANT_FULL) ||
1914 (quadrant_type[1] == QUADRANT_START && px2 <= hsx) ||
1915 (quadrant_type[1] == QUADRANT_END && px2 >= hex) ||
1916 (quadrant_type[1] == QUADRANT_START_BEFORE_END && (px2 <= hsx && px2 >= hex)) ||
1917 (quadrant_type[1] == QUADRANT_END_BEFORE_START && (px2 <= hsx || px2 >= hex)))
1921 PutPixel(px2, py2, colour);
1925 FillCircle(px2, py2, width, colour);
1928 if ((quadrant_type[2] == QUADRANT_FULL) ||
1929 (quadrant_type[2] == QUADRANT_START && px2 >= hsx) ||
1930 (quadrant_type[2] == QUADRANT_END && px2 <= hex) ||
1931 (quadrant_type[2] == QUADRANT_START_BEFORE_END && (px2 >= hsx && px2 <= hex)) ||
1932 (quadrant_type[2] == QUADRANT_END_BEFORE_START && (px2 >= hsx || px2 <= hex)))
1936 PutPixel(px2, py1, colour);
1940 FillCircle(px2, py1, width, colour);
1943 if ((quadrant_type[3] == QUADRANT_FULL) ||
1944 (quadrant_type[3] == QUADRANT_START && px1 >= hsx) ||
1945 (quadrant_type[3] == QUADRANT_END && px1 <= hex) ||
1946 (quadrant_type[3] == QUADRANT_START_BEFORE_END && (px1 >= hsx && px1 <= hex)) ||
1947 (quadrant_type[3] == QUADRANT_END_BEFORE_START && (px1 >= hsx || px1 <= hex)))
1951 PutPixel(px1, py1, colour);
1955 FillCircle(px1, py1, width, colour);
1963 S64AddS32(&stop_x, two_b2);
1966 S64AddS64(&error, &x_change);
1969 S64AddS32(&x_change, two_b2);
1972 S64AssignS32(&zero, 0);
1973 S64AssignS32(&temp_check, 0);
1974 S64AddS64(&temp_check, &error);
1975 S64AddS64(&temp_check, &error);
1976 S64AddS64(&temp_check, &y_change);
1978 if (S64CompareS64(&temp_check, &zero) > 0)
1984 S64SubtractS32(&stop_y, two_a2);
1987 S64AddS64(&error, &y_change);
1990 S64AddS32(&y_change, two_a2);
2016 S32BIT hsx, hsy, hex, hey;
2019 S32BIT two_a2, two_b2, stride;
2024 DLAColor *sp1, *sp2;
2027 #ifdef DEBUG_DRAW_SECTOR 2028 printf(
"DrawSector: x %d y %d w %d h %d start %d arc %d lw %d fill %d line %d\n",
2029 x,y,w,h,start,arc,width,(
int)fill_colour,(
int)line_colour);
2039 QUADRANT_START_BEFORE_END,
2040 QUADRANT_END_BEFORE_START
2045 stride = dla_canvas->
bf_stride /
sizeof(DLAColor);
2071 for (i = 0; i < 4; ++i)
2073 quadrant_type[i] = QUADRANT_EMPTY;
2077 for (i = qs + 1; i < qe; ++i)
2079 quadrant_type[i] = QUADRANT_FULL;
2081 quadrant_type[qs] = QUADRANT_START;
2082 quadrant_type[qe] = QUADRANT_END;
2086 for (i = qs + 1; i < qe + 4; ++i)
2088 quadrant_type[i%4] = QUADRANT_FULL;
2090 quadrant_type[qs] = QUADRANT_START;
2091 quadrant_type[qe] = QUADRANT_END;
2097 quadrant_type[qs] = QUADRANT_START_BEFORE_END;
2101 for (i = qs + 1; i < qe + 4; ++i)
2103 quadrant_type[i%4] = QUADRANT_FULL;
2105 quadrant_type[qs] = QUADRANT_END_BEFORE_START;
2109 #ifdef DEBUG_DRAW_SECTOR 2110 printf(
"qs = %d, qe = %d\n", qs, qe);
2111 for (i = 0; i < 4; i++)
2113 printf(
"quadrant_type[%d] = %s\n", i,
2114 quadrant_type[i] == QUADRANT_FULL ?
"QUADRANT_FULL" :
2115 quadrant_type[i] == QUADRANT_EMPTY ?
"QUADRANT_EMPTY" :
2116 quadrant_type[i] == QUADRANT_START ?
"QUADRANT_START" :
2117 quadrant_type[i] == QUADRANT_END ?
"QUADRANT_END" :
2118 quadrant_type[i] == QUADRANT_START_BEFORE_END ?
"QUADRANT_START_BEFORE_END" :
2119 quadrant_type[i] == QUADRANT_END_BEFORE_START ?
"QUADRANT_END_BEFORE_START" :
2125 GetHitPoints(rx, ry, start, &hsx, &hsy);
2126 GetHitPoints(rx, ry, end, &hex, &hey);
2128 hsx += cx + xadj * (hsx >= 0);
2129 hex += cx + xadj * (hex >= 0);
2130 hsy += cy + yadj * (hsy >= 0);
2131 hey += cy + yadj * (hey >= 0);
2133 #ifdef DEBUG_DRAW_SECTOR 2134 printf(
"hsx %d hex %d\nhsy %d hey %d\n", hsx, hex, hsy, hey);
2135 printf(
"cx = %d, cy = %d, xadj = %d, yadj = %d\n", cx, cy, xadj, yadj);
2138 #ifdef DEBUG_DLA_QUAD 2139 printf(
"quadrants: %s %s %s %s\n",
2140 quadrant_type[0] == QUADRANT_FULL ?
"QUADRANT_FULL" :
2141 quadrant_type[0] == QUADRANT_EMPTY ?
"QUADRANT_EMPTY" :
2142 quadrant_type[0] == QUADRANT_START ?
"QUADRANT_START" :
2143 quadrant_type[0] == QUADRANT_END ?
"QUADRANT_END" :
2144 quadrant_type[0] == QUADRANT_START_BEFORE_END ?
"QUADRANT_START_BEFORE_END" :
2145 quadrant_type[0] == QUADRANT_END_BEFORE_START ?
"QUADRANT_END_BEFORE_START" :
"UNKNOWN",
2146 quadrant_type[1] == QUADRANT_FULL ?
"QUADRANT_FULL" :
2147 quadrant_type[1] == QUADRANT_EMPTY ?
"QUADRANT_EMPTY" :
2148 quadrant_type[1] == QUADRANT_START ?
"QUADRANT_START" :
2149 quadrant_type[1] == QUADRANT_END ?
"QUADRANT_END" :
2150 quadrant_type[1] == QUADRANT_START_BEFORE_END ?
"QUADRANT_START_BEFORE_END" :
2151 quadrant_type[1] == QUADRANT_END_BEFORE_START ?
"QUADRANT_END_BEFORE_START" :
"UNKNOWN",
2152 quadrant_type[2] == QUADRANT_FULL ?
"QUADRANT_FULL" :
2153 quadrant_type[2] == QUADRANT_EMPTY ?
"QUADRANT_EMPTY" :
2154 quadrant_type[2] == QUADRANT_START ?
"QUADRANT_START" :
2155 quadrant_type[2] == QUADRANT_END ?
"QUADRANT_END" :
2156 quadrant_type[2] == QUADRANT_START_BEFORE_END ?
"QUADRANT_START_BEFORE_END" :
2157 quadrant_type[2] == QUADRANT_END_BEFORE_START ?
"QUADRANT_END_BEFORE_START" :
"UNKNOWN",
2158 quadrant_type[3] == QUADRANT_FULL ?
"QUADRANT_FULL" :
2159 quadrant_type[3] == QUADRANT_EMPTY ?
"QUADRANT_EMPTY" :
2160 quadrant_type[3] == QUADRANT_START ?
"QUADRANT_START" :
2161 quadrant_type[3] == QUADRANT_END ?
"QUADRANT_END" :
2162 quadrant_type[3] == QUADRANT_START_BEFORE_END ?
"QUADRANT_START_BEFORE_END" :
2163 quadrant_type[3] == QUADRANT_END_BEFORE_START ?
"QUADRANT_END_BEFORE_START" :
"UNKNOWN");
2168 two_a2 = 2 * rx * rx;
2169 two_b2 = 2 * ry * ry;
2181 S64AssignS32(&x_change, ry);
2182 S64MultiplyS32(&x_change, ry);
2183 S64MultiplyS32(&x_change, 1 - 2 * rx);
2186 S64AssignS32(&y_change, rx);
2187 S64MultiplyS32(&y_change, rx);
2190 S64AssignS32(&stop_x, two_b2);
2191 S64MultiplyS32(&stop_x, rx);
2194 S64AssignS32(&stop_y, 0);
2197 S64AssignS32(&error, 0);
2199 sp1 = dla_canvas->
cols + py1 * stride;
2200 sp2 = dla_canvas->
cols + py2 * stride;
2203 printf(
"first phase\n"); fflush(stdout);
2206 while (S64CompareS64(&stop_x, &stop_y) >= 0)
2208 if (py2 >= 0 && py2 < dla_canvas->height)
2211 switch (quadrant_type[0])
2214 FillLine(sp2, cx + xadj, px1 - cx + 1, fill_colour);
2216 case QUADRANT_START:
2219 FillLine(sp2, cx + xadj, px1 - cx + 1, fill_colour);
2225 FillLine(sp2, hex, px1 - hex + 1 + xadj, fill_colour);
2228 case QUADRANT_START_BEFORE_END:
2229 if (py2 <= hsy && py2 >= hey)
2231 FillLine(sp2, hex, px1 - hex + 1 + xadj, fill_colour);
2234 case QUADRANT_END_BEFORE_START:
2237 FillLine(sp2, cx + xadj, px1 - cx + 1, fill_colour);
2241 FillLine(sp2, hex, px1 - hex + 1 + xadj, fill_colour);
2244 case QUADRANT_EMPTY:
2249 switch (quadrant_type[1])
2252 FillLine(sp2, px2, cx - px2 + 1 + xadj, fill_colour);
2254 case QUADRANT_START:
2257 FillLine(sp2, px2, hsx - px2 + 1, fill_colour);
2263 FillLine(sp2, px2, cx - px2 + 1 + xadj, fill_colour);
2266 case QUADRANT_START_BEFORE_END:
2267 if (py2 >= hsy && py2 <= hey)
2269 FillLine(sp2, px2, hsx - px2 + 1, fill_colour);
2272 case QUADRANT_END_BEFORE_START:
2275 FillLine(sp2, px2, hsx - px2 + 1, fill_colour);
2279 FillLine(sp2, px2, cx - px2 + 1 + xadj, fill_colour);
2282 case QUADRANT_EMPTY:
2287 if (py1 >= 0 && py1 < dla_canvas->height)
2290 switch (quadrant_type[2])
2293 FillLine(sp1, px2, cx - px2 + 1 + xadj, fill_colour);
2295 case QUADRANT_START:
2298 FillLine(sp1, px2, cx - px2 + 1 + xadj, fill_colour);
2304 FillLine(sp1, px2, hex - px2 + 1, fill_colour);
2307 case QUADRANT_START_BEFORE_END:
2308 if (py1 >= hsy && py1 <= hey)
2310 FillLine(sp1, px2, hex - px2 + 1, fill_colour);
2313 case QUADRANT_END_BEFORE_START:
2316 FillLine(sp1, px2, cx - px2 + 1 + xadj, fill_colour);
2320 FillLine(sp1, px2, hex - px2 + 1, fill_colour);
2323 case QUADRANT_EMPTY:
2328 switch (quadrant_type[3])
2331 FillLine(sp1, cx + xadj, px1 - cx + 1, fill_colour);
2333 case QUADRANT_START:
2336 FillLine(sp1, hsx, px1 - hsx + 1 + xadj, fill_colour);
2342 FillLine(sp1, cx + xadj, px1 - cx + 1, fill_colour);
2345 case QUADRANT_START_BEFORE_END:
2346 if (py1 <= hsy && py1 >= hey)
2348 FillLine(sp1, hsx, px1 - hsx + 1 + xadj, fill_colour);
2351 case QUADRANT_END_BEFORE_START:
2354 FillLine(sp1, hsx, px1 - hsx + 1 + xadj, fill_colour);
2358 FillLine(sp1, cx + xadj, px1 - cx + 1, fill_colour);
2361 case QUADRANT_EMPTY:
2372 S64AddS32(&stop_y, two_a2);
2375 S64AddS64(&error, &y_change);
2378 S64AddS32(&y_change, two_a2);
2381 S64AssignS32(&zero, 0);
2382 S64AssignS32(&temp_check, 0);
2383 S64AddS64(&temp_check, &error);
2384 S64AddS64(&temp_check, &error);
2385 S64AddS64(&temp_check, &x_change);
2387 if (S64CompareS64(&temp_check, &zero) > 0)
2393 S64SubtractS32(&stop_x, two_b2);
2396 S64AddS64(&error, &x_change);
2399 S64AddS32(&x_change, two_b2);
2413 S64AssignS32(&x_change, ry);
2414 S64MultiplyS32(&x_change, ry);
2417 S64AssignS32(&y_change, rx);
2418 S64MultiplyS32(&y_change, rx);
2419 S64MultiplyS32(&y_change, 1 - 2 * ry);
2422 S64AssignS32(&stop_x, 0);
2425 S64AssignS32(&stop_y, two_a2);
2426 S64MultiplyS32(&stop_y, ry);
2429 S64AssignS32(&error, 0);
2431 sp1 = dla_canvas->
cols + py1 * stride;
2432 sp2 = dla_canvas->
cols + py2 * stride;
2435 while (S64CompareS64(&stop_x, &stop_y) <= 0)
2437 if (py2 >= 0 && py2 < dla_canvas->height)
2440 switch (quadrant_type[0])
2443 FillLine(sp2, cx + xadj, px1 - cx + 1, fill_colour);
2445 case QUADRANT_START:
2448 FillLine(sp2, cx + xadj, px1 - cx + 1, fill_colour);
2454 FillLine(sp2, hex, px1 - hex + 1 + xadj, fill_colour);
2457 case QUADRANT_START_BEFORE_END:
2458 if (px1 <= hsx && px1 >= hex)
2460 FillLine(sp2, hex, px1 - hex + 1 + xadj, fill_colour);
2463 case QUADRANT_END_BEFORE_START:
2466 FillLine(sp2, cx + xadj, px1 - cx + 1, fill_colour);
2470 FillLine(sp2, hex, px1 - hex + 1 + xadj, fill_colour);
2473 case QUADRANT_EMPTY:
2478 switch (quadrant_type[1])
2481 FillLine(sp2, px2, cx - px2 + 1 + xadj, fill_colour);
2483 case QUADRANT_START:
2486 FillLine(sp2, px2, hsx - px2 + 1, fill_colour);
2492 FillLine(sp2, px2, cx - px2 + 1 + xadj, fill_colour);
2495 case QUADRANT_START_BEFORE_END:
2496 if (px2 <= hsx && px2 >= hex)
2498 FillLine(sp2, px2, hsx - px2 + 1, fill_colour);
2501 case QUADRANT_END_BEFORE_START:
2504 FillLine(sp2, px2, hsx - px2 + 1, fill_colour);
2508 FillLine(sp2, px2, cx - px2 + 1 + xadj, fill_colour);
2511 case QUADRANT_EMPTY:
2516 if (py1 >= 0 && py1 < dla_canvas->height)
2519 switch (quadrant_type[2])
2522 FillLine(sp1, px2, cx - px2 + 1 + xadj, fill_colour);
2524 case QUADRANT_START:
2527 FillLine(sp1, px2, cx - px2 + 1 + xadj, fill_colour);
2533 FillLine(sp1, px2, hex - px2 + 1, fill_colour);
2536 case QUADRANT_START_BEFORE_END:
2537 if (px2 >= hsx && px2 <= hex)
2539 FillLine(sp1, px2, hex - px2 + 1, fill_colour);
2542 case QUADRANT_END_BEFORE_START:
2545 FillLine(sp1, px2, cx - px2 + 1 + xadj, fill_colour);
2549 FillLine(sp1, px2, hex - px2 + 1, fill_colour);
2552 case QUADRANT_EMPTY:
2557 switch (quadrant_type[3])
2560 FillLine(sp1, cx + xadj, px1 - cx + 1, fill_colour);
2562 case QUADRANT_START:
2565 FillLine(sp1, hsx, px1 - hsx + 1 + xadj, fill_colour);
2571 FillLine(sp1, cx + xadj, px1 - cx + 1, fill_colour);
2574 case QUADRANT_START_BEFORE_END:
2575 if (px1 >= hsx && px1 <= hex)
2577 FillLine(sp1, hsx, px1 - hsx + 1 + xadj, fill_colour);
2580 case QUADRANT_END_BEFORE_START:
2583 FillLine(sp1, hsx, px1 - hsx + 1 + xadj, fill_colour);
2587 FillLine(sp1, cx + xadj, px1 - cx + 1, fill_colour);
2590 case QUADRANT_EMPTY:
2599 S64AddS32(&stop_x, two_b2);
2602 S64AddS64(&error, &x_change);
2605 S64AddS32(&x_change, two_b2);
2608 S64AssignS32(&zero, 0);
2609 S64AssignS32(&temp_check, 0);
2610 S64AddS64(&temp_check, &error);
2611 S64AddS64(&temp_check, &error);
2612 S64AddS64(&temp_check, &y_change);
2614 if (S64CompareS64(&temp_check, &zero) > 0)
2622 S64SubtractS32(&stop_y, two_a2);
2625 S64AddS64(&error, &y_change);
2628 S64AddS32(&y_change, two_a2);
2638 switch (quadrant_type[0])
2640 case QUADRANT_START:
2641 FillTriangle(cx+xadj-1, hsy-xadj, hsx-xadj, hsy-xadj, cx+xadj-1, cy, fill_colour);
2642 DrawLine(cx+xadj, cy, hsx-xadj, hsy-yadj, width, line_colour);
2645 FillTriangle(hex, hey-yadj-sd_adj, hex, cy+1, cx+xadj-1, cy+1, fill_colour);
2646 DrawLine(cx+xadj, cy, hex, hey-yadj, width, line_colour);
2648 case QUADRANT_START_BEFORE_END:
2649 FillTriangle(hex, hsy, hsx, hsy, cx+xadj-1, cy+1, fill_colour);
2650 DrawLine(cx+xadj-1, cy+1, hsx, hsy, width, line_colour);
2651 FillTriangle(hex, hey-sd_adj, hex, hsy, cx+xadj-1, cy+1, fill_colour);
2652 DrawLine(cx+xadj-1, cy, hex, hey, width, line_colour);
2654 case QUADRANT_END_BEFORE_START:
2655 FillTriangle(cx+xadj-1, hsy, hsx, hsy, cx+xadj-1, cy+1, fill_colour);
2656 DrawLine(cx+xadj-1, cy+1, hsx, hsy, width, line_colour);
2657 FillTriangle(hex, hey-sd_adj, hex, cy+1, cx+xadj-1, cy+1, fill_colour);
2658 DrawLine(cx+xadj-1, cy, hex, hey-sd_adj, width, line_colour);
2664 switch (quadrant_type[1])
2666 case QUADRANT_START:
2667 FillTriangle(hsx, hsy, hsx, cy+1, cx+1, cy+1, fill_colour);
2668 DrawLine(cx+1, cy, hsx, hsy, width, line_colour);
2671 FillTriangle(hex, hey, cx+1, hey, cx+1, cy+1, fill_colour);
2672 DrawLine(cx, cy+1, hex, hey, width, line_colour);
2674 case QUADRANT_START_BEFORE_END:
2675 FillTriangle(hex, hey, hsx, hey, cx+1, cy+1, fill_colour);
2676 DrawLine(cx, cy, hex, hey, width, line_colour);
2677 FillTriangle(hsx, hsy, hsx, hey, cx+1, cy+1, fill_colour);
2678 DrawLine(cx, cy, hsx, hsy, width, line_colour);
2680 case QUADRANT_END_BEFORE_START:
2681 FillTriangle(hsx, hsy, hsx, cy+1, cx+1, cy+1, fill_colour);
2682 DrawLine(cx, cy+1, hsx, hsy, width, line_colour);
2683 FillTriangle(hex, hey, cx+1, hey, cx+1, cy+1, fill_colour);
2684 DrawLine(cx, cy+1, hex, hey, width, line_colour);
2690 switch (quadrant_type[2])
2692 case QUADRANT_START:
2693 FillTriangle(hsx, hsy+1, cx+1, hsy+1, cx+1, cy+yadj, fill_colour);
2694 DrawLine(cx, cy+yadj, hsx, hsy, width, line_colour);
2697 FillTriangle(hex, cy+yadj, hex, hey, cx+1, cy+yadj, fill_colour);
2698 DrawLine(cx, cy+yadj, hex-xadj, hey, width, line_colour);
2700 case QUADRANT_START_BEFORE_END:
2701 FillTriangle(cx+1, cy+yadj, hsx, hsy, hex, hsy, fill_colour);
2702 DrawLine(cx, cy+yadj, hsx, hsy, width, line_colour);
2703 FillTriangle(cx+1, cy+yadj, hex, hsy, hex, hey, fill_colour);
2704 DrawLine(cx, cy+yadj, hex, hey, width, line_colour);
2706 case QUADRANT_END_BEFORE_START:
2707 FillTriangle(hsx, hsy+1, cx+1, hsy+1, cx+1, cy+yadj, fill_colour);
2708 DrawLine(cx, cy+yadj, hsx, hsy, width, line_colour);
2709 FillTriangle(hex, cy+yadj, hex, hey, cx+1, cy+yadj, fill_colour);
2710 DrawLine(cx, cy+yadj, hex, hey, width, line_colour);
2716 switch (quadrant_type[3])
2718 case QUADRANT_START:
2719 FillTriangle(cx+xadj-1, cy+yadj, hsx, cy+yadj, hsx, hsy, fill_colour);
2720 DrawLine(cx+xadj-1, cy+yadj, hsx, hsy, width, line_colour);
2723 FillTriangle(cx+xadj-1, cy+yadj, cx+xadj, hey+1, hex+sd_adj, hey+1, fill_colour);
2724 DrawLine(cx+xadj, cy+yadj, hex, hey, width, line_colour);
2726 case QUADRANT_START_BEFORE_END:
2727 FillTriangle(cx+xadj-1, cy+yadj, hsx, hsy, hsx, hey, fill_colour);
2728 DrawLine(cx+xadj-1, cy+yadj, hsx, hsy, width, line_colour);
2729 FillTriangle(cx+xadj-1, cy+yadj, hsx, hey, hex, hey, fill_colour);
2730 DrawLine(cx+xadj-1, cy+yadj, hex, hey, width, line_colour);
2732 case QUADRANT_END_BEFORE_START:
2733 FillTriangle(cx+xadj-1, cy+yadj, hsx, cy+yadj, hsx, hsy, fill_colour);
2734 DrawLine(cx+xadj-1, cy+yadj, hsx, hsy, width, line_colour);
2735 FillTriangle(cx+xadj-1, cy+yadj, cx+xadj-1, hey+1, hex, hey+1, fill_colour);
2736 DrawLine(cx+xadj-1, cy+yadj, hex, hey, width, line_colour);
2743 DrawArc(x, y, w, h, start, arc, width, line_colour);
2765 t = t >= dla_canvas->
width ? dla_canvas->
width : t;
2769 DLA_MEMSET(
buffer + f, colour, t - f );
2795 printf(
"FillTriangle(%d, %d, %d, %d, %d, %d)\n", x1, y1, x2, y2, x3, y3);
2805 if ( ConvertPolygon(points, 3, &polygon)
2806 && FillPolygon(&polygon, colour) )
2808 FreePolygon(&polygon);
2824 U16BIT radius = width / 2;
2825 U16BIT even = (width % 2 == 0);
2829 S32BIT ddF_y = -2 * radius;
2832 S32BIT line_from_ext, line_to_ext, line_from_int, line_to_int, lf, lt, stride;
2834 DLAColor *sp1, *sp2, *sp3, *sp4;
2839 if (width <= 4 && mg_ctxt.out_osd_width > 720)
2841 FillSimpleRectangle(cx-radius, cy-radius,
2842 cx+radius+even+1, cy+radius+even+1, colour);
2846 stride = dla_canvas->
bf_stride /
sizeof(DLAColor);
2849 if (cx + radius >= 0 && cx - radius < dla_canvas->width &&
2850 cy >= 0 && cy - radius < dla_canvas->height)
2852 sp1 = dla_canvas->
cols + (cy + y - even) * stride;
2853 sp2 = dla_canvas->
cols + (cy - y) * stride;
2854 sp3 = dla_canvas->
cols + (cy + x - even) * stride;
2855 sp4 = dla_canvas->
cols + (cy - x) * stride;
2858 if ( (even == 0) && (cy < dla_canvas->
height) )
2866 if (lt >= dla_canvas->
width)
2868 lt = dla_canvas->
width - 1;
2872 DLA_MEMSET( sp4 + lf, colour, lt );
2875 line_from_ext = cx - x;
2876 line_to_ext = cx + x - even;
2877 line_from_int = cx - y;
2878 line_to_int = cx + y - even;
2906 if (lt >= dla_canvas->
width)
2908 lt = dla_canvas->
width - 1;
2914 if (cy + y - even >= 0 && cy + y - even < dla_canvas->height)
2916 DLA_MEMSET( sp1 + lf, colour, lt );
2918 if (cy - y >= 0 && cy - y < dla_canvas->height)
2920 DLA_MEMSET( sp2 + lf, colour, lt );
2930 if (lt >= dla_canvas->
width)
2932 lt = dla_canvas->
width - 1;
2938 if (cy + x - even >= 0 && cy + x - even < dla_canvas->height)
2940 DLA_MEMSET( sp3 + lf, colour, lt );
2942 if (cy - x >= 0 && cy - x < dla_canvas->height)
2944 DLA_MEMSET( sp4 + lf, colour, lt );
2964 if (x >= 0 && x < dla_canvas->width && y >= 0 && y < dla_canvas->height)
2967 dla_canvas->
cols[x+y*stride] = c;
2991 (**ppl)->point.x = x;
2992 (**ppl)->point.y = y;
2993 *ppl = &((**ppl)->next);
3014 const U32BIT b[] = {0xAAAAAAAA
UL, 0xCCCCCCCC
UL, 0xF0F0F0F0
UL,
3015 0xFF00FF00
UL, 0xFFFF0000UL};
3030 r = (v & b[0]) != 0;
3031 r |= ((v & b[4]) != 0) << 4;
3032 r |= ((v & b[3]) != 0) << 3;
3033 r |= ((v & b[2]) != 0) << 2;
3034 r |= ((v & b[1]) != 0) << 1;
3048 U32BIT temp, g = 0, b = 0x8000, bshft = 15;
3053 temp = ((g << 1) + b) << bshft;
3081 U32BIT numer, numer_factor;
3082 U32BIT denom, denom_factor;
3088 const U32BIT *tan_table_32;
3175 tan_table_32 = sd_tan_table_32;
3181 tan_table_32 = hd_tan_table_32;
3187 degrees = (angle + 32) >> 6;
3188 quadrant = (degrees / 90) & 0x3;
3191 if (degrees == 45 && !hdres)
3193 xh = rx * ry / GetSqrt(rx*rx + ry*ry);
3198 if (quadrant == 1 || quadrant == 3)
3200 degrees = 90 - degrees;
3203 if (degrees < tan_1_deg)
3213 degrees = 90 - degrees;
3222 tan_table_32 = hd_tan_table_rev_32;
3230 denom_factor = GetLog2(rx * rx + ry * ry);
3235 denom_factor += (denom_factor & 1);
3240 tan_factor = (32 - denom_factor) >> 1;
3243 tangens = (tan_table_32[degrees]) >> (32 - tan_factor);
3247 denom = (((rx * rx) * (tangens * tangens)) +
3248 ((ry * ry) << (tan_factor << 1)));
3251 denom = GetSqrt(denom);
3256 numer_factor = GetLog2(numer);
3262 numer <<= (32 - numer_factor);
3263 if (denom_factor + tan_factor > 16)
3265 denom >>= (denom_factor + tan_factor - 16);
3266 tan_factor = 16 - denom_factor;
3270 xh >>= (32 - numer_factor - tan_factor);
3273 tangens = (tan_table_32[degrees]) >> numer_factor;
3276 numer = rx * ry * tangens;
3282 yh >>= (32 - numer_factor - tan_factor);
3336 S32BIT i, min_index_l, max_index, min_index_r, skip_first, temp;
3337 S32BIT min_point_y, max_point_y, top_is_flat, left_edge_dir;
3338 S32BIT next_index, current_index, previous_index;
3339 S32BIT delta_x_n, delta_y_n, delta_x_p, delta_y_p;
3345 printf(
"FillConvexPolygon\n");
3352 if (vertex_list->
length == 0)
3354 max_point_y = min_point_y = vertex[min_index_l = max_index = 0].
y;
3355 for (i = 1; i < vertex_list->
length; i++) {
3356 if (vertex[i].y < min_point_y)
3357 min_point_y = vertex[min_index_l = i].
y;
3358 else if (vertex[i].y > max_point_y)
3359 max_point_y = vertex[max_index = i].
y;
3361 if (min_point_y == max_point_y)
3365 min_index_r = min_index_l;
3366 while (vertex[min_index_r].y == min_point_y)
3371 while (vertex[min_index_l].y == min_point_y)
3378 if ((top_is_flat = (vertex[min_index_l].x !=
3379 vertex[min_index_r].x) ? 1 : 0) == 1) {
3381 if (vertex[min_index_l].x > vertex[min_index_r].x) {
3384 min_index_l = min_index_r;
3390 next_index = min_index_r;
3392 previous_index = min_index_l;
3397 delta_x_n = vertex[next_index].
x - vertex[min_index_l].
x;
3398 delta_y_n = vertex[next_index].
y - vertex[min_index_l].
y;
3399 delta_x_p = vertex[previous_index].
x - vertex[min_index_l].
x;
3400 delta_y_p = vertex[previous_index].
y - vertex[min_index_l].
y;
3401 if (((
long)delta_x_n * delta_y_p - (
long)delta_y_n * delta_x_p) < 0L) {
3404 min_index_l = min_index_r;
3414 if ((working_hline_list.
length =
3415 max_point_y - min_point_y - 1 + top_is_flat) <= 0)
3417 working_hline_list.
y_start = min_point_y + 1 - top_is_flat;
3425 edge_point = working_hline_list.
hline;
3427 previous_index = current_index = min_index_l;
3431 skip_first = top_is_flat ? 0 : 1;
3435 ScanEdge(vertex[previous_index].x,
3436 vertex[previous_index].y,
3437 vertex[current_index].x,
3438 vertex[current_index].y, 1, skip_first, &edge_point);
3439 previous_index = current_index;
3441 }
while (current_index != max_index);
3444 edge_point = working_hline_list.
hline;
3445 previous_index = current_index = min_index_r;
3446 skip_first = top_is_flat ? 0 : 1;
3453 ScanEdge(vertex[previous_index].x - 1,
3454 vertex[previous_index].y,
3455 vertex[current_index].x - 1,
3456 vertex[current_index].y, 0, skip_first, &edge_point);
3457 previous_index = current_index;
3459 }
while (current_index != max_index);
3462 DrawHorizontalLineList(&working_hline_list, colour);
3484 S32BIT y, delta_x, delta_y;
3506 working_edge_point = *edge_point;
3507 for (y = y1 + skip_first; y < y2; y++, working_edge_point++)
3510 if (set_x_start == 1)
3513 x1 + ((y - y1) * delta_x + (delta_y >> 1)) / delta_y;
3517 working_edge_point->
x_end =
3518 x1 + ((y - y1) * delta_x + (delta_y >> 1)) / delta_y;
3521 *edge_point = working_edge_point;
3538 s64->
msw = 0xffffffff;
3563 s64->
msw += (s64->
lsw < t);
3584 s64_var->
lsw += s64_value->
lsw;
3587 s64_var->
msw += (s64_var->
lsw < s64_value->
lsw);
3589 s64_var->
msw += s64_value->
msw;
3608 s64->
msw += (s64->
lsw < t);
3613 s64->
msw += 0xffffffff;
3654 e = (s32 >> 16) & 0xffff;
3657 a = (s64->
msw >> 16) & 0xffff;
3658 b = s64->
msw & 0xffff;
3659 c = (s64->
lsw >> 16) & 0xffff;
3660 d = s64->
lsw & 0xffff;
3670 y = ((lo >> 16) & 0xffff) + x;
3675 lo = (lo & 0xffff) | ((y & 0xffff) << 16);
3676 hi = (y >> 16) & 0xffff;
3680 hi += ((a * f) & 0xffff) << 16;
3681 hi += ((b * e) & 0xffff) << 16;
3688 hi += ((c * s) & 0xffff) << 16;
3689 hi += ((d * s) & 0xffff) << 16;
3714 overflow = (((b > 0) && (diff > a)) || ((b < 0) && (diff < a)));
3720 if (s64_a->
lsw < s64_b->
lsw)
3724 else if (s64_a->
lsw == s64_b->
lsw)
3735 if (sign ^ overflow)
3757 #ifndef VOYAGER_PORT_DEMO 3773 dla_canvas = canvas;
3774 DrawLine(x1, y1, x2, y2, width, colour);
3790 U16BIT width, DLAColor fill_colour, DLAColor line_colour )
3796 if (poly.point_list)
3798 if (poly.num_points > 2)
3800 dla_canvas = canvas;
3801 if ( FillPolygon(&poly, fill_colour) )
3803 cp = poly.point_list;
3804 while (cp->
next != NULL)
3807 width, line_colour);
3811 FillCircle(cp->
point.
x, cp->
point.
y, width, line_colour);
3815 poly.point_list->point.x, poly.point_list->point.y, width, line_colour );
3818 FillCircle(poly.point_list->point.x, poly.point_list->point.y, width, line_colour);
3846 if (poly.point_list)
3848 if (poly.num_points > 2)
3850 dla_canvas = canvas;
3851 cp = poly.point_list;
3852 while (cp->
next != NULL)
3857 if ( (width > 1) && (cp->
next != NULL) )
3869 #ifndef VOYAGER_PORT_DEMO 3885 DLAColor fill_colour, DLAColor line_colour )
3889 if (x1 < x2 && y1 < y2)
3891 dla_canvas = canvas;
3892 FillSimpleRectangle( x1, y1, x2, y2, fill_colour);
3894 DrawLine( x1, y1, x2, y1, y_lw, line_colour );
3895 DrawLine( x2, y1, x2, y2, x_lw, line_colour );
3896 DrawLine( x2, y2, x1, y2, y_lw, line_colour );
3897 DrawLine( x1, y2, x1, y1, x_lw, line_colour );
3898 if (y_lw > 1 && x_lw > 1)
3902 FillCircle( x1, y1, x_lw, line_colour);
3903 FillCircle( x2, y1, x_lw, line_colour);
3904 FillCircle( x2, y2, x_lw, line_colour);
3905 FillCircle( x1, y2, x_lw, line_colour);
3915 FillEllipse( x1, y1, x_lw, y_lw, line_colour);
3916 FillEllipse( x2, y1, x_lw, y_lw, line_colour);
3917 FillEllipse( x2, y2, x_lw, y_lw, line_colour);
3918 FillEllipse( x1, y2, x_lw, y_lw, line_colour);
3942 if (w > 1 && h > 1 && h+w > 4)
3944 dla_canvas = canvas;
3945 FillEllipse(x, y, w, h, fill_colour);
3946 DrawEllipse(x, y, w, h, width, line_colour);
3969 if (start < 23040 && arc != 0 && arc < 23040 && w > 0 && h > 0)
3971 dla_canvas = canvas;
3972 DrawArc(x, y, w, h, start, arc, width, colour);
3997 if (start < 23040 && arc != 0 && arc < 23040 && w > 0 && h > 0)
4003 DLA_FUNCTION(
Rectangle)(canvas, x, y, x+w, y+h, width, width, fill_colour, line_colour);
4009 DLA_FUNCTION(
Rectangle)(canvas, x, y, x+w, y+h, width, width, fill_colour, line_colour);
4013 dla_canvas = canvas;
4014 DrawSector(x, y, w, h, start, arc, width,
4015 fill_colour, line_colour);
4037 dla_canvas = canvas;
4040 DrawThinLine(0, 0, 0, dla_canvas->
height-1, line_colour);
4044 FillSimpleRectangle(0, 0, x1_bw, dla_canvas->
height, line_colour);
4048 DrawThinLine(dla_canvas->
width-1, 0, dla_canvas->
width-1, dla_canvas->
height-1, line_colour);
4052 FillSimpleRectangle(dla_canvas->
width-x2_bw, 0, dla_canvas->
width, dla_canvas->
height, line_colour);
4056 DrawThinLine(0, 0, dla_canvas->
width-1, 0, line_colour);
4060 FillSimpleRectangle(0, 0, dla_canvas->
width, y1_bw, line_colour);
4064 DrawThinLine(0, dla_canvas->
height-1, dla_canvas->
width-1, dla_canvas->
height-1, line_colour);
4068 FillSimpleRectangle(0, dla_canvas->
height-y2_bw, dla_canvas->
width, dla_canvas->
height, line_colour);
struct point_list_header S_POINT_LIST_HEADER
#define FUNCTION_FINISH(name)
#define INDEX_MOVE(index, direction)
void DLA_FUNCTION() Polyline(DLA_Surface *canvas, S_POLYGON poly, U16BIT width, DLAColor colour)
Draw a polyline (sequence of connected lines) on the canvas.
MHEG-5 Graphics: Dynamic Line-Art utility functions.
void DLA_FUNCTION() Ellipse(DLA_Surface *canvas, S16BIT x, S16BIT y, U16BIT w, U16BIT h, U16BIT width, DLAColor fill_colour, DLAColor line_colour)
Draw an ellipse ("oval") on the canvas.
void DLA_FUNCTION() Arc(DLA_Surface *canvas, S16BIT x, S16BIT y, U16BIT w, U16BIT h, U16BIT start, U16BIT arc, U16BIT width, DLAColor colour)
Draw an arc on the canvas.
S_POINT_LIST * point_list
void DLA_FUNCTION() Polygon(DLA_Surface *canvas, S_POLYGON poly, U16BIT width, DLAColor fill_colour, DLAColor line_colour)
Draw a polygon on the canvas.
void DLA_FUNCTION() Rectangle(DLA_Surface *canvas, S16BIT x1, S16BIT y1, S16BIT x2, S16BIT y2, U16BIT x_lw, U16BIT y_lw, DLAColor fill_colour, DLAColor line_colour)
Draw a rectangle on the canvas.
#define INDEX_BACKWARD(index)
struct hline_list S_HLINE_LIST
void DLA_FUNCTION() Line(DLA_Surface *canvas, S16BIT x1, S16BIT y1, S16BIT x2, S16BIT y2, U16BIT width, DLAColor colour)
Draw a line on the canvas.
void DLA_FUNCTION() Border(DLA_Surface *canvas, U16BIT x1_bw, U16BIT y1_bw, U16BIT x2_bw, U16BIT y2_bw, DLAColor line_colour)
Draw a border around the canvas.
#define INDEX_FORWARD(index)
void DLA_FUNCTION() Sector(DLA_Surface *canvas, S16BIT x, S16BIT y, U16BIT w, U16BIT h, U16BIT start, U16BIT arc, U16BIT width, DLAColor fill_colour, DLAColor line_colour)
Draw a sector ("pie slice") on the canvas.
#define FUNCTION_START(name)