xserver-multidpi/hw/xfree86/xaa/xaaImage.c
Keith Packard 9838b7032e Introduce a consistent coding style
This is strictly the application of the script 'x-indent-all.sh'
from util/modular. Compared to the patch that Daniel posted in
January, I've added a few indent flags:

	-bap
	-psl
	-T PrivatePtr
	-T pmWait
	-T _XFUNCPROTOBEGIN
	-T _XFUNCPROTOEND
	-T _X_EXPORT

The typedefs were needed to make the output of sdksyms.sh match the
previous output, otherwise, the code is formatted badly enough that
sdksyms.sh generates incorrect output.

The generated code was compared with the previous version and found to
be essentially identical -- "assert" line numbers and BUILD_TIME were
the only differences found.

The comparison was done with this script:

dir1=$1
dir2=$2

for dir in $dir1 $dir2; do
	(cd $dir && find . -name '*.o' | while read file; do
		dir=`dirname $file`
		base=`basename $file .o`
		dump=$dir/$base.dump
		objdump -d $file > $dump
	done)
done

find $dir1 -name '*.dump' | while read dump; do
	otherdump=`echo $dump | sed "s;$dir1;$dir2;"`
	diff -u $dump $otherdump
done

Signed-off-by: Keith Packard <keithp@keithp.com>
Acked-by: Daniel Stone <daniel@fooishbar.org>
Acked-by: Alan Coopersmith <alan.coopersmith@oracle.com>
2012-03-21 13:54:42 -07:00

535 lines
16 KiB
C

