2
* $XFree86: xc/programs/Xserver/miext/shadow/shplanar.c,v 1.3 2001/05/29 04:54:13 keithp Exp $
4
* Copyright © 2000 Keith Packard
6
* Permission to use, copy, modify, distribute, and sell this software and its
7
* documentation for any purpose is hereby granted without fee, provided that
8
* the above copyright notice appear in all copies and that both that
9
* copyright notice and this permission notice appear in supporting
10
* documentation, and that the name of Keith Packard not be used in
11
* advertising or publicity pertaining to distribution of the software without
12
* specific, written prior permission. Keith Packard makes no
13
* representations about the suitability of this software for any purpose. It
14
* is provided "as is" without express or implied warranty.
16
* KEITH PACKARD DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
17
* INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
18
* EVENT SHALL KEITH PACKARD BE LIABLE FOR ANY SPECIAL, INDIRECT OR
19
* CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
20
* DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
21
* TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
22
* PERFORMANCE OF THIS SOFTWARE.
25
#ifdef HAVE_DIX_CONFIG_H
26
#include <dix-config.h>
30
#include "scrnintstr.h"
31
#include "windowstr.h"
32
#include <X11/fonts/font.h>
33
#include "dixfontstr.h"
34
#include <X11/fonts/fontstruct.h>
36
#include "regionstr.h"
43
* 32 4-bit pixels per write
47
#define PL_UNIT (1 << PL_SHIFT)
48
#define PL_MASK (PL_UNIT - 1)
56
* 3 3 2 2 2 2 2 2 2 2 2 2 1 1 1 1 1 1 1 1 1 1
57
* 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0
58
* m . . . H . . . G . . . F . . . E . . . D . . . C . . . B . . . A
59
* m1 G . . . F . . . E . . . D . . . C . . . B . . . A . . . . . . . m << (7 - (p))
60
* m2 . H . . . G . . . F . . . E . . . D . . . C . . . B . . . A . . (m >> (p)) << 2
61
* m3 G E C A m1 & 0x80808080
62
* m4 H F D B m2 & 0x40404040
63
* m5 G H E F C D A B m3 | m4
64
* m6 G H E F C D G H A B E F m5 | (m5 >> 20)
65
* m7 G H E F C D G H A B C D E F G H m6 | (m6 >> 10)
69
#define GetBits(p,o,d) {\
71
m1 = m << (7 - (p)); \
72
m2 = (m >> (p)) << 2; \
73
m3 = m1 & 0x80808080; \
74
m4 = m2 & 0x40404040; \
76
m6 = m5 | (m5 >> 20); \
77
d = m6 | (m6 >> 10); \
80
#define GetBits(p,o,d) {\
82
m5 = ((m << (7 - (p))) & 0x80808080) | (((m >> (p)) << 2) & 0x40404040); \
83
m6 = m5 | (m5 >> 20); \
84
d = m6 | (m6 >> 10); \
89
shadowUpdatePlanar4 (ScreenPtr pScreen,
92
RegionPtr damage = &pBuf->damage;
93
PixmapPtr pShadow = pBuf->pPixmap;
94
int nbox = REGION_NUM_RECTS (damage);
95
BoxPtr pbox = REGION_RECTS (damage);
96
CARD32 *shaBase, *shaLine, *sha;
98
int scrBase, scrLine, scr;
100
int shaXoff, shaYoff; /* XXX assumed to be zero */
101
int x, y, w, h, width;
103
CARD32 *winBase = NULL, *win;
107
CARD8 s1, s2, s3, s4;
109
fbGetStipDrawable (&pShadow->drawable, shaBase, shaStride, shaBpp, shaXoff, shaYoff);
112
x = (pbox->x1) * shaBpp;
114
w = (pbox->x2 - pbox->x1) * shaBpp;
115
h = pbox->y2 - pbox->y1;
117
w = (w + (x & PL_MASK) + PL_MASK) >> PL_SHIFT;
120
scrLine = (x >> PL_SHIFT);
121
shaLine = shaBase + y * shaStride + (x >> FB_SHIFT);
125
for (plane = 0; plane < 4; plane++)
133
/* how much remains in this window */
134
i = scrBase + winSize - scr;
135
if (i <= 0 || scr < scrBase)
137
winBase = (CARD32 *) (*pBuf->window) (pScreen,
139
(scr << 4) | (plane),
149
win = winBase + (scr - scrBase);
161
*win++ = s1 | (s2 << 8) | (s3 << 16) | (s4 << 24);
166
shaLine += shaStride;
173
shadowUpdateProc shadowUpdatePlanar4Weak(void) {
174
return shadowUpdatePlanar4;
177
shadowUpdateProc shadowUpdatePlanar4x8Weak(void) {
178
return shadowUpdatePlanar4x8;