baron@runx.OZ (Jason Haines) (07/06/86)
Here is the C source to zoomrect() - a function that produces the zooming
effect found in various programs like the Finder.
/* Jason Haines ACSnet: baron@runx
* ElecEng Undergraduate CSNET: baron@runx.oz
* Australia ARPA: baron%runx.oz@seismo.css.gov
*
* UUCP:
* {enea,hplabs,mcvax,prlb2,seismo,ubc-vision,ukc}!munnari!runx.oz!baron
*/
--------------------------(Cut Here)----------------------------
/*
* Title: zoomrect.c
* Author: Jason Haines
* Version: 1.0
* Date: July 6th 1986
*
* Synopsis: The function zoomrect(sourcerect,destrect,zoomSteps) produces
* the zoom effect found in the Finder.
* Where:
* sourcerect is the source rectangle;
* destrect is the destination rectangle;
* zoomSteps is the number of intermediate rectangles
* displayed.
*
*
* Jason Haines
* 73 Davidson Avenue
* Concord NSW 2137
* AUSTRALIA
*
* STD: (02) 73-4444
* ISD: +61 2 73-4444
* ACSnet: baron@runx
* CSNET: baron@runx.oz
* ARPA: baron%runx.oz@seismo.css.gov
* JANET: runx.oz!baron@ukc
* UUCP: {enea,hplabs,mcvax,prlb2,seismo,ubc-vision,ukc}!munnari!runx.oz!baron
*/
#include "qd.h"
#include "qdvars.h"
#define MaxZoom 100
zoomrect(r1,r2,zoomSteps)
rect *r1,*r2;
int zoomSteps;
{
int hDiff, vDiff, widDiff, htDiff;
int l, t, r, b;
int rWid, rHt;
register int i, j;
register int zIndex;
rect *rp;
static rect zRect[MaxZoom];
penstate oldpen;
if (zoomSteps > MaxZoom)
return(0);
getpenstate(&oldpen);
penpat(gray);
penmode(notpatxor);
zIndex = zoomSteps;
hDiff = r2->a.left - r1->a.left; /* positive if moving to right */
vDiff = r2->a.top - r1->a.top; /* positive if moving down */
rWid = r1->a.right - r1->a.left;
rHt = r1->a.bottom - r1->a.top;
widDiff = (r2->a.right - r2->a.left) - rWid;
htDiff = (r2->a.bottom - r2->a.top) - rHt;
for ( i = 1; i < 3 ; i++)
for ( j = 1; j < zoomSteps ; j++)
{
++zIndex;
if (zIndex >= zoomSteps)
zIndex = 0;
rp = &zRect + zIndex;
l = r1->a.left + (hDiff * j) / zoomSteps;
t = r1->a.top + (vDiff * j) / zoomSteps;
r = l + rWid + (widDiff * j) / zoomSteps;
b = t + rHt + (htDiff * j) / zoomSteps;
setrect (rp, l, t, r, b);
framerect (rp);
}
setpenstate(&oldpen);
}