Skip to content
Snippets Groups Projects
Commit 19f0c215 authored by Deucе's avatar Deucе :ok_hand_tone4:
Browse files

More improvements...

Consistently use map_rip_color()
Optimize flood fill to not clobber the stack
Fix small full ellipses to match RIPTerm 1.54
parent faca73d3
No related branches found
No related tags found
1 merge request!463MRC mods by Codefenix (2024-10-20)
Pipeline #2128 passed
...@@ -7607,6 +7607,24 @@ rv_mouse(const char * const var, const void * const data) ...@@ -7607,6 +7607,24 @@ rv_mouse(const char * const var, const void * const data)
return NULL; return NULL;
} }
   
static uint32_t
map_rip_color(int color)
{
uint32_t col = 0;
if (color < 16)
col = ega_colours[color];
else if (color < 256) {
col = 0x80000000
| ((default_mapped[color][0] << 2 | (default_mapped[color][0] & 3)) << 16)
| ((default_mapped[color][1] << 2 | (default_mapped[color][1] & 3)) << 8)
| ((default_mapped[color][2] << 2 | (default_mapped[color][2] & 3)));
}
else
fprintf(stderr, "Unable to map %d\n", color);
return col;
}
static char * static char *
rv_reset(const char * const var, const void * const data) rv_reset(const char * const var, const void * const data)
{ {
...@@ -7656,8 +7674,8 @@ rv_reset(const char * const var, const void * const data) ...@@ -7656,8 +7674,8 @@ rv_reset(const char * const var, const void * const data)
cterm->extattr |= CTERM_EXTATTR_ORIGINMODE; cterm->extattr |= CTERM_EXTATTR_ORIGINMODE;
cterm->extattr |= CTERM_EXTATTR_AUTOWRAP; cterm->extattr |= CTERM_EXTATTR_AUTOWRAP;
cterm->attr = 15; cterm->attr = 15;
cterm->fg_color = ega_colours[15]; cterm->fg_color = map_rip_color(15);
cterm->bg_color = ega_colours[0]; cterm->bg_color = map_rip_color(0);
setwindow(cterm); setwindow(cterm);
cterm_gotoxy(cterm, 1, 1); cterm_gotoxy(cterm, 1, 1);
clrscr(); clrscr();
...@@ -7693,24 +7711,6 @@ rv_restore(const char * const var, const void * const data) ...@@ -7693,24 +7711,6 @@ rv_restore(const char * const var, const void * const data)
return NULL; return NULL;
} }
   
