home *** CD-ROM | disk | FTP | other *** search
/ Mac-Source 1994 July / Mac-Source_July_1994.iso / C and C++ / Libraries / BlobMgr / Library Folder / Zoom.c < prev    next >
Encoding:
C/C++ Source or Header  |  1994-02-21  |  2.1 KB  |  76 lines  |  [TEXT/KAHL]

  1. /*
  2.  * Zoom.c - Rectangle zooming routine
  3.  *
  4.  * 24 Dec 93
  5.  * - Added some timing delay to loop so zooming doesn't zip so fast on
  6.  * faster processors.  This probably needs some fine tuning.
  7.  */
  8.  
  9. # include    "BlobMgr.h"
  10.  
  11.  
  12. /*
  13.  * Zooming parameters.  zoomSteps is the number of steps in the
  14.  * interpolative series.  It must not be zero.  zoomShow is the number
  15.  * of steps that show at any one time in the series.  It must be less
  16.  * than or equal to zoomSteps.
  17.  */
  18.  
  19. # define    zoomSteps    10
  20. # define    zoomShow    3
  21.  
  22.  
  23. /*
  24.  * BMgrZoomRect() zooms a dotted rectangle from r1 to r2.  The effect is
  25.  * transparent (screen no different afterwards).  The shape of the zoomed
  26.  * rectangles changes for smooth interpolation.
  27. */
  28.  
  29. pascal void
  30. BMgrZoomRect (Rect *r1, Rect *r2)
  31. {
  32. short    r1left, r1top;
  33. short    hDiff, vDiff, widDiff, htDiff;
  34. short    l, t, r, b;
  35. short    rWid, rHt;
  36. short    i, j;
  37. Rect    zoomRect[zoomSteps];
  38. PenState    ps;
  39. long    ticks;
  40.  
  41.     r1left = r1->left;    /* these two statements make code shorter and */
  42.     r1top = r1->top;    /* impervious to mem mgr if rects passed by handle */
  43.     hDiff = r2->left - r1left;    /* positive if moving to right */
  44.     vDiff = r2->top - r1top;    /* positive if moving down */
  45.     rWid = r1->right - r1left;
  46.     rHt = r1->bottom - r1top;
  47.     widDiff = (r2->right - r2->left) - rWid;
  48.     htDiff = (r2->bottom - r2->top) - rHt;
  49.     /* set pen gray, mode xor */
  50.     GetPenState (&ps);                /* save current pen state */
  51.     PenPat (gray);
  52.     PenMode (patXor);
  53.     for (i = 0; i < zoomSteps; ++i)
  54.     {
  55.         j = i + 1;
  56.         l = r1left + (hDiff * j) / zoomSteps;
  57.         t = r1top + (vDiff * j)    / zoomSteps;
  58.         r = l + rWid + (widDiff * j) / zoomSteps;
  59.         b = t + rHt + (htDiff * j) / zoomSteps;
  60.         SetRect (&zoomRect[i], l, t, r, b);
  61.         FrameRect (&zoomRect[i]);        /* draw in xor */
  62.         if (i >= zoomShow)
  63.             FrameRect (&zoomRect[i-zoomShow]);
  64.         ticks = TickCount () + 1;
  65.         while ((i % 3) == 0 && TickCount () < ticks) {}
  66.     }
  67.     for (i = zoomSteps - zoomShow; i < zoomSteps; ++i)
  68.     {
  69.         FrameRect (&zoomRect[i]);
  70.         ticks = TickCount () + 1;
  71.         while ((i % 3) == 0 && TickCount () < ticks) {}
  72.     }
  73.     /* set pen normal */
  74.     SetPenState (&ps);                /* restore pen state */
  75. }
  76.