⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 out_scrn.c

📁 unix vnc 协议源码. VNC是一款远程控制工具软件.
💻 C
📖 第 1 页 / 共 3 页
字号:
	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 + -