static uint32_t
map_rip_color(int color)
{
uint32_t col = 0;
if (color < 16)
col = ega_colours[color];
else if (color < 256) {
col = 0x80000000
| ((default_mapped[color][0] << 2 | (default_mapped[color][0] & 3)) << 16)
| ((default_mapped[color][1] << 2 | (default_mapped[color][1] & 3)) << 8)
| ((default_mapped[color][2] << 2 | (default_mapped[color][2] & 3)));
}
else
fprintf(stderr, "Unable to map %d\n", color);
return col;
}
static int static int
unmap_rip_x(int x) unmap_rip_x(int x)
{ {
...@@ -8821,7 +8821,7 @@ draw_button(struct rip_button_style *but, bool inverted) ...@@ -8821,7 +8821,7 @@ draw_button(struct rip_button_style *but, bool inverted)
} }
else { else {
fg = map_rip_color(but->cfore); fg = map_rip_color(but->cfore);
bg = ega_colours[0]; bg = map_rip_color(0);
ds = map_rip_color(but->cdshadow); ds = map_rip_color(but->cdshadow);
ch = map_rip_color(but->chighlight); ch = map_rip_color(but->chighlight);
cs = map_rip_color(but->cshadow); cs = map_rip_color(but->cshadow);
...@@ -9141,12 +9141,12 @@ do_popup(const char * const str) ...@@ -9141,12 +9141,12 @@ do_popup(const char * const str)
int ret; int ret;
struct ciolib_pixels *pix; struct ciolib_pixels *pix;
   
black = ega_colours[0]; black = map_rip_color(0);
yellow = ega_colours[14]; yellow = map_rip_color(14);
white = ega_colours[15]; white = map_rip_color(15);
dark = ega_colours[8]; dark = map_rip_color(8);
light = ega_colours[7]; light = map_rip_color(7);
blue = ega_colours[1]; blue = map_rip_color(1);
p = (char *)str; p = (char *)str;
if (str[0] == '*') { if (str[0] == '*') {
must_answer = true; must_answer = true;
...@@ -9657,46 +9657,61 @@ draw_ellipse(int x1, int y1, int arg1, int arg2, int x2, int y2) ...@@ -9657,46 +9657,61 @@ draw_ellipse(int x1, int y1, int arg1, int arg2, int x2, int y2)
static void static void
full_ellipse(int xc, int yc, int a, int b, bool fill) full_ellipse(int xc, int yc, int a, int b, bool fill)
{ {
if (b == 0) {
b = 1;
a--;
}
if (a <= 0)
a = 1;
int x = 0, y = b; int x = 0, y = b;
long a2 = (long)a*a, b2 = (long)b*b; long a2 = (long)a*a;
long b2 = (long)b*b;
long crit1 = -(a2/4 + a%2 + b2); long crit1 = -(a2/4 + a%2 + b2);
long crit2 = -(b2/4 + b%2 + a2); long crit2 = -(b2/4 + b%2 + a2);
long crit3 = -(b2/4 + b%2); long crit3 = -(b2/4 + b%2);
long t = -a2*y; /* t = e(x+1/2,y-1/2) - (a²+b²)/4 */ long t = -(a2*y); /* t = e(x+1/2,y-1/2) - (a²+b²)/4 */
long dxt = 2*b2*x, dyt = -2*a2*y; long dxt = 2*b2*x, dyt = -2*a2*y;
long d2xt = 2*b2, d2yt = 2*a2; long d2xt = 2*b2, d2yt = 2*a2;
int fy; int fy;
bool skip = false;
   
while(y>=0 && x<=a) { while(y>=0 && x<=a) {
if(x!=0 || y!=0) { if (!skip) {
if (fill) { if(x!=0 || y!=0) {
if (x == 0) { if (fill) {
for (fy = yc - y + 1; fy < yc + y; fy++) { if (x == 0) {
fill_pixel(xc, fy); for (fy = yc - y + 1; fy < yc + y; fy++) {
fill_pixel(xc, fy);
}
} }
} }
if (rip.color)
draw_pixel(xc-x, yc-y);
} }
if (rip.color) if(x!=0 && y!=0) {
draw_pixel(xc-x, yc-y); if (fill) {
} for (fy = yc - y + 1; fy < yc + y; fy++) {
if(x!=0 && y!=0) { fill_pixel(xc - x, fy);
if (fill) { fill_pixel(xc + x, fy);
for (fy = yc - y + 1; fy < yc + y; fy++) { }
fill_pixel(xc - x, fy);
fill_pixel(xc + x, fy);
} }
} if (rip.color) {
if (rip.color) { if (rip.borders) {
if (rip.borders) { draw_pixel(xc+x, yc-y);
draw_pixel(xc+x, yc-y); draw_pixel(xc-x, yc+y);
draw_pixel(xc-x, yc+y); }
} }
} }
draw_pixel(xc+x, yc+y);
} }
draw_pixel(xc+x, yc+y); skip = false;
if(t + b2*x <= crit1 || /* e(x+1,y-1/2) <= 0 */ if(t + b2*x <= crit1 || /* e(x+1,y-1/2) <= 0 */
t+a2*y <= crit3) /* e(x+1/2,y) <= 0 */ t+a2*y <= crit3) { /* e(x+1/2,y) <= 0 */
incx(); incx();
// Angle move, skip next...
if (!(t + b2*x <= crit1 || t+a2*y <= crit3) && (t - a2*y > crit2))
skip = true;
}
else if(t - a2*y > crit2) /* e(x+1/2,y-1) > 0 */ else if(t - a2*y > crit2) /* e(x+1/2,y-1) > 0 */
incy(); incy();
else { else {
...@@ -9743,7 +9758,7 @@ bff_push(struct saved_point **stack, int x, int y) ...@@ -9743,7 +9758,7 @@ bff_push(struct saved_point **stack, int x, int y)
*/ */
   
static void static void
broken_flood_fill(struct ciolib_pixels *pix, int x, int y, uint32_t edge, uint32_t fillfg, uint32_t fillbg, bool iszero, int oy) broken_flood_fill(struct ciolib_pixels *pix, int x, int y, uint32_t edge, uint32_t fillfg, uint32_t fillbg, bool iszero, int oy, struct saved_point** orig_stack)
{ {
bool nextline = false; bool nextline = false;
bool prevline = false; bool prevline = false;
...@@ -9751,9 +9766,12 @@ broken_flood_fill(struct ciolib_pixels *pix, int x, int y, uint32_t edge, uint32 ...@@ -9751,9 +9766,12 @@ broken_flood_fill(struct ciolib_pixels *pix, int x, int y, uint32_t edge, uint32
int noff; int noff;
int poff; int poff;
int vx, vy; int vx, vy;
struct saved_point *stack = NULL; struct saved_point **stack = orig_stack;
struct saved_point *new_stack = NULL;
struct saved_point *this = NULL; struct saved_point *this = NULL;
   
if (stack == NULL)
stack = &new_stack;
if (x < 0 || y < 0) if (x < 0 || y < 0)
return; return;
if (x >= pix->width) if (x >= pix->width)
...@@ -9815,7 +9833,7 @@ broken_flood_fill(struct ciolib_pixels *pix, int x, int y, uint32_t edge, uint32 ...@@ -9815,7 +9833,7 @@ broken_flood_fill(struct ciolib_pixels *pix, int x, int y, uint32_t edge, uint32
if (pix->pixels[poff] != edge) { if (pix->pixels[poff] != edge) {
prevline = true; prevline = true;
if ((pix->pixels[poff] & 0x40000000) == 0) if ((pix->pixels[poff] & 0x40000000) == 0)
bff_push(&stack, x, y - 1); bff_push(stack, x, y - 1);
} }
} }
} }
...@@ -9831,7 +9849,7 @@ broken_flood_fill(struct ciolib_pixels *pix, int x, int y, uint32_t edge, uint32 ...@@ -9831,7 +9849,7 @@ broken_flood_fill(struct ciolib_pixels *pix, int x, int y, uint32_t edge, uint32
if (pix->pixels[noff] != edge) { if (pix->pixels[noff] != edge) {
nextline = true; nextline = true;
if ((pix->pixels[noff] & 0x40000000) == 0) if ((pix->pixels[noff] & 0x40000000) == 0)
bff_push(&stack, x, y + 1); bff_push(stack, x, y + 1);
} }
} }
} }
...@@ -9846,10 +9864,12 @@ broken_flood_fill(struct ciolib_pixels *pix, int x, int y, uint32_t edge, uint32 ...@@ -9846,10 +9864,12 @@ broken_flood_fill(struct ciolib_pixels *pix, int x, int y, uint32_t edge, uint32
poff++; poff++;
} }
   
for (this = stack; this; this = stack) { if (orig_stack == NULL) {
stack = stack->next; for (this = *stack; this; this = *stack) {
broken_flood_fill(pix, this->x, this->y, edge, fillfg, fillbg, iszero, y); *stack = (*stack)->next;
free(this); broken_flood_fill(pix, this->x, this->y, edge, fillfg, fillbg, iszero, y, stack);
free(this);
}
} }
} }
   
...@@ -10030,7 +10050,7 @@ do_rip_command(int level, int sublevel, int cmd, const char *rawargs) ...@@ -10030,7 +10050,7 @@ do_rip_command(int level, int sublevel, int cmd, const char *rawargs)
*/ */
handled = true; handled = true;
uint32_t oldbg = cterm->bg_color; uint32_t oldbg = cterm->bg_color;
cterm->bg_color = ega_colours[0]; cterm->bg_color = map_rip_color(0);
cterm_clreol(cterm); cterm_clreol(cterm);
cterm->bg_color = oldbg; cterm->bg_color = oldbg;
break; break;
...@@ -10186,7 +10206,7 @@ do_rip_command(int level, int sublevel, int cmd, const char *rawargs) ...@@ -10186,7 +10206,7 @@ do_rip_command(int level, int sublevel, int cmd, const char *rawargs)
   
for (i = 0; i < 50; i++) { for (i = 0; i < 50; i++) {
SLEEP(50); SLEEP(50);
scape_setpixel(x1, y1, fg); scale_setpixel(x1, y1, fg);
SLEEP(50); SLEEP(50);
scale_setpixel(x1, y1, xx); scale_setpixel(x1, y1, xx);
} }
...@@ -10197,9 +10217,9 @@ do_rip_command(int level, int sublevel, int cmd, const char *rawargs) ...@@ -10197,9 +10217,9 @@ do_rip_command(int level, int sublevel, int cmd, const char *rawargs)
fg = map_rip_color(arg1); fg = map_rip_color(arg1);
uint32_t ffg, fbg; uint32_t ffg, fbg;
ffg = map_rip_color(rip.fill_color); ffg = map_rip_color(rip.fill_color);
fbg = ega_colours[0]; fbg = map_rip_color(0);
if (x1 < pix->width && y1 < pix->height) if (x1 < pix->width && y1 < pix->height)
broken_flood_fill(pix, x1, y1, fg, ffg, fbg, rip.fill_color == 0, y1); broken_flood_fill(pix, x1, y1, fg, ffg, fbg, rip.fill_color == 0, y1, NULL);
else else
puts("TODO: Flood fill off screen"); puts("TODO: Flood fill off screen");
for (i = 0; i < pix->width * pix->height; i++) { for (i = 0; i < pix->width * pix->height; i++) {
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment