jerq code (Part 1 of 4)
S.Kenyon
sk at ukc.UUCP
Wed Apr 10 20:38:48 AEST 1985
Well, when I got back from Paris (very enjoyable) there were 30
requests for this, so here it is. I hope it is of use.
----------------------shar archive-----------------------------
#!/bin/sh
echo 'Start of jerq layers code, part 01 of 04:'
echo 'x - src/bitblt.c'
sed 's/^X//' > src/bitblt.c << '/'
X
X/*
X * File: bitblt.c
X *
X * Sccs-id: @(#)bitblt.c 1.4 85/03/24
X *
X * Description: This file contains the one routine bitblt which
X * copies the source rectangle r in a bitmap sb to the
X * corresponding rectangle with origin p in the destination
X * bitmap db using the optional halftone bitmap hb.
X *
X * Author: Simon Kenyon.
X *
X * History: SCK 1.1 83/10/03 Created.
X * SCK 1.2 84/11/29 Made it work.
X * SCK 1.3 85/03/04 Tidied up for release.
X * SCK 1.4 85/03/24 Changed the include files around.
X */
X
X#include "../h/layers.h"
X
Xunsigned short RightMasks[] = {
X 0x0000,
X 0x0001, 0x0003, 0x0007, 0x000F,
X 0x001F, 0x003F, 0x007F, 0x00FF,
X 0x01FF, 0x03FF, 0x07FF, 0x0FFF,
X 0x1FFF, 0x3FFF, 0x7FFF, 0xFFFF
X};
Xunsigned short AllOnes = 0xFFFF;
X
X/*
X * Name: bitblt
X *
X * Description: Copy the source rectangle r in a bitmap sb to the
X * corresponding rectangle with origin p in the destination
X * bitmap db using the optional halftone bitmap hb.
X * (Algorithm snarfed from the 1st Smalltalk-80 book)
X *
X * Synopsis: bitblt (sb, r, db, p, hb, f)
X * struct Bitmap *sb;
X * struct Rectangle r;
X * struct Bitmap *db;
X * struct Point p;
X * struct Bitmap *hb;
X * int f;
X *
X * Globals: RightMasks (r)
X * AllOnes (r)
X *
X * Calls: merge (merge.c)
X *
X * Called by: addobs (addobs.c)
X * screenswap (screenswap.c)
X * newlayer (newlayer.c)
X * background (background.c)
X * LBblt (LBblt.c)
X * rectf (rectf.c)
X */
Xbitblt (sb, r, db, p, hb, f)
Xstruct Bitmap *sb; /* source bitmap */
Xstruct Rectangle r; /* source rectangle */
Xstruct Bitmap *db; /* destination bitmap */
Xstruct Point p; /* point in destination bitmap to start
X operation */
Xstruct Bitmap *hb; /* halftone bitmap */
Xint f; /* operation to perform */
X{
X int sourceIndex;
X int destIndex;
X int sourceDelta;
X int destDelta;
X boolean preload;
X int sx;
X int sy;
X int dx;
X int dy;
X int w;
X int h;
X int startBits;
X int endBits;
X int word;
X int skew;
X int nWords;
X int vDir;
X int hDir;
X int i;
X unsigned short merge ();
X unsigned short t; /* temp for exchanging masks */
X unsigned short prevWord;
X unsigned short thisWord;
X unsigned short skewWord;
X unsigned short mergeMask;
X unsigned short mergeWord;
X unsigned short destWord;
X unsigned short mask1;
X unsigned short mask2;
X unsigned short skewMask;
X unsigned short halftoneWord;
X
X /*
X * set w and h
X */
X w = r.corner.x - r.origin.x;
X h = r.corner.y - r.origin.y;
X if ((w <= 0) || (h <= 0))
X return; /* null range */
X /*
X * calculate sx, sy, dx and dy
X */
X sx = r.origin.x;
X sy = r.origin.y;
X dx = p.x;
X dy = p.y;
X /*
X * calculate skew and edge masks
X */
X skew = (sx - dx) % WORDSIZE;
X if (skew < 0)
X skew += WORDSIZE;
X /*
X * how many bits source gets skewed to right
X */
X startBits = WORDSIZE - (dx % WORDSIZE);
X /*
X * how many bits in first word
X */
X mask1 = RightMasks[startBits];
X endBits = WORDSIZE - ((dx + w - 1) % WORDSIZE + 1);
X /*
X * how many bits in last word
X */
X mask2 = ~RightMasks[endBits];
X skewMask = (skew == 0 ? 0 : RightMasks[WORDSIZE - skew]);
X /*
X * determine number of words stored per line
X * merge masks if necessary
X */
X if (w <= startBits) { /* I think this should be <=, not < */
X mask1 = mask1 & mask2;
X mask2 = 0;
X nWords = 1;
X }
X else
X nWords = (w - startBits - 1) / WORDSIZE + 2;
X /*
X * check for possible overlap of source and destination
X */
X hDir = vDir = 1; /* default for no overlap */
X if ((sb == db) && (dy >= sy)) {
X if (dy > sy) { /* have to start at bottom */
X vDir = -1;
X sy = sy + h - 1;
X dy = dy + h - 1;
X }
X else {
X if (dx > sx) {
X /*
X * y's are equal, but x's are backwards
X */
X hDir = -1;
X sx = sx + w - 1;
X /*
X * start at right
X */
X dx = dx + w - 1;
X /*
X * and fix up masks
X */
X skewMask = ~skewMask;
X t = mask1;
X mask1 = mask2;
X mask2 = t;
X }
X }
X }
X /*
X * check if need to reload buffer (i.e., two words of
X * source needed for first word of destination)
X */
X preload = ((sb != NULL) && ((skew != 0) &&
X ((dx % WORDSIZE) <= (sx % WORDSIZE))));
X if (hDir < 0)
X preload = !preload;
X /*
X * calculate starting offsets
X */
X if (sb != NULL)
X sourceIndex = (sy - sb -> rect.origin.y) * sb -> width +
X (sx / WORDSIZE) -
X (sb -> rect.origin.x / WORDSIZE);
X else
X sourceIndex = 0;
X destIndex = (dy - db -> rect.origin.y) * db -> width +
X (dx / WORDSIZE) -
X (db -> rect.origin.x / WORDSIZE);
X /*
X * calculate increments from end of one line to start of next
X */
X if (sb != NULL)
X sourceDelta = (sb -> width * vDir) - ((nWords + (preload ? 1 : 0)) * hDir);
X else
X sourceDelta = 0;
X destDelta = (db -> width * vDir) - (nWords * hDir);
X /*
X * perform the data transfer
X */
X for (i = 1; i <= h; i++) { /* this is the vertical loop */
X if (hb != NULL) {
X halftoneWord = *(hb -> base + (dy % WORDSIZE));
X dy = dy + vDir;
X }
X else
X halftoneWord = AllOnes;
X skewWord = halftoneWord;
X if (preload) {
X prevWord = *(sb -> base + sourceIndex);
X /*
X * load the 32-bit shifter (will also work with 32-bit ints,
X * so this might be a 64-bit shifter)
X */
X sourceIndex = sourceIndex + hDir;
X }
X else
X prevWord = 0;
X mergeMask = mask1;
X /*
X * here is the inner horizontal loop
X */
X for (word = 1; word <= nWords; word++) {
X if (sb != NULL) {
X prevWord = prevWord & skewMask;
X /*
X * pick up next word
X */
X thisWord = *(sb -> base + sourceIndex);
X skewWord = prevWord | (thisWord & ~skewMask);
X prevWord = thisWord;
X /*
X * 16-bit rotate (actually, this code will work on 32-bit ints as well)
X */
X skewWord = (skewWord << skew) | (skewWord >> (WORDSIZE - skew));
X }
X destWord = *(db -> base + destIndex);
X mergeWord = merge ((skewWord & halftoneWord), destWord, f);
X *(db -> base + destIndex) = ((mergeMask & mergeWord) |
X (~mergeMask & destWord));
X sourceIndex = sourceIndex + hDir;
X destIndex = destIndex + hDir;
X if (word == (nWords - 1))
X mergeMask = mask2;
X else
X mergeMask = AllOnes;
X }
X sourceIndex = sourceIndex + sourceDelta;
X destIndex = destIndex + destDelta;
X }
X}
/
echo 'x - src/newlayer.c'
sed 's/^X//' > src/newlayer.c << '/'
X
X/*
X * File: newlayer.c
X *
X * Sccs-id: @(#)newlayer.c 1.4 85/03/24
X *
X * Description: This file contains the function newlayer which
X * creates a new layer in rectangle r of bitmap *bp
X * and either fills the layer with optional halftone hb
X * or clears it. It returns a pointer to the new layer.
X *
X * Author: Simon Kenyon.
X *
X * History: SCK 1.1 83/10/03 Created.
X * SCK 1.2 84/11/29 Made it work.
X * SCK 1.3 85/03/04 Tidied up for release.
X * SCK 1.4 85/03/24 Changed the include files around.
X */
X
X#include "../h/layers.h"
X
Xextern struct Layer *TopLayer;
Xextern struct Layer *BottomLayer;
Xextern struct Bitmap *display;
X
Xstruct Obscured *obs;
Xstruct Obscured *endobs;
X
X/*
X * Name: newlayer
X *
X * Description: Create a new layer in rectangle r of bitmap *bp
X * and either fill the layer with optional halftone hb
X * or clear it. Return a pointer to the new layer.
X *
X * Synopsis: struct Layer *newlayer (bp, r, hb)
X * struct Bitmap *bp;
X * struct Rectangle r;
X * struct Bitmap *hb;
X *
X * Globals: obs (r/w)
X * endobs (r/w)
X * addpiece () (addpiece.c)
X * TopLayer (r/w)
X * BottomLayer (r/w)
X * display (r/w)
X *
X * Calls:
X * rectXrect (rectxrect.c)
X * addobs (addobs.c)
X * bfree (bfree.c)
X * free (libc)
X * malloc (libc)
X * layerop (layerop.c)
X * balloc (balloc.c)
X * upfront (upfront.c)
X * bitblt (bitblt.c)
X * rectf (rectf.c)
X *
X * Called by: This is a top level function.
X */
Xstruct Layer *newlayer (bp, r, hb)
Xstruct Bitmap *bp;
Xstruct Rectangle r;
Xstruct Bitmap *hb; /* optional half tone to fill layer */
X{
X struct Layer *lp;
X struct Layer *newlp;
X struct Obscured *op;
X struct Obscured *nop;
X
X int addpiece ();
X struct Bitmap *balloc ();
X char *malloc ();
X
X /*
X * first build, in obs, a list of all obscured rectangles that
X * will be obscured by the new layer, doing subdivision with
X * addobs()
X */
X obs = NULL;
X endobs = NULL;
X for (lp = TopLayer; lp != NULL; lp = lp -> back) {
X /* lp = each layer from front to back */
X for (op = lp -> obs; op != NULL;) {
X /* op = each obscured portion of lp */
X nop = op;
X op = op -> next;
X if (rectXrect (r, nop -> rect) &&
X addobs (nop, nop -> rect, r, lp)) {
X /*
X * unlink nop from lp -> obs
X */
X if (nop -> prev != NULL)
X nop -> prev -> next = nop -> next;
X else
X lp -> obs = nop -> next;
X if (nop -> next != NULL)
X nop -> next -> prev = nop -> prev;
X else
X lp -> endobs = nop -> prev;
X (void) bfree (nop -> bmap);
X free ((char *) nop);
X }
X }
X }
X /*
X * now add the rectangles not currently obscured, but that will
X * be obscured by the new layer, by building the layer and
X * calling layerop()
X */
X /*
X * newlp = new layer
X */
X newlp = (struct Layer *) malloc ((unsigned) sizeof (struct Layer));
X /*
X * bitmap part of newlp = bp
X */
X newlp -> base = bp -> base; /* to be perfectly frank, */
X newlp -> width = bp -> width; /* I don't understand what */
X /* these are used for */
X newlp -> rect = r;
X newlp -> obs = obs; /* currently obscured ... */
X newlp -> endobs = endobs;
X for (lp = TopLayer; lp != NULL; lp = lp -> back)
X /* lp = each layer from front to back */
X (void) layerop (newlp, addpiece, lp -> rect, lp, NULL, NULL, NULL);
X newlp -> obs = obs; /* ... and soon to be */
X newlp -> endobs = endobs;
X for (op = obs; op != NULL; op = op -> next)/* op = each element of obs */
X op -> bmap = balloc (op -> rect);
X /*
X * link newlp into back of layer list
X */
X if (BottomLayer != NULL)
X BottomLayer -> back = newlp;
X else /* first layer */
X TopLayer = newlp;
X newlp -> front = BottomLayer;
X newlp -> back = NULL;
X BottomLayer = newlp;
X (void) upfront (newlp);
X if (hb != NULL)
X (void) bitblt (NULL, newlp -> rect, display, newlp -> rect.origin, hb, S);
X else
X (void) rectf (display, newlp -> rect, CLR);
X /* clear the screen rectangle */
X return (newlp);
X}
/
echo 'x - test/sierpinski.c'
sed 's/^X//' > test/sierpinski.c << '/'
X
X/*
X * File: sierpinski.c
X *
X * Sccs-id: @(#)sierpinski.c 1.3 85/03/24
X *
X * Description: This file contains code to plot sierpinski curves
X * as described in
X * Algorithms + Data Structures = Programs
X * by N. Wirth.
X *
X * Author: Simon Kenyon.
X *
X * History: SCK 1.1 85/03/15 Created.
X * SCK 1.2 85/03/22 Tidied up for release.
X * SCK 1.3 85/03/24 Changed the include files around.
X */
X
X#include "../h/layers.h"
X
Xstruct Layer *drawP;
X
X/*
X * Name: sierpinski
X *
X * Description: Control routine for drawing sierpinski curves.
X *
X * Synopsis: sierpinski (depth, grid)
X * int depth;
X * int grid;
X *
X * Globals: None.
X *
X * Calls: a (sierpinski.c)
X * do_plot (sierpinski.c)
X * b (sierpinski.c)
X * c (sierpinski.c)
X * d (sierpinski.c)
X *
X * Called by: test (test.c)
X */
Xsierpinski (depth, grid)
Xint depth; /* draw sierpinski curves of orders 1 to
X depth */
Xint grid; /* size to draw them */
X{
X struct Point home;
X struct Point old;
X struct Point cur;
X int i;
X int h;
X
X h = grid / 4;
X home.x = 2 * h;
X home.y = 3 * h;
X for (i = 1; i <= depth; i++) {
X home.x -= h;
X h = h / 2;
X home.y += h;
X cur = old = home;
X a (i, h, &old, &cur);
X cur.x += h;
X cur.y -= h;
X do_plot (&old, &cur);
X b (i, h, &old, &cur);
X cur.x -= h;
X cur.y -= h;
X do_plot (&old, &cur);
X c (i, h, &old, &cur);
X cur.x -= h;
X cur.y += h;
X do_plot (&old, &cur);
X d (i, h, &old, &cur);
X cur.x += h;
X cur.y += h;
X do_plot (&old, &cur);
X }
X}
X
X/*
X * Name: do_plot
X *
X * Description: Draw a line from old to cur.
X *
X * Synopsis: do_plot (old, cur)
X * struct Point *old;
X * struct Point *cur;
X *
X * Globals: drawP (r/w)
X *
X * Calls: lline (lline.c)
X *
X * Called by: sierpinski (sierpinski.c)
X * a (sierpinski.c)
X * b (sierpinski.c)
X * c (sierpinski.c)
X * d (sierpinski.c)
X */
Xdo_plot (old, cur)
Xstruct Point *old;
Xstruct Point *cur;
X{
X lline (drawP, *old, *cur, S);
X *old = *cur;
X}
X
X/*
X * Name: a
X *
X * Description: Recursive procedure used to draw sierpinski curves.
X *
X * Synopsis: a (i, h, old, cur)
X * int i;
X * int h;
X * struct Point *cur;
X * struct Point *old;
X *
X * Globals: None.
X *
X * Calls: a (sierpinski.c)
X * do_plot (sierpinski.c)
X * b (sierpinski.c)
X * d (sierpinski.c)
X *
X * Called by: sierpinski (sierpinski.c)
X * a (sierpinski.c)
X * b (sierpinski.c)
X * d (sierpinski.c)
X */
Xa (i, h, old, cur)
Xint i;
Xint h;
Xstruct Point *cur;
Xstruct Point *old;
X{
X if (i > 0) {
X a (i - 1, h, cur, old);
X old -> x += h;
X old -> y -= h;
X do_plot (cur, old);
X b (i - 1, h, cur, old);
X old -> x += 2 * h;
X do_plot (cur, old);
X d (i - 1, h, cur, old);
X old -> x += h;
X old -> y += h;
X do_plot (cur, old);
X a (i - 1, h, cur, old);
X }
X}
X
X/*
X * Name: b
X *
X * Description: Recursive procedure used to draw sierpinski curves.
X *
X * Synopsis: b (i, h, old, cur)
X * int i;
X * int h;
X * struct Point *cur;
X * struct Point *old;
X *
X * Globals: None.
X *
X * Calls: b (sierpinski.c)
X * do_plot (sierpinski.c)
X * c (sierpinski.c)
X * a (sierpinski.c)
X *
X * Called by: sierpinski (sierpinski.c)
X * a (sierpinski.c)
X * b (sierpinski.c)
X * c (sierpinski.c)
X */
Xb (i, h, old, cur)
Xint i;
Xint h;
Xstruct Point *cur;
Xstruct Point *old;
X{
X if (i > 0) {
X b (i - 1, h, cur, old);
X old -> x -= h;
X old -> y -= h;
X do_plot (cur, old);
X c (i - 1, h, cur, old);
X old -> y -= 2 * h;
X do_plot (cur, old);
X a (i - 1, h, cur, old);
X old -> x += h;
X old -> y -= h;
X do_plot (cur, old);
X b (i - 1, h, cur, old);
X }
X}
X
X/*
X * Name: c
X *
X * Description: Recursive procedure used to draw sierpinski curves.
X *
X * Synopsis: c (i, h, old, cur)
X * int i;
X * int h;
X * struct Point *cur;
X * struct Point *old;
X *
X * Globals: None.
X *
X * Calls: c (sierpinski.c)
X * do_plot (sierpinski.c)
X * d (sierpinski.c)
X * b (sierpinski.c)
X *
X * Called by: sierpinski (sierpinski.c)
X * b (sierpinski.c)
X * c (sierpinski.c)
X * d (sierpinski.c)
X */
Xc (i, h, old, cur)
Xint i;
Xint h;
Xstruct Point *cur;
Xstruct Point *old;
X{
X if (i > 0) {
X c (i - 1, h, cur, old);
X old -> x -= h;
X old -> y += h;
X do_plot (cur, old);
X d (i - 1, h, cur, old);
X old -> x -= 2 * h;
X do_plot (cur, old);
X b (i - 1, h, cur, old);
X old -> x -= h;
X old -> y -= h;
X do_plot (cur, old);
X c (i - 1, h, cur, old);
X }
X}
X
X/*
X * Name: d
X *
X * Description: Recursive procedure used to draw sierpinski curves.
X *
X * Synopsis: d (i, h, old, cur)
X * int i;
X * int h;
X * struct Point *cur;
X * struct Point *old;
X *
X * Globals: None.
X *
X * Calls: d (sierpinski.c)
X * do_plot (sierpinski.c)
X * a (sierpinski.c)
X * c (sierpinski.c)
X *
X * Called by: sierpinski (sierpinski.c)
X * a (sierpinski.c)
X * c (sierpinski.c)
X * d (sierpinski.c)
X */
Xd (i, h, old, cur)
Xint i;
Xint h;
Xstruct Point *cur;
Xstruct Point *old;
X{
X if (i > 0) {
X d (i - 1, h, cur, old);
X old -> x += h;
X old -> y += h;
X do_plot (cur, old);
X a (i - 1, h, cur, old);
X old -> y += 2 * h;
X do_plot (cur, old);
X c (i - 1, h, cur, old);
X old -> x -= h;
X old -> y += h;
X do_plot (cur, old);
X d (i - 1, h, cur, old);
X }
X}
/
echo 'x - test/test.c'
sed 's/^X//' > test/test.c << '/'
X
X/*
X * File: test.c
X *
X * Sccs-id: @(#)test.c 1.3 85/03/24
X *
X * Description: This file contains the one routine test which
X * calls the various jerq routines in an attempt to test them.
X *
X * Author: Simon Kenyon.
X *
X * History: SCK 1.1 85/03/08 Created.
X * SCK 1.2 85/03/21 Tidied up for release.
X * SCK 1.3 85/03/24 Changed the include files around.
X */
X
X#include "../h/layers.h"
X
Xextern struct Bitmap *display;
X
Xunsigned short spiral[] = {
X 0xFFFF, 0x8001, 0xBFFD, 0xA005,
X 0xAFF5, 0xA815, 0xABD5, 0xAA55,
X 0xAA55, 0xABD5, 0xA815, 0xAFF5,
X 0xA005, 0xBFFD, 0x8001, 0xFFFF,
X 0x0000
X};
Xunsigned short pattern[] = {
X 0x3333, 0xCCCC, 0x3333, 0xCCCC,
X 0x3333, 0xCCCC, 0x3333, 0xCCCC,
X 0x3333, 0xCCCC, 0x3333, 0xCCCC,
X 0x3333, 0xCCCC, 0x3333, 0xCCCC,
X 0x0000
X};
Xunsigned short ht1[] = {
X 0x5555, 0x5555, 0x5555, 0x5555,
X 0x5555, 0x5555, 0x5555, 0x5555,
X 0x5555, 0x5555, 0x5555, 0x5555,
X 0x5555, 0x5555, 0x5555, 0x5555,
X 0x0000
X};
Xunsigned short ht2[] = {
X 0xFFFF, 0x0000, 0xFFFF, 0x0000,
X 0xFFFF, 0x0000, 0xFFFF, 0x0000,
X 0xFFFF, 0x0000, 0xFFFF, 0x0000,
X 0xFFFF, 0x0000, 0xFFFF, 0x0000,
X 0x0000
X};
Xunsigned short ht3[] = {
X 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF,
X 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF,
X 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF,
X 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF,
X 0x0000
X};
X
Xstruct Point tp1 = {20, 42};
Xstruct Point tpa = {22, 22};
Xstruct Point tpb = {22, 02};
Xstruct Point tpc = {42, 02};
Xstruct Point tpd = {42, 22};
Xstruct Point tpe = {42, 42};
Xstruct Point tpf = {22, 42};
Xstruct Point tpg = {02, 42};
Xstruct Point tph = {02, 22};
Xstruct Point tpi = {02, 02};
Xstruct Point startp = {10, 10};
Xstruct Point endp = {60, 60};
X
Xstruct Rectangle trx = {{00, 00}, {256, 256}};
Xstruct Rectangle try = {{00, 00}, {256, 256}};
Xstruct Rectangle trz = {{00, 00}, {256, 256}};
X
Xstruct Rectangle tr = {{16, 32}, {32, 48}};
Xstruct Rectangle tr1 = {{05, 10}, {40, 50}};
Xstruct Rectangle tr2 = {{10, 40}, {50, 60}};
Xstruct Rectangle tr3 = {{25, 30}, {60, 55}};
Xstruct Rectangle trla = {{01, 01}, {60, 60}};
Xstruct Rectangle tra = {{22, 22}, {38, 38}};
Xstruct Rectangle trb = {{22, 02}, {38, 18}};
Xstruct Rectangle trc = {{42, 02}, {58, 18}};
Xstruct Rectangle trd = {{42, 22}, {58, 38}};
Xstruct Rectangle tre = {{42, 42}, {58, 58}};
Xstruct Rectangle trf = {{22, 42}, {38, 58}};
Xstruct Rectangle trg = {{02, 42}, {18, 58}};
Xstruct Rectangle trh = {{02, 22}, {18, 38}};
Xstruct Rectangle tri = {{02, 02}, {18, 18}};
X
Xstruct Bitmap testb = {pattern, 1, {{16, 32}, {32, 48}}, 0};
Xstruct Bitmap hb1 = {ht1, 1, {{ 0, 0}, {WORDSIZE, WORDSIZE}}, 0};
Xstruct Bitmap hb2 = {ht2, 1, {{ 0, 0}, {WORDSIZE, WORDSIZE}}, 0};
Xstruct Bitmap hb3 = {ht3, 1, {{ 0, 0}, {WORDSIZE, WORDSIZE}}, 0};
Xstruct Bitmap hba = {spiral, 1, {{ 0, 0}, {WORDSIZE, WORDSIZE}}, 0};
X
Xstruct Layer *drawP;
X
Xstruct Layer *tl1;
Xstruct Layer *tl2;
Xstruct Layer *tl3;
Xstruct Layer *tla;
X
X/*
X * Name: test
X *
X * Description: Test the layer code.
X *
X * Synopsis: test (testno, size)
X * int testno;
X * int size;
X *
X * Globals: None.
X *
X * Calls: layers (layers.c)
X * newlayer (newlayer.c)
X * lline (lline.c)
X * hilbert (hilbert.c)
X * sierpinski (sierpinski.c)
X * plot (plot.c)
X * lblt (lblt.c)
X * lbitblt (lbitblt.c)
X * upfront (upfront.c)
X * dellayer (dellayer.c)
X *
X * Called by: main (jerq.c)
X */
Xtest (testno, size)
Xint testno;
Xint size;
X{
X int i;
X
X struct Layer *newlayer ();
X
X layers ();
X switch (testno) {
X default:
X case 1:
X tl1 = newlayer (display, trx, NULL);
X plot (display, display -> rect, size);
X startp.x = 110;
X startp.y = 110;
X for (i = 10; i <= 210; i += 5) {
X endp.x = i;
X endp.y = 10;
X lline (tl1, startp, endp, S);
X }
X for (i = 10; i <= 210; i += 5) {
X endp.x = 210;
X endp.y = i;
X lline (tl1, startp, endp, S);
X }
X for (i = 10; i <= 210; i += 5) {
X endp.x = i;
X endp.y = 210;
X lline (tl1, startp, endp, S);
X }
X for (i = 10; i <= 210; i += 5) {
X endp.x = 10;
X endp.y = i;
X lline (tl1, startp, endp, S);
X }
X plot (display, display -> rect, size);
X break;
X case 2:
X drawP = newlayer (display, try, NULL);
X plot (display, display -> rect, size);
X hilbert (4, 128);
X break;
X case 3:
X drawP = newlayer (display, trz, NULL);
X plot (display, display -> rect, size);
X sierpinski (4, 128);
X break;
X case 4:
X plot (display, display -> rect, size);
X tl1 = newlayer (display, tr1, &hb1);
X plot (display, display -> rect, size);
X tl2 = newlayer (display, tr2, &hb2);
X plot (display, display -> rect, size);
X tl3 = newlayer (display, tr3, &hb3);
X plot (display, display -> rect, size);
X lblt (tl1, &testb, tr, NULL, tr.origin, S);
X plot (display, display -> rect, size);
X lbitblt (tl1, tr, tl2, tp1, NULL, S);
X plot (display, display -> rect, size);
X upfront (tl1);
X plot (display, display -> rect, size);
X upfront (tl2);
X plot (display, display -> rect, size);
X upfront (tl3);
X plot (display, display -> rect, size);
X dellayer (tl2);
X plot (display, display -> rect, size);
X dellayer (tl1);
X plot (display, display -> rect, size);
X dellayer (tl3);
X plot (display, display -> rect, size);
X break;
X case 5:
X tla = newlayer (display, trla, NULL);
X plot (display, display -> rect, size);
X lblt (tla, &hba, hba.rect, NULL, tpa, S);
X plot (display, display -> rect, size);
X lbitblt (tla, tra, tla, tpb, NULL, S);
X plot (display, display -> rect, size);
X lbitblt (tla, tra, tla, tpc, NULL, S);
X plot (display, display -> rect, size);
X lbitblt (tla, tra, tla, tpd, NULL, S);
X plot (display, display -> rect, size);
X lbitblt (tla, tra, tla, tpe, NULL, S);
X plot (display, display -> rect, size);
X lbitblt (tla, tra, tla, tpf, NULL, S);
X plot (display, display -> rect, size);
X lbitblt (tla, tra, tla, tpg, NULL, S);
X plot (display, display -> rect, size);
X lbitblt (tla, tra, tla, tph, NULL, S);
X plot (display, display -> rect, size);
X lbitblt (tla, tra, tla, tpi, NULL, S);
X plot (display, display -> rect, size);
X break;
X }
X}
/
echo 'Part 01 of jerq layers code complete.'
exit
--
Simon Kenyon
More information about the Comp.sources.unix
mailing list