555 lines
		
	
	
		
			13 KiB
		
	
	
	
		
			C
		
	
	
	
			
		
		
	
	
			555 lines
		
	
	
		
			13 KiB
		
	
	
	
		
			C
		
	
	
	
| /***********************************************************
 | |
| 
 | |
| Copyright 1987,1998  The Open Group
 | |
| 
 | |
| Permission to use, copy, modify, distribute, and sell this software and its
 | |
| documentation for any purpose is hereby granted without fee, provided that
 | |
| the above copyright notice appear in all copies and that both that
 | |
| copyright notice and this permission notice appear in supporting
 | |
| documentation.
 | |
| 
 | |
| The above copyright notice and this permission notice shall be included in
 | |
| all copies or substantial portions of the Software.
 | |
| 
 | |
| THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 | |
| IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 | |
| FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL THE
 | |
| OPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
 | |
| AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
 | |
| CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 | |
| 
 | |
| Except as contained in this notice, the name of The Open Group shall not be
 | |
| used in advertising or otherwise to promote the sale, use or other dealings
 | |
| in this Software without prior written authorization from The Open Group.
 | |
| 
 | |
| 
 | |
| Copyright 1987 by Digital Equipment Corporation, Maynard, Massachusetts.
 | |
| 
 | |
|                         All Rights Reserved
 | |
| 
 | |
| Permission to use, copy, modify, and distribute this software and its 
 | |
| documentation for any purpose and without fee is hereby granted, 
 | |
| provided that the above copyright notice appear in all copies and that
 | |
| both that copyright notice and this permission notice appear in 
 | |
| supporting documentation, and that the name of Digital not be
 | |
| used in advertising or publicity pertaining to distribution of the
 | |
| software without specific, written prior permission.  
 | |
| 
 | |
| DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
 | |
| ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL
 | |
| DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
 | |
| ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
 | |
| WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
 | |
| ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
 | |
| SOFTWARE.
 | |
| 
 | |
| ******************************************************************/
 | |
| #ifdef HAVE_DIX_CONFIG_H
 | |
| #include <dix-config.h>
 | |
| #endif
 | |
| 
 | |
| #include <X11/X.h>
 | |
| 
 | |
| #include "gc.h"
 | |
| #include "window.h"
 | |
| #include "pixmap.h"
 | |
| #include "region.h"
 | |
| 
 | |
| #include "cfb.h"
 | |
| #include "cfbmskbits.h"
 | |
| 
 | |
| /* horizontal solid line
 | |
|    abs(len) > 1
 | |
| */
 | |
| void
 | |
| cfbHorzS(rop, and, xor, addrl, nlwidth, x1, y1, len)
 | |
| register int rop;
 | |
| register CfbBits and;
 | |
| register CfbBits xor;
 | |
| register CfbBits *addrl;	/* pointer to base of bitmap */
 | |
| int nlwidth;		/* width in longwords of bitmap */
 | |
| int x1;			/* initial point */ 
 | |
| int y1;
 | |
| int len;		/* length of line */
 | |
