150276Speter/**************************************************************************** 2184989Srafan * Copyright (c) 1998-2007,2008 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** lib_overlay.c 3650276Speter** 3750276Speter** The routines overlay(), copywin(), and overwrite(). 3850276Speter** 3950276Speter*/ 4050276Speter 4150276Speter#include <curses.priv.h> 4250276Speter 43184989SrafanMODULE_ID("$Id: lib_overlay.c,v 1.27 2008/06/07 23:30:34 tom Exp $") 4450276Speter 4576726Speterstatic int 46178866Srafanoverlap(const WINDOW *const src, WINDOW *const dst, int const flag) 4750276Speter{ 48178866Srafan int rc = ERR; 49166124Srafan int sx1, sy1, sx2, sy2; 50166124Srafan int dx1, dy1, dx2, dy2; 51166124Srafan int sminrow, smincol; 52166124Srafan int dminrow, dmincol; 53166124Srafan int dmaxrow, dmaxcol; 5450276Speter 55178866Srafan T((T_CALLED("overlap(%p,%p,%d)"), src, dst, flag)); 5650276Speter 57178866Srafan if (src != 0 && dst != 0) { 58184989Srafan _nc_lock_global(curses); 59178866Srafan 60166124Srafan T(("src : begy %ld, begx %ld, maxy %ld, maxx %ld", 61178866Srafan (long) src->_begy, 62178866Srafan (long) src->_begx, 63178866Srafan (long) src->_maxy, 64178866Srafan (long) src->_maxx)); 65166124Srafan T(("dst : begy %ld, begx %ld, maxy %ld, maxx %ld", 66178866Srafan (long) dst->_begy, 67178866Srafan (long) dst->_begx, 68178866Srafan (long) dst->_maxy, 69178866Srafan (long) dst->_maxx)); 7050276Speter 71178866Srafan sx1 = src->_begx; 72178866Srafan sy1 = src->_begy; 73178866Srafan sx2 = sx1 + src->_maxx; 74178866Srafan sy2 = sy1 + src->_maxy; 7576726Speter 76178866Srafan dx1 = dst->_begx; 77178866Srafan dy1 = dst->_begy; 78178866Srafan dx2 = dx1 + dst->_maxx; 79178866Srafan dy2 = dy1 + dst->_maxy; 80166124Srafan 81178866Srafan if (dx2 >= sx1 && dx1 <= sx2 && dy2 >= sy1 && dy1 <= sy2) { 82166124Srafan sminrow = max(sy1, dy1) - sy1; 83166124Srafan smincol = max(sx1, dx1) - sx1; 84166124Srafan dminrow = max(sy1, dy1) - dy1; 85166124Srafan dmincol = max(sx1, dx1) - dx1; 86166124Srafan dmaxrow = min(sy2, dy2) - dy1; 87166124Srafan dmaxcol = min(sx2, dx2) - dx1; 88166124Srafan 89178866Srafan rc = copywin(src, dst, 90178866Srafan sminrow, smincol, 91178866Srafan dminrow, dmincol, 92178866Srafan dmaxrow, dmaxcol, 93178866Srafan flag); 94166124Srafan } 95184989Srafan _nc_unlock_global(curses); 96166124Srafan } 97178866Srafan returnCode(rc); 9850276Speter} 9950276Speter 10050276Speter/* 10150276Speter** 10250276Speter** overlay(win1, win2) 10350276Speter** 10450276Speter** 10550276Speter** overlay() writes the overlapping area of win1 behind win2 10650276Speter** on win2 non-destructively. 10750276Speter** 10850276Speter**/ 10950276Speter 11076726SpeterNCURSES_EXPORT(int) 11176726Speteroverlay(const WINDOW *win1, WINDOW *win2) 11250276Speter{ 11376726Speter T((T_CALLED("overlay(%p,%p)"), win1, win2)); 11476726Speter returnCode(overlap(win1, win2, TRUE)); 11550276Speter} 11650276Speter 11750276Speter/* 11850276Speter** 11950276Speter** overwrite(win1, win2) 12050276Speter** 12150276Speter** 12250276Speter** overwrite() writes the overlapping area of win1 behind win2 12350276Speter** on win2 destructively. 12450276Speter** 12550276Speter**/ 12650276Speter 12776726SpeterNCURSES_EXPORT(int) 12876726Speteroverwrite(const WINDOW *win1, WINDOW *win2) 12950276Speter{ 13076726Speter T((T_CALLED("overwrite(%p,%p)"), win1, win2)); 13176726Speter returnCode(overlap(win1, win2, FALSE)); 13250276Speter} 13350276Speter 13476726SpeterNCURSES_EXPORT(int) 135166124Srafancopywin(const WINDOW *src, WINDOW *dst, 136166124Srafan int sminrow, int smincol, 137166124Srafan int dminrow, int dmincol, 138166124Srafan int dmaxrow, int dmaxcol, 139166124Srafan int over) 14050276Speter{ 141178866Srafan int rc = ERR; 14276726Speter int sx, sy, dx, dy; 14376726Speter bool touched; 144174993Srafan attr_t bk; 145174993Srafan attr_t mask; 14650276Speter 14776726Speter T((T_CALLED("copywin(%p, %p, %d, %d, %d, %d, %d, %d, %d)"), 14876726Speter src, dst, sminrow, smincol, dminrow, dmincol, dmaxrow, dmaxcol, over)); 14950276Speter 150178866Srafan if (src && dst) { 151184989Srafan _nc_lock_global(curses); 15250276Speter 153178866Srafan bk = AttrOf(dst->_nc_bkgd); 154178866Srafan mask = ~(attr_t) ((bk & A_COLOR) ? A_COLOR : 0); 15550276Speter 156178866Srafan /* make sure rectangle exists in source */ 157178866Srafan if ((sminrow + dmaxrow - dminrow) <= (src->_maxy + 1) && 158178866Srafan (smincol + dmaxcol - dmincol) <= (src->_maxx + 1)) { 15950276Speter 160178866Srafan T(("rectangle exists in source")); 16150276Speter 162178866Srafan /* make sure rectangle fits in destination */ 163178866Srafan if (dmaxrow <= dst->_maxy && dmaxcol <= dst->_maxx) { 16450276Speter 165178866Srafan T(("rectangle fits in destination")); 166178866Srafan 167178866Srafan for (dy = dminrow, sy = sminrow; 168178866Srafan dy <= dmaxrow; 169178866Srafan sy++, dy++) { 170178866Srafan 171178866Srafan touched = FALSE; 172178866Srafan for (dx = dmincol, sx = smincol; 173178866Srafan dx <= dmaxcol; 174178866Srafan sx++, dx++) { 175178866Srafan if (over) { 176178866Srafan if ((CharOf(src->_line[sy].text[sx]) != L(' ')) && 177178866Srafan (!CharEq(dst->_line[dy].text[dx], 178178866Srafan src->_line[sy].text[sx]))) { 179178866Srafan dst->_line[dy].text[dx] = 180178866Srafan src->_line[sy].text[sx]; 181178866Srafan SetAttr(dst->_line[dy].text[dx], 182178866Srafan ((AttrOf(src->_line[sy].text[sx]) & 183178866Srafan mask) | bk)); 184178866Srafan touched = TRUE; 185178866Srafan } 186178866Srafan } else { 187178866Srafan if (!CharEq(dst->_line[dy].text[dx], 188178866Srafan src->_line[sy].text[sx])) { 189178866Srafan dst->_line[dy].text[dx] = 190178866Srafan src->_line[sy].text[sx]; 191178866Srafan touched = TRUE; 192178866Srafan } 193178866Srafan } 194178866Srafan } 195178866Srafan if (touched) { 196178866Srafan touchline(dst, dminrow, (dmaxrow - dminrow + 1)); 197178866Srafan } 19876726Speter } 199178866Srafan T(("finished copywin")); 200178866Srafan rc = OK; 20176726Speter } 20250276Speter } 203184989Srafan _nc_unlock_global(curses); 20476726Speter } 205178866Srafan returnCode(rc); 20650276Speter} 207