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

150 lines
4.0 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) dixLookupPrivate(&pGC->devPrivates,
XAAGetGCKey());
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;
free(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 = calloc((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;
}
}