| {
 | |
|     register int nlmiddle;
 | |
| 
 | |
| #if PSZ == 24
 | |
| 
 | |
|     int leftIndex, rightIndex;
 | |
|     CfbBits piQxelAnd[3], piQxelXor[3];
 | |
|     piQxelAnd[0] = (and & 0xFFFFFF) | ((and<<24)  & 0xFF000000);
 | |
|     piQxelAnd[1] = ((and>>8)  & 0xFFFF)| ((and<<16) & 0xFFFF0000);
 | |
|     piQxelAnd[2] = ((and<<8) & 0xFFFFFF00) | ((and>>16) & 0xFF);
 | |
| 
 | |
|     piQxelXor[0] = (xor & 0xFFFFFF) | ((xor<<24) & 0xFF000000);
 | |
|     piQxelXor[1] = ((xor>>8)  & 0xFFFF)| ((xor<<16) & 0xFFFF0000);
 | |
|     piQxelXor[2] = ((xor<<8) & 0xFFFFFF00) | ((xor>>16) & 0xFF);
 | |
| 
 | |
|     leftIndex = x1 & 3;
 | |
|     rightIndex = ((x1 + len) < 5)?0:(x1 + len)&3;
 | |
|     nlmiddle = len;
 | |
|     if(leftIndex){
 | |
|       nlmiddle -= (4 - leftIndex);
 | |
|     }
 | |
|     if(rightIndex){
 | |
|       nlmiddle -= rightIndex;
 | |
|     }
 | |
|     if (nlmiddle < 0)
 | |
|       nlmiddle = 0;
 | |
| 
 | |
|     nlmiddle >>= 2;
 | |
| 
 | |
|     addrl += (y1 * nlwidth) + (x1 >> 2)*3 + (leftIndex?leftIndex-1:0);
 | |
| 
 | |
|     switch(leftIndex+len){
 | |
|     case 4:
 | |
|       switch(leftIndex){
 | |
|       case 0:
 | |
| 	*addrl = DoRRop (*addrl, piQxelAnd[0], piQxelXor[0]);
 | |
| 	addrl++;
 | |
| 	*addrl = DoRRop (*addrl, piQxelAnd[1], piQxelXor[1]);
 | |
| 	addrl++;
 | |
| 	*addrl = DoRRop (*addrl, piQxelAnd[2], piQxelXor[2]);
 | |
| 	break;
 | |
|       case 1:
 | |
| 	*addrl = DoMaskRRop (*addrl, piQxelAnd[0], piQxelXor[0], 0xFF000000);
 | |
| 	addrl++;
 | |
| 	*addrl = DoRRop (*addrl, piQxelAnd[1], piQxelXor[1]);
 | |
| 	addrl++;
 | |
| 	*addrl = DoRRop (*addrl, piQxelAnd[2], piQxelXor[2]);
 | |
| 	break;
 | |
|       case 2:
 | |
| 	*addrl = DoMaskRRop (*addrl, piQxelAnd[1], piQxelXor[1], 0xFFFF0000);
 | |
| 	addrl++;
 | |
| 	*addrl = DoRRop (*addrl, piQxelAnd[2], piQxelXor[2]);
 | |
| 	break;
 | |
|       case 3:
 | |
| 	*addrl = DoMaskRRop (*addrl, piQxelAnd[2], piQxelXor[2], 0xFFFFFF00);
 | |
| 	break;
 | |
|       }
 | |
|       break;
 | |
|     case 3:
 | |
|       switch(leftIndex){
 | |
|       case 0:
 | |
| 	*addrl = DoRRop (*addrl, piQxelAnd[0], piQxelXor[0]);
 | |
| 	addrl++;
 | |
| 	*addrl = DoRRop (*addrl, piQxelAnd[1], piQxelXor[1]);
 | |
| 	addrl++;
 | |
| 	*addrl = DoMaskRRop (*addrl, piQxelAnd[2], piQxelXor[2], 0xFF);
 | |
| 	break;
 | |
|       case 1:
 | |
| 	*addrl = DoMaskRRop (*addrl, piQxelAnd[0], piQxelXor[0], 0xFF000000);
 | |
| 	addrl++;
 | |
| 	*addrl = DoRRop (*addrl, piQxelAnd[1], piQxelXor[1]);
 | |
| 	addrl++;
 | |
| 	*addrl = DoMaskRRop (*addrl, piQxelAnd[2], piQxelXor[2], 0xFF);
 | |
| 	break;
 | |
|       case 2:
 | |
| 	*addrl = DoMaskRRop (*addrl, piQxelAnd[1], piQxelXor[1], 0xFFFF0000);
 | |
| 	addrl++;
 | |
| 	*addrl = DoMaskRRop (*addrl, piQxelAnd[2], piQxelXor[2], 0xFF);
 | |
| 	break;
 | |
|       }
 | |
|       break;
 | |
|     case 2:
 | |
|       if(leftIndex){
 | |
| 	*addrl = DoMaskRRop (*addrl, piQxelAnd[0], piQxelXor[0], 0xFF000000);
 | |
| 	addrl++;
 | |
|       }
 | |
|       else{
 | |
| 	*addrl = DoRRop (*addrl, piQxelAnd[0], piQxelXor[0]);
 | |
| 	addrl++;
 | |
|       }
 | |
|       *addrl =  DoMaskRRop (*addrl, piQxelAnd[1], piQxelXor[1], 0xFFFF);
 | |
|       break;
 | |
|     case 1: /*only if leftIndex = 0 and w = 1*/
 | |
|       *addrl = DoMaskRRop (*addrl, piQxelAnd[0], piQxelXor[0], 0xFFFFFF);
 | |
|       break;
 | |
|     case 0: /*never*/
 | |
|       break;
 | |
|     default:
 | |
|       {
 | |
| 	if (rop == GXcopy){
 | |
| 	  switch(leftIndex){
 | |
| 	  case 0:
 | |
| 	    break;
 | |
| 	  case 1:
 | |
| 	    *addrl = ((*addrl) & 0xFFFFFF) | (piQxelXor[0] & 0xFF000000);
 | |
| 	    addrl++;
 | |
| 	    *addrl++ = piQxelXor[1];
 | |
| 	    *addrl++ = piQxelXor[2];
 | |
| 	    break;
 | |
| 	  case 2:
 | |
| 	    *addrl = ((*addrl) & 0xFFFF) | (piQxelXor[1] & 0xFFFF0000);
 | |
| 	    addrl++;
 | |
| 	    *addrl++ = piQxelXor[2];
 | |
| 	    break;
 | |
| 	  case 3:
 | |
| 	    *addrl = ((*addrl) & 0xFF) | (piQxelXor[2] & 0xFFFFFF00);
 | |
| 	    addrl++;
 | |
| 	    break;
 | |
| 	  }
 | |
| 	  while(nlmiddle--){
 | |
| 	    *addrl++ = piQxelXor[0];
 | |
| 	    *addrl++ = piQxelXor[1];
 | |
| 	    *addrl++ = piQxelXor[2];
 | |
| 	  }
 | |
| 	  switch(rightIndex){
 | |
| 	  case 0:
 | |
| 	    break;
 | |
| 	  case 1:
 | |
| 	    *addrl = ((*addrl) & 0xFF000000) | (piQxelXor[0] & 0xFFFFFF);
 | |
| 	    break;
 | |
| 	  case 2:
 | |
| 	    *addrl++ = piQxelXor[0];
 | |
| 	    *addrl = ((*addrl) & 0xFFFF0000) | (piQxelXor[1] & 0xFFFF);
 | |
| 	    break;
 | |
| 	  case 3:
 | |
| 	    *addrl++ = piQxelXor[0];
 | |
| 	    *addrl++ = piQxelXor[1];
 | |
| 	    *addrl = ((*addrl) & 0xFFFFFF00) | (piQxelXor[2] & 0xFF);
 | |
| 	    break;
 | |
| 	  }
 | |
| 	}
 | |
| 	else{
 | |
| 	  if(rop == GXxor){
 | |
| 	  switch(leftIndex){
 | |
| 	  case 0:
 | |
| 	    break;
 | |
| 	  case 1:
 | |
| 	    *addrl++ ^= (piQxelXor[0]&0xFF000000);
 | |
| 	    *addrl++ ^= piQxelXor[1];
 | |
| 	    *addrl++ ^= piQxelXor[2];
 | |
| 	    break;
 | |
| 	  case 2:
 | |
| 	    *addrl++ ^= (piQxelXor[1]& 0xFFFF0000);
 | |
| 	    *addrl++ ^= piQxelXor[2];
 | |
| 	    break;
 | |
| 	  case 3:
 | |
| 	    *addrl++ ^= (piQxelXor[2]& 0xFFFFFF00);
 | |
| 	    break;
 | |
| 	  }
 | |
| 	  while(nlmiddle--){
 | |
| 	    *addrl++ ^= piQxelXor[0];
 | |
| 	    *addrl++ ^= piQxelXor[1];
 | |
| 	    *addrl++ ^= piQxelXor[2];
 | |
| 	  }
 | |
| 	  switch(rightIndex){
 | |
| 	  case 0:
 | |
| 	    break;
 | |
| 	  case 1:
 | |
| 	    *addrl ^= (piQxelXor[0]& 0xFFFFFF);
 | |
| 	    break;
 | |
| 	  case 2:
 | |
| 	    *addrl++ ^= piQxelXor[0];
 | |
| 	    *addrl ^= (piQxelXor[1]&0xFFFF);
 | |
| 	    break;
 | |
| 	  case 3:
 | |
| 	    *addrl++ ^= piQxelXor[0];
 | |
| 	    *addrl++ ^= piQxelXor[1];
 | |
| 	    *addrl ^= (piQxelXor[2]&0xFF);
 | |
| 	    break;
 | |
| 	  }
 | |
| 	}
 | |
| 	  else{
 | |
| 	    switch(leftIndex){
 | |
| 	    case 0:
 | |
| 	      break;
 | |
| 	    case 1:
 | |
| 	      *addrl = DoMaskRRop (*addrl, piQxelAnd[0], piQxelXor[0], 0xFF000000);
 | |
| 	      addrl++;
 | |
| 	      *addrl = DoRRop (*addrl, piQxelAnd[1], piQxelXor[1]);
 | |
| 	      addrl++;
 | |
| 	      *addrl = DoRRop (*addrl, piQxelAnd[2], piQxelXor[2]);
 | |
| 	      addrl++;
 | |
| 	      break;
 | |
| 	    case 2:
 | |
| 	      *addrl = DoMaskRRop (*addrl, piQxelAnd[1], piQxelXor[1], 0xFFFF0000);
 | |
| 	      addrl++;
 | |
| 	      *addrl = DoRRop (*addrl, piQxelAnd[2], piQxelXor[2]);
 | |
| 	      addrl++;
 | |
| 	      break;
 | |
| 	    case 3:
 | |
| 	      *addrl = DoMaskRRop (*addrl, piQxelAnd[2], piQxelXor[2], 0xFFFFFF00);
 | |
| 	      addrl++;
 | |
| 	      break;
 | |
| 	  }
 | |
| 	  while(nlmiddle--){
 | |
| 	    *addrl = DoRRop (*addrl, piQxelAnd[0], piQxelXor[0]);
 | |
| 	    addrl++;
 | |
| 	    *addrl = DoRRop (*addrl, piQxelAnd[1], piQxelXor[1]);
 | |
| 	    addrl++;
 | |
| 	    *addrl = DoRRop (*addrl, piQxelAnd[2], piQxelXor[2]);
 | |
| 	    addrl++;
 | |
| 	  }
 | |
| 	  switch(rightIndex){
 | |
| 	  case 0:
 | |
| 	    break;
 | |
| 	  case 1:
 | |
| 	    *addrl = DoMaskRRop (*addrl, piQxelAnd[0], piQxelXor[0], 0xFFFFFF);
 | |
| 	    addrl++;
 | |
| 	    break;
 | |
| 	  case 2:
 | |
| 	    *addrl = DoRRop (*addrl, piQxelAnd[0], piQxelXor[0]);
 | |
| 	    addrl++;
 | |
| 	    *addrl = DoMaskRRop (*addrl, piQxelAnd[1], piQxelXor[1], 0xFFFF);
 | |
| 	    break;
 | |
| 	  case 3:
 | |
| 	    *addrl = DoRRop (*addrl, piQxelAnd[0], piQxelXor[0]);
 | |
| 	    addrl++;
 | |
| 	    *addrl = DoRRop (*addrl, piQxelAnd[1], piQxelXor[1]);
 | |
| 	    addrl++;
 | |
| 	    *addrl = DoMaskRRop (*addrl, piQxelAnd[2], piQxelXor[2], 0xFF);
 | |
| 	    break;
 | |
| 	  }
 | |
| 
 | |
| 	  }
 | |
| 	}
 | |
|       }
 | |
|     }
 | |
| #else
 | |
|     register CfbBits startmask;
 | |
|     register CfbBits endmask;
 | |
| 
 | |
|     addrl = addrl + (y1 * nlwidth) + (x1 >> PWSH);
 | |
| 
 | |
|     /* all bits inside same longword */
 | |
|     if ( ((x1 & PIM) + len) < PPW)
 | |
|     {
 | |
| 	maskpartialbits(x1, len, startmask);
 | |
| 	*addrl = DoMaskRRop (*addrl, and, xor, startmask);
 | |
|     }
 | |
|     else
 | |
|     {
 | |
| 	maskbits(x1, len, startmask, endmask, nlmiddle);
 | |
| 	if (rop == GXcopy)
 | |
| 	{
 | |
| 	    if (startmask)
 | |
| 	    {
 | |
| 		*addrl = (*addrl & ~startmask) | (xor & startmask);
 | |
| 		addrl++;
 | |
| 	    }
 | |
| 	    while (nlmiddle--)
 | |
| 	    	*addrl++ = xor;
 | |
| 	    if (endmask)
 | |
| 		*addrl = (*addrl & ~endmask) | (xor & endmask);
 | |
| 	}
 | |
| 	else
 | |
| 	{
 | |
| 	    if (startmask)
 | |
| 	    {
 | |
| 		*addrl = DoMaskRRop (*addrl, and, xor, startmask);
 | |
| 		addrl++;
 | |
| 	    }
 | |
| 	    if (rop == GXxor)
 | |
| 	    {
 | |
| 		while (nlmiddle--)
 | |
| 		    *addrl++ ^= xor;
 | |
| 	    }
 | |
| 	    else
 | |
| 	    {
 | |
| 		while (nlmiddle--)
 | |
| 		{
 | |
| 		    *addrl = DoRRop (*addrl, and, xor);
 | |
| 		    addrl++;
 | |
| 		}
 | |
| 	    }
 | |
| 	    if (endmask)
 | |
| 		*addrl = DoMaskRRop (*addrl, and, xor, endmask);
 | |
| 	}
 | |
|     }
 | |
| #endif
 | |
| }
 | |
