home *** CD-ROM | disk | FTP | other *** search
/ InfoMagic Source Code 1993 July / THE_SOURCE_CODE_CD_ROM.iso / X / mit / server / ddx / cfb / cfb8bit.h < prev    next >
Encoding:
C/C++ Source or Header  |  1991-07-11  |  11.8 KB  |  434 lines

  1. /*
  2.  * cfb8bit.h
  3.  *
  4.  * Defines which are only useful to 8 bit color frame buffers
  5.  */
  6.  
  7. /*
  8. Copyright 1989 by the Massachusetts Institute of Technology
  9.  
  10. Permission to use, copy, modify, and distribute this software and its
  11. documentation for any purpose and without fee is hereby granted,
  12. provided that the above copyright notice appear in all copies and that
  13. both that copyright notice and this permission notice appear in
  14. supporting documentation, and that the name of M.I.T. not be used in
  15. advertising or publicity pertaining to distribution of the software
  16. without specific, written prior permission.  M.I.T. makes no
  17. representations about the suitability of this software for any
  18. purpose.  It is provided "as is" without express or implied warranty.
  19. */
  20.  
  21. /* $XConsortium: cfb8bit.h,v 1.11 91/07/11 17:58:48 keith Exp $ */
  22.  
  23. #if (PPW == 4)
  24.  
  25. #include "servermd.h"
  26.  
  27. #if (BITMAP_BIT_ORDER == MSBFirst)
  28. #define GetFourBits(x)        (((unsigned long) (x)) >> 28)
  29. #define NextFourBits(x)        ((x) <<= 4)
  30. #define NextSomeBits(x,n)    ((x) <<= (n))
  31. #else
  32. #define GetFourBits(x)        ((x) & 0xf)
  33. #define NextFourBits(x)        ((x) >>= 4)
  34. #define NextSomeBits(x,n)    ((x) >>= (n))
  35. #endif
  36.  
  37. #define RotBitsLeft(x,k)    ((x) = BitLeft (x,k) | \
  38.                    BitRight (x, 32-(k)))
  39.  
  40. #if defined(__GNUC__) && defined(mc68020)
  41. #undef RotBitsLeft
  42. #define RotBitsLeft(x,k)    asm("rol%.l %2,%0" \
  43.                 : "=d" (x) \
  44.                  : "0" (x), "dI" (k))
  45. #endif
  46.  
  47. #define GetFourPixels(x)    (cfb8StippleXor[GetFourBits(x)])
  48. #define RRopPixels(dst,x)    (DoRRop(dst,cfb8StippleAnd[x], cfb8StippleXor[x]))
  49. #define RRopFourPixels(dst,x)    (RRopPixels(dst,GetFourBits(x)))
  50. #define MaskRRopPixels(dst,x,mask)  (DoMaskRRop(dst,cfb8StippleAnd[x], cfb8StippleXor[x], mask))
  51.  
  52.  
  53. extern int            cfb8StippleMode, cfb8StippleAlu;
  54. extern unsigned long        cfb8StippleFg, cfb8StippleBg, cfb8StipplePm;
  55. extern unsigned long        cfb8StippleMasks[16];
  56. extern unsigned long        cfb8StippleAnd[16], cfb8StippleXor[16];
  57. extern int            cfb8StippleRRop;
  58.  
  59. #define cfb8PixelMasks        cfb8StippleMasks
  60. #define cfb8Pixels        cfb8StippleXor
  61.  
  62. extern int            cfb8SetStipple (), cfb8SetOpaqueStipple();
  63.  
  64. #define cfb8CheckPixels(fg, bg) \
  65.     (FillOpaqueStippled == cfb8StippleMode && \
  66.      GXcopy == cfb8StippleAlu && \
  67.      ((fg) & PMSK) == cfb8StippleFg && \
  68.      ((bg) & PMSK) == cfb8StippleBg && \
  69.      PMSK == cfb8StipplePm)
  70.  
  71. #define cfb8CheckOpaqueStipple(alu,fg,bg,pm) \
  72.     ((FillOpaqueStippled == cfb8StippleMode && \
  73.       (alu) == cfb8StippleAlu && \
  74.       ((fg) & PMSK) == cfb8StippleFg && \
  75.       ((bg) & PMSK) == cfb8StippleBg && \
  76.       ((pm) & PMSK) == cfb8StipplePm) ? 0 : cfb8SetOpaqueStipple(alu,fg,bg,pm))
  77.  
  78. #define cfb8CheckStipple(alu,fg,pm) \
  79.     ((FillStippled == cfb8StippleMode && \
  80.       (alu) == cfb8StippleAlu && \
  81.       ((fg) & PMSK) == cfb8StippleFg && \
  82.       ((pm) & PMSK) == cfb8StipplePm) ? 0 : cfb8SetStipple(alu,fg,pm))
  83.  
  84. #define cfb8SetPixels(fg,bg) cfb8SetOpaqueStipple(GXcopy,fg,bg,PMSK)
  85.  
  86. /*
  87.  * These macros are shared between the unnatural spans code
  88.  * and the unnatural rectangle code.  No reasonable person
  89.  * would attempt to use them anyplace else.
  90.  */
  91.  
  92. #define NextUnnaturalStippleWord \
  93.     if (bitsLeft >= 32) \
  94.     { \
  95.         inputBits = *srcTemp++; \
  96.         bitsLeft -= 32; \
  97.         partBitsLeft = 32; \
  98.     } \
  99.     else \
  100.     { \
  101.         inputBits = 0; \
  102.         if (bitsLeft) \
  103.         inputBits = *srcTemp & ~cfb8BitLenMasks[bitsLeft]; \
  104.         srcTemp = srcStart; \
  105.         partBitsLeft = bitsLeft; \
  106.         bitsLeft = bitsWhole; \
  107.     }
  108.  
  109. #define NextUnnaturalStippleBits \
  110.     if (partBitsLeft >= 4) { \
  111.     bits = GetFourBits (inputBits); \
  112.     NextFourBits (inputBits); \
  113.     partBitsLeft -= 4; \
  114.     } else { \
  115.     bits = GetFourBits (inputBits); \
  116.     nextPartBits = 4 - partBitsLeft; \
  117.     NextUnnaturalStippleWord \
  118.     if (partBitsLeft < nextPartBits) { \
  119.         if (partBitsLeft) {\
  120.             bits |= BitRight (GetFourBits (inputBits), \
  121.                   4 - nextPartBits) & 0xf;\
  122.             nextPartBits -= partBitsLeft; \
  123.         } \
  124.         NextUnnaturalStippleWord \
  125.     } \
  126.     bits |= BitRight (GetFourBits (inputBits), \
  127.               4 - nextPartBits) & 0xf; \
  128.     NextSomeBits (inputBits, nextPartBits); \
  129.     partBitsLeft -= nextPartBits; \
  130.     }
  131.  
  132. #define NextUnnaturalStippleBitsFast \
  133.     if (partBitsLeft >= 4) { \
  134.     bits = GetFourBits(inputBits); \
  135.     NextFourBits(inputBits); \
  136.     partBitsLeft -= 4; \
  137.     } else { \
  138.     bits = GetFourBits (inputBits); \
  139.     nextPartBits = 4 - partBitsLeft; \
  140.     inputBits = *srcTemp++; \
  141.     bits |= BitRight (GetFourBits (inputBits), \
  142.                   partBitsLeft) & 0xf; \
  143.     NextSomeBits (inputBits, nextPartBits); \
  144.     partBitsLeft = 32 - nextPartBits; \
  145.     }
  146.  
  147. /*
  148.  * WriteFourBits takes the destination address, a pixel
  149.  * value (which must be 8 bits duplicated 4 time with PFILL)
  150.  * and the four bits to write, which must be in the low order
  151.  * bits of the register (probably from GetFourBits) and writes
  152.  * the appropriate locations in memory with the pixel value.  This
  153.  * is a copy-mode only operation.
  154.  */
  155.  
  156. #define RRopFourBits(dst,bits)                    \
  157.     {                                \
  158.     register int    _bitsTmp = (bits);                \
  159.     *(dst) = RRopPixels(*(dst),bits);                \
  160.     }
  161.  
  162. #define MaskRRopFourBits(dst,bits,mask)                \
  163.     {                                \
  164.     register int    _bitsTmp = (bits);                \
  165.     *(dst) = MaskRRopPixels(*(dst),bits,mask);            \
  166.     }
  167.  
  168. #ifndef AVOID_MEMORY_READ
  169.  
  170. #define WriteFourBits(dst,pixel,bits)                \
  171.     {                                \
  172.     register unsigned long _maskTmp = cfb8PixelMasks[(bits)];   \
  173.     *(dst) = (*(dst) & ~_maskTmp) | ((pixel) & _maskTmp);    \
  174.     }
  175.  
  176. #define SwitchFourBits(dst,pixel,bits)                \
  177.     {                                \
  178.     register unsigned long _maskTmp = cfb8PixelMasks[(bits)];   \
  179.     register unsigned long _pixTmp = ((pixel) & _maskTmp);    \
  180.     _maskTmp = ~_maskTmp;                    \
  181.     SwitchBitsLoop (*(dst) = (*(dst) & _maskTmp) | _pixTmp;)    \
  182.     }
  183.     
  184. #else /* AVOID_MEMORY_READ */
  185.  
  186. #if (BITMAP_BIT_ORDER == MSBFirst)
  187. #define WriteFourBits(dst,pixel,bits) \
  188.     switch (bits) {            \
  189.     case 0:                \
  190.         break;            \
  191.     case 1:                \
  192.         ((char *) (dst))[3] = (pixel);    \
  193.         break;            \
  194.     case 2:                \
  195.         ((char *) (dst))[2] = (pixel);    \
  196.         break;            \
  197.     case 3:                \
  198.         ((short *) (dst))[1] = (pixel);    \
  199.         break;            \
  200.     case 4:                \
  201.         ((char *) (dst))[1] = (pixel);    \
  202.         break;            \
  203.     case 5:                \
  204.         ((char *) (dst))[3] = (pixel);    \
  205.         ((char *) (dst))[1] = (pixel);    \
  206.         break;            \
  207.     case 6:                \
  208.         ((char *) (dst))[2] = (pixel);    \
  209.         ((char *) (dst))[1] = (pixel);    \
  210.         break;            \
  211.     case 7:                \
  212.         ((short *) (dst))[1] = (pixel);    \
  213.         ((char *) (dst))[1] = (pixel);    \
  214.         break;            \
  215.     case 8:                \
  216.         ((char *) (dst))[0] = (pixel);    \
  217.         break;            \
  218.     case 9:                \
  219.         ((char *) (dst))[3] = (pixel);    \
  220.         ((char *) (dst))[0] = (pixel);    \
  221.         break;            \
  222.     case 10:            \
  223.         ((char *) (dst))[2] = (pixel);    \
  224.         ((char *) (dst))[0] = (pixel);    \
  225.         break;            \
  226.     case 11:            \
  227.         ((short *) (dst))[1] = (pixel);    \
  228.         ((char *) (dst))[0] = (pixel);    \
  229.         break;            \
  230.     case 12:            \
  231.         ((short *) (dst))[0] = (pixel);    \
  232.         break;            \
  233.     case 13:            \
  234.         ((char *) (dst))[3] = (pixel);    \
  235.         ((short *) (dst))[0] = (pixel);    \
  236.         break;            \
  237.     case 14:            \
  238.         ((char *) (dst))[2] = (pixel);    \
  239.         ((short *) (dst))[0] = (pixel);    \
  240.         break;            \
  241.     case 15:            \
  242.         ((long *) (dst))[0] = (pixel);    \
  243.         break;            \
  244.     }
  245.  
  246. #define SwitchFourBits(dst,pixel,bits) { \
  247.     switch (bits) { \
  248.     case 0: \
  249.         break; \
  250.     case 1: \
  251.         SwitchBitsLoop (((char *) (dst))[3] = (pixel);) \
  252.         break; \
  253.     case 2: \
  254.         SwitchBitsLoop (((char *) (dst))[2] = (pixel);) \
  255.         break; \
  256.     case 3: \
  257.         SwitchBitsLoop (((short *) (dst))[1] = (pixel);) \
  258.         break; \
  259.     case 4: \
  260.         SwitchBitsLoop (((char *) (dst))[1] = (pixel);) \
  261.         break; \
  262.     case 5: \
  263.         SwitchBitsLoop (((char *) (dst))[3] = (pixel); \
  264.              ((char *) (dst))[1] = (pixel);) \
  265.         break; \
  266.     case 6: \
  267.         SwitchBitsLoop (((char *) (dst))[2] = (pixel); \
  268.              ((char *) (dst))[1] = (pixel);) \
  269.         break; \
  270.     case 7: \
  271.         SwitchBitsLoop (((short *) (dst))[1] = (pixel); \
  272.              ((char *) (dst))[1] = (pixel);) \
  273.         break; \
  274.     case 8: \
  275.         SwitchBitsLoop (((char *) (dst))[0] = (pixel);) \
  276.         break; \
  277.     case 9: \
  278.         SwitchBitsLoop (((char *) (dst))[3] = (pixel); \
  279.              ((char *) (dst))[0] = (pixel);) \
  280.         break; \
  281.     case 10: \
  282.         SwitchBitsLoop (((char *) (dst))[2] = (pixel); \
  283.              ((char *) (dst))[0] = (pixel);) \
  284.         break; \
  285.     case 11: \
  286.         SwitchBitsLoop (((short *) (dst))[1] = (pixel); \
  287.              ((char *) (dst))[0] = (pixel);) \
  288.         break; \
  289.     case 12: \
  290.         SwitchBitsLoop (((short *) (dst))[0] = (pixel);) \
  291.         break; \
  292.     case 13: \
  293.         SwitchBitsLoop (((char *) (dst))[3] = (pixel); \
  294.              ((short *) (dst))[0] = (pixel);) \
  295.         break; \
  296.     case 14: \
  297.         SwitchBitsLoop (((char *) (dst))[2] = (pixel); \
  298.              ((short *) (dst))[0] = (pixel);) \
  299.         break; \
  300.     case 15: \
  301.         SwitchBitsLoop (((long *) (dst))[0] = (pixel);) \
  302.         break; \
  303.     } \
  304. }
  305.  
  306. #else /* BITMAP_BIT_ORDER */
  307.  
  308. #define WriteFourBits(dst,pixel,bits) \
  309.     switch (bits) {            \
  310.     case 0:                \
  311.         break;            \
  312.     case 1:                \
  313.         ((char *) (dst))[0] = (pixel);    \
  314.         break;            \
  315.     case 2:                \
  316.         ((char *) (dst))[1] = (pixel);    \
  317.         break;            \
  318.     case 3:                \
  319.         ((short *) (dst))[0] = (pixel);    \
  320.         break;            \
  321.     case 4:                \
  322.         ((char *) (dst))[2] = (pixel);    \
  323.         break;            \
  324.     case 5:                \
  325.         ((char *) (dst))[0] = (pixel);    \
  326.         ((char *) (dst))[2] = (pixel);    \
  327.         break;            \
  328.     case 6:                \
  329.         ((char *) (dst))[1] = (pixel);    \
  330.         ((char *) (dst))[2] = (pixel);    \
  331.         break;            \
  332.     case 7:                \
  333.         ((short *) (dst))[0] = (pixel);    \
  334.         ((char *) (dst))[2] = (pixel);    \
  335.         break;            \
  336.     case 8:                \
  337.         ((char *) (dst))[3] = (pixel);    \
  338.         break;            \
  339.     case 9:                \
  340.         ((char *) (dst))[0] = (pixel);    \
  341.         ((char *) (dst))[3] = (pixel);    \
  342.         break;            \
  343.     case 10:            \
  344.         ((char *) (dst))[1] = (pixel);    \
  345.         ((char *) (dst))[3] = (pixel);    \
  346.         break;            \
  347.     case 11:            \
  348.         ((short *) (dst))[0] = (pixel);    \
  349.         ((char *) (dst))[3] = (pixel);    \
  350.         break;            \
  351.     case 12:            \
  352.         ((short *) (dst))[1] = (pixel);    \
  353.         break;            \
  354.     case 13:            \
  355.         ((char *) (dst))[0] = (pixel);    \
  356.         ((short *) (dst))[1] = (pixel);    \
  357.         break;            \
  358.     case 14:            \
  359.         ((char *) (dst))[1] = (pixel);    \
  360.         ((short *) (dst))[1] = (pixel);    \
  361.         break;            \
  362.     case 15:            \
  363.         ((long *) (dst))[0] = (pixel);    \
  364.         break;            \
  365.     }
  366.  
  367. #define SwitchFourBits(dst,pixel,bits) { \
  368.     switch (bits) { \
  369.     case 0: \
  370.                break; \
  371.     case 1: \
  372.         SwitchBitsLoop (((char *) (dst))[0] = (pixel);) \
  373.         break; \
  374.     case 2: \
  375.         SwitchBitsLoop (((char *) (dst))[1] = (pixel);) \
  376.         break; \
  377.     case 3: \
  378.         SwitchBitsLoop (((short *) (dst))[0] = (pixel);) \
  379.         break; \
  380.     case 4: \
  381.         SwitchBitsLoop (((char *) (dst))[2] = (pixel);) \
  382.         break; \
  383.     case 5: \
  384.         SwitchBitsLoop (((char *) (dst))[0] = (pixel); \
  385.              ((char *) (dst))[2] = (pixel);) \
  386.         break; \
  387.     case 6: \
  388.         SwitchBitsLoop (((char *) (dst))[1] = (pixel); \
  389.              ((char *) (dst))[2] = (pixel);) \
  390.         break; \
  391.     case 7: \
  392.         SwitchBitsLoop (((short *) (dst))[0] = (pixel); \
  393.              ((char *) (dst))[2] = (pixel);) \
  394.         break; \
  395.     case 8: \
  396.         SwitchBitsLoop (((char *) (dst))[3] = (pixel);) \
  397.         break; \
  398.     case 9: \
  399.         SwitchBitsLoop (((char *) (dst))[0] = (pixel); \
  400.              ((char *) (dst))[3] = (pixel);) \
  401.         break; \
  402.     case 10: \
  403.         SwitchBitsLoop (((char *) (dst))[1] = (pixel); \
  404.              ((char *) (dst))[3] = (pixel);) \
  405.         break; \
  406.     case 11: \
  407.         SwitchBitsLoop (((short *) (dst))[0] = (pixel); \
  408.              ((char *) (dst))[3] = (pixel);) \
  409.         break; \
  410.     case 12: \
  411.         SwitchBitsLoop (((short *) (dst))[1] = (pixel);) \
  412.         break; \
  413.     case 13: \
  414.         SwitchBitsLoop (((char *) (dst))[0] = (pixel); \
  415.              ((short *) (dst))[1] = (pixel);) \
  416.         break; \
  417.     case 14: \
  418.         SwitchBitsLoop (((char *) (dst))[1] = (pixel); \
  419.              ((short *) (dst))[1] = (pixel);) \
  420.         break; \
  421.     case 15: \
  422.         SwitchBitsLoop (((long *) (dst))[0] = (pixel);) \
  423.         break; \
  424.     } \
  425. }
  426.  
  427. # endif /* BITMAP_BIT_ORDER */
  428. #endif /* AVOID_MEMORY_READ */
  429.  
  430. extern unsigned long    cfb8BitLenMasks[32];
  431. extern int        cfb8ComputeClipMasks32 ();
  432.  
  433. #endif /* PPW == 4 */
  434.