]> git.sesse.net Git - rdpsrv/blob - Xserver/programs/Xserver/mfb/mfbpntarea.c
Support RDP5 logon packets.
[rdpsrv] / Xserver / programs / Xserver / mfb / mfbpntarea.c
1 /* Combined Purdue/PurduePlus patches, level 2.0, 1/17/89 */
2 /***********************************************************
3
4 Copyright (c) 1987  X Consortium
5
6 Permission is hereby granted, free of charge, to any person obtaining a copy
7 of this software and associated documentation files (the "Software"), to deal
8 in the Software without restriction, including without limitation the rights
9 to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
10 copies of the Software, and to permit persons to whom the Software is
11 furnished to do so, subject to the following conditions:
12
13 The above copyright notice and this permission notice shall be included in
14 all copies or substantial portions of the Software.
15
16 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17 IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18 FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL THE
19 X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
20 AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
21 CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
22
23 Except as contained in this notice, the name of the X Consortium shall not be
24 used in advertising or otherwise to promote the sale, use or other dealings
25 in this Software without prior written authorization from the X Consortium.
26
27
28 Copyright 1987 by Digital Equipment Corporation, Maynard, Massachusetts.
29
30                         All Rights Reserved
31
32 Permission to use, copy, modify, and distribute this software and its 
33 documentation for any purpose and without fee is hereby granted, 
34 provided that the above copyright notice appear in all copies and that
35 both that copyright notice and this permission notice appear in 
36 supporting documentation, and that the name of Digital not be
37 used in advertising or publicity pertaining to distribution of the
38 software without specific, written prior permission.  
39
40 DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
41 ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL
42 DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
43 ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
44 WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
45 ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
46 SOFTWARE.
47
48 ******************************************************************/
49 /* $XConsortium: mfbpntarea.c,v 5.7 94/04/17 20:28:29 dpw Exp $ */
50 #include "X.h"
51
52 #include "windowstr.h"
53 #include "regionstr.h"
54 #include "pixmapstr.h"
55 #include "scrnintstr.h"
56
57 #include "mfb.h"
58 #include "maskbits.h"
59
60 /* 
61    the solid fillers are called for rectangles and window backgrounds.
62    the boxes are already translated.
63    maybe this should always take a pixmap instead of a drawable?
64
65    NOTE:
66    iy = ++iy < tileHeight ? iy : 0
67 is equivalent to iy%= tileheight, and saves a division.
68 */
69
70 /*
71         MFBSOLIDFILLAREA        OPEQ    EQWHOLEOWRD
72         mfbSolidWhiteArea       |=      = ~0
73         mfbSolidBlackArea       &=~     = 0
74         mfbSolidInvertArea      ^=      ^= ~0
75
76 EQWHOLEWORD is used to write whole longwords.  it could use OPEQ,
77 but *p++ |= ~0 on at least two compilers generates much
78 worse code than *p++ = ~0.  similarly for *p++ &= ~~0
79 and *p++ = 0.
80
81 */
82
83 /*ARGSUSED*/
84 void
85 MFBSOLIDFILLAREA(pDraw, nbox, pbox, alu, nop)
86     DrawablePtr pDraw;
87     int nbox;
88     BoxPtr pbox;
89     int alu;
90     PixmapPtr nop;
91 {
92     int nlwidth;        /* width in longwords of the drawable */
93     int w;              /* width of current box */
94     register int h;     /* height of current box */
95     register PixelType *p;      /* pointer to bits we're writing */
96     register int nlw;   /* loop version of nlwMiddle */
97     register PixelType startmask;
98     register PixelType endmask;/* masks for reggedy bits at either end of line */
99     register int nlwExtra;      
100                         /* to get from right of box to left of next span */
101     int nlwMiddle;      /* number of longwords between sides of boxes */
102     PixelType *pbits;   /* pointer to start of drawable */
103
104     mfbGetPixelWidthAndPointer(pDraw, nlwidth, pbits);
105
106     while (nbox--)
107     {
108         w = pbox->x2 - pbox->x1;
109         h = pbox->y2 - pbox->y1;
110         p = mfbScanline(pbits, pbox->x1, pbox->y1, nlwidth);
111
112         if ( ((pbox->x1 & PIM) + w) < PPW)
113         {
114             maskpartialbits(pbox->x1, w, startmask);
115             nlwExtra = nlwidth;
116             Duff(h, *p OPEQ startmask; mfbScanlineInc(p, nlwExtra));
117         }
118         else
119         {
120             maskbits(pbox->x1, w, startmask, endmask, nlwMiddle);
121             nlwExtra = nlwidth - nlwMiddle;
122
123             if (startmask && endmask)
124             {
125                 nlwExtra -= 1;
126                 while (h--)
127                 {
128                     nlw = nlwMiddle;
129                     *p OPEQ startmask;
130                     p++;
131                     Duff(nlw, *p++ EQWHOLEWORD);
132                     *p OPEQ endmask;
133                     mfbScanlineInc(p, nlwExtra);
134                 }
135             }
136             else if (startmask && !endmask)
137             {
138                 nlwExtra -= 1;
139                 while (h--)
140                 {
141                     nlw = nlwMiddle;
142                     *p OPEQ startmask;
143                     p++;
144                     Duff(nlw, *p++ EQWHOLEWORD);
145                     mfbScanlineInc(p, nlwExtra);
146                 }
147             }
148             else if (!startmask && endmask)
149             {
150                 while (h--)
151                 {
152                     nlw = nlwMiddle;
153                     Duff(nlw, *p++ EQWHOLEWORD);
154                     *p OPEQ endmask;
155                     mfbScanlineInc(p, nlwExtra);
156                 }
157             }
158             else /* no ragged bits at either end */
159             {
160                 while (h--)
161                 {
162                     nlw = nlwMiddle;
163                     Duff(nlw, *p++ EQWHOLEWORD);
164                     mfbScanlineInc(p, nlwExtra);
165                 }
166             }
167         }
168         pbox++;
169     }
170 }
171
172
173
174 /* stipple a list of boxes
175
176 you can use the reduced rasterop for stipples.  if rrop is
177 black, AND the destination with (not stipple pattern).  if rrop is
178 white OR the destination with the stipple pattern.  if rrop is invert,
179 XOR the destination with the stipple pattern.
180
181         MFBSTIPPLEFILLAREA      OPEQ
182         mfbStippleWhiteArea     |=
183         mfbStippleBlackArea     &=~
184         mfbStippleInveryArea    ^=
185 */
186
187 /*ARGSUSED*/
188 void
189 MFBSTIPPLEFILLAREA(pDraw, nbox, pbox, alu, pstipple)
190     DrawablePtr pDraw;
191     int nbox;
192     BoxPtr pbox;
193     int alu;
194     PixmapPtr pstipple;
195 {
196     register PixelType *psrc;
197                         /* pointer to bits in tile, if needed */
198     int tileHeight;     /* height of the tile */
199     register PixelType srcpix;  
200
201     int nlwidth;        /* width in longwords of the drawable */
202     int w;              /* width of current box */
203     register int nlw;   /* loop version of nlwMiddle */
204     register PixelType *p;      /* pointer to bits we're writing */
205     register int h;     /* height of current box */
206     PixelType startmask;
207     PixelType endmask;  /* masks for reggedy bits at either end of line */
208     int nlwMiddle;      /* number of longwords between sides of boxes */
209     int nlwExtra;       /* to get from right of box to left of next span */
210     register int iy;    /* index of current scanline in tile */
211     PixelType *pbits;   /* pointer to start of drawable */
212
213     mfbGetPixelWidthAndPointer(pDraw, nlwidth, pbits);
214
215     tileHeight = pstipple->drawable.height;
216     psrc = (PixelType *)(pstipple->devPrivate.ptr);
217
218     while (nbox--)
219     {
220         w = pbox->x2 - pbox->x1;
221         h = pbox->y2 - pbox->y1;
222         iy = pbox->y1 % tileHeight;
223         p = mfbScanline(pbits, pbox->x1, pbox->y1, nlwidth);
224
225         if ( ((pbox->x1 & PIM) + w) < PPW)
226         {
227             maskpartialbits(pbox->x1, w, startmask);
228             nlwExtra = nlwidth;
229             while (h--)
230             {
231                 srcpix = psrc[iy];
232                 iy = ++iy < tileHeight ? iy : 0;
233                 *p OPEQ (srcpix & startmask);
234                 mfbScanlineInc(p, nlwExtra);
235             }
236         }
237         else
238         {
239             maskbits(pbox->x1, w, startmask, endmask, nlwMiddle);
240             nlwExtra = nlwidth - nlwMiddle;
241
242             if (startmask && endmask)
243             {
244                 nlwExtra -= 1;
245                 while (h--)
246                 {
247                     srcpix = psrc[iy];
248                     iy = ++iy < tileHeight ? iy : 0;
249                     nlw = nlwMiddle;
250                     *p OPEQ (srcpix & startmask);
251                     p++;
252                     Duff (nlw, *p++ OPEQ srcpix);
253                     *p OPEQ (srcpix & endmask);
254                     mfbScanlineInc(p, nlwExtra);
255                 }
256             }
257             else if (startmask && !endmask)
258             {
259                 nlwExtra -= 1;
260                 while (h--)
261                 {
262                     srcpix = psrc[iy];
263                     iy = ++iy < tileHeight ? iy : 0;
264                     nlw = nlwMiddle;
265                     *p OPEQ (srcpix & startmask);
266                     p++;
267                     Duff(nlw, *p++ OPEQ srcpix);
268                     mfbScanlineInc(p, nlwExtra);
269                 }
270             }
271             else if (!startmask && endmask)
272             {
273                 while (h--)
274                 {
275                     srcpix = psrc[iy];
276                     iy = ++iy < tileHeight ? iy : 0;
277                     nlw = nlwMiddle;
278                     Duff(nlw, *p++ OPEQ srcpix);
279                     *p OPEQ (srcpix & endmask);
280                     mfbScanlineInc(p, nlwExtra);
281                 }
282             }
283             else /* no ragged bits at either end */
284             {
285                 while (h--)
286                 {
287                     srcpix = psrc[iy];
288                     iy = ++iy < tileHeight ? iy : 0;
289                     nlw = nlwMiddle;
290                     Duff(nlw, *p++ OPEQ srcpix);
291                     mfbScanlineInc(p, nlwExtra);
292                 }
293             }
294         }
295         pbox++;
296     }
297 }