Fix screen artifacts:

In mark_cells_from_index(void) mark all rectangle (in most cases this not decrease render speed, and more fast in calculation, and no errors)
This commit is contained in:
DiSlord 2020-03-09 13:12:01 +03:00
parent 5cf86ee1a6
commit 90407d5730

50
plot.c
View file

@ -787,48 +787,29 @@ invalidateRect(int x0, int y0, int x1, int y1){
mark_map(x, y); mark_map(x, y);
} }
#define SWAP(x,y) {int t=x;x=y;y=t;}
static void static void
mark_cells_from_index(void) mark_cells_from_index(void)
{ {
int t; int t, i;
/* mark cells between each neighber points */ /* mark cells between each neighber points */
for (t = 0; t < TRACES_MAX; t++) { for (t = 0; t < TRACES_MAX; t++) {
if (!trace[t].enabled) if (!trace[t].enabled)
continue; continue;
int x0 = CELL_X(trace_index[t][0]); int m0 = CELL_X(trace_index[t][0]) / CELLWIDTH;
int y0 = CELL_Y(trace_index[t][0]); int n0 = CELL_Y(trace_index[t][0]) / CELLHEIGHT;
int m0 = x0 / CELLWIDTH; markmap[current_mappage][n0] |= 1<<m0;
int n0 = y0 / CELLHEIGHT;
int i;
mark_map(m0, n0);
for (i = 1; i < sweep_points; i++) { for (i = 1; i < sweep_points; i++) {
int x1 = CELL_X(trace_index[t][i]); int m1 = CELL_X(trace_index[t][i]) / CELLWIDTH;
int y1 = CELL_Y(trace_index[t][i]); int n1 = CELL_Y(trace_index[t][i]) / CELLHEIGHT;
int m1 = x1 / CELLWIDTH; if (m0 == m1 && n0 == n1)
int n1 = y1 / CELLHEIGHT; continue;
while (m0 != m1 || n0 != n1) { int x0 = m0; int x1 = m1; if (x0>x1) SWAP(x0, x1); m0=m1;
if (m0 == m1) { int y0 = n0; int y1 = n1; if (y0>y1) SWAP(y0, y1); n0=n1;
if (n0 < n1) n0++; else n0--; for (; y0<=y1; y0++)
} else if (n0 == n1) { for(int j=x0;j<=x1;j++)
if (m0 < m1) m0++; else m0--; markmap[current_mappage][y0]|= 1<<x0;
} else {
int x = ((m0 < m1) ? (m0 + 1) : m0) * CELLWIDTH;
int y = ((n0 < n1) ? (n0 + 1) : n0) * CELLHEIGHT;
int sgn = (n0 < n1) ? 1 : -1;
if (sgn*(y-y0)*(x1-x0) < sgn*(x-x0)*(y1-y0)) {
if (m0 < m1) m0++;
else m0--;
} else {
if (n0 < n1) n0++;
else n0--;
}
}
mark_map(m0, n0);
}
x0 = x1;
y0 = y1;
m0 = m1;
n0 = n1;
} }
} }
} }
@ -840,7 +821,6 @@ markmap_upperarea(void)
invalidateRect(0, 0, AREA_WIDTH_NORMAL, 31); invalidateRect(0, 0, AREA_WIDTH_NORMAL, 31);
} }
#define SWAP(x,y) {int t=x;x=y;y=t;}
// //
// in most cases _compute_outcode clip calculation not give render line speedup // in most cases _compute_outcode clip calculation not give render line speedup
// //