139 lines
3.9 KiB
C
139 lines
3.9 KiB
C
/*
|
|
* Copyright © 2000 Keith Packard
|
|
*
|
|
* 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, and that the name of Keith Packard not be used in
|
|
* advertising or publicity pertaining to distribution of the software without
|
|
* specific, written prior permission. Keith Packard makes no
|
|
* representations about the suitability of this software for any purpose. It
|
|
* is provided "as is" without express or implied warranty.
|
|
*
|
|
* KEITH PACKARD DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
|
|
* INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
|
|
* EVENT SHALL KEITH PACKARD 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 "shadow.h"
|
|
#include "fb.h"
|
|
|
|
#define Get8(a) ((CARD32) READ(a))
|
|
|
|
#if BITMAP_BIT_ORDER == MSBFirst
|
|
#define Get24(a) ((Get8(a) << 16) | (Get8((a)+1) << 8) | Get8((a)+2))
|
|
#define Put24(a,p) ((WRITE((a+0), (CARD8) ((p) >> 16))), \
|
|
(WRITE((a+1), (CARD8) ((p) >> 8))), \
|
|
(WRITE((a+2), (CARD8) (p))))
|
|
#else
|
|
#define Get24(a) (Get8(a) | (Get8((a)+1) << 8) | (Get8((a)+2)<<16))
|
|
#define Put24(a,p) ((WRITE((a+0), (CARD8) (p))), \
|
|
(WRITE((a+1), (CARD8) ((p) >> 8))), \
|
|
(WRITE((a+2), (CARD8) ((p) >> 16))))
|
|
#endif
|
|
|
|
static void
|
|
sh24_32BltLine(CARD8 *srcLine,
|
|
CARD8 *dstLine,
|
|
int width)
|
|
{
|
|
CARD32 *src;
|
|
CARD8 *dst;
|
|
int w;
|
|
CARD32 pixel;
|
|
|
|
src = (CARD32 *) srcLine;
|
|
dst = dstLine;
|
|
w = width;
|
|
|
|
while (((long)dst & 3) && w) {
|
|
w--;
|
|
pixel = READ(src++);
|
|
Put24(dst, pixel);
|
|
dst += 3;
|
|
}
|
|
/* Do four aligned pixels at a time */
|
|
while (w >= 4) {
|
|
CARD32 s0, s1;
|
|
|
|
s0 = READ(src++);
|
|
s1 = READ(src++);
|
|
#if BITMAP_BIT_ORDER == LSBFirst
|
|
WRITE((CARD32 *) dst, (s0 & 0xffffff) | (s1 << 24));
|
|
#else
|
|
WRITE((CARD32 *) dst, (s0 << 8) | ((s1 & 0xffffff) >> 16));
|
|
#endif
|
|
s0 = READ(src++);
|
|
#if BITMAP_BIT_ORDER == LSBFirst
|
|
WRITE((CARD32 *) (dst + 4),
|
|
((s1 & 0xffffff) >> 8) | (s0 << 16));
|
|
#else
|
|
WRITE((CARD32 *) (dst + 4),
|
|
(s1 << 16) | ((s0 & 0xffffff) >> 8));
|
|
#endif
|
|
s1 = READ(src++);
|
|
#if BITMAP_BIT_ORDER == LSBFirst
|
|
WRITE((CARD32 *) (dst + 8),
|
|
((s0 & 0xffffff) >> 16) | (s1 << 8));
|
|
#else
|
|
WRITE((CARD32 *) (dst + 8), (s0 << 24) | (s1 & 0xffffff));
|
|
#endif
|
|
dst += 12;
|
|
w -= 4;
|
|
}
|
|
while (w--) {
|
|
pixel = READ(src++);
|
|
Put24(dst, pixel);
|
|
dst += 3;
|
|
}
|
|
}
|
|
|
|
void
|
|
shadowUpdate32to24(ScreenPtr pScreen, shadowBufPtr pBuf)
|
|
{
|
|
RegionPtr damage = DamageRegion(pBuf->pDamage);
|
|
PixmapPtr pShadow = pBuf->pPixmap;
|
|
int nbox = RegionNumRects(damage);
|
|
BoxPtr pbox = RegionRects(damage);
|
|
FbStride shaStride;
|
|
int shaBpp;
|
|
_X_UNUSED int shaXoff, shaYoff;
|
|
int x, y, w, h;
|
|
CARD32 winSize;
|
|
FbBits *shaBase, *shaLine;
|
|
CARD8 *winBase = NULL, *winLine;
|
|
|
|
fbGetDrawable(&pShadow->drawable, shaBase, shaStride, shaBpp, shaXoff,
|
|
shaYoff);
|
|
|
|
/* just get the initial window base + stride */
|
|
winBase = (*pBuf->window)(pScreen, 0, 0, SHADOW_WINDOW_WRITE,
|
|
&winSize, pBuf->closure);
|
|
|
|
while (nbox--) {
|
|
x = pbox->x1;
|
|
y = pbox->y1;
|
|
w = pbox->x2 - pbox->x1;
|
|
h = pbox->y2 - pbox->y1;
|
|
|
|
winLine = winBase + y * winSize + (x * 3);
|
|
shaLine = shaBase + y * shaStride + ((x * shaBpp) >> FB_SHIFT);
|
|
|
|
while (h--) {
|
|
sh24_32BltLine((CARD8 *)shaLine, (CARD8 *)winLine, w);
|
|
winLine += winSize;
|
|
shaLine += shaStride;
|
|
}
|
|
pbox++;
|
|
}
|
|
}
|