home *** CD-ROM | disk | FTP | other *** search
/ RISC DISC 3 / RISC_DISC_3.iso / resources / etexts / gems / gemsiii / fastbitmap.c < prev    next >
Text File  |  1992-12-14  |  5KB  |  180 lines

  1. /*
  2. Fast Bitmap Stretching
  3. Tomas MŒller
  4. */
  5.  
  6.  
  7.  
  8.  
  9.  
  10.  
  11.  
  12.  
  13.  
  14.  
  15.  
  16.  
  17.  
  18. /* user provided routines */
  19.  
  20. short ReadPixel(long x,long y);/* returns color of (x,y) in source bitmap*/
  21. void SetColor(short Col); /* set the current writing color to Col */
  22. void WritePixel(long x,long y); /* write a pixel at (x,y) in destination bitmap with the current writing color */
  23.  
  24. #define sign(x) ((x)>0 ? 1:-1)
  25.  
  26. void RectStretch(long xs1,long ys1,long xs2,long ys2,long xd1,long yd1,long xd2,long yd2) ;
  27. void Stretch(long x1,long x2,long y1,long y2,long yr,long yw) ;
  28. void CircleStretch(long SBMINX,long SBMAXX,long xc,long yc,long r) ;
  29. void Stretch2Lines(long x1,long x2,long y1,long y2,long yr1,long yw1,long yr2,long yw2) ;
  30.  
  31. /**********************************************************
  32.  RectStretch enlarges or diminishes a source rectangle of
  33.  a bitmap to a destination rectangle. The source
  34.  rectangle is selected by the two points (xs1,ys1) and
  35.  (xs2,ys2), and the destination rectangle by (xd1,yd1) and
  36.  (xd2,yd2). Since readability of source-code is wanted,
  37.  some optimizations have been left out for the reader:
  38.  It«s possible to read one line at a time, by first
  39.  stretching in x-direction and then stretching that bitmap
  40.  in y-direction.
  41.  Entry:
  42.     xs1,ys1 - first point of source rectangle
  43.     xs2,ys2 - second point of source rectangle
  44.     xd1,yd1 - first point of destination rectangle
  45.     xd2,yd2 - second point of destination rectangle
  46. **********************************************************/
  47. void RectStretch(long xs1,long ys1,long xs2,long ys2,long xd1,long yd1,long xd2,long yd2)
  48. {
  49.     long dx,dy,e,d,dx2;
  50.     short sx,sy;
  51.     dx=abs((int)(yd2-yd1));
  52.     dy=abs((int)(ys2-ys1));
  53.     sx=sign(yd2-yd1);
  54.     sy=sign(ys2-ys1);
  55.     e=(dy<<1)-dx;
  56.     dx2=dx<<1;
  57.     dy<<=1;
  58.     for(d=0;d<=dx;d++)
  59.     {
  60.         Stretch(xd1,xd2,xs1,xs2,ys1,yd1);
  61.         while(e>=0)
  62.         {
  63.             ys1+=sy;
  64.             e-=dx2;
  65.         }
  66.         yd1+=sx;
  67.         e+=dy;
  68.     }
  69. }
  70.  
  71. /**********************************************************
  72.  Stretches a horizontal source line onto a horizontal
  73.  destination line. Used by RectStretch.
  74.  Entry:
  75.     x1,x2 - x-coordinates of the destination line
  76.     y1,y2 - x-coordinates of the source line
  77.     yr    - y-coordinate of source line
  78.     yw    - y-coordinate of destination line
  79. **********************************************************/
  80. void Stretch(long x1,long x2,long y1,long y2,long yr,long yw)
  81. {
  82.     long dx,dy,e,d,dx2;
  83.     short sx,sy,color;
  84.     dx=abs((int)(x2-x1));
  85.     dy=abs((int)(y2-y1));
  86.     sx=sign(x2-x1);
  87.     sy=sign(y2-y1);
  88.     e=(dy<<1)-dx;
  89.     dx2=dx<<1;
  90.     dy<<=1;
  91.     for(d=0;d<=dx;d++)
  92.     {
  93.         color=ReadPixel(y1,yr); 
  94.         SetColor(color);
  95.         WritePixel(x1,yw);
  96.         while(e>=0)
  97.         {
  98.             y1+=sy;
  99.             e-=dx2;
  100.         }
  101.         x1+=sx;
  102.         e+=dy;
  103.     }
  104. }
  105.  
  106. /**********************************************************
  107.  CircleStretch stretches a source rectangle, selected by
  108.  the two points (SBMINX,0) and (SBMAXX,2*r-1), onto a
  109.  Bresenham circle at (xc,yc) with radius=r.
  110.  Instead of writing pixels on the circle, horizontal lines
  111.  of the source rectangle are being stretched onto all
  112.  horizontal lines of the circle. 
  113.  Entry:
  114.     SBMINX - min x of source rectangle
  115.     SBMAXX - max x of source rectangle 
  116.     xc,yc  - center of the circle
  117.     r      - radius of circle
  118. **********************************************************/
  119. void CircleStretch(long SBMINX,long SBMAXX,long xc,long yc,long r)
  120. {
  121.     long p=3-(r<<1),x=0,y=r;
  122.     while(x<y)
  123.     {
  124.         /* stretch lines in first octant */
  125.         Stretch2Lines(xc-y,xc+y,SBMINX,SBMAXX,r-x,yc-x,r+x,yc+x);
  126.         if(p<0) p=p+(x<<2)+6;
  127.         else
  128.         {
  129.             /* stretch lines in second octant */
  130.             Stretch2Lines(xc-x,xc+x,SBMINX,SBMAXX,r-y,yc-y,r+y,yc+y);
  131.             p=p+((x-y)<<2)+10;
  132.             y--;
  133.         }
  134.         x++;
  135.     }
  136.     if(x==y) Stretch2Lines(xc-x,xc+x,SBMINX,SBMAXX,r-y,yc-y,r+y,yc+y);
  137. }
  138.  
  139. /**********************************************************
  140.  Stretch2Lines stretches two source lines with same length
  141.  and different y-coordinates onto two destination lines
  142.  with same length and different y-coordinates. Used by
  143.  CircleStretch.
  144.  Entry:
  145.     x1,x2 - x-coordinates of the destination line
  146.     y1,y2 - x-coordinates of the source line
  147.     yr1   - y-coordinate of source line # 1
  148.     yw1   - y-coordinate of destination line # 1
  149.     yr2   - y-coordinate of source line # 2
  150.     yw2   - y-coordinate of destination line # 2
  151. **********************************************************/
  152. void Stretch2Lines(long x1,long x2,long y1,long y2,long yr1,long yw1,long yr2,long yw2)
  153. {
  154.     long dx,dy,e,d,dx2;
  155.     short sx,sy,color;
  156.     dx=abs((int)(x2-x1));
  157.     dy=abs((int)(y2-y1));
  158.     sx=sign(x2-x1);
  159.     sy=sign(y2-y1);
  160.     e=(dy<<1)-dx;
  161.     dx2=dx<<1;
  162.     dy<<=1;
  163.     for(d=0;d<=dx;d++)
  164.     {
  165.         color=ReadPixel(y1,yr1);
  166.         SetColor(color);
  167.         WritePixel(x1,yw1);
  168.         color=ReadPixel(y1,yr2);
  169.         SetColor(color);
  170.         WritePixel(x1,yw2);
  171.         while(e>=0)
  172.         {
  173.             y1+=sy;
  174.             e-=dx2;
  175.         }
  176.         x1+=sx;
  177.         e+=dy;
  178.     }
  179. }
  180.