Minix2.0/src/lib/curses/overlay.c

/****************************************************************/
/* 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++;
  }
}