lib_overlay.c revision 50276
150276Speter/****************************************************************************
250276Speter * Copyright (c) 1998 Free Software Foundation, Inc.                        *
350276Speter *                                                                          *
450276Speter * Permission is hereby granted, free of charge, to any person obtaining a  *
550276Speter * copy of this software and associated documentation files (the            *
650276Speter * "Software"), to deal in the Software without restriction, including      *
750276Speter * without limitation the rights to use, copy, modify, merge, publish,      *
850276Speter * distribute, distribute with modifications, sublicense, and/or sell       *
950276Speter * copies of the Software, and to permit persons to whom the Software is    *
1050276Speter * furnished to do so, subject to the following conditions:                 *
1150276Speter *                                                                          *
1250276Speter * The above copyright notice and this permission notice shall be included  *
1350276Speter * in all copies or substantial portions of the Software.                   *
1450276Speter *                                                                          *
1550276Speter * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS  *
1650276Speter * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF               *
1750276Speter * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.   *
1850276Speter * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,   *
1950276Speter * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR    *
2050276Speter * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR    *
2150276Speter * THE USE OR OTHER DEALINGS IN THE SOFTWARE.                               *
2250276Speter *                                                                          *
2350276Speter * Except as contained in this notice, the name(s) of the above copyright   *
2450276Speter * holders shall not be used in advertising or otherwise to promote the     *
2550276Speter * sale, use or other dealings in this Software without prior written       *
2650276Speter * authorization.                                                           *
2750276Speter ****************************************************************************/
2850276Speter
2950276Speter/****************************************************************************
3050276Speter *  Author: Zeyd M. Ben-Halim <zmbenhal@netcom.com> 1992,1995               *
3150276Speter *     and: Eric S. Raymond <esr@snark.thyrsus.com>                         *
3250276Speter ****************************************************************************/
3350276Speter
3450276Speter
3550276Speter/*
3650276Speter**	lib_overlay.c
3750276Speter**
3850276Speter**	The routines overlay(), copywin(), and overwrite().
3950276Speter**
4050276Speter*/
4150276Speter
4250276Speter#include <curses.priv.h>
4350276Speter
4450276SpeterMODULE_ID("$Id: lib_overlay.c,v 1.12 1998/02/11 12:13:59 tom Exp $")
4550276Speter
4650276Speterstatic int overlap(const WINDOW *const s, WINDOW *const d, int const flag)
4750276Speter{
4850276Speterint sminrow, smincol, dminrow, dmincol, dmaxrow, dmaxcol;
4950276Speter
5050276Speter	T(("overlap : sby %d, sbx %d, smy %d, smx %d, dby %d, dbx %d, dmy %d, dmx %d",
5150276Speter		s->_begy, s->_begx, s->_maxy, s->_maxx,
5250276Speter		d->_begy, d->_begx, d->_maxy, d->_maxx));
5350276Speter
5450276Speter	if (!s || !d)
5550276Speter		returnCode(ERR);
5650276Speter
5750276Speter	sminrow = max(s->_begy, d->_begy) - s->_begy;
5850276Speter	smincol = max(s->_begx, d->_begx) - s->_begx;
5950276Speter	dminrow = max(s->_begy, d->_begy) - d->_begy;
6050276Speter	dmincol = max(s->_begx, d->_begx) - d->_begx;
6150276Speter	dmaxrow = min(s->_maxy+s->_begy, d->_maxy+d->_begy) - d->_begy;
6250276Speter	dmaxcol = min(s->_maxx+s->_begx, d->_maxx+d->_begx) - d->_begx;
6350276Speter
6450276Speter	return(copywin(s, d,
6550276Speter		       sminrow, smincol, dminrow, dmincol, dmaxrow, dmaxcol,
6650276Speter		       flag));
6750276Speter}
6850276Speter
6950276Speter/*
7050276Speter**
7150276Speter**	overlay(win1, win2)
7250276Speter**
7350276Speter**
7450276Speter**	overlay() writes the overlapping area of win1 behind win2
7550276Speter**	on win2 non-destructively.
7650276Speter**
7750276Speter**/
7850276Speter
7950276Speterint overlay(const WINDOW *win1, WINDOW *win2)
8050276Speter{
8150276Speter	T((T_CALLED("overlay(%p,%p)"), win1, win2));
8250276Speter	returnCode(overlap(win1, win2, TRUE));
8350276Speter}
8450276Speter
8550276Speter/*
8650276Speter**
8750276Speter**	overwrite(win1, win2)
8850276Speter**
8950276Speter**
9050276Speter**	overwrite() writes the overlapping area of win1 behind win2
9150276Speter**	on win2 destructively.
9250276Speter**
9350276Speter**/
9450276Speter
9550276Speterint overwrite(const WINDOW *win1, WINDOW *win2)
9650276Speter{
9750276Speter	T((T_CALLED("overwrite(%p,%p)"), win1, win2));
9850276Speter	returnCode(overlap(win1, win2, FALSE));
9950276Speter}
10050276Speter
10150276Speterint copywin(const WINDOW *src, WINDOW *dst,
10250276Speter	int sminrow, int smincol,
10350276Speter	int dminrow, int dmincol, int dmaxrow, int dmaxcol,
10450276Speter	int over)
10550276Speter{
10650276Speterint sx, sy, dx, dy;
10750276Speterbool touched;
10850276Speterchtype bk = AttrOf(dst->_bkgd);
10950276Speterchtype mask = ~(chtype)((bk&A_COLOR) ? A_COLOR : 0);
11050276Speter
11150276Speter	T((T_CALLED("copywin(%p, %p, %d, %d, %d, %d, %d, %d, %d)"),
11250276Speter		src, dst, sminrow, smincol, dminrow, dmincol, dmaxrow, dmaxcol, over));
11350276Speter
11450276Speter	if (!src || !dst)
11550276Speter	  returnCode(ERR);
11650276Speter
11750276Speter	/* make sure rectangle exists in source */
11850276Speter	if ((sminrow + dmaxrow - dminrow) > (src->_maxy + 1) ||
11950276Speter	    (smincol + dmaxcol - dmincol) > (src->_maxx + 1)) {
12050276Speter		returnCode(ERR);
12150276Speter	}
12250276Speter
12350276Speter	T(("rectangle exists in source"));
12450276Speter
12550276Speter	/* make sure rectangle fits in destination */
12650276Speter	if (dmaxrow > dst->_maxy || dmaxcol > dst->_maxx) {
12750276Speter		returnCode(ERR);
12850276Speter	}
12950276Speter
13050276Speter	T(("rectangle fits in destination"));
13150276Speter
13250276Speter	for (dy = dminrow, sy = sminrow; dy <= dmaxrow; sy++, dy++) {
13350276Speter	   touched = FALSE;
13450276Speter	   for(dx=dmincol, sx=smincol; dx <= dmaxcol; sx++, dx++)
13550276Speter	   {
13650276Speter		if (over)
13750276Speter		{
13850276Speter		   if ((TextOf(src->_line[sy].text[sx]) != ' ') &&
13950276Speter                       (dst->_line[dy].text[dx]!=src->_line[sy].text[sx]))
14050276Speter		   {
14150276Speter			dst->_line[dy].text[dx] =
14250276Speter					(src->_line[sy].text[sx] & mask) | bk;
14350276Speter			touched = TRUE;
14450276Speter		   }
14550276Speter	        }
14650276Speter		else {
14750276Speter		   if (dst->_line[dy].text[dx] != src->_line[sy].text[sx])
14850276Speter		   {
14950276Speter			dst->_line[dy].text[dx] = src->_line[sy].text[sx];
15050276Speter			touched = TRUE;
15150276Speter                   }
15250276Speter                }
15350276Speter           }
15450276Speter	   if (touched)
15550276Speter	   {
15650276Speter	      touchline(dst,0,getmaxy(dst));
15750276Speter	   }
15850276Speter	}
15950276Speter	T(("finished copywin"));
16050276Speter	returnCode(OK);
16150276Speter}
162