| 
 | |
| /* vertical solid line */
 | |
| 
 | |
| void
 | |
| cfbVertS(rop, and, xor, addrl, nlwidth, x1, y1, len)
 | |
| int rop;
 | |
| register CfbBits and, xor;
 | |
| register CfbBits *addrl;	/* pointer to base of bitmap */
 | |
| register int nlwidth;	/* width in longwords of bitmap */
 | |
| int x1, y1;		/* initial point */
 | |
| register int len;	/* length of line */
 | |
| {
 | |
| #if PSZ == 24
 | |
|     int xIdx;
 | |
|     CfbBits and2 = 0, xor2 = 0, mask = 0, mask2;
 | |
| #endif
 | |
| #ifdef PIXEL_ADDR
 | |
|     register PixelType    *bits = (PixelType *) addrl;
 | |
| 
 | |
| #if PSZ == 24
 | |
|     nlwidth <<= PWSH;
 | |
|     xIdx = x1 & 3;
 | |
|     bits = (PixelType *)(addrl + (y1 * nlwidth) + ((x1*3) >> 2));
 | |
| #else
 | |
|     nlwidth <<= PWSH;
 | |
|     bits = bits + (y1 * nlwidth) + x1;
 | |
| #endif
 | |
| #if PSZ == 24
 | |
|     mask2 = 0;
 | |
|     switch(xIdx){
 | |
|       case 0:
 | |
|         mask = 0xFF000000;
 | |
| 	xor &= 0xFFFFFF;
 | |
| 	and |= 0xFF000000;
 | |
| 	break;
 | |
|       case 3:
 | |
| 	mask = 0xFF;
 | |
| 	xor &= 0xFFFFFF;
 | |
| 	xor <<= 8;
 | |
| 	and <<= 8;
 | |
| 	and |= 0xFF;
 | |
| 	break;
 | |
|       case 1:
 | |
| 	mask = 0xFFFFFF;
 | |
| 	mask2 = 0xFFFF0000;
 | |
| 	xor2 = (xor>>8) & 0xFFFF;
 | |
| 	xor &= 0xFF;
 | |
| 	xor <<= 24;
 | |
| 	and2 = (and >> 8 ) | 0xFFFF0000;
 | |
| 	and <<= 24;
 | |
| 	and |= 0xFFFFFF;
 | |
| 	break;
 | |
|       case 2:
 | |
| 	mask = 0x0000FFFF;
 | |
| 	mask2 = 0xFFFFFF00;
 | |
| 	xor2 = (xor >> 16) & 0xFF;
 | |
| 	xor <<= 16;
 | |
| 	xor &= 0xFFFF0000;
 | |
| 	and2 = (and >> 16) | 0xFFFFFF00;
 | |
| 	and <<= 16;
 | |
| 	and |= 0xFFFF;
 | |
| 	break;
 | |
|       }
 | |
| #endif
 | |
| 
 | |
|     /*
 | |
|      * special case copy and xor to avoid a test per pixel
 | |
|      */
 | |
|     if (rop == GXcopy)
 | |
|     {
 | |
| #if PSZ == 24
 | |
|       switch(xIdx){
 | |
|       case 0:
 | |
|       case 3:
 | |
| 	while (len--){
 | |
| 	  *bits = (*bits & mask)| xor;
 | |
| 	  bits += nlwidth;
 | |
| 	}
 | |
| 	break;
 | |
|       case 1:
 | |
|       case 2:
 | |
| 	while (len--){
 | |
| 	  *bits = (*bits & mask)| xor;
 | |
| 	  bits++;
 | |
| 	  *bits = (*bits & mask2)| xor2;
 | |
| 	  bits--;
 | |
| 	  bits += nlwidth;
 | |
| 	}
 | |
| 	break;
 | |
|       }
 | |
| #else
 | |
| 	while (len--)
 | |
| 	{
 | |
| 	    *bits = xor;
 | |
| 	    bits += nlwidth;
 | |
| 	}
 | |
| #endif
 | |
|     }
 | |
|     else if (rop == GXxor)
 | |
|     {
 | |
| #if PSZ == 24
 | |
|       switch(xIdx){
 | |
|       case 0:
 | |
|       case 3:
 | |
| 	while (len--){
 | |
| 	  *bits ^=  xor;
 | |
| 	  bits += nlwidth;
 | |
| 	}
 | |
| 	break;
 | |
|       case 1:
 | |
|       case 2:
 | |
| 	while (len--){
 | |
| 	  *bits ^= xor;
 | |
| 	  bits++;
 | |
| 	  *bits ^= xor2;
 | |
| 	  bits--;
 | |
| 	  bits += nlwidth;
 | |
| 	}
 | |
| 	break;
 | |
|       }
 | |
| #else
 | |
| 	while (len--)
 | |
| 	{
 | |
| 	    *bits ^= xor;
 | |
| 	    bits += nlwidth;
 | |
| 	}
 | |
| #endif
 | |
|     }
 | |
|     else
 | |
|     {
 | |
| #if PSZ == 24
 | |
|       switch(xIdx){
 | |
|       case 0:
 | |
| 	while (len--){
 | |
| 	  *bits = DoMaskRRop(*bits, and, xor, 0x00FFFFFF);
 | |
| 	  bits += nlwidth;
 | |
| 	}
 | |
| 	break;
 | |
|       case 3:
 | |
| 	while (len--){
 | |
| 	  *bits = DoMaskRRop(*bits, and, xor, 0xFFFFFF00);
 | |
| 	  bits += nlwidth;
 | |
| 	}
 | |
| 	break;
 | |
|       case 1:
 | |
| 	while (len--){
 | |
| 	  *bits = DoMaskRRop(*bits, and, xor, 0xFF000000);
 | |
| 	  bits++;
 | |
| 	  *bits = DoMaskRRop(*bits, and2, xor2, 0x0000FFFF);
 | |
| 	  bits--;
 | |
| 	  bits += nlwidth;
 | |
| 	}
 | |
| 	break;
 | |
|       case 2:
 | |
| 	while (len--){
 | |
| 	  *bits = DoMaskRRop(*bits, and, xor, 0xFFFF0000);
 | |
| 	  bits++;
 | |
| 	  *bits = DoMaskRRop(*bits, and2, xor2, 0x000000FF);
 | |
| 	  bits--;
 | |
| 	  bits += nlwidth;
 | |
| 	}
 | |
| 	break;
 | |
|       }
 | |
| #else
 | |
| 	while (len--)
 | |
| 	{
 | |
| 	    *bits = DoRRop(*bits, and, xor);
 | |
| 	    bits += nlwidth;
 | |
| 	}
 | |
| #endif
 | |
|     }
 | |
| #else /* !PIXEL_ADDR */
 | |
| #if PSZ == 24
 | |
|     addrl = addrl + (y1 * nlwidth) + ((x1*3) >>2);
 | |
| 
 | |
|     and |= ~cfbmask[(x1 & 3)<<1];
 | |
|     xor &= cfbmask[(x1 & 3)<<1];
 | |
| #else
 | |
|     addrl = addrl + (y1 * nlwidth) + (x1 >> PWSH);
 | |
| 
 | |
|     and |= ~cfbmask[x1 & PIM];
 | |
|     xor &= cfbmask[x1 & PIM];
 | |
| #endif
 | |
| 
 | |
|     while (len--)
 | |
|     {
 | |
| 	*addrl = DoRRop (*addrl, and, xor);
 | |
| 	addrl += nlwidth;
 | |
|     }
 | |
| #endif
 | |
| }
 |