xenocara/xserver/hw/xfree86/xaa/xaaLineMisc.c

151 lines
3.4 KiB
C
Raw Normal View History

2006-11-26 11:13:41 -07:00
#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);
2007-11-24 10:55:21 -07:00
XAAGCPtr pGCPriv = (XAAGCPtr) (pGC)->devPrivates[XAAGetGCIndex()].ptr;
2006-11-26 11:13:41 -07:00
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;
}
}