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