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); }