#ifdef HAVE_XORG_CONFIG_H
#include <xorg-config.h>
#endif
#include "misc.h"
#include "xf86.h"
#include "xf86_OSproc.h"
#include "servermd.h"
#include <X11/X.h>
#include "scrnintstr.h"
#include "mi.h"
#include "pixmapstr.h"
#include "xf86str.h"
#include "xaa.h"
#include "xaalocal.h"
void
XAAMoveDWORDS_FixedBase(register CARD32 *dest,
register CARD32 *src, register int dwords)
{
while (dwords & ~0x03) {
*dest = *src;
*dest = *(src + 1);
*dest = *(src + 2);
*dest = *(src + 3);
dwords -= 4;
src += 4;
}
if (!dwords)
return;
*dest = *src;
if (dwords == 1)
return;
*dest = *(src + 1);
if (dwords == 2)
return;
*dest = *(src + 2);
}
void
XAAMoveDWORDS(register CARD32 *dest, register CARD32 *src, register int dwords)
{
while (dwords & ~0x03) {
*dest = *src;
*(dest + 1) = *(src + 1);
*(dest + 2) = *(src + 2);
*(dest + 3) = *(src + 3);
src += 4;
dest += 4;
dwords -= 4;
}
if (!dwords)
return;
*dest = *src;
if (dwords == 1)
return;
*(dest + 1) = *(src + 1);
if (dwords == 2)
return;
*(dest + 2) = *(src + 2);
}
void
XAAMoveDWORDS_FixedSrc(register CARD32 *dest,
register CARD32 *src, register int dwords)
{
while (dwords & ~0x03) {
*dest = *src;
*(dest + 1) = *src;
*(dest + 2) = *src;
*(dest + 3) = *src;
dest += 4;
dwords -= 4;
}
if (!dwords)
return;
*dest = *src;
if (dwords == 1)
return;
*(dest + 1) = *src;
if (dwords == 2)
return;
*(dest + 2) = *src;
}
static void
XAAWritePixmap32To24(ScrnInfoPtr pScrn, int x, int y, int w, int h, unsigned char *srcInit, int srcwidth, /* bytes */
int rop, unsigned int planemask, int trans)
{
XAAInfoRecPtr infoRec = GET_XAAINFORECPTR_FROM_SCRNINFOPTR(pScrn);
int count, dwords = bytes_to_int32(w * 3);
CARD32 *src, *dst;
Bool PlusOne = FALSE;
if ((infoRec->ImageWriteFlags & CPU_TRANSFER_PAD_QWORD) &&
((dwords * h) & 0x01)) {
PlusOne = TRUE;
}
(*infoRec->SetupForImageWrite) (pScrn, rop, planemask, trans, 24, 24);
(*infoRec->SubsequentImageWriteRect) (pScrn, x, y, w, h, 0);
if (dwords > infoRec->ImageWriteRange) {
dst = (CARD32 *) infoRec->ImageWriteBase;
while (h--) {
src = (CARD32 *) srcInit;
count = w;
while (count >= 4) {
*dst = (src[0] & 0x00ffffff) | (src[1] << 24);
*dst = ((src[1] >> 8) & 0x0000ffff) | (src[2] << 16);
*dst = ((src[2] >> 16) & 0x000000ff) | (src[3] << 8);
src += 4;
count -= 4;
}
switch (count) {
case 0:
break;
case 1:
*dst = src[0];
break;
case 2:
*dst = (src[0] & 0x00ffffff) | (src[1] << 24);
*dst = src[1] >> 8;
break;
default:
*dst = (src[0] & 0x00ffffff) | (src[1] << 24);
*dst = ((src[1] >> 8) & 0x0000ffff) | (src[2] << 16);
*dst = src[2] >> 16;
break;
}
srcInit += srcwidth;
}
}
else {
while (h--) {
dst = (CARD32 *) infoRec->ImageWriteBase;
src = (CARD32 *) srcInit;
count = w;
while (count >= 4) {
dst[0] = (src[0] & 0x00ffffff) | (src[1] << 24);
dst[1] = ((src[1] >> 8) & 0x0000ffff) | (src[2] << 16);
dst[2] = ((src[2] >> 16) & 0x000000ff) | (src[3] << 8);
dst += 3;
src += 4;
count -= 4;
}
switch (count) {
case 0:
break;
case 1:
dst[0] = src[0];
break;
case 2:
dst[0] = (src[0] & 0x00ffffff) | (src[1] << 24);
dst[1] = src[1] >> 8;
break;
default:
dst[0] = (src[0] & 0x00ffffff) | (src[1] << 24);
dst[1] = ((src[1] >> 8) & 0x0000ffff) | (src[2] << 16);
dst[2] = src[2] >> 16;
break;
}
srcInit += srcwidth;
}
}
if (PlusOne) {
CARD32 *base = (CARD32 *) infoRec->ImageWriteBase;
*base = 0x00000000;
}
if (infoRec->ImageWriteFlags & SYNC_AFTER_IMAGE_WRITE)
(*infoRec->Sync) (pScrn);
else
SET_SYNC_FLAG(infoRec);
}
void
XAAWritePixmap(ScrnInfoPtr pScrn, int x, int y, int w, int h, unsigned char *src, int srcwidth, /* bytes */
int rop, unsigned int planemask, int trans, int bpp, int depth)
{
XAAInfoRecPtr infoRec;
int dwords, skipleft, Bpp;
Bool beCareful, PlusOne;
if ((bpp == 32) && (pScrn->bitsPerPixel == 24)) {
XAAWritePixmap32To24(pScrn, x, y, w, h, src, srcwidth,
rop, planemask, trans);
return;
}
infoRec = GET_XAAINFORECPTR_FROM_SCRNINFOPTR(pScrn);
beCareful = PlusOne = FALSE;
Bpp = bpp >> 3;
if ((skipleft = (long) src & 0x03L)) {
if (!(infoRec->ImageWriteFlags & LEFT_EDGE_CLIPPING)) {
skipleft = 0;
beCareful = TRUE;
goto BAD_ALIGNMENT;
}
if (Bpp == 3)
skipleft = 4 - skipleft;
else
skipleft /= Bpp;
if ((x < skipleft) && !(infoRec->ImageWriteFlags &
LEFT_EDGE_CLIPPING_NEGATIVE_X)) {
skipleft = 0;
beCareful = TRUE;
goto BAD_ALIGNMENT;
}
x -= skipleft;
w += skipleft;
if (Bpp == 3)
src -= 3 * skipleft;
else /* is this Alpha friendly ? */
src = (unsigned char *) ((long) src & ~0x03L);
}
BAD_ALIGNMENT:
dwords = bytes_to_int32(w * Bpp);
if ((infoRec->ImageWriteFlags & CPU_TRANSFER_PAD_QWORD) &&
((dwords * h) & 0x01)) {
PlusOne = TRUE;
}
(*infoRec->SetupForImageWrite) (pScrn, rop, planemask, trans, bpp, depth);
(*infoRec->SubsequentImageWriteRect) (pScrn, x, y, w, h, skipleft);
if (beCareful) {
/* in cases with bad alignment we have to be careful not
to read beyond the end of the source */
if (((x * Bpp) + (dwords << 2)) > srcwidth)
h--;
else
beCareful = FALSE;
}
if (dwords > infoRec->ImageWriteRange) {
while (h--) {
XAAMoveDWORDS_FixedBase((CARD32 *) infoRec->ImageWriteBase,
(CARD32 *) src, dwords);
src += srcwidth;
}
if (beCareful) {
int shift = ((long) src & 0x03L) << 3;
if (--dwords)
XAAMoveDWORDS_FixedBase((CARD32 *) infoRec->ImageWriteBase,
(CARD32 *) src, dwords);
src = (unsigned char *) ((long) (src + (dwords << 2)) & ~0x03L);
*((CARD32 *) infoRec->ImageWriteBase) = *((CARD32 *) src) >> shift;
}
}
else {
if (srcwidth == (dwords << 2)) {
int decrement = infoRec->ImageWriteRange / dwords;
while (h > decrement) {
XAAMoveDWORDS((CARD32 *) infoRec->ImageWriteBase,
(CARD32 *) src, dwords * decrement);
src += (srcwidth * decrement);
h -= decrement;
}
if (h) {
XAAMoveDWORDS((CARD32 *) infoRec->ImageWriteBase,
(CARD32 *) src, dwords * h);
if (beCareful)
src += (srcwidth * h);
}
}
else {
while (h--) {
XAAMoveDWORDS((CARD32 *) infoRec->ImageWriteBase,
(CARD32 *) src, dwords);
src += srcwidth;
}
}
if (beCareful) {
int shift = ((long) src & 0x03L) << 3;
if (--dwords)
XAAMoveDWORDS((CARD32 *) infoRec->ImageWriteBase,
(CARD32 *) src, dwords);
src = (unsigned char *) ((long) (src + (dwords << 2)) & ~0x03L);
((CARD32 *) infoRec->ImageWriteBase)[dwords] =
*((CARD32 *) src) >> shift;
}
}
if (PlusOne) {
CARD32 *base = (CARD32 *) infoRec->ImageWriteBase;
*base = 0x00000000;
}
if (infoRec->ImageWriteFlags & SYNC_AFTER_IMAGE_WRITE)
(*infoRec->Sync) (pScrn);
else
SET_SYNC_FLAG(infoRec);
}
void
XAAWritePixmapScanline(ScrnInfoPtr pScrn, int x, int y, int w, int h, unsigned char *src, int srcwidth, /* bytes */
int rop,
unsigned int planemask, int trans, int bpp, int depth)
{
XAAInfoRecPtr infoRec = GET_XAAINFORECPTR_FROM_SCRNINFOPTR(pScrn);
int dwords, skipleft, bufferNo = 0, Bpp = bpp >> 3;
Bool beCareful = FALSE;
CARD32 *base;
if ((skipleft = (long) src & 0x03L)) {
if (!(infoRec->ScanlineImageWriteFlags & LEFT_EDGE_CLIPPING)) {
skipleft = 0;
beCareful = TRUE;
goto BAD_ALIGNMENT;
}
if (Bpp == 3)
skipleft = 4 - skipleft;
else
skipleft /= Bpp;
if ((x < skipleft) && !(infoRec->ScanlineImageWriteFlags &
LEFT_EDGE_CLIPPING_NEGATIVE_X)) {
skipleft = 0;
beCareful = TRUE;
goto BAD_ALIGNMENT;
}
x -= skipleft;
w += skipleft;
if (Bpp == 3)
src -= 3 * skipleft;
else
src = (unsigned char *) ((long) src & ~0x03L);
}
BAD_ALIGNMENT:
dwords = bytes_to_int32(w * Bpp);
(*infoRec->SetupForScanlineImageWrite) (pScrn, rop, planemask, trans, bpp,
depth);
(*infoRec->SubsequentScanlineImageWriteRect) (pScrn, x, y, w, h, skipleft);
if (beCareful) {
/* in cases with bad alignment we have to be careful not
to read beyond the end of the source */
if (((x * Bpp) + (dwords << 2)) > srcwidth)
h--;
else
beCareful = FALSE;
}
while (h--) {
base = (CARD32 *) infoRec->ScanlineImageWriteBuffers[bufferNo];
XAAMoveDWORDS(base, (CARD32 *) src, dwords);
(*infoRec->SubsequentImageWriteScanline) (pScrn, bufferNo++);
src += srcwidth;
if (bufferNo >= infoRec->NumScanlineImageWriteBuffers)
bufferNo = 0;
}
if (beCareful) {
int shift = ((long) src & 0x03L) << 3;
base = (CARD32 *) infoRec->ScanlineImageWriteBuffers[bufferNo];
if (--dwords)
XAAMoveDWORDS(base, (CARD32 *) src, dwords);
src = (unsigned char *) ((long) (src + (dwords << 2)) & ~0x03L);
base[dwords] = *((CARD32 *) src) >> shift;
(*infoRec->SubsequentImageWriteScanline) (pScrn, bufferNo);
}
SET_SYNC_FLAG(infoRec);
}
void
XAAPutImage(DrawablePtr pDraw,
GCPtr pGC,
int depth,
int x, int y, int w, int h, int leftPad, int format, char *pImage)
{
XAAInfoRecPtr infoRec = GET_XAAINFORECPTR_FROM_GC(pGC);
int bpp = BitsPerPixel(depth);
Bool depthBug = FALSE;
if (!w || !h)
return;
if (!RegionNumRects(pGC->pCompositeClip))
return;
depthBug = XAA_DEPTH_BUG(pGC);
if (((format == ZPixmap) && infoRec->WritePixmap &&
((pDraw->bitsPerPixel == bpp) ||
((pDraw->bitsPerPixel == 24) && (bpp == 32) &&
(infoRec->WritePixmapFlags & CONVERT_32BPP_TO_24BPP))) &&
CHECK_ROP(pGC, infoRec->WritePixmapFlags) &&
CHECK_ROPSRC(pGC, infoRec->WritePixmapFlags) &&
CHECK_PLANEMASK(pGC, infoRec->WritePixmapFlags) &&
CHECK_NO_GXCOPY(pGC, infoRec->WritePixmapFlags)) ||
((format == XYBitmap) && !depthBug && infoRec->WriteBitmap &&
CHECK_ROP(pGC, infoRec->WriteBitmapFlags) &&
CHECK_ROPSRC(pGC, infoRec->WriteBitmapFlags) &&
CHECK_PLANEMASK(pGC, infoRec->WriteBitmapFlags) &&
CHECK_COLORS(pGC, infoRec->WriteBitmapFlags) &&
!(infoRec->WriteBitmapFlags & TRANSPARENCY_ONLY)) ||
((format == XYPixmap) && !depthBug && infoRec->WriteBitmap &&
CHECK_ROP(pGC, infoRec->WriteBitmapFlags) &&
CHECK_ROPSRC(pGC, infoRec->WriteBitmapFlags) &&
!(infoRec->WriteBitmapFlags & NO_PLANEMASK) &&
!(infoRec->WriteBitmapFlags & TRANSPARENCY_ONLY))) {
int MaxBoxes = RegionNumRects(pGC->pCompositeClip);
BoxPtr pbox, pClipBoxes;
int nboxes, srcx, srcy, srcwidth;
xRectangle TheRect;
TheRect.x = pDraw->x + x;
TheRect.y = pDraw->y + y;
TheRect.width = w;
TheRect.height = h;
if (MaxBoxes > (infoRec->PreAllocSize / sizeof(BoxRec))) {
pClipBoxes = malloc(MaxBoxes * sizeof(BoxRec));
if (!pClipBoxes)
return;
}
else
pClipBoxes = (BoxPtr) infoRec->PreAllocMem;
nboxes = XAAGetRectClipBoxes(pGC, pClipBoxes, 1, &TheRect);
pbox = pClipBoxes;
if (format == XYBitmap) {
srcwidth = BitmapBytePad(leftPad + w);
while (nboxes--) {
srcx = pbox->x1 - TheRect.x + leftPad;
srcy = pbox->y1 - TheRect.y;
(*infoRec->WriteBitmap) (infoRec->pScrn, pbox->x1, pbox->y1,
pbox->x2 - pbox->x1,
pbox->y2 - pbox->y1,
(unsigned char *) pImage +
(srcwidth * srcy) + ((srcx >> 5) << 2),
srcwidth, srcx & 31, pGC->fgPixel,
pGC->bgPixel, pGC->alu,
pGC->planemask);
pbox++;
}
}
else if (format == ZPixmap) {
int Bpp = bpp >> 3;
srcwidth = PixmapBytePad(leftPad + w, depth);
while (nboxes--) {
srcx = pbox->x1 - TheRect.x + leftPad;
srcy = pbox->y1 - TheRect.y;
(*infoRec->WritePixmap) (infoRec->pScrn, pbox->x1, pbox->y1,
pbox->x2 - pbox->x1,
pbox->y2 - pbox->y1,
(unsigned char *) pImage +
(srcwidth * srcy) + (srcx * Bpp),
srcwidth, pGC->alu, pGC->planemask, -1,
Bpp << 3, depth);
pbox++;
}
}
else { /* XYPixmap */
int depth = pGC->depth;
int numBox, increment;
unsigned long i, mask;
BoxPtr pntBox;
srcwidth = BitmapBytePad(w + leftPad);
increment = h * srcwidth;
i = 1 << (depth - 1);
mask = ~0;
if ((infoRec->pScrn->overlayFlags & OVERLAY_8_32_PLANAR) &&
(pGC->depth == 8)) {
i = 0x80000000;
mask = 0xff000000;
}
for (; i & mask; i >>= 1, pImage += increment) {
if (i & pGC->planemask) {
pntBox = pbox;
numBox = nboxes;
while (numBox--) {
srcx = pntBox->x1 - TheRect.x + leftPad;
srcy = pntBox->y1 - TheRect.y;
(*infoRec->WriteBitmap) (infoRec->pScrn,
pntBox->x1, pntBox->y1,
pntBox->x2 - pntBox->x1,
pntBox->y2 - pntBox->y1,
(unsigned char *) pImage +
(srcwidth * srcy) +
((srcx >> 5) << 2), srcwidth,
srcx & 31, ~0, 0, pGC->alu, i);
pntBox++;
}
}
}
}
if (pClipBoxes != (BoxPtr) infoRec->PreAllocMem)
free(pClipBoxes);
}
else
XAAFallbackOps.PutImage(pDraw, pGC, depth, x, y, w, h, leftPad,
format, pImage);
}