this repo has no description
0
fork

Configure Feed

Select the types of activity you want to include in your feed.

fixed elli/ellib/circ/circb functions #1532

nesbox 1a1a3350 4100a89d

+27 -39
+27 -39
src/core/draw.c
··· 477 477 } 478 478 } 479 479 480 - static void drawEllipse(tic_mem* memory, s64 x0, s64 y0, s64 a, s64 b, u8 color, PixelFunc pix) 480 + static void drawEllipse(tic_mem* memory, s32 x0, s32 y0, s32 x1, s32 y1, u8 color, PixelFunc pix) 481 481 { 482 - if(a <= 0) return; 483 - if(b <= 0) return; 482 + s64 a = abs(x1 - x0), b = abs(y1 - y0), b1 = b & 1; /* values of diameter */ 483 + s64 dx = 4 * (1 - a) * b * b, dy = 4 * (b1 + 1) * a * a; /* error increment */ 484 + s64 err = dx + dy + b1 * a * a, e2; /* error of 1.step */ 484 485 485 - s64 aa2 = a*a*2, bb2 = b*b*2; 486 + if (x0 > x1) { x0 = x1; x1 += a; } /* if called with swapped pos32s */ 487 + if (y0 > y1) y0 = y1; /* .. exchange them */ 488 + y0 += (b + 1) / 2; y1 = y0 - b1; /* starting pixel */ 489 + a *= 8 * a; b1 = 8 * b * b; 486 490 491 + do 487 492 { 488 - s64 x = a, y = 0; 489 - s64 dx = (1-2*a)*b*b, dy = a*a; 490 - s64 sx = bb2*a, sy=0; 491 - s64 e = 0; 492 - 493 - while (sx >= sy) 494 - { 495 - pix(memory, (s32)(x0+x), (s32)(y0+y), color); /* I. Quadrant */ 496 - pix(memory, (s32)(x0+x), (s32)(y0-y), color); /* II. Quadrant */ 497 - pix(memory, (s32)(x0-x), (s32)(y0+y), color); /* III. Quadrant */ 498 - pix(memory, (s32)(x0-x), (s32)(y0-y), color); /* IV. Quadrant */ 499 - y++; sy += aa2; e += dy; dy += aa2; 500 - if(2*e+dx >0) { x--; sx -= bb2; e += dx; dx += bb2; } 501 - } 502 - } 503 - 504 - { 505 - s64 x = 0, y = b; 506 - s64 dx = b*b, dy = (1-2*b)*a*a; 507 - s64 sx = 0, sy=aa2*b; 508 - s64 e = 0; 493 + pix(memory, x1, y0, color); /* I. Quadrant */ 494 + pix(memory, x0, y0, color); /* II. Quadrant */ 495 + pix(memory, x0, y1, color); /* III. Quadrant */ 496 + pix(memory, x1, y1, color); /* IV. Quadrant */ 497 + e2 = 2 * err; 498 + if (e2 <= dy) { y0++; y1--; err += dy += a; } /* y step */ 499 + if (e2 >= dx || 2 * err > dy) { x0++; x1--; err += dx += b1; } /* x step */ 500 + } while (x0 <= x1); 509 501 510 - while (sy >= sx) 511 - { 512 - pix(memory, (s32)(x0+x), (s32)(y0+y), color); /* I. Quadrant */ 513 - pix(memory, (s32)(x0+x), (s32)(y0-y), color); /* II. Quadrant */ 514 - pix(memory, (s32)(x0-x), (s32)(y0+y), color); /* III. Quadrant */ 515 - pix(memory, (s32)(x0-x), (s32)(y0-y), color); /* IV. Quadrant */ 516 - 517 - x++; sx += bb2; e += dx; dx += bb2; 518 - if(2*e+dy >0) { y--; sy -= aa2; e += dy; dy += aa2; } 519 - } 502 + while (y0-y1 < b) 503 + { /* too early stop of flat ellipses a=1 */ 504 + pix(memory, x0 - 1, y0, color); /* -> finish tip of ellipse */ 505 + pix(memory, x1 + 1, y0++, color); 506 + pix(memory, x0 - 1, y1, color); 507 + pix(memory, x1 + 1, y1--, color); 520 508 } 521 509 } 522 510 ··· 552 540 void tic_api_circ(tic_mem* memory, s32 x, s32 y, s32 r, u8 color) 553 541 { 554 542 initSidesBuffer(); 555 - drawEllipse(memory, x, y, r, r, 0, setElliSide); 543 + drawEllipse(memory, x - r, y - r, x + r, y + r, 0, setElliSide); 556 544 drawSidesBuffer(memory, y - r, y + r + 1, color); 557 545 } 558 546 559 547 void tic_api_circb(tic_mem* memory, s32 x, s32 y, s32 r, u8 color) 560 548 { 561 - drawEllipse(memory, x, y, r, r, mapColor(memory, color), setElliPixel); 549 + drawEllipse(memory, x - r, y - r, x + r, y + r, mapColor(memory, color), setElliPixel); 562 550 } 563 551 564 552 void tic_api_elli(tic_mem* memory, s32 x, s32 y, s32 a, s32 b, u8 color) 565 553 { 566 554 initSidesBuffer(); 567 - drawEllipse(memory, x , y, a, b, 0, setElliSide); 555 + drawEllipse(memory, x - a, y - b, x + a, y + b, 0, setElliSide); 568 556 drawSidesBuffer(memory, y - b, y + b + 1, color); 569 557 } 570 558 571 559 void tic_api_ellib(tic_mem* memory, s32 x, s32 y, s32 a, s32 b, u8 color) 572 560 { 573 - drawEllipse(memory, x, y, a, b, mapColor(memory, color), setElliPixel); 561 + drawEllipse(memory, x - a, y - b, x + a, y + b, mapColor(memory, color), setElliPixel); 574 562 } 575 563 576 564 static inline float initLine(float *x0, float *x1, float *y0, float *y1)