150276Speter/**************************************************************************** 2262685Sdelphij * Copyright (c) 1998-2009,2013 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 43262685SdelphijMODULE_ID("$Id: lib_overlay.c,v 1.31 2013/04/06 23:47:13 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 55262629Sdelphij T((T_CALLED("overlap(%p,%p,%d)"), (const void *) src, (void *) 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{ 113262629Sdelphij T((T_CALLED("overlay(%p,%p)"), (const void *) win1, (void *) 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{ 130262629Sdelphij T((T_CALLED("overwrite(%p,%p)"), (const void *) win1, (void *) 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)"), 148262629Sdelphij (const void *) src, 149262629Sdelphij (void *) dst, 150262629Sdelphij sminrow, smincol, 151262629Sdelphij dminrow, dmincol, 152262629Sdelphij dmaxrow, dmaxcol, over)); 15350276Speter 154262685Sdelphij if (src != 0 155262685Sdelphij && dst != 0 156262685Sdelphij && dmaxrow >= dminrow 157262685Sdelphij && dmaxcol >= dmincol) { 158184989Srafan _nc_lock_global(curses); 15950276Speter 160178866Srafan bk = AttrOf(dst->_nc_bkgd); 161178866Srafan mask = ~(attr_t) ((bk & A_COLOR) ? A_COLOR : 0); 16250276Speter 163178866Srafan /* make sure rectangle exists in source */ 164178866Srafan if ((sminrow + dmaxrow - dminrow) <= (src->_maxy + 1) && 165178866Srafan (smincol + dmaxcol - dmincol) <= (src->_maxx + 1)) { 166262685Sdelphij bool copied = FALSE; 16750276Speter 168178866Srafan T(("rectangle exists in source")); 16950276Speter 170178866Srafan /* make sure rectangle fits in destination */ 171178866Srafan if (dmaxrow <= dst->_maxy && dmaxcol <= dst->_maxx) { 17250276Speter 173178866Srafan T(("rectangle fits in destination")); 174178866Srafan 175178866Srafan for (dy = dminrow, sy = sminrow; 176178866Srafan dy <= dmaxrow; 177178866Srafan sy++, dy++) { 178178866Srafan 179262685Sdelphij if (dy < 0 || sy < 0) 180262685Sdelphij continue; 181262685Sdelphij 182178866Srafan touched = FALSE; 183178866Srafan for (dx = dmincol, sx = smincol; 184178866Srafan dx <= dmaxcol; 185178866Srafan sx++, dx++) { 186262685Sdelphij 187262685Sdelphij if (dx < 0 || sx < 0) 188262685Sdelphij continue; 189262685Sdelphij copied = TRUE; 190262685Sdelphij 191178866Srafan if (over) { 192178866Srafan if ((CharOf(src->_line[sy].text[sx]) != L(' ')) && 193178866Srafan (!CharEq(dst->_line[dy].text[dx], 194178866Srafan src->_line[sy].text[sx]))) { 195178866Srafan dst->_line[dy].text[dx] = 196178866Srafan src->_line[sy].text[sx]; 197178866Srafan SetAttr(dst->_line[dy].text[dx], 198178866Srafan ((AttrOf(src->_line[sy].text[sx]) & 199178866Srafan mask) | bk)); 200178866Srafan touched = TRUE; 201178866Srafan } 202178866Srafan } else { 203178866Srafan if (!CharEq(dst->_line[dy].text[dx], 204178866Srafan src->_line[sy].text[sx])) { 205178866Srafan dst->_line[dy].text[dx] = 206178866Srafan src->_line[sy].text[sx]; 207178866Srafan touched = TRUE; 208178866Srafan } 209178866Srafan } 210178866Srafan } 211178866Srafan if (touched) { 212178866Srafan touchline(dst, dminrow, (dmaxrow - dminrow + 1)); 213178866Srafan } 21476726Speter } 215178866Srafan T(("finished copywin")); 216262685Sdelphij if (copied) 217262685Sdelphij rc = OK; 21876726Speter } 21950276Speter } 220184989Srafan _nc_unlock_global(curses); 22176726Speter } 222178866Srafan returnCode(rc); 22350276Speter} 224