151 lines
		
	
	
		
			3.4 KiB
		
	
	
	
		
			C
		
	
	
	
			
		
		
	
	
			151 lines
		
	
	
		
			3.4 KiB
		
	
	
	
		
			C
		
	
	
	
| 
 | |
| #ifdef HAVE_XORG_CONFIG_H
 | |
| #include <xorg-config.h>
 | |
| #endif
 | |
| 
 | |
| #include "misc.h"
 | |
| #include "xf86.h"
 | |
| #include "xf86_OSproc.h"
 | |
| 
 | |
| #include <X11/X.h>
 | |
| #include "scrnintstr.h"
 | |
| #include "miline.h"
 | |
| #include "xf86str.h"
 | |
| #include "xaa.h"
 | |
| #include "xaalocal.h"
 | |
|    
 | |
| 
 | |
| void 
 | |
| XAASolidHorVertLineAsRects(
 | |
|    ScrnInfoPtr pScrn,
 | |
|    int x, int y, int len, int dir
 | |
| ){
 | |
|     XAAInfoRecPtr infoRec = GET_XAAINFORECPTR_FROM_SCRNINFOPTR(pScrn);
 | |
| 
 | |
|     if(dir == DEGREES_0) 
 | |
| 	(*infoRec->SubsequentSolidFillRect)(pScrn, x, y, len, 1);
 | |
|     else
 | |
| 	(*infoRec->SubsequentSolidFillRect)(pScrn, x, y, 1, len);
 | |
| }
 | |
|    
 | |
| 
 | |
| void 
 | |
| XAASolidHorVertLineAsTwoPoint(
 | |
|    ScrnInfoPtr pScrn,
 | |
|    int x, int y, int len, int dir
 | |
| ){
 | |
|     XAAInfoRecPtr infoRec = GET_XAAINFORECPTR_FROM_SCRNINFOPTR(pScrn);
 | |
| 
 | |
|     len--;
 | |
| 
 | |
|     if(dir == DEGREES_0) 
 | |
| 	(*infoRec->SubsequentSolidTwoPointLine)(pScrn, x, y, x + len, y, 0);
 | |
|     else
 | |
| 	(*infoRec->SubsequentSolidTwoPointLine)(pScrn, x, y, x, y + len, 0);
 | |
| }
 | |
|    
 | |
| void 
 | |
| XAASolidHorVertLineAsBresenham(
 | |
|    ScrnInfoPtr pScrn,
 | |
|    int x, int y, int len, int dir
 | |
| ){
 | |
|     XAAInfoRecPtr infoRec = GET_XAAINFORECPTR_FROM_SCRNINFOPTR(pScrn);
 | |
| 
 | |
|     if(dir == DEGREES_0) 
 | |
| 	(*infoRec->SubsequentSolidBresenhamLine)(
 | |
| 		pScrn, x, y, len << 1, 0, -len, len, 0);
 | |
|     else
 | |
| 	(*infoRec->SubsequentSolidBresenhamLine)(
 | |
| 		pScrn, x, y, len << 1, 0, -len, len, YMAJOR);
 | |
| }
 | |
| 
 | |
| 
 | |
| void
 | |
| XAAComputeDash(GCPtr pGC)
 | |
| {
 | |
|     XAAInfoRecPtr infoRec = GET_XAAINFORECPTR_FROM_GC(pGC);
 | |
|     XAAGCPtr   pGCPriv = (XAAGCPtr) (pGC)->devPrivates[XAAGetGCIndex()].ptr;
 | |
|     Bool EvenDash = (pGC->numInDashList & 0x01) ? FALSE : TRUE;
 | |
|     int PatternLength = 0;
 | |
|     unsigned char* DashPtr = (unsigned char*)pGC->dash;
 | |
|     CARD32 *ptr;
 | |
|     int count = pGC->numInDashList; 
 | |
|     int shift, value, direction;
 | |
|     Bool set;
 | |
| 
 | |
|     if(pGCPriv->DashPattern)
 | |
| 	xfree(pGCPriv->DashPattern);
 | |
| 
 | |
|     pGCPriv->DashPattern = NULL;
 | |
|     pGCPriv->DashLength = 0; 
 | |
|  
 | |
|     while(count--) 
 | |
| 	PatternLength += *(DashPtr++);
 | |
| 
 | |
|     if(!EvenDash)
 | |
| 	PatternLength <<= 1;
 | |
| 
 | |
|     if(PatternLength > infoRec->DashPatternMaxLength) 
 | |
| 	return;
 | |
| 
 | |
|     if((infoRec->DashedLineFlags & LINE_PATTERN_POWER_OF_2_ONLY) && 
 | |
| 				(PatternLength & (PatternLength - 1)))
 | |
| 	return;
 | |
| 
 | |
|     pGCPriv->DashPattern = xcalloc((PatternLength + 31) >> 5, 4);
 | |
|     if(!pGCPriv->DashPattern) return;
 | |
|     pGCPriv->DashLength = PatternLength;
 | |
| 
 | |
|     if(infoRec->DashedLineFlags & (LINE_PATTERN_LSBFIRST_MSBJUSTIFIED |
 | |
|  	 	 		   LINE_PATTERN_LSBFIRST_LSBJUSTIFIED)) {
 | |
| 	direction = 1;
 | |
| 	set = TRUE;
 | |
| 	DashPtr = (unsigned char*)pGC->dash;
 | |
|     } else {
 | |
| 	direction = -1;
 | |
| 	set = FALSE;
 | |
| 	DashPtr = (unsigned char*)pGC->dash + pGC->numInDashList - 1;
 | |
|     }
 | |
| 
 | |
|     if(infoRec->DashedLineFlags & (LINE_PATTERN_LSBFIRST_MSBJUSTIFIED |
 | |
|  	 	 		   LINE_PATTERN_MSBFIRST_MSBJUSTIFIED))
 | |
| 	shift = 32 - (PatternLength & 31);
 | |
|     else
 | |
| 	shift = 0;
 | |
| 
 | |
|     ptr = (CARD32*)(pGCPriv->DashPattern);
 | |
| 
 | |
| CONCATENATE:
 | |
| 
 | |
|     count = pGC->numInDashList;
 | |
| 
 | |
|     while(count--) {
 | |
| 	value = *DashPtr;
 | |
| 	DashPtr += direction;
 | |
| 	while(value) {
 | |
| 	    if(value < (32 - shift)) {
 | |
| 		if(set) *ptr |= XAAShiftMasks[value] << shift;
 | |
| 		shift += value;
 | |
| 		break;
 | |
| 	     } else {
 | |
| 		if(set) *ptr |= ~0L << shift;
 | |
| 		value -= (32 - shift);
 | |
| 		shift = 0;
 | |
| 		ptr++;
 | |
| 	     }
 | |
| 	}
 | |
| 	if(set) set = FALSE;
 | |
| 	else set = TRUE;
 | |
|     }
 | |
| 
 | |
|     if(!EvenDash) {
 | |
| 	EvenDash = TRUE;
 | |
| 	if(infoRec->DashedLineFlags & (LINE_PATTERN_LSBFIRST_MSBJUSTIFIED |
 | |
| 				       LINE_PATTERN_LSBFIRST_LSBJUSTIFIED))
 | |
| 	   DashPtr = (unsigned char*)pGC->dash;
 | |
| 	else
 | |
| 	   DashPtr = (unsigned char*)pGC->dash + pGC->numInDashList;
 | |
| 	goto CONCATENATE;
 | |
|     }
 | |
| }
 |