xref: /original-bsd/lib/libcurses/overlay.c (revision 79386b64)
1 /*
2  * Copyright (c) 1981 Regents of the University of California.
3  * All rights reserved.
4  *
5  * Redistribution and use in source and binary forms are permitted
6  * provided that the above copyright notice and this paragraph are
7  * duplicated in all such forms and that any documentation,
8  * advertising materials, and other materials related to such
9  * distribution and use acknowledge that the software was developed
10  * by the University of California, Berkeley.  The name of the
11  * University may not be used to endorse or promote products derived
12  * from this software without specific prior written permission.
13  * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
14  * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
15  * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
16  */
17 
18 #ifndef lint
19 static char sccsid[] = "@(#)overlay.c	5.5 (Berkeley) 06/30/88";
20 #endif /* not lint */
21 
22 # include	"curses.ext"
23 # include	<ctype.h>
24 
25 # define	min(a,b)	(a < b ? a : b)
26 # define	max(a,b)	(a > b ? a : b)
27 
28 /*
29  *	This routine writes win1 on win2 non-destructively.
30  *
31  */
32 overlay(win1, win2)
33 reg WINDOW	*win1, *win2; {
34 
35 	reg char	*sp, *end;
36 	reg int		x, y, endy, endx, starty, startx;
37 	reg int 	y1,y2;
38 
39 # ifdef DEBUG
40 	fprintf(outf, "OVERLAY(%0.2o, %0.2o);\n", win1, win2);
41 # endif
42 	starty = max(win1->_begy, win2->_begy);
43 	startx = max(win1->_begx, win2->_begx);
44 	endy = min(win1->_maxy + win1->_begy, win2->_maxy + win2->_begx);
45 	endx = min(win1->_maxx + win1->_begx, win2->_maxx + win2->_begx);
46 # ifdef DEBUG
47 	fprintf(outf, "OVERLAY:from (%d,%d) to (%d,%d)\n", starty, startx, endy, endx);
48 # endif
49 	if (starty >= endy || startx >= endx)
50 		return;
51 	y1 = starty - win1->_begy;
52 	y2 = starty - win2->_begy;
53 	for (y = starty; y < endy; y++, y1++, y2++) {
54 		end = &win1->_y[y1][endx - win1->_begx];
55 		x = startx - win2->_begx;
56 		for (sp = &win1->_y[y1][startx - win1->_begx]; sp < end; sp++) {
57 			if (!isspace(*sp))
58 				mvwaddch(win2, y2, x, *sp);
59 			x++;
60 		}
61 	}
62 }
63