Merge remote-tracking branch 'geertu/master'
This commit is contained in:
commit
7ab98bafc9
|
@ -30,7 +30,7 @@
|
||||||
|
|
||||||
extern int KdTsPhyScreen;
|
extern int KdTsPhyScreen;
|
||||||
|
|
||||||
char *fbdevDevicePath = NULL;
|
const char *fbdevDevicePath = NULL;
|
||||||
|
|
||||||
static Bool
|
static Bool
|
||||||
fbdevInitialize(KdCardInfo * card, FbdevPriv * priv)
|
fbdevInitialize(KdCardInfo * card, FbdevPriv * priv)
|
||||||
|
@ -206,13 +206,23 @@ fbdevScreenInitialize(KdScreenInfo * screen, FbdevScrPriv * scrpriv)
|
||||||
depth = priv->var.bits_per_pixel;
|
depth = priv->var.bits_per_pixel;
|
||||||
gray = priv->var.grayscale;
|
gray = priv->var.grayscale;
|
||||||
|
|
||||||
|
/* Calculate fix.line_length if it's zero */
|
||||||
|
if (!priv->fix.line_length)
|
||||||
|
priv->fix.line_length = (priv->var.xres_virtual * depth + 7) / 8;
|
||||||
|
|
||||||
switch (priv->fix.visual) {
|
switch (priv->fix.visual) {
|
||||||
|
case FB_VISUAL_MONO01:
|
||||||
|
case FB_VISUAL_MONO10:
|
||||||
|
screen->fb.visuals = (1 << StaticGray);
|
||||||
|
break;
|
||||||
case FB_VISUAL_PSEUDOCOLOR:
|
case FB_VISUAL_PSEUDOCOLOR:
|
||||||
if (gray) {
|
screen->fb.visuals = (1 << StaticGray);
|
||||||
screen->fb.visuals = (1 << StaticGray);
|
if (priv->var.bits_per_pixel == 1) {
|
||||||
|
/* Override to monochrome, to have preallocated black/white */
|
||||||
|
priv->fix.visual = FB_VISUAL_MONO01;
|
||||||
|
} else if (gray) {
|
||||||
/* could also support GrayScale, but what's the point? */
|
/* could also support GrayScale, but what's the point? */
|
||||||
}
|
} else {
|
||||||
else {
|
|
||||||
screen->fb.visuals = ((1 << StaticGray) |
|
screen->fb.visuals = ((1 << StaticGray) |
|
||||||
(1 << GrayScale) |
|
(1 << GrayScale) |
|
||||||
(1 << StaticColor) |
|
(1 << StaticColor) |
|
||||||
|
@ -309,6 +319,21 @@ fbdevWindowLinear(ScreenPtr pScreen,
|
||||||
return (CARD8 *) priv->fb + row * priv->fix.line_length + offset;
|
return (CARD8 *) priv->fb + row * priv->fix.line_length + offset;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void *
|
||||||
|
fbdevWindowAfb(ScreenPtr pScreen,
|
||||||
|
CARD32 row,
|
||||||
|
CARD32 offset, int mode, CARD32 *size, void *closure)
|
||||||
|
{
|
||||||
|
KdScreenPriv(pScreen);
|
||||||
|
FbdevPriv *priv = pScreenPriv->card->driver;
|
||||||
|
|
||||||
|
if (!pScreenPriv->enabled)
|
||||||
|
return 0;
|
||||||
|
/* offset to next plane */
|
||||||
|
*size = priv->var.yres_virtual * priv->fix.line_length;
|
||||||
|
return (CARD8 *) priv->fb + row * priv->fix.line_length + offset;
|
||||||
|
}
|
||||||
|
|
||||||
Bool
|
Bool
|
||||||
fbdevMapFramebuffer(KdScreenInfo * screen)
|
fbdevMapFramebuffer(KdScreenInfo * screen)
|
||||||
{
|
{
|
||||||
|
@ -316,7 +341,8 @@ fbdevMapFramebuffer(KdScreenInfo * screen)
|
||||||
KdPointerMatrix m;
|
KdPointerMatrix m;
|
||||||
FbdevPriv *priv = screen->card->driver;
|
FbdevPriv *priv = screen->card->driver;
|
||||||
|
|
||||||
if (scrpriv->randr != RR_Rotate_0)
|
if (scrpriv->randr != RR_Rotate_0 ||
|
||||||
|
priv->fix.type != FB_TYPE_PACKED_PIXELS)
|
||||||
scrpriv->shadow = TRUE;
|
scrpriv->shadow = TRUE;
|
||||||
else
|
else
|
||||||
scrpriv->shadow = FALSE;
|
scrpriv->shadow = FALSE;
|
||||||
|
@ -392,33 +418,88 @@ fbdevSetShadow(ScreenPtr pScreen)
|
||||||
|
|
||||||
window = fbdevWindowLinear;
|
window = fbdevWindowLinear;
|
||||||
update = 0;
|
update = 0;
|
||||||
if (scrpriv->randr)
|
switch (priv->fix.type) {
|
||||||
if (priv->var.bits_per_pixel == 16) {
|
case FB_TYPE_PACKED_PIXELS:
|
||||||
switch (scrpriv->randr) {
|
if (scrpriv->randr)
|
||||||
case RR_Rotate_90:
|
if (priv->var.bits_per_pixel == 16) {
|
||||||
if (useYX)
|
switch (scrpriv->randr) {
|
||||||
update = shadowUpdateRotate16_90YX;
|
case RR_Rotate_90:
|
||||||
else
|
if (useYX)
|
||||||
update = shadowUpdateRotate16_90;
|
update = shadowUpdateRotate16_90YX;
|
||||||
break;
|
else
|
||||||
case RR_Rotate_180:
|
update = shadowUpdateRotate16_90;
|
||||||
update = shadowUpdateRotate16_180;
|
break;
|
||||||
break;
|
case RR_Rotate_180:
|
||||||
case RR_Rotate_270:
|
update = shadowUpdateRotate16_180;
|
||||||
if (useYX)
|
break;
|
||||||
update = shadowUpdateRotate16_270YX;
|
case RR_Rotate_270:
|
||||||
else
|
if (useYX)
|
||||||
update = shadowUpdateRotate16_270;
|
update = shadowUpdateRotate16_270YX;
|
||||||
break;
|
else
|
||||||
default:
|
update = shadowUpdateRotate16_270;
|
||||||
update = shadowUpdateRotate16;
|
break;
|
||||||
break;
|
default:
|
||||||
|
update = shadowUpdateRotate16;
|
||||||
|
break;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
else
|
||||||
|
update = shadowUpdateRotatePacked;
|
||||||
else
|
else
|
||||||
update = shadowUpdateRotatePacked;
|
update = shadowUpdatePacked;
|
||||||
else
|
break;
|
||||||
update = shadowUpdatePacked;
|
|
||||||
|
case FB_TYPE_PLANES:
|
||||||
|
window = fbdevWindowAfb;
|
||||||
|
switch (priv->var.bits_per_pixel) {
|
||||||
|
case 4:
|
||||||
|
update = shadowUpdateAfb4;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 8:
|
||||||
|
update = shadowUpdateAfb8;
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
FatalError("Bitplanes with bpp %u are not yet supported\n",
|
||||||
|
priv->var.bits_per_pixel);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case FB_TYPE_INTERLEAVED_PLANES:
|
||||||
|
if (priv->fix.type_aux == 2) {
|
||||||
|
switch (priv->var.bits_per_pixel) {
|
||||||
|
case 4:
|
||||||
|
update = shadowUpdateIplan2p4;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 8:
|
||||||
|
update = shadowUpdateIplan2p8;
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
FatalError("Atari interleaved bitplanes with bpp %u are not yet supported\n",
|
||||||
|
priv->var.bits_per_pixel);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
FatalError("Interleaved bitplanes with interleave %u are not yet supported\n",
|
||||||
|
priv->fix.type_aux);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case FB_TYPE_TEXT:
|
||||||
|
FatalError("Text frame buffers are not yet supported\n");
|
||||||
|
break;
|
||||||
|
|
||||||
|
case FB_TYPE_VGA_PLANES:
|
||||||
|
FatalError("VGA planes are not yet supported\n");
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
FatalError("Unsupported frame buffer type %u\n", priv->fix.type);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
return KdShadowSet(pScreen, scrpriv->randr, update, window);
|
return KdShadowSet(pScreen, scrpriv->randr, update, window);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -573,6 +654,26 @@ fbdevCreateColormap(ColormapPtr pmap)
|
||||||
xColorItem *pdefs;
|
xColorItem *pdefs;
|
||||||
|
|
||||||
switch (priv->fix.visual) {
|
switch (priv->fix.visual) {
|
||||||
|
case FB_VISUAL_MONO01:
|
||||||
|
pScreen->whitePixel = 0;
|
||||||
|
pScreen->blackPixel = 1;
|
||||||
|
pmap->red[0].co.local.red = 65535;
|
||||||
|
pmap->red[0].co.local.green = 65535;
|
||||||
|
pmap->red[0].co.local.blue = 65535;
|
||||||
|
pmap->red[1].co.local.red = 0;
|
||||||
|
pmap->red[1].co.local.green = 0;
|
||||||
|
pmap->red[1].co.local.blue = 0;
|
||||||
|
return TRUE;
|
||||||
|
case FB_VISUAL_MONO10:
|
||||||
|
pScreen->blackPixel = 0;
|
||||||
|
pScreen->whitePixel = 1;
|
||||||
|
pmap->red[0].co.local.red = 0;
|
||||||
|
pmap->red[0].co.local.green = 0;
|
||||||
|
pmap->red[0].co.local.blue = 0;
|
||||||
|
pmap->red[1].co.local.red = 65535;
|
||||||
|
pmap->red[1].co.local.green = 65535;
|
||||||
|
pmap->red[1].co.local.blue = 65535;
|
||||||
|
return TRUE;
|
||||||
case FB_VISUAL_STATIC_PSEUDOCOLOR:
|
case FB_VISUAL_STATIC_PSEUDOCOLOR:
|
||||||
pVisual = pmap->pVisual;
|
pVisual = pmap->pVisual;
|
||||||
nent = pVisual->ColormapEntries;
|
nent = pVisual->ColormapEntries;
|
||||||
|
|
|
@ -49,7 +49,7 @@ typedef struct _fbdevScrPriv {
|
||||||
} FbdevScrPriv;
|
} FbdevScrPriv;
|
||||||
|
|
||||||
extern KdCardFuncs fbdevFuncs;
|
extern KdCardFuncs fbdevFuncs;
|
||||||
extern char *fbdevDevicePath;
|
extern const char *fbdevDevicePath;
|
||||||
|
|
||||||
Bool
|
Bool
|
||||||
fbdevCardInit(KdCardInfo * card);
|
fbdevCardInit(KdCardInfo * card);
|
||||||
|
|
|
@ -943,7 +943,8 @@ KdInitScreen(ScreenInfo * pScreenInfo,
|
||||||
{
|
{
|
||||||
KdCardInfo *card = screen->card;
|
KdCardInfo *card = screen->card;
|
||||||
|
|
||||||
(*card->cfuncs->scrinit) (screen);
|
if (!(*card->cfuncs->scrinit) (screen))
|
||||||
|
FatalError("Screen initialization failed!\n");
|
||||||
|
|
||||||
if (!card->cfuncs->initAccel)
|
if (!card->cfuncs->initAccel)
|
||||||
screen->dumb = TRUE;
|
screen->dumb = TRUE;
|
||||||
|
|
|
@ -9,7 +9,11 @@ endif
|
||||||
libshadow_la_SOURCES = \
|
libshadow_la_SOURCES = \
|
||||||
shadow.c \
|
shadow.c \
|
||||||
shadow.h \
|
shadow.h \
|
||||||
|
shafb4.c \
|
||||||
|
shafb8.c \
|
||||||
shalloc.c \
|
shalloc.c \
|
||||||
|
shiplan2p4.c \
|
||||||
|
shiplan2p8.c \
|
||||||
shpacked.c \
|
shpacked.c \
|
||||||
shplanar8.c \
|
shplanar8.c \
|
||||||
shplanar.c \
|
shplanar.c \
|
||||||
|
|
184
miext/shadow/c2p_core.h
Normal file
184
miext/shadow/c2p_core.h
Normal file
|
@ -0,0 +1,184 @@
|
||||||
|
/*
|
||||||
|
* Fast C2P (Chunky-to-Planar) Conversion
|
||||||
|
*
|
||||||
|
* Copyright (C) 2003-2008 Geert Uytterhoeven
|
||||||
|
*
|
||||||
|
* NOTES:
|
||||||
|
* - This code was inspired by Scout's C2P tutorial
|
||||||
|
* - It assumes to run on a big endian system
|
||||||
|
*
|
||||||
|
* 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 Geert Uytterhoeven not be used in
|
||||||
|
* advertising or publicity pertaining to distribution of the software without
|
||||||
|
* specific, written prior permission. Geert Uytterhoeven makes no
|
||||||
|
* representations about the suitability of this software for any purpose. It
|
||||||
|
* is provided "as is" without express or implied warranty.
|
||||||
|
*
|
||||||
|
* GEERT UYTTERHOEVEN DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
|
||||||
|
* INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
|
||||||
|
* EVENT SHALL GEERT UYTTERHOEVEN 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.
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Basic transpose step
|
||||||
|
*/
|
||||||
|
|
||||||
|
static inline void _transp(CARD32 d[], unsigned int i1, unsigned int i2,
|
||||||
|
unsigned int shift, CARD32 mask)
|
||||||
|
{
|
||||||
|
CARD32 t = (d[i1] ^ (d[i2] >> shift)) & mask;
|
||||||
|
|
||||||
|
d[i1] ^= t;
|
||||||
|
d[i2] ^= t << shift;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
extern void c2p_unsupported(void);
|
||||||
|
|
||||||
|
static inline CARD32 get_mask(unsigned int n)
|
||||||
|
{
|
||||||
|
switch (n) {
|
||||||
|
case 1:
|
||||||
|
return 0x55555555;
|
||||||
|
|
||||||
|
case 2:
|
||||||
|
return 0x33333333;
|
||||||
|
|
||||||
|
case 4:
|
||||||
|
return 0x0f0f0f0f;
|
||||||
|
|
||||||
|
case 8:
|
||||||
|
return 0x00ff00ff;
|
||||||
|
|
||||||
|
case 16:
|
||||||
|
return 0x0000ffff;
|
||||||
|
}
|
||||||
|
|
||||||
|
c2p_unsupported();
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Transpose operations on 8 32-bit words
|
||||||
|
*/
|
||||||
|
|
||||||
|
static inline void transp8(CARD32 d[], unsigned int n, unsigned int m)
|
||||||
|
{
|
||||||
|
CARD32 mask = get_mask(n);
|
||||||
|
|
||||||
|
switch (m) {
|
||||||
|
case 1:
|
||||||
|
/* First n x 1 block */
|
||||||
|
_transp(d, 0, 1, n, mask);
|
||||||
|
/* Second n x 1 block */
|
||||||
|
_transp(d, 2, 3, n, mask);
|
||||||
|
/* Third n x 1 block */
|
||||||
|
_transp(d, 4, 5, n, mask);
|
||||||
|
/* Fourth n x 1 block */
|
||||||
|
_transp(d, 6, 7, n, mask);
|
||||||
|
return;
|
||||||
|
|
||||||
|
case 2:
|
||||||
|
/* First n x 2 block */
|
||||||
|
_transp(d, 0, 2, n, mask);
|
||||||
|
_transp(d, 1, 3, n, mask);
|
||||||
|
/* Second n x 2 block */
|
||||||
|
_transp(d, 4, 6, n, mask);
|
||||||
|
_transp(d, 5, 7, n, mask);
|
||||||
|
return;
|
||||||
|
|
||||||
|
case 4:
|
||||||
|
/* Single n x 4 block */
|
||||||
|
_transp(d, 0, 4, n, mask);
|
||||||
|
_transp(d, 1, 5, n, mask);
|
||||||
|
_transp(d, 2, 6, n, mask);
|
||||||
|
_transp(d, 3, 7, n, mask);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
c2p_unsupported();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Transpose operations on 4 32-bit words
|
||||||
|
*/
|
||||||
|
|
||||||
|
static inline void transp4(CARD32 d[], unsigned int n, unsigned int m)
|
||||||
|
{
|
||||||
|
CARD32 mask = get_mask(n);
|
||||||
|
|
||||||
|
switch (m) {
|
||||||
|
case 1:
|
||||||
|
/* First n x 1 block */
|
||||||
|
_transp(d, 0, 1, n, mask);
|
||||||
|
/* Second n x 1 block */
|
||||||
|
_transp(d, 2, 3, n, mask);
|
||||||
|
return;
|
||||||
|
|
||||||
|
case 2:
|
||||||
|
/* Single n x 2 block */
|
||||||
|
_transp(d, 0, 2, n, mask);
|
||||||
|
_transp(d, 1, 3, n, mask);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
c2p_unsupported();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Transpose operations on 4 32-bit words (reverse order)
|
||||||
|
*/
|
||||||
|
|
||||||
|
static inline void transp4x(CARD32 d[], unsigned int n, unsigned int m)
|
||||||
|
{
|
||||||
|
CARD32 mask = get_mask(n);
|
||||||
|
|
||||||
|
switch (m) {
|
||||||
|
case 2:
|
||||||
|
/* Single n x 2 block */
|
||||||
|
_transp(d, 2, 0, n, mask);
|
||||||
|
_transp(d, 3, 1, n, mask);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
c2p_unsupported();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Transpose operations on 2 32-bit words
|
||||||
|
*/
|
||||||
|
|
||||||
|
static inline void transp2(CARD32 d[], unsigned int n)
|
||||||
|
{
|
||||||
|
CARD32 mask = get_mask(n);
|
||||||
|
|
||||||
|
/* Single n x 1 block */
|
||||||
|
_transp(d, 0, 1, n, mask);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Transpose operations on 2 32-bit words (reverse order)
|
||||||
|
*/
|
||||||
|
|
||||||
|
static inline void transp2x(CARD32 d[], unsigned int n)
|
||||||
|
{
|
||||||
|
CARD32 mask = get_mask(n);
|
||||||
|
|
||||||
|
/* Single n x 1 block */
|
||||||
|
_transp(d, 1, 0, n, mask);
|
||||||
|
return;
|
||||||
|
}
|
|
@ -95,6 +95,18 @@ shadowInit(ScreenPtr pScreen, ShadowUpdateProc update, ShadowWindowProc window);
|
||||||
|
|
||||||
extern _X_EXPORT void *shadowAlloc(int width, int height, int bpp);
|
extern _X_EXPORT void *shadowAlloc(int width, int height, int bpp);
|
||||||
|
|
||||||
|
extern _X_EXPORT void
|
||||||
|
shadowUpdateAfb4(ScreenPtr pScreen, shadowBufPtr pBuf);
|
||||||
|
|
||||||
|
extern _X_EXPORT void
|
||||||
|
shadowUpdateAfb8(ScreenPtr pScreen, shadowBufPtr pBuf);
|
||||||
|
|
||||||
|
extern _X_EXPORT void
|
||||||
|
shadowUpdateIplan2p4(ScreenPtr pScreen, shadowBufPtr pBuf);
|
||||||
|
|
||||||
|
extern _X_EXPORT void
|
||||||
|
shadowUpdateIplan2p8(ScreenPtr pScreen, shadowBufPtr pBuf);
|
||||||
|
|
||||||
extern _X_EXPORT void
|
extern _X_EXPORT void
|
||||||
shadowUpdatePacked(ScreenPtr pScreen, shadowBufPtr pBuf);
|
shadowUpdatePacked(ScreenPtr pScreen, shadowBufPtr pBuf);
|
||||||
|
|
||||||
|
|
139
miext/shadow/shafb4.c
Normal file
139
miext/shadow/shafb4.c
Normal file
|
@ -0,0 +1,139 @@
|
||||||
|
/*
|
||||||
|
*
|
||||||
|
* Copyright © 2013 Geert Uytterhoeven
|
||||||
|
*
|
||||||
|
* 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 Geert Uytterhoeven not be used in
|
||||||
|
* advertising or publicity pertaining to distribution of the software without
|
||||||
|
* specific, written prior permission. Geert Uytterhoeven makes no
|
||||||
|
* representations about the suitability of this software for any purpose. It
|
||||||
|
* is provided "as is" without express or implied warranty.
|
||||||
|
*
|
||||||
|
* GEERT UYTTERHOEVEN DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
|
||||||
|
* INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
|
||||||
|
* EVENT SHALL GEERT UYTTERHOEVEN 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.
|
||||||
|
*
|
||||||
|
* Based on shpacked.c, which is Copyright © 2000 Keith Packard
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifdef HAVE_DIX_CONFIG_H
|
||||||
|
#include <dix-config.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include <stdlib.h>
|
||||||
|
|
||||||
|
#include <X11/X.h>
|
||||||
|
#include "scrnintstr.h"
|
||||||
|
#include "windowstr.h"
|
||||||
|
#include <X11/fonts/font.h>
|
||||||
|
#include "dixfontstr.h"
|
||||||
|
#include <X11/fonts/fontstruct.h>
|
||||||
|
#include "mi.h"
|
||||||
|
#include "regionstr.h"
|
||||||
|
#include "globals.h"
|
||||||
|
#include "gcstruct.h"
|
||||||
|
#include "shadow.h"
|
||||||
|
#include "fb.h"
|
||||||
|
#include "c2p_core.h"
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Perform a full C2P step on 32 4-bit pixels, stored in 4 32-bit words
|
||||||
|
* containing
|
||||||
|
* - 32 4-bit chunky pixels on input
|
||||||
|
* - permutated planar data (1 plane per 32-bit word) on output
|
||||||
|
*/
|
||||||
|
|
||||||
|
static void c2p_32x4(CARD32 d[4])
|
||||||
|
{
|
||||||
|
transp4(d, 16, 2);
|
||||||
|
transp4(d, 8, 1);
|
||||||
|
transp4(d, 4, 2);
|
||||||
|
transp4(d, 2, 1);
|
||||||
|
transp4(d, 1, 2);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Store a full block of permutated planar data after c2p conversion
|
||||||
|
*/
|
||||||
|
|
||||||
|
static inline void store_afb4(void *dst, unsigned int stride,
|
||||||
|
const CARD32 d[4])
|
||||||
|
{
|
||||||
|
CARD8 *p = dst;
|
||||||
|
|
||||||
|
*(CARD32 *)p = d[3]; p += stride;
|
||||||
|
*(CARD32 *)p = d[1]; p += stride;
|
||||||
|
*(CARD32 *)p = d[2]; p += stride;
|
||||||
|
*(CARD32 *)p = d[0]; p += stride;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void
|
||||||
|
shadowUpdateAfb4(ScreenPtr pScreen, shadowBufPtr pBuf)
|
||||||
|
{
|
||||||
|
RegionPtr damage = shadowDamage(pBuf);
|
||||||
|
PixmapPtr pShadow = pBuf->pPixmap;
|
||||||
|
int nbox = RegionNumRects(damage);
|
||||||
|
BoxPtr pbox = RegionRects(damage);
|
||||||
|
FbBits *shaBase;
|
||||||
|
CARD32 *shaLine, *sha;
|
||||||
|
FbStride shaStride;
|
||||||
|
int scrLine;
|
||||||
|
_X_UNUSED int shaBpp, shaXoff, shaYoff;
|
||||||
|
int x, y, w, h;
|
||||||
|
int i, n;
|
||||||
|
CARD32 *win;
|
||||||
|
CARD32 off, winStride;
|
||||||
|
union {
|
||||||
|
CARD8 bytes[16];
|
||||||
|
CARD32 words[4];
|
||||||
|
} d;
|
||||||
|
|
||||||
|
fbGetDrawable(&pShadow->drawable, shaBase, shaStride, shaBpp, shaXoff,
|
||||||
|
shaYoff);
|
||||||
|
if (sizeof(FbBits) != sizeof(CARD32))
|
||||||
|
shaStride = shaStride * sizeof(FbBits) / sizeof(CARD32);
|
||||||
|
|
||||||
|
while (nbox--) {
|
||||||
|
x = pbox->x1;
|
||||||
|
y = pbox->y1;
|
||||||
|
w = pbox->x2 - pbox->x1;
|
||||||
|
h = pbox->y2 - pbox->y1;
|
||||||
|
|
||||||
|
scrLine = (x & -32) / 2;
|
||||||
|
shaLine = (CARD32 *)shaBase + y * shaStride + scrLine / sizeof(CARD32);
|
||||||
|
|
||||||
|
off = scrLine / 4; /* byte offset in bitplane scanline */
|
||||||
|
n = ((x & 31) + w + 31) / 32; /* number of c2p units in scanline */
|
||||||
|
|
||||||
|
while (h--) {
|
||||||
|
sha = shaLine;
|
||||||
|
win = (CARD32 *) (*pBuf->window) (pScreen,
|
||||||
|
y,
|
||||||
|
off,
|
||||||
|
SHADOW_WINDOW_WRITE,
|
||||||
|
&winStride,
|
||||||
|
pBuf->closure);
|
||||||
|
if (!win)
|
||||||
|
return;
|
||||||
|
for (i = 0; i < n; i++) {
|
||||||
|
memcpy(d.bytes, sha, sizeof(d.bytes));
|
||||||
|
c2p_32x4(d.words);
|
||||||
|
store_afb4(win++, winStride, d.words);
|
||||||
|
sha += sizeof(d.bytes) / sizeof(*sha);
|
||||||
|
}
|
||||||
|
shaLine += shaStride;
|
||||||
|
y++;
|
||||||
|
}
|
||||||
|
pbox++;
|
||||||
|
}
|
||||||
|
}
|
143
miext/shadow/shafb8.c
Normal file
143
miext/shadow/shafb8.c
Normal file
|
@ -0,0 +1,143 @@
|
||||||
|
/*
|
||||||
|
*
|
||||||
|
* Copyright © 2013 Geert Uytterhoeven
|
||||||
|
*
|
||||||
|
* 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 Geert Uytterhoeven not be used in
|
||||||
|
* advertising or publicity pertaining to distribution of the software without
|
||||||
|
* specific, written prior permission. Geert Uytterhoeven makes no
|
||||||
|
* representations about the suitability of this software for any purpose. It
|
||||||
|
* is provided "as is" without express or implied warranty.
|
||||||
|
*
|
||||||
|
* GEERT UYTTERHOEVEN DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
|
||||||
|
* INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
|
||||||
|
* EVENT SHALL GEERT UYTTERHOEVEN 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.
|
||||||
|
*
|
||||||
|
* Based on shpacked.c, which is Copyright © 2000 Keith Packard
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifdef HAVE_DIX_CONFIG_H
|
||||||
|
#include <dix-config.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include <stdlib.h>
|
||||||
|
|
||||||
|
#include <X11/X.h>
|
||||||
|
#include "scrnintstr.h"
|
||||||
|
#include "windowstr.h"
|
||||||
|
#include <X11/fonts/font.h>
|
||||||
|
#include "dixfontstr.h"
|
||||||
|
#include <X11/fonts/fontstruct.h>
|
||||||
|
#include "mi.h"
|
||||||
|
#include "regionstr.h"
|
||||||
|
#include "globals.h"
|
||||||
|
#include "gcstruct.h"
|
||||||
|
#include "shadow.h"
|
||||||
|
#include "fb.h"
|
||||||
|
#include "c2p_core.h"
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Perform a full C2P step on 32 8-bit pixels, stored in 8 32-bit words
|
||||||
|
* containing
|
||||||
|
* - 32 8-bit chunky pixels on input
|
||||||
|
* - permutated planar data (1 plane per 32-bit word) on output
|
||||||
|
*/
|
||||||
|
|
||||||
|
static void c2p_32x8(CARD32 d[8])
|
||||||
|
{
|
||||||
|
transp8(d, 16, 4);
|
||||||
|
transp8(d, 8, 2);
|
||||||
|
transp8(d, 4, 1);
|
||||||
|
transp8(d, 2, 4);
|
||||||
|
transp8(d, 1, 2);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Store a full block of permutated planar data after c2p conversion
|
||||||
|
*/
|
||||||
|
|
||||||
|
static inline void store_afb8(void *dst, unsigned int stride,
|
||||||
|
const CARD32 d[8])
|
||||||
|
{
|
||||||
|
CARD8 *p = dst;
|
||||||
|
|
||||||
|
*(CARD32 *)p = d[7]; p += stride;
|
||||||
|
*(CARD32 *)p = d[5]; p += stride;
|
||||||
|
*(CARD32 *)p = d[3]; p += stride;
|
||||||
|
*(CARD32 *)p = d[1]; p += stride;
|
||||||
|
*(CARD32 *)p = d[6]; p += stride;
|
||||||
|
*(CARD32 *)p = d[4]; p += stride;
|
||||||
|
*(CARD32 *)p = d[2]; p += stride;
|
||||||
|
*(CARD32 *)p = d[0]; p += stride;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void
|
||||||
|
shadowUpdateAfb8(ScreenPtr pScreen, shadowBufPtr pBuf)
|
||||||
|
{
|
||||||
|
RegionPtr damage = shadowDamage(pBuf);
|
||||||
|
PixmapPtr pShadow = pBuf->pPixmap;
|
||||||
|
int nbox = RegionNumRects(damage);
|
||||||
|
BoxPtr pbox = RegionRects(damage);
|
||||||
|
FbBits *shaBase;
|
||||||
|
CARD32 *shaLine, *sha;
|
||||||
|
FbStride shaStride;
|
||||||
|
int scrLine;
|
||||||
|
_X_UNUSED int shaBpp, shaXoff, shaYoff;
|
||||||
|
int x, y, w, h;
|
||||||
|
int i, n;
|
||||||
|
CARD32 *win;
|
||||||
|
CARD32 off, winStride;
|
||||||
|
union {
|
||||||
|
CARD8 bytes[32];
|
||||||
|
CARD32 words[8];
|
||||||
|
} d;
|
||||||
|
|
||||||
|
fbGetDrawable(&pShadow->drawable, shaBase, shaStride, shaBpp, shaXoff,
|
||||||
|
shaYoff);
|
||||||
|
if (sizeof(FbBits) != sizeof(CARD32))
|
||||||
|
shaStride = shaStride * sizeof(FbBits) / sizeof(CARD32);
|
||||||
|
|
||||||
|
while (nbox--) {
|
||||||
|
x = pbox->x1;
|
||||||
|
y = pbox->y1;
|
||||||
|
w = pbox->x2 - pbox->x1;
|
||||||
|
h = pbox->y2 - pbox->y1;
|
||||||
|
|
||||||
|
scrLine = x & -32;
|
||||||
|
shaLine = (CARD32 *)shaBase + y * shaStride + scrLine / sizeof(CARD32);
|
||||||
|
|
||||||
|
off = scrLine / 8; /* byte offset in bitplane scanline */
|
||||||
|
n = ((x & 31) + w + 31) / 32; /* number of c2p units in scanline */
|
||||||
|
|
||||||
|
while (h--) {
|
||||||
|
sha = shaLine;
|
||||||
|
win = (CARD32 *) (*pBuf->window) (pScreen,
|
||||||
|
y,
|
||||||
|
off,
|
||||||
|
SHADOW_WINDOW_WRITE,
|
||||||
|
&winStride,
|
||||||
|
pBuf->closure);
|
||||||
|
if (!win)
|
||||||
|
return;
|
||||||
|
for (i = 0; i < n; i++) {
|
||||||
|
memcpy(d.bytes, sha, sizeof(d.bytes));
|
||||||
|
c2p_32x8(d.words);
|
||||||
|
store_afb8(win++, winStride, d.words);
|
||||||
|
sha += sizeof(d.bytes) / sizeof(*sha);
|
||||||
|
}
|
||||||
|
shaLine += shaStride;
|
||||||
|
y++;
|
||||||
|
}
|
||||||
|
pbox++;
|
||||||
|
}
|
||||||
|
}
|
136
miext/shadow/shiplan2p4.c
Normal file
136
miext/shadow/shiplan2p4.c
Normal file
|
@ -0,0 +1,136 @@
|
||||||
|
/*
|
||||||
|
*
|
||||||
|
* Copyright © 2013 Geert Uytterhoeven
|
||||||
|
*
|
||||||
|
* 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 Geert Uytterhoeven not be used in
|
||||||
|
* advertising or publicity pertaining to distribution of the software without
|
||||||
|
* specific, written prior permission. Geert Uytterhoeven makes no
|
||||||
|
* representations about the suitability of this software for any purpose. It
|
||||||
|
* is provided "as is" without express or implied warranty.
|
||||||
|
*
|
||||||
|
* GEERT UYTTERHOEVEN DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
|
||||||
|
* INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
|
||||||
|
* EVENT SHALL GEERT UYTTERHOEVEN 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.
|
||||||
|
*
|
||||||
|
* Based on shpacked.c, which is Copyright © 2000 Keith Packard
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifdef HAVE_DIX_CONFIG_H
|
||||||
|
#include <dix-config.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include <stdlib.h>
|
||||||
|
|
||||||
|
#include <X11/X.h>
|
||||||
|
#include "scrnintstr.h"
|
||||||
|
#include "windowstr.h"
|
||||||
|
#include <X11/fonts/font.h>
|
||||||
|
#include "dixfontstr.h"
|
||||||
|
#include <X11/fonts/fontstruct.h>
|
||||||
|
#include "mi.h"
|
||||||
|
#include "regionstr.h"
|
||||||
|
#include "globals.h"
|
||||||
|
#include "gcstruct.h"
|
||||||
|
#include "shadow.h"
|
||||||
|
#include "fb.h"
|
||||||
|
#include "c2p_core.h"
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Perform a full C2P step on 16 4-bit pixels, stored in 2 32-bit words
|
||||||
|
* containing
|
||||||
|
* - 16 4-bit chunky pixels on input
|
||||||
|
* - permutated planar data (2 planes per 32-bit word) on output
|
||||||
|
*/
|
||||||
|
|
||||||
|
static void c2p_16x4(CARD32 d[2])
|
||||||
|
{
|
||||||
|
transp2(d, 8);
|
||||||
|
transp2(d, 2);
|
||||||
|
transp2x(d, 1);
|
||||||
|
transp2(d, 16);
|
||||||
|
transp2(d, 4);
|
||||||
|
transp2(d, 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Store a full block of iplan2p4 data after c2p conversion
|
||||||
|
*/
|
||||||
|
|
||||||
|
static inline void store_iplan2p4(void *dst, const CARD32 d[2])
|
||||||
|
{
|
||||||
|
CARD32 *p = dst;
|
||||||
|
|
||||||
|
*p++ = d[0];
|
||||||
|
*p++ = d[1];
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void
|
||||||
|
shadowUpdateIplan2p4(ScreenPtr pScreen, shadowBufPtr pBuf)
|
||||||
|
{
|
||||||
|
RegionPtr damage = shadowDamage(pBuf);
|
||||||
|
PixmapPtr pShadow = pBuf->pPixmap;
|
||||||
|
int nbox = RegionNumRects(damage);
|
||||||
|
BoxPtr pbox = RegionRects(damage);
|
||||||
|
FbBits *shaBase;
|
||||||
|
CARD16 *shaLine, *sha;
|
||||||
|
FbStride shaStride;
|
||||||
|
int scrLine;
|
||||||
|
_X_UNUSED int shaBpp, shaXoff, shaYoff;
|
||||||
|
int x, y, w, h;
|
||||||
|
int i, n;
|
||||||
|
CARD16 *win;
|
||||||
|
_X_UNUSED CARD32 winSize;
|
||||||
|
union {
|
||||||
|
CARD8 bytes[8];
|
||||||
|
CARD32 words[2];
|
||||||
|
} d;
|
||||||
|
|
||||||
|
fbGetDrawable(&pShadow->drawable, shaBase, shaStride, shaBpp, shaXoff,
|
||||||
|
shaYoff);
|
||||||
|
shaStride *= sizeof(FbBits) / sizeof(CARD16);
|
||||||
|
|
||||||
|
while (nbox--) {
|
||||||
|
x = pbox->x1;
|
||||||
|
y = pbox->y1;
|
||||||
|
w = pbox->x2 - pbox->x1;
|
||||||
|
h = pbox->y2 - pbox->y1;
|
||||||
|
|
||||||
|
scrLine = (x & -16) / 2;
|
||||||
|
shaLine = (CARD16 *)shaBase + y * shaStride + scrLine / sizeof(CARD16);
|
||||||
|
|
||||||
|
n = ((x & 15) + w + 15) / 16; /* number of c2p units in scanline */
|
||||||
|
|
||||||
|
while (h--) {
|
||||||
|
sha = shaLine;
|
||||||
|
win = (CARD16 *) (*pBuf->window) (pScreen,
|
||||||
|
y,
|
||||||
|
scrLine,
|
||||||
|
SHADOW_WINDOW_WRITE,
|
||||||
|
&winSize,
|
||||||
|
pBuf->closure);
|
||||||
|
if (!win)
|
||||||
|
return;
|
||||||
|
for (i = 0; i < n; i++) {
|
||||||
|
memcpy(d.bytes, sha, sizeof(d.bytes));
|
||||||
|
c2p_16x4(d.words);
|
||||||
|
store_iplan2p4(win, d.words);
|
||||||
|
sha += sizeof(d.bytes) / sizeof(*sha);
|
||||||
|
win += sizeof(d.bytes) / sizeof(*win);
|
||||||
|
}
|
||||||
|
shaLine += shaStride;
|
||||||
|
y++;
|
||||||
|
}
|
||||||
|
pbox++;
|
||||||
|
}
|
||||||
|
}
|
137
miext/shadow/shiplan2p8.c
Normal file
137
miext/shadow/shiplan2p8.c
Normal file
|
@ -0,0 +1,137 @@
|
||||||
|
/*
|
||||||
|
*
|
||||||
|
* Copyright © 2013 Geert Uytterhoeven
|
||||||
|
*
|
||||||
|
* 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 Geert Uytterhoeven not be used in
|
||||||
|
* advertising or publicity pertaining to distribution of the software without
|
||||||
|
* specific, written prior permission. Geert Uytterhoeven makes no
|
||||||
|
* representations about the suitability of this software for any purpose. It
|
||||||
|
* is provided "as is" without express or implied warranty.
|
||||||
|
*
|
||||||
|
* GEERT UYTTERHOEVEN DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
|
||||||
|
* INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
|
||||||
|
* EVENT SHALL GEERT UYTTERHOEVEN 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.
|
||||||
|
*
|
||||||
|
* Based on shpacked.c, which is Copyright © 2000 Keith Packard
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifdef HAVE_DIX_CONFIG_H
|
||||||
|
#include <dix-config.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include <stdlib.h>
|
||||||
|
|
||||||
|
#include <X11/X.h>
|
||||||
|
#include "scrnintstr.h"
|
||||||
|
#include "windowstr.h"
|
||||||
|
#include <X11/fonts/font.h>
|
||||||
|
#include "dixfontstr.h"
|
||||||
|
#include <X11/fonts/fontstruct.h>
|
||||||
|
#include "mi.h"
|
||||||
|
#include "regionstr.h"
|
||||||
|
#include "globals.h"
|
||||||
|
#include "gcstruct.h"
|
||||||
|
#include "shadow.h"
|
||||||
|
#include "fb.h"
|
||||||
|
#include "c2p_core.h"
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Perform a full C2P step on 16 8-bit pixels, stored in 4 32-bit words
|
||||||
|
* containing
|
||||||
|
* - 16 8-bit chunky pixels on input
|
||||||
|
* - permutated planar data (2 planes per 32-bit word) on output
|
||||||
|
*/
|
||||||
|
|
||||||
|
static void c2p_16x8(CARD32 d[4])
|
||||||
|
{
|
||||||
|
transp4(d, 8, 2);
|
||||||
|
transp4(d, 1, 2);
|
||||||
|
transp4x(d, 16, 2);
|
||||||
|
transp4x(d, 2, 2);
|
||||||
|
transp4(d, 4, 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Store a full block of permutated iplan2p8 data after c2p conversion
|
||||||
|
*/
|
||||||
|
|
||||||
|
static inline void store_iplan2p8(void *dst, const CARD32 d[4])
|
||||||
|
{
|
||||||
|
CARD32 *p = dst;
|
||||||
|
|
||||||
|
*p++ = d[1];
|
||||||
|
*p++ = d[3];
|
||||||
|
*p++ = d[0];
|
||||||
|
*p++ = d[2];
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void
|
||||||
|
shadowUpdateIplan2p8(ScreenPtr pScreen, shadowBufPtr pBuf)
|
||||||
|
{
|
||||||
|
RegionPtr damage = shadowDamage(pBuf);
|
||||||
|
PixmapPtr pShadow = pBuf->pPixmap;
|
||||||
|
int nbox = RegionNumRects(damage);
|
||||||
|
BoxPtr pbox = RegionRects(damage);
|
||||||
|
FbBits *shaBase;
|
||||||
|
CARD16 *shaLine, *sha;
|
||||||
|
FbStride shaStride;
|
||||||
|
int scrLine;
|
||||||
|
_X_UNUSED int shaBpp, shaXoff, shaYoff;
|
||||||
|
int x, y, w, h;
|
||||||
|
int i, n;
|
||||||
|
CARD16 *win;
|
||||||
|
_X_UNUSED CARD32 winSize;
|
||||||
|
union {
|
||||||
|
CARD8 bytes[16];
|
||||||
|
CARD32 words[4];
|
||||||
|
} d;
|
||||||
|
|
||||||
|
fbGetDrawable(&pShadow->drawable, shaBase, shaStride, shaBpp, shaXoff,
|
||||||
|
shaYoff);
|
||||||
|
shaStride *= sizeof(FbBits) / sizeof(CARD16);
|
||||||
|
|
||||||
|
while (nbox--) {
|
||||||
|
x = pbox->x1;
|
||||||
|
y = pbox->y1;
|
||||||
|
w = pbox->x2 - pbox->x1;
|
||||||
|
h = pbox->y2 - pbox->y1;
|
||||||
|
|
||||||
|
scrLine = x & -16;
|
||||||
|
shaLine = (CARD16 *)shaBase + y * shaStride + scrLine / sizeof(CARD16);
|
||||||
|
|
||||||
|
n = ((x & 15) + w + 15) / 16; /* number of c2p units in scanline */
|
||||||
|
|
||||||
|
while (h--) {
|
||||||
|
sha = shaLine;
|
||||||
|
win = (CARD16 *) (*pBuf->window) (pScreen,
|
||||||
|
y,
|
||||||
|
scrLine,
|
||||||
|
SHADOW_WINDOW_WRITE,
|
||||||
|
&winSize,
|
||||||
|
pBuf->closure);
|
||||||
|
if (!win)
|
||||||
|
return;
|
||||||
|
for (i = 0; i < n; i++) {
|
||||||
|
memcpy(d.bytes, sha, sizeof(d.bytes));
|
||||||
|
c2p_16x8(d.words);
|
||||||
|
store_iplan2p8(win, d.words);
|
||||||
|
sha += sizeof(d.bytes) / sizeof(*sha);
|
||||||
|
win += sizeof(d.bytes) / sizeof(*win);
|
||||||
|
}
|
||||||
|
shaLine += shaStride;
|
||||||
|
y++;
|
||||||
|
}
|
||||||
|
pbox++;
|
||||||
|
}
|
||||||
|
}
|
|
@ -98,7 +98,6 @@ shadowUpdatePacked(ScreenPtr pScreen, shadowBufPtr pBuf)
|
||||||
i = width;
|
i = width;
|
||||||
width -= i;
|
width -= i;
|
||||||
scr += i;
|
scr += i;
|
||||||
#define PickBit(a,i) (((a) >> (i)) & 1)
|
|
||||||
memcpy(win, sha, i * sizeof(FbBits));
|
memcpy(win, sha, i * sizeof(FbBits));
|
||||||
sha += i;
|
sha += i;
|
||||||
}
|
}
|
||||||
|
|
|
@ -1384,7 +1384,7 @@ dix_valuator_alloc(void)
|
||||||
|
|
||||||
assert(v);
|
assert(v);
|
||||||
assert(v->numAxes == num_axes);
|
assert(v->numAxes == num_axes);
|
||||||
#if !defined(__i386__) && !defined(__sh__)
|
#if !defined(__i386__) && !defined(__m68k__) && !defined(__sh__)
|
||||||
/* must be double-aligned on 64 bit */
|
/* must be double-aligned on 64 bit */
|
||||||
assert(((void *) v->axisVal - (void *) v) % sizeof(double) == 0);
|
assert(((void *) v->axisVal - (void *) v) % sizeof(double) == 0);
|
||||||
assert(((void *) v->axes - (void *) v) % sizeof(double) == 0);
|
assert(((void *) v->axes - (void *) v) % sizeof(double) == 0);
|
||||||
|
|
Loading…
Reference in New Issue
Block a user