125 lines
		
	
	
		
			3.3 KiB
		
	
	
	
		
			C
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			125 lines
		
	
	
		
			3.3 KiB
		
	
	
	
		
			C
		
	
	
		
			Executable File
		
	
	
	
	
| /****************************************************************/
 | |
| /* Overlay() and overwrite() functions of the PCcurses package	*/
 | |
| /*								*/
 | |
| /****************************************************************/
 | |
| /* This version of curses is based on ncurses, a curses version	*/
 | |
| /* Originally written by Pavel Curtis at Cornell University.	*/
 | |
| /* I have made substantial changes to make it run on IBM PC's,	*/
 | |
| /* And therefore consider myself free to make it public domain.	*/
 | |
| /*		Bjorn Larsson (...mcvax!enea!infovax!bl)	*/
 | |
| /****************************************************************/
 | |
| /* 1.0:	Release:					870515	*/
 | |
| /****************************************************************/
 | |
| /* Modified to run under the MINIX operating system by Don Cope */
 | |
| /* These changes are also released into the public domain.      */
 | |
| /* 							900906  */
 | |
| /****************************************************************/
 | |
| 
 | |
| #include <curses.h>
 | |
| #include "curspriv.h"
 | |
| 
 | |
| /****************************************************************/
 | |
| /* Overlay() overwrites 'win1' upon 'win2', with origins alig-	*/
 | |
| /* Ned. Overlay is transparent; blanks from 'win1' are not	*/
 | |
| /* Copied to 'win2'.						*/
 | |
| /****************************************************************/
 | |
| void overlay(win1, win2)
 | |
| WINDOW *win1, *win2;
 | |
| {
 | |
|   int *minchng;
 | |
|   int *maxchng;
 | |
|   int *w1ptr;
 | |
|   int *w2ptr;
 | |
|   int attrs;
 | |
|   int col;
 | |
|   int line;
 | |
|   int last_line;
 | |
|   int last_col;
 | |
| 
 | |
|   last_col = min(win1->_maxx, win2->_maxx);
 | |
|   last_line = min(win1->_maxy, win2->_maxy);
 | |
|   attrs = win2->_attrs & ATR_MSK;
 | |
|   minchng = win2->_minchng;
 | |
|   maxchng = win2->_maxchng;
 | |
| 
 | |
|   for (line = 0; line <= last_line; line++) {
 | |
| 	register short fc, lc = 0;
 | |
| 	w1ptr = win1->_line[line];
 | |
| 	w2ptr = win2->_line[line];
 | |
| 	fc = _NO_CHANGE;
 | |
| 	for (col = 0; col <= last_col; col++) {
 | |
| 		if ((*w1ptr & CHR_MSK) != ' ') {
 | |
| 			*w2ptr = (*w1ptr & CHR_MSK) | attrs;
 | |
| 			if (fc == _NO_CHANGE) fc = col;
 | |
| 			lc = col;
 | |
| 		}
 | |
| 		w1ptr++;
 | |
| 		w2ptr++;
 | |
| 	}
 | |
| 
 | |
| 	if (*minchng == _NO_CHANGE) {
 | |
| 		*minchng = fc;
 | |
| 		*maxchng = lc;
 | |
| 	} else if (fc != _NO_CHANGE) {
 | |
| 		if (fc < *minchng) *minchng = fc;
 | |
| 		if (lc > *maxchng) *maxchng = lc;
 | |
| 	}
 | |
| 	minchng++;
 | |
| 	maxchng++;
 | |
|   }				/* for */
 | |
| }				/* overlay */
 | |
| 
 | |
| /****************************************************************/
 | |
| /* Overwrite() overwrites 'win1' upon 'win2', with origins	*/
 | |
| /* Aligned. Overwrite is non-transparent; blanks from 'win1'	*/
 | |
| /* Are copied to 'win2'.					*/
 | |
| /****************************************************************/
 | |
| void overwrite(win1, win2)
 | |
| WINDOW *win1, *win2;
 | |
| {
 | |
|   int *minchng;
 | |
|   int *maxchng;
 | |
|   int *w1ptr;
 | |
|   int *w2ptr;
 | |
|   int attrs;
 | |
|   int col;
 | |
|   int line;
 | |
|   int last_line;
 | |
|   int last_col;
 | |
| 
 | |
|   last_col = min(win1->_maxx, win2->_maxx);
 | |
|   last_line = min(win1->_maxy, win2->_maxy);
 | |
|   attrs = win2->_attrs & ATR_MSK;
 | |
|   minchng = win2->_minchng;
 | |
|   maxchng = win2->_maxchng;
 | |
| 
 | |
|   for (line = 0; line <= last_line; line++) {
 | |
| 	register short fc, lc = 0;
 | |
| 
 | |
| 	w1ptr = win1->_line[line];
 | |
| 	w2ptr = win2->_line[line];
 | |
| 	fc = _NO_CHANGE;
 | |
| 
 | |
| 	for (col = 0; col <= last_col; col++) {
 | |
| 		if ((*w1ptr & CHR_MSK) != (*w2ptr & CHR_MSK)) {
 | |
| 			*w2ptr = (*w1ptr & CHR_MSK) | attrs;
 | |
| 
 | |
| 			if (fc == _NO_CHANGE) fc = col;
 | |
| 			lc = col;
 | |
| 		}
 | |
| 		w1ptr++;
 | |
| 		w2ptr++;
 | |
| 	}			/* for */
 | |
| 
 | |
| 	if (*minchng == _NO_CHANGE) {
 | |
| 		*minchng = fc;
 | |
| 		*maxchng = lc;
 | |
| 	} else if (fc != _NO_CHANGE) {
 | |
| 		if (fc < *minchng) *minchng = fc;
 | |
| 		if (lc > *maxchng) *maxchng = lc;
 | |
| 	}
 | |
| 	minchng++;
 | |
| 	maxchng++;
 | |
|   }
 | |
| }
 | 
