fbsolid.c revision 35c4bbdf
1/*
2 * Copyright © 1998 Keith Packard
3 *
4 * Permission to use, copy, modify, distribute, and sell this software and its
5 * documentation for any purpose is hereby granted without fee, provided that
6 * the above copyright notice appear in all copies and that both that
7 * copyright notice and this permission notice appear in supporting
8 * documentation, and that the name of Keith Packard not be used in
9 * advertising or publicity pertaining to distribution of the software without
10 * specific, written prior permission.  Keith Packard makes no
11 * representations about the suitability of this software for any purpose.  It
12 * is provided "as is" without express or implied warranty.
13 *
14 * KEITH PACKARD DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
15 * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
16 * EVENT SHALL KEITH PACKARD BE LIABLE FOR ANY SPECIAL, INDIRECT OR
17 * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
18 * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
19 * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
20 * PERFORMANCE OF THIS SOFTWARE.
21 */
22
23#define FbSelectPart(xor,o,t)    xor
24
25#ifdef HAVE_DIX_CONFIG_H
26#include <dix-config.h>
27#endif
28
29#include "fb.h"
30
31void
32fbSolid(FbBits * dst,
33        FbStride dstStride,
34        int dstX, int bpp, int width, int height, FbBits and, FbBits xor)
35{
36    FbBits startmask, endmask;
37    int n, nmiddle;
38    int startbyte, endbyte;
39
40    if (bpp == 24 && (!FbCheck24Pix(and) || !FbCheck24Pix(xor))) {
41        fbSolid24(dst, dstStride, dstX, width, height, and, xor);
42        return;
43    }
44    dst += dstX >> FB_SHIFT;
45    dstX &= FB_MASK;
46    FbMaskBitsBytes(dstX, width, and == 0, startmask, startbyte,
47                    nmiddle, endmask, endbyte);
48    if (startmask)
49        dstStride--;
50    dstStride -= nmiddle;
51    while (height--) {
52        if (startmask) {
53            FbDoLeftMaskByteRRop(dst, startbyte, startmask, and, xor);
54            dst++;
55        }
56        n = nmiddle;
57        if (!and)
58            while (n--)
59                WRITE(dst++, xor);
60        else
61            while (n--) {
62                WRITE(dst, FbDoRRop(READ(dst), and, xor));
63                dst++;
64            }
65        if (endmask)
66            FbDoRightMaskByteRRop(dst, endbyte, endmask, and, xor);
67        dst += dstStride;
68    }
69}
70
71void
72fbSolid24(FbBits * dst,
73          FbStride dstStride,
74          int dstX, int width, int height, FbBits and, FbBits xor)
75{
76    FbBits startmask, endmask;
77    FbBits xor0 = 0, xor1 = 0, xor2 = 0;
78    FbBits and0 = 0, and1 = 0, and2 = 0;
79    FbBits xorS = 0, andS = 0, xorE = 0, andE = 0;
80    int n, nmiddle;
81    int rotS, rot;
82
83    dst += dstX >> FB_SHIFT;
84    dstX &= FB_MASK;
85    /*
86     * Rotate pixel values this far across the word to align on
87     * screen pixel boundaries
88     */
89    rot = FbFirst24Rot(dstX);
90    FbMaskBits(dstX, width, startmask, nmiddle, endmask);
91    if (startmask)
92        dstStride--;
93    dstStride -= nmiddle;
94
95    /*
96     * Precompute rotated versions of the rasterop values
97     */
98    rotS = rot;
99    xor = FbRot24(xor, rotS);
100    and = FbRot24(and, rotS);
101    if (startmask) {
102        xorS = xor;
103        andS = and;
104        xor = FbNext24Pix(xor);
105        and = FbNext24Pix(and);
106    }
107
108    if (nmiddle) {
109        xor0 = xor;
110        and0 = and;
111        xor1 = FbNext24Pix(xor0);
112        and1 = FbNext24Pix(and0);
113        xor2 = FbNext24Pix(xor1);
114        and2 = FbNext24Pix(and1);
115    }
116
117    if (endmask) {
118        switch (nmiddle % 3) {
119        case 0:
120            xorE = xor;
121            andE = and;
122            break;
123        case 1:
124            xorE = xor1;
125            andE = and1;
126            break;
127        case 2:
128            xorE = xor2;
129            andE = and2;
130            break;
131        }
132    }
133
134    while (height--) {
135        if (startmask) {
136            WRITE(dst, FbDoMaskRRop(READ(dst), andS, xorS, startmask));
137            dst++;
138        }
139        n = nmiddle;
140        if (!and0) {
141            while (n >= 3) {
142                WRITE(dst++, xor0);
143                WRITE(dst++, xor1);
144                WRITE(dst++, xor2);
145                n -= 3;
146            }
147            if (n) {
148                WRITE(dst++, xor0);
149                n--;
150                if (n) {
151                    WRITE(dst++, xor1);
152                }
153            }
154        }
155        else {
156            while (n >= 3) {
157                WRITE(dst, FbDoRRop(READ(dst), and0, xor0));
158                dst++;
159                WRITE(dst, FbDoRRop(READ(dst), and1, xor1));
160                dst++;
161                WRITE(dst, FbDoRRop(READ(dst), and2, xor2));
162                dst++;
163                n -= 3;
164            }
165            if (n) {
166                WRITE(dst, FbDoRRop(READ(dst), and0, xor0));
167                dst++;
168                n--;
169                if (n) {
170                    WRITE(dst, FbDoRRop(READ(dst), and1, xor1));
171                    dst++;
172                }
173            }
174        }
175        if (endmask)
176            WRITE(dst, FbDoMaskRRop(READ(dst), andE, xorE, endmask));
177        dst += dstStride;
178    }
179}
180