📄 out_scrn.c
字号:
else if (xloc == sp_intercepts.car[to] && xfrac < (sp_intercepts.inttype[to] & FRACTION)) goto insert_element; /* ... drop out and insert here */ from = to; /* move forward in list */ }insert_element: /* insert element "sp_globals.next_offset" between elements "from" */ /* and "to" */sp_intercepts.cdr[from] = sp_globals.next_offset;sp_intercepts.cdr[sp_globals.next_offset] = to;if (++sp_globals.next_offset >= MAX_INTERCEPTS) /* Intercept buffer full? */ { sp_globals.intercept_oflo = TRUE;/* There may be a few more calls to "add_intercept" from the current line *//* To avoid problems, we set next_offset to a safe value. We don't care *//* if the intercept table gets trashed at this point */ sp_globals.next_offset = sp_globals.first_offset; }}#endif#if INCL_SCREENFUNCTION LOCAL void sp_proc_intercepts_screen()GDECL/* Called by sp_make_char to output accumulated intercept lists * Clips output to sp_globals.xmin, sp_globals.xmax, sp_globals.ymin, sp_globals.ymax boundaries */{register fix15 i,j, jplus1, iminus1;fix15 k,nextk, previ;register fix15 from, to; /* Start and end of run in pixel units relative to left extent of character */register fix15 y;register fix15 scan_line; fix15 first_y, last_y; fix15 xsave; fix15 xmin, xmax; boolean clipleft, clipright;fix15 diff;#if DEBUGprintf("\nPROC_INTERCEPTS_SCREEN: Intercept lists before:\n");#endif#if INCL_CLIPPINGif ((sp_globals.specs.flags & CLIP_LEFT) != 0) clipleft = TRUE;else clipleft = FALSE;if ((sp_globals.specs.flags & CLIP_RIGHT) != 0) clipright = TRUE;else clipright = FALSE;if (clipleft || clipright) { xmax = sp_globals.clip_xmax + sp_globals.xmin; xmin = sp_globals.clip_xmin + sp_globals.xmin; }if (!clipright) xmax = ((sp_globals.set_width.x+32768L) >> 16);#endifif ((first_y = sp_globals.y_band.band_max) >= sp_globals.ymax) first_y = sp_globals.ymax - 1; /* Clip to sp_globals.ymax boundary */if ((last_y = sp_globals.y_band.band_min) < sp_globals.ymin) last_y = sp_globals.ymin; /* Clip to sp_globals.ymin boundary */last_y -= sp_globals.y_band.band_min;#if DEBUG/* Print out all of the intercept info */scan_line = sp_globals.ymax - first_y - 1;for (y = first_y - sp_globals.y_band.band_min; y >= last_y; y--, scan_line++) { i = y; /* Index head of intercept list */ while ((i = sp_intercepts.cdr[i]) != 0) /* Link to next intercept if present */ { if ((from = sp_intercepts.car[i] - sp_globals.xmin) < 0) from = 0; /* Clip to sp_globals.xmin boundary */ i = sp_intercepts.cdr[i]; /* Link to next intercept */ if (i == 0) /* End of list? */ { printf("****** proc_intercepts: odd number of intercepts\n"); break; } if ((to = sp_intercepts.car[i]) > sp_globals.xmax) to = sp_globals.xmax - sp_globals.xmin; /* Clip to sp_globals.xmax boundary */ else to -= sp_globals.xmin; printf(" Y = %2d (scanline %2d): %d %d:\n", y + sp_globals.y_band.band_min, scan_line, from, to); } }#endif/* CHECK INTERCEPT LIST FOR DROPOUT AND WINDING, FIX IF NECESSARY */for (y = first_y - sp_globals.y_band.band_min; y >= last_y; y--) { previ = y; i = sp_intercepts.cdr[y]; /* Index head of intercept list */ while (i != 0) /* Link to next intercept if present */ { j = i; i = sp_intercepts.cdr[i]; /* Link to next intercept */ if (sp_intercepts.inttype[i] & LEFT_INT) { if (sp_intercepts.inttype[j] & LEFT_INT) { do { i = sp_intercepts.cdr[i]; } while (sp_intercepts.inttype[i] & LEFT_INT); do { i = sp_intercepts.cdr[i]; } while (sp_intercepts.cdr[i] && !(sp_intercepts.inttype[sp_intercepts.cdr[i]] & LEFT_INT)); sp_intercepts.cdr[j] = i; } else { xsave = sp_intercepts.car[j]; sp_intercepts.car[j] = sp_intercepts.car[i]; sp_intercepts.car[i] = xsave; xsave = sp_intercepts.inttype[j]; sp_intercepts.inttype[j] = sp_intercepts.inttype[i] & FRACTION; sp_intercepts.inttype[i] = xsave | LEFT_INT; sp_intercepts.cdr[previ] = i; sp_intercepts.cdr[j] = sp_intercepts.cdr[i]; sp_intercepts.cdr[i] = j; i = j; j = sp_intercepts.cdr[previ]; } } if (sp_intercepts.car[j] < sp_globals.xmin) sp_intercepts.car[j] = sp_globals.xmin; /* Clip to sp_globals.xmin boundary */ if (sp_intercepts.car[i] > sp_globals.xmax) sp_intercepts.car[i] = sp_globals.xmax; if (sp_intercepts.car[j] >= sp_intercepts.car[i]) { if ((ufix16)(sp_intercepts.inttype[j] & FRACTION) + (ufix16)(sp_intercepts.inttype[i] & FRACTION) > sp_intercepts.fracpix) ++sp_intercepts.car[i]; else --sp_intercepts.car[j]; } if (sp_globals.first_pass) { if (sp_intercepts.inttype[i-1] & END_INT) { for (iminus1 = i+1; !(sp_intercepts.inttype[iminus1] & END_INT); iminus1++) ; } else iminus1 = i-1; if (sp_intercepts.inttype[j] & END_INT) { for (jplus1 = j-1; !(sp_intercepts.inttype[jplus1] & END_INT); jplus1--) ; jplus1++; } else jplus1 = j+1; if ((sp_intercepts.inttype[iminus1] & LEFT_INT)) { if ( sp_intercepts.car[jplus1] > sp_intercepts.car[i]) { diff = sp_intercepts.car[jplus1] - sp_intercepts.car[i]; sp_intercepts.car[i] += diff/2; sp_intercepts.car[jplus1] -= diff/2; if (diff & 1) { if ((ufix16)(sp_intercepts.inttype[i] & FRACTION) + (ufix16)(sp_intercepts.inttype[jplus1] & FRACTION) > sp_intercepts.fracpix) sp_intercepts.car[i] ++; else sp_intercepts.car[jplus1]--; } } } else if (!(sp_intercepts.inttype[jplus1] & LEFT_INT)) { if (sp_intercepts.car[iminus1] < sp_intercepts.car[j]) { diff = sp_intercepts.car[j] - sp_intercepts.car[iminus1]; sp_intercepts.car[j] -= diff/2; sp_intercepts.car[iminus1] += diff/2; if (diff & 1) { if ((ufix16)(sp_intercepts.inttype[j] & FRACTION) + (ufix16)(sp_intercepts.inttype[iminus1] & FRACTION) > sp_intercepts.fracpix) sp_intercepts.car[iminus1]++; else sp_intercepts.car[j]--; } } } if (sp_globals.tcb.mirror == -1) { if (sp_intercepts.inttype[j-1] & END_INT) { for (jplus1 = j+1; !(sp_intercepts.inttype[jplus1] & END_INT); jplus1++) ; } else { jplus1 = j-1; } } if (!(sp_intercepts.inttype[jplus1] & LEFT_INT) && sp_intercepts.car[j] > sp_intercepts.car[jplus1]) { k = sp_intercepts.cdr[y - 1]; while (k > 0) { nextk = sp_intercepts.cdr[k]; if (!(sp_intercepts.inttype[k] & LEFT_INT) && (sp_intercepts.inttype[nextk] & LEFT_INT) && sp_intercepts.car[nextk] > sp_intercepts.car[jplus1]) { if ((diff=sp_intercepts.car[j] - sp_intercepts.car[k]) > 0) { if (diff <= (sp_intercepts.car[nextk] - sp_intercepts.car[jplus1])) { sp_intercepts.car[j] -= diff/2; sp_intercepts.car[k] += diff/2; if (diff & 1) { if ((ufix16)(sp_intercepts.inttype[j] & FRACTION) + (ufix16)(sp_intercepts.inttype[k] & FRACTION) > sp_intercepts.fracpix) sp_intercepts.car[j]--; else sp_intercepts.car[k]++; } } else { diff = sp_intercepts.car[nextk] - sp_intercepts.car[jplus1]; sp_intercepts.car[nextk] -= diff/2; sp_intercepts.car[jplus1] += diff/2; if (diff & 1) { if ((ufix16)(sp_intercepts.inttype[jplus1] & FRACTION) + (ufix16)(sp_intercepts.inttype[nextk] & FRACTION) > sp_intercepts.fracpix) sp_intercepts.car[nextk]--; else sp_intercepts.car[jplus1]++; } } } break; } k = nextk; } } if (j > 0 && sp_intercepts.car[j-1] > sp_intercepts.car[i] && !(sp_intercepts.inttype[j-1] & END_INT)) { diff = sp_intercepts.car[j-1] - sp_intercepts.car[i]; sp_intercepts.car[i] += diff/2; sp_intercepts.car[j-1] -= diff/2; if (diff & 1) { if ((ufix16)(sp_intercepts.inttype[i] & FRACTION) + (ufix16)(sp_intercepts.inttype[j-1] & FRACTION) > sp_intercepts.fracpix) sp_intercepts.car[i]++; else sp_intercepts.car[j-1]--; } } if (sp_intercepts.car[i+1] < sp_intercepts.car[j] && !(sp_intercepts.inttype[i] & END_INT)) { diff = sp_intercepts.car[j] - sp_intercepts.car[i+1]; sp_intercepts.car[j] -= diff/2; sp_intercepts.car[i+1] += diff/2; if (diff & 1) { if ((ufix16)(sp_intercepts.inttype[j] & FRACTION) + (ufix16)(sp_intercepts.inttype[i+1] & FRACTION) > sp_intercepts.fracpix) sp_intercepts.car[i+1]++; else sp_intercepts.car[j]--; } } previ = i; } i = sp_intercepts.cdr[i]; } }#if DEBUGprintf("\nPROC_INTERCEPTS_SCREEN: Intercept lists after:\n");/* Print out all of the intercept info */scan_line = sp_globals.ymax - first_y - 1;for (y = first_y - sp_globals.y_band.band_min; y >= last_y; y--, scan_line++) { i = y; /* Index head of intercept list */ while ((i = sp_intercepts.cdr[i]) != 0) /* Link to next intercept if present */ { if ((from = sp_intercepts.car[i] - sp_globals.xmin) < 0) from = 0; /* Clip to sp_globals.xmin boundary */ i = sp_intercepts.cdr[i]; /* Link to next intercept */ if (i == 0) /* End of list? */ { printf("****** proc_intercepts: odd number of intercepts\n"); break; } if ((to = sp_intercepts.car[i]) > sp_globals.xmax) to = sp_globals.xmax - sp_globals.xmin; /* Clip to sp_globals.xmax boundary */ else to -= sp_globals.xmin; printf(" Y = %2d (scanline %2d): %d %d:\n", y + sp_globals.y_band.band_min, scan_line, from, to); } }#endif /* INTERCEPTS ALL PATCHED, NOW DRAW THE IMAGE */scan_line = sp_globals.ymax - first_y - 1;for (y = first_y - sp_globals.y_band.band_min; y >= last_y; y--, scan_line++) { i = sp_intercepts.cdr[y]; /* Index head of intercept list */ while (i != 0) /* Link to next intercept if present */ { from = sp_intercepts.car[i]; i = sp_intercepts.cdr[i]; /* Link to next intercept */ to = sp_intercepts.car[i];#if INCL_CLIPPING if (clipleft) { if (to <= xmin) { i = sp_intercepts.cdr[i]; continue; } if (from < xmin) from = xmin; } if (clipright) { if (from >= xmax) { i = sp_intercepts.cdr[i]; continue; } if (to > xmax) to = xmax; }#endif set_bitmap_bits(scan_line, from-sp_globals.xmin, to-sp_globals.xmin); i = sp_intercepts.cdr[i]; } }}#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -