home *** CD-ROM | disk | FTP | other *** search
/ InfoMagic Source Code 1993 July / THE_SOURCE_CODE_CD_ROM.iso / X / mit / server / ddx / cfb / cfbbres.c < prev    next >
Encoding:
C/C++ Source or Header  |  1991-07-10  |  4.8 KB  |  229 lines

  1. /***********************************************************
  2. Copyright 1987 by Digital Equipment Corporation, Maynard, Massachusetts,
  3. and the Massachusetts Institute of Technology, Cambridge, Massachusetts.
  4.  
  5.                         All Rights Reserved
  6.  
  7. Permission to use, copy, modify, and distribute this software and its 
  8. documentation for any purpose and without fee is hereby granted, 
  9. provided that the above copyright notice appear in all copies and that
  10. both that copyright notice and this permission notice appear in 
  11. supporting documentation, and that the names of Digital or MIT not be
  12. used in advertising or publicity pertaining to distribution of the
  13. software without specific, written prior permission.  
  14.  
  15. DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
  16. ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL
  17. DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
  18. ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
  19. WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
  20. ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
  21. SOFTWARE.
  22.  
  23. ******************************************************************/
  24. /* $XConsortium: cfbbres.c,v 1.10 91/07/10 14:53:48 keith Exp $ */
  25. #include "X.h"
  26. #include "misc.h"
  27. #include "cfb.h"
  28. #include "cfbmskbits.h"
  29. #include "servermd.h"
  30.  
  31. /* Solid bresenham line */
  32. /* NOTES
  33.    e2 is used less often than e1, so it's not in a register
  34. */
  35.  
  36. cfbBresS(rop, and, xor, addrl, nlwidth, signdx, signdy, axis, x1, y1, e, e1, e2, len)
  37. int rop;
  38. unsigned long and, xor;
  39. int *addrl;        /* pointer to base of bitmap */
  40. int nlwidth;        /* width in longwords of bitmap */
  41. register int signdx;
  42. int signdy;        /* signs of directions */
  43. int axis;        /* major axis (Y_AXIS or X_AXIS) */
  44. int x1, y1;        /* initial point */
  45. register int e;        /* error accumulator */
  46. register int e1;    /* bresenham increments */
  47. int e2;
  48. int len;        /* length of line */
  49. {
  50.     register int    e3 = e2-e1;
  51.  
  52. #if (PPW == 4)
  53.     register unsigned char *addrb;        /* bitmask long pointer 
  54.                               * cast to char pointer */
  55.     register unsigned char pix = xor;
  56.  
  57.     if (len == 0)
  58.         return;
  59.     /* point to first point */
  60.     nlwidth <<= 2;
  61.     addrb = (unsigned char *)(addrl) + (y1 * nlwidth) + x1;
  62.     if (signdy < 0)
  63.         nlwidth = -nlwidth;
  64.     e = e-e1;            /* to make looping easier */
  65.     
  66.     if (axis == Y_AXIS)
  67.     {
  68.     int    t;
  69.  
  70.     t = nlwidth;
  71.     nlwidth = signdx;
  72.     signdx = t;
  73.     }
  74.     if (rop == GXcopy)
  75.     {
  76.     --len;
  77. #define body {\
  78.         *addrb = pix; \
  79.         addrb += signdx; \
  80.         e += e1; \
  81.         if (e >= 0) \
  82.         { \
  83.         addrb += nlwidth; \
  84.         e += e3; \
  85.         } \
  86.     }
  87. #ifdef LARGE_INSTRUCTION_CACHE
  88.     while (len >= 16)
  89.     {
  90.         body body body body
  91.         body body body body
  92.         body body body body
  93.         body body body body
  94.         len -= 16;
  95.     }
  96.     switch (len)
  97.     {
  98.     case 15: body case 14: body case 13: body case 12: body
  99.     case 11: body case 10: body case  9: body case  8: body
  100.     case  7: body case  6: body case  5: body case  4: body
  101.     case  3: body case  2: body case  1: body
  102.     }
  103. #else
  104.     while (len >= 4)
  105.     {
  106.         body body body body
  107.         len -= 4;
  108.     }
  109.     switch (len)
  110.     {
  111.     case  3: body case  2: body case  1: body
  112.     }
  113. #endif
  114. #undef body
  115.     *addrb = pix;
  116.     }
  117.     else
  118.     {
  119.     while(len--)
  120.     { 
  121.         *addrb = DoRRop (*addrb, and, xor);
  122.         e += e1;
  123.         if (e >= 0)
  124.         {
  125.         addrb += nlwidth;
  126.         e += e3;
  127.         }
  128.         addrb += signdx;
  129.     }
  130.     }
  131. #else
  132.     register unsigned long   tmp, bit;
  133.     unsigned long leftbit, rightbit;
  134.  
  135.     /* point to longword containing first point */
  136.     addrl = (addrl + (y1 * nlwidth) + (x1 >> PWSH));
  137.     if (signdy < 0)
  138.         nlwidth = -nlwidth;
  139.     e = e-e1;            /* to make looping easier */
  140.  
  141.     leftbit = cfbmask[0];
  142.     rightbit = cfbmask[PPW-1];
  143.     bit = cfbmask[x1 & PIM];
  144.  
  145.     if (axis == X_AXIS)
  146.     {
  147.     if (signdx > 0)
  148.     {
  149.         while (len--)
  150.         { 
  151.         *addrl = DoMaskRRop (*addrl, and, xor, bit);
  152.         bit = SCRRIGHT(bit,1);
  153.         e += e1;
  154.         if (e >= 0)
  155.         {
  156.             addrl += nlwidth;
  157.             e += e3;
  158.         }
  159.         if (!bit)
  160.         {
  161.             bit = leftbit;
  162.             addrl++;
  163.         }
  164.         }
  165.     }
  166.     else
  167.     {
  168.         while (len--)
  169.         { 
  170.         *addrl = DoMaskRRop (*addrl, and, xor, bit);
  171.         e += e1;
  172.         bit = SCRLEFT(bit,1);
  173.         if (e >= 0)
  174.         {
  175.             addrl += nlwidth;
  176.             e += e3;
  177.         }
  178.         if (!bit)
  179.         {
  180.             bit = rightbit;
  181.             addrl--;
  182.         }
  183.         }
  184.     }
  185.     } /* if X_AXIS */
  186.     else
  187.     {
  188.     if (signdx > 0)
  189.     {
  190.         while(len--)
  191.         {
  192.         *addrl = DoMaskRRop (*addrl, and, xor, bit);
  193.         e += e1;
  194.         if (e >= 0)
  195.         {
  196.             bit = SCRRIGHT(bit,1);
  197.             if (!bit)
  198.             {
  199.             bit = leftbit;
  200.             addrl++;
  201.             }
  202.             e += e3;
  203.         }
  204.         addrl += nlwidth;
  205.         }
  206.     }
  207.     else
  208.     {
  209.         while(len--)
  210.         {
  211.         *addrl = DoMaskRRop (*addrl, and, xor, bit);
  212.         e += e1;
  213.         if (e >= 0)
  214.         {
  215.             bit = SCRLEFT(bit,1);
  216.             if (!bit)
  217.             {
  218.             bit = rightbit;
  219.             addrl--;
  220.             }
  221.             e += e3;
  222.         }
  223.         addrl += nlwidth;
  224.         }
  225.     }
  226.     } /* else Y_AXIS */
  227. #endif
  228. }
  229.