home *** CD-ROM | disk | FTP | other *** search
/ Usenet 1994 January / usenetsourcesnewsgroupsinfomagicjanuary1994.iso / sources / x / volume6 / xplumb / part01 / piece.C < prev    next >
C/C++ Source or Header  |  1990-04-11  |  7KB  |  160 lines

  1. /*
  2.  * Copyright 1990 Digital Equipment Corporation
  3.  *
  4.  * Permission to use, copy, modify, and distribute this software and its
  5.  * documentation for any purpose and without fee is hereby granted,
  6.  * provided that the above copyright notice appear in all copies and that
  7.  * both that copyright notice and this permission notice appear in
  8.  * supporting documentation, and that the name of Digital Equipment
  9.  * Corporation not be used in advertising or publicity pertaining to
  10.  * distribution of the software without specific, written prior
  11.  * permission.  Digital Equipment Corporation makes no representations
  12.  * about the suitability of this software for any purpose.  It is
  13.  * provided "as is" without express or implied warranty.
  14.  *
  15.  * DIGITAL EQUIPMENT CORPORATION DISCLAIMS ALL WARRANTIES WITH REGARD TO
  16.  * THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND
  17.  * FITNESS, IN NO EVENT SHALL DIGITAL EQUIPMENT CORPORATION BE LIABLE FOR
  18.  * ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
  19.  * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
  20.  * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT
  21.  * OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
  22.  *
  23.  * Author:  Terry Weissman
  24.  *          weissman@wsl.dec.com
  25.  */
  26.  
  27. #include "plumbing.h"
  28.  
  29. static int numpieces = 0;
  30.  
  31. PieceRec::PieceRec(Direction updir, Direction downdir, Direction leftdir,
  32.            Direction rightdir, PieceRecFunc painter) {
  33.     out[Up] = updir;
  34.     out[Down] = downdir;
  35.     out[Left] = leftdir;
  36.     out[Right] = rightdir;
  37.     func = painter;
  38.     id = numpieces++;
  39.     piecelist[id] = this;
  40. }
  41.  
  42. void PieceRec::Paint(Scrn scrn, int x, int y) {
  43.     int ssize = scrn->GetSSize();
  44.     Display *dpy = scrn->GetDpy();
  45.     Window window = scrn->GetWindow();
  46.     Pixmap pixmap = scrn->GetPieceCache(this);
  47.     if (!pixmap) {
  48.     pixmap = XCreatePixmap(dpy, window, ssize, ssize,
  49.                    DefaultDepth(dpy, DefaultScreen(dpy)));
  50.     XFillRectangle(dpy, pixmap, scrn->GetBackgroundGC(), 0, 0,
  51.                ssize, ssize);
  52.     (*func)(scrn, dpy, pixmap, ssize, scrn->GetForegroundGC());
  53.     scrn->SetPieceCache(this, pixmap);
  54.     }
  55.     XCopyArea(dpy, pixmap, window, scrn->GetCopyGC(),
  56.           0, 0, ssize, ssize, x, y);
  57. }
  58.  
  59.  
  60. inline int L(int ssize) {return ssize / 3;}
  61. inline int H(int ssize) {return 2 * ssize / 3;}
  62.  
  63. static void PaintNone(Scrn, Display *dpy, Pixmap pixmap, int ssize, GC gc) {
  64.     XDrawLine(dpy, pixmap, gc, 0, 0, ssize, ssize);
  65.     XDrawLine(dpy, pixmap, gc, 0, ssize, ssize, 0);
  66. }
  67.  
  68. static void PaintHBar(Scrn, Display *dpy, Pixmap pixmap, int ssize, GC gc) {
  69.     XDrawLine(dpy, pixmap, gc, 0, L(ssize), ssize, L(ssize));
  70.     XDrawLine(dpy, pixmap, gc, 0, H(ssize), ssize, H(ssize));
  71. }
  72.  
  73. static void PaintCross(Scrn, Display *dpy, Pixmap pixmap, int ssize, GC gc) {
  74.     XDrawLine(dpy, pixmap, gc, 0, L(ssize), L(ssize), L(ssize));
  75.     XDrawLine(dpy, pixmap, gc, L(ssize), L(ssize), L(ssize), 0);
  76.     XDrawLine(dpy, pixmap, gc, H(ssize), 0, H(ssize), L(ssize));
  77.     XDrawLine(dpy, pixmap, gc, H(ssize), L(ssize), ssize, L(ssize));
  78.     XDrawLine(dpy, pixmap, gc, 0, H(ssize), L(ssize), H(ssize));
  79.     XDrawLine(dpy, pixmap, gc, L(ssize), H(ssize), L(ssize), ssize);
  80.     XDrawLine(dpy, pixmap, gc, H(ssize), ssize, H(ssize), H(ssize));
  81.     XDrawLine(dpy, pixmap, gc, H(ssize), H(ssize), ssize, H(ssize));
  82. }
  83.  
  84. static void PaintVBar(Scrn, Display *dpy, Pixmap pixmap, int ssize, GC gc) {
  85.     XDrawLine(dpy, pixmap, gc, L(ssize), 0, L(ssize), ssize);
  86.     XDrawLine(dpy, pixmap, gc, H(ssize), 0, H(ssize), ssize);
  87. }
  88.  
  89. static void PaintUL(Scrn, Display *dpy, Pixmap pixmap, int ssize, GC gc) {
  90.     XDrawLine(dpy, pixmap, gc, 0, L(ssize), L(ssize), L(ssize));
  91.     XDrawLine(dpy, pixmap, gc, L(ssize), L(ssize), L(ssize), 0);
  92.     XDrawLine(dpy, pixmap, gc, 0, H(ssize), H(ssize), H(ssize));
  93.     XDrawLine(dpy, pixmap, gc, H(ssize), H(ssize), H(ssize), 0);
  94. }
  95.  
  96. static void PaintUR(Scrn, Display *dpy, Pixmap pixmap, int ssize, GC gc) {
  97.     XDrawLine(dpy, pixmap, gc, L(ssize), 0, L(ssize), H(ssize));
  98.     XDrawLine(dpy, pixmap, gc, L(ssize), H(ssize), ssize, H(ssize));
  99.     XDrawLine(dpy, pixmap, gc, H(ssize), 0, H(ssize), L(ssize));
  100.     XDrawLine(dpy, pixmap, gc, H(ssize), L(ssize), ssize, L(ssize));
  101. }
  102.  
  103. static void PaintDL(Scrn, Display *dpy, Pixmap pixmap, int ssize, GC gc) {
  104.     XDrawLine(dpy, pixmap, gc, 0, L(ssize), H(ssize), L(ssize));
  105.     XDrawLine(dpy, pixmap, gc, H(ssize), L(ssize), H(ssize), ssize);
  106.     XDrawLine(dpy, pixmap, gc, 0, H(ssize), L(ssize), H(ssize));
  107.     XDrawLine(dpy, pixmap, gc, L(ssize), H(ssize), L(ssize), ssize);
  108. }
  109.  
  110. static void PaintDR(Scrn, Display *dpy, Pixmap pixmap, int ssize, GC gc) {
  111.     XDrawLine(dpy, pixmap, gc, L(ssize), ssize, L(ssize), L(ssize));
  112.     XDrawLine(dpy, pixmap, gc, L(ssize), L(ssize), ssize, L(ssize));
  113.     XDrawLine(dpy, pixmap, gc, H(ssize), ssize, H(ssize), H(ssize));
  114.     XDrawLine(dpy, pixmap, gc, H(ssize), H(ssize), ssize, H(ssize));
  115. }
  116.  
  117. static void PaintSUp(Scrn, Display *dpy, Pixmap pixmap, int ssize, GC gc) {
  118.     XDrawLine(dpy, pixmap, gc, L(ssize), 0, L(ssize), H(ssize));
  119.     XDrawLine(dpy, pixmap, gc, L(ssize), H(ssize), H(ssize), H(ssize));
  120.     XDrawLine(dpy, pixmap, gc, H(ssize), H(ssize), H(ssize), 0);
  121. }
  122.  
  123. static void PaintSDown(Scrn, Display *dpy, Pixmap pixmap, int ssize, GC gc) {
  124.     XDrawLine(dpy, pixmap, gc, L(ssize), ssize, L(ssize), L(ssize));
  125.     XDrawLine(dpy, pixmap, gc, L(ssize), L(ssize), H(ssize), L(ssize));
  126.     XDrawLine(dpy, pixmap, gc, H(ssize), L(ssize), H(ssize), ssize);
  127. }
  128.  
  129. static void PaintSLeft(Scrn, Display *dpy, Pixmap pixmap, int ssize, GC gc) {
  130.     XDrawLine(dpy, pixmap, gc, 0, L(ssize), H(ssize), L(ssize));
  131.     XDrawLine(dpy, pixmap, gc, H(ssize), L(ssize), H(ssize), H(ssize));
  132.     XDrawLine(dpy, pixmap, gc, H(ssize), H(ssize), 0, H(ssize));
  133. }
  134.  
  135. static void PaintSRight(Scrn, Display *dpy, Pixmap pixmap, int ssize, GC gc) {
  136.     XDrawLine(dpy, pixmap, gc, ssize, L(ssize), L(ssize), L(ssize));
  137.     XDrawLine(dpy, pixmap, gc, L(ssize), L(ssize), L(ssize), H(ssize));
  138.     XDrawLine(dpy, pixmap, gc, L(ssize), H(ssize), ssize, H(ssize));
  139. }
  140.     
  141.  
  142. void PieceInit() {
  143.     PieceNone = new PieceRec(BadDir, BadDir, BadDir, BadDir, PaintNone);
  144.     PieceHBar = new PieceRec(BadDir, BadDir, Right, Left, PaintHBar);
  145.     PieceVBar = new PieceRec(Down, Up, BadDir, BadDir, PaintVBar);
  146.     PieceCross = new PieceRec(Down, Up, Right, Left, PaintCross);
  147.     PieceUL = new PieceRec(Left, BadDir, Up, BadDir, PaintUL);
  148.     PieceUR = new PieceRec(Right, BadDir, BadDir, Up, PaintUR);
  149.     PieceDL = new PieceRec(BadDir, Left, Down, BadDir, PaintDL);
  150.     PieceDR = new PieceRec(BadDir, Right, BadDir, Down, PaintDR);
  151.     PieceStart[Up] = new PieceRec(BadDir, BadDir, BadDir, BadDir,
  152.                   PaintSUp);
  153.     PieceStart[Down] = new PieceRec(BadDir, BadDir, BadDir, BadDir,
  154.                     PaintSDown);
  155.     PieceStart[Left] = new PieceRec(BadDir, BadDir, BadDir, BadDir,
  156.                     PaintSLeft);
  157.     PieceStart[Right] = new PieceRec(BadDir, BadDir, BadDir, BadDir,
  158.                      PaintSRight);
  159. }
  160.