2
* $Xorg: cfbsolid.c,v 1.4 2001/02/09 02:04:38 xorgcvs Exp $
4
Copyright 1990, 1998 The Open Group
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
12
The above copyright notice and this permission notice shall be included in
13
all copies or substantial portions of the Software.
15
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
OPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
19
AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
20
CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
22
Except as contained in this notice, the name of The Open Group shall not be
23
used in advertising or otherwise to promote the sale, use or other dealings
24
in this Software without prior written authorization from The Open Group.
26
* Author: Keith Packard, MIT X Consortium
28
/* $XFree86: xc/programs/Xserver/cfb/cfbsolid.c,v 3.8tsi Exp $ */
31
#ifdef HAVE_DIX_CONFIG_H
32
#include <dix-config.h>
40
#include "pixmapstr.h"
41
#include "scrnintstr.h"
42
#include "windowstr.h"
45
#include "cfbmskbits.h"
51
#if defined(FAST_CONSTANT_OFFSET_MODE) && (RROP != GXcopy)
52
# define Expand(left,right,leftAdjust) {\
53
int part = nmiddle & 3; \
55
widthStep = widthDst - nmiddle - leftAdjust; \
62
RROP_UNROLL_CASE3(pdst) \
67
RROP_UNROLL_LOOP4(pdst,-4) \
76
# define Expand(left,right,leftAdjust) {\
77
int part = nmiddle & RROP_UNROLL_MASK; \
79
widthStep = widthDst - nmiddle - leftAdjust; \
80
nmiddle >>= RROP_UNROLL_SHIFT; \
86
RROP_UNROLL_CASE(pdst) \
90
pdst += RROP_UNROLL; \
91
RROP_UNROLL_LOOP(pdst) \
100
# define Expand(left, right, leftAdjust) { \
110
pdstRect += widthDst; \
118
RROP_NAME(cfbFillRectSolid) (pDrawable, pGC, nBox, pBox)
119
DrawablePtr pDrawable;
125
register CfbBits *pdst;
127
CfbBits *pdstBase, *pdstRect;
133
int leftIndex, rightIndex;
135
register CfbBits leftMask, rightMask;
138
cfbGetLongWidthAndPointer (pDrawable, widthDst, pdstBase)
142
for (; nBox; nBox--, pBox++)
144
pdstRect = pdstBase + pBox->y1 * widthDst;
145
h = pBox->y2 - pBox->y1;
146
w = pBox->x2 - pBox->x1;
150
register char *pdstb = ((char *) pdstRect) + pBox->x1;
151
int incr = widthDst * PGSZB;
163
leftIndex = pBox->x1 &3;
164
/* rightIndex = ((leftIndex+w)<5)?0:pBox->x2 &3;*/
165
rightIndex = pBox->x2 &3;
167
nmiddle = w - rightIndex;
169
nmiddle -= (4 - leftIndex);
175
pdstRect += (pBox->x1 * 3) >> 2;
183
*pdst++ = piQxelXor[0];
184
*pdst++ = piQxelXor[1];
185
*pdst-- = piQxelXor[2];
188
*pdst++ ^= piQxelXor[0];
189
*pdst++ ^= piQxelXor[1];
190
*pdst-- ^= piQxelXor[2];
193
*pdst++ &= piQxelAnd[0];
194
*pdst++ &= piQxelAnd[1];
195
*pdst-- &= piQxelAnd[2];
198
*pdst++ |= piQxelOr[0];
199
*pdst++ |= piQxelOr[1];
200
*pdst-- |= piQxelOr[2];
203
*pdst = DoRRop((*pdst), piQxelAnd[0], piQxelXor[0]);
205
*pdst = DoRRop((*pdst), piQxelAnd[1], piQxelXor[1]);
207
*pdst = DoRRop((*pdst), piQxelAnd[2], piQxelXor[2]);
217
*pdst = ((*pdst) & 0xFFFFFF) | (piQxelXor[0] & 0xFF000000);
219
*pdst++ = piQxelXor[1];
220
*pdst-- = piQxelXor[2];
223
*pdst++ ^= (piQxelXor[0] & 0xFF000000);
224
*pdst++ ^= piQxelXor[1];
225
*pdst-- ^= piQxelXor[2];
228
*pdst++ &= (piQxelAnd[0] | 0x00FFFFFF);
229
*pdst++ &= piQxelAnd[1];
230
*pdst-- &= piQxelAnd[2];
233
*pdst++ |= (piQxelOr[0] & 0xFF000000);
234
*pdst++ |= piQxelOr[1];
235
*pdst-- |= piQxelOr[2];
238
*pdst = DoMaskRRop((*pdst), piQxelAnd[0], piQxelXor[0], 0xFF000000);
240
*pdst = DoRRop((*pdst), piQxelAnd[1], piQxelXor[1]);
242
*pdst = DoRRop((*pdst), piQxelAnd[2], piQxelXor[2]);
252
*pdst = ((*pdst) & 0xFFFF) | (piQxelXor[1] & 0xFFFF0000);
254
*pdst-- = piQxelXor[2];
257
*pdst++ ^= (piQxelXor[1] & 0xFFFF0000);
258
*pdst-- ^= piQxelXor[2];
261
*pdst++ &= (piQxelAnd[1] | 0xFFFF);
262
*pdst-- &= piQxelAnd[2];
265
*pdst++ |= (piQxelOr[1] & 0xFFFF0000);
266
*pdst-- |= piQxelOr[2];
269
*pdst = DoMaskRRop((*pdst), piQxelAnd[1], piQxelXor[1], 0xFFFF0000);
271
*pdst = DoRRop((*pdst), piQxelAnd[2], piQxelXor[2]);
280
*pdst = ((*pdst) & 0xFF) | (piQxelXor[2] & 0xFFFFFF00);
283
*pdst ^= (piQxelXor[2] & 0xFFFFFF00);
286
*pdst &= (piQxelAnd[2] | 0xFF);
289
*pdst |= (piQxelOr[2] & 0xFFFFFF00);
292
*pdst = DoMaskRRop((*pdst), piQxelAnd[2], piQxelXor[2], 0xFFFFFF00);
304
*pdst++ = piQxelXor[0];
305
*pdst++ = piQxelXor[1];
306
*pdst = ((*pdst) & 0xFFFFFF00) | (piQxelXor[2] & 0xFF);
310
*pdst++ ^= piQxelXor[0];
311
*pdst++ ^= piQxelXor[1];
312
*pdst-- ^= (piQxelXor[2] & 0xFF);
315
*pdst++ &= piQxelAnd[0];
316
*pdst++ &= piQxelAnd[1];
317
*pdst-- &= (piQxeAnd[2] | 0xFFFFFF00);
320
*pdst++ |= piQxelOr[0];
321
*pdst++ |= piQxelOr[1];
322
*pdst-- |= (piQxelOr[2] & 0xFF);
325
*pdst = DoRRop((*pdst), piQxelAnd[0], piQxelXor[0]);
327
*pdst = DoRRop((*pdst), piQxelAnd[1], piQxelXor[1]);
329
*pdst = DoMaskRRop((*pdst), piQxelAnd[2], piQxelXor[2], 0xFF);
339
*pdst = ((*pdst) & 0xFFFFFF) | (piQxelXor[0] & 0xFF000000);
341
*pdst++ = piQxelXor[1];
342
*pdst = ((*pdst) & 0xFFFFFF00) | (piQxelXor[2] & 0xFF);
346
*pdst++ ^= (piQxelXor[0] & 0xFF000000);
347
*pdst++ ^= piQxelXor[1];
348
*pdst-- ^= (piQxelXor[2] & 0xFF);
351
*pdst++ &= (piQxelAnd[0] | 0x00FFFFFF);
352
*pdst++ &= piQxelAnd[1];
353
*pdst-- &= (piQxelAnd[2] | 0xFFFFFF00);
356
*pdst++ |= (piQxelOr[0] & 0xFF000000);
357
*pdst++ |= piQxelOr[1];
358
*pdst-- |= (piQxelOr[2] & 0xFF);
361
*pdst = DoMaskRRop((*pdst), piQxelAnd[0], piQxelXor[0], 0xFF000000);
363
*pdst = DoRRop((*pdst), piQxelAnd[1], piQxelXor[1]);
365
*pdst = DoMaskRRop((*pdst), piQxelAnd[2], piQxelXor[2], 0xFF);
375
*pdst = ((*pdst) & 0xFFFF) | (piQxelXor[1] & 0xFFFF0000);
377
*pdst = ((*pdst) & 0xFFFFFF00) | (piQxelXor[2] & 0xFF);
381
*pdst++ ^= (piQxelXor[1] & 0xFFFF0000);
382
*pdst-- ^= (piQxelXor[2] & 0xFF);
385
*pdst++ &= (piQxelAnd[1] | 0xFFFF);
386
*pdst-- &= (piQxelAnd[2] | 0xFFFFFF00);
389
*pdst++ |= (piQxelOr[1] & 0xFFFF0000);
390
*pdst-- |= (piQxelOr[2] & 0xFF);
393
*pdst = DoMaskRRop((*pdst), piQxelAnd[1], piQxelXor[1], 0xFFFF0000);
395
*pdst = DoMaskRRop((*pdst), piQxelAnd[2], piQxelXor[2], 0xFF);
404
*pdst = ((*pdst) & 0xFF) | (piQxelXor[2] & 0xFFFFFF00);
407
*pdst ^= (piQxelXor[2] & 0xFFFFFF00);
410
*pdst &= (piQxelAnd[2] | 0xFF);
413
*pdst |= (piQxelOr[2] & 0xFFFFFF00);
416
*pdst = DoMaskRRop((*pdst), piQxelAnd[2], piQxelXor[2], 0xFFFFFF00);
423
case 2: /* leftIndex + w = 2*/
428
*pdst = ((*pdst) & 0xFFFF) | (piQxelXor[1] & 0xFFFF0000);
430
*pdst = ((*pdst) & 0xFFFFFF00) | (piQxelXor[2] & 0xFF);
434
*pdst++ ^= (piQxelXor[1] & 0xFFFF0000);
435
*pdst-- ^= (piQxelXor[2] & 0xFF);
438
*pdst++ &= (piQxelAnd[1] | 0xFFFF0000);
439
*pdst-- &= (piQxelAnd[2] | 0xFF);
442
*pdst++ |= (piQxelOr[1] & 0xFFFF0000);
443
*pdst-- |= (piQxelOr[2] & 0xFF);
446
*pdst = DoMaskRRop((*pdst), piQxelAnd[1], piQxelXor[1], 0xFFFF0000);
448
*pdst = DoMaskRRop((*pdst), piQxelAnd[2], piQxelXor[2], 0xFF);
457
*pdst = ((*pdst) & 0xFFFFFF) | (piQxelXor[0] & 0xFF000000);
459
*pdst = ((*pdst) & 0xFFFF0000) | (piQxelXor[1] & 0xFFFF);
463
*pdst++ ^= (piQxelXor[0] & 0xFF000000);
464
*pdst-- ^= (piQxelXor[1] & 0xFFFF);
467
*pdst++ &= (piQxelAnd[0] | 0xFFFFFF);
468
*pdst-- &= (piQxelAnd[1] | 0xFFFF0000);
471
*pdst++ |= (piQxelOr[0] & 0xFF000000);
472
*pdst-- |= (piQxelOr[1] & 0xFFFF);
475
*pdst = DoMaskRRop((*pdst), piQxelAnd[0], piQxelXor[0], 0xFF000000);
477
*pdst = DoMaskRRop((*pdst), piQxelAnd[1], piQxelXor[1], 0xFFFF);
483
case 0: /*case 2 leftIndex == 0 */
486
*pdst++ = piQxelXor[0];
487
*pdst = ((*pdst) & 0xFFFF0000) | (piQxelXor[1] & 0xFFFF);
491
*pdst++ ^= piQxelXor[0];
492
*pdst-- ^= (piQxelXor[1] & 0xFFFF);
495
*pdst++ &= piQxelAnd[0];
496
*pdst-- &= (piQxelAnd[1] | 0xFFFF0000);
499
*pdst++ |= piQxelOr[0];
500
*pdst-- |= (piQxelOr[1] & 0xFFFF);
503
*pdst = DoRRop((*pdst), piQxelAnd[0], piQxelXor[0]);
505
*pdst = DoMaskRRop((*pdst), piQxelAnd[1], piQxelXor[1], 0xFFFF);
513
case 1: /*only if leftIndex = 0 and w = 1*/
516
*pdst = ((*pdst) & 0xFF000000) | (piQxelXor[0] & 0xFFFFFF);
519
*pdst ^= (piQxelXor[0] & 0xFFFFFF);
522
*pdst &= (piQxelAnd[0] | 0xFF000000);
525
*pdst |= (piQxelOr[0] & 0xFFFFFF);
528
*pdst = DoMaskRRop((*pdst), piQxelAnd[0], piQxelXor[0], 0xFFFFFF);
544
*pdst = ((*pdst) & 0xFFFFFF) | (piQxelXor[0] & 0xFF000000);
546
*pdst++ = piQxelXor[1];
547
*pdst++ = piQxelXor[2];
550
*pdst++ ^= (piQxelXor[0] & 0xFF000000);
551
*pdst++ ^= piQxelXor[1];
552
*pdst++ ^= piQxelXor[2];
555
*pdst++ &= (piQxelAnd[0] | 0xFFFFFF);
556
*pdst++ &= piQxelAnd[1];
557
*pdst++ &= piQxelAnd[2];
560
*pdst++ |= (piQxelOr[0] & 0xFF000000);
561
*pdst++ |= piQxelOr[1];
562
*pdst++ |= piQxelOr[2];
565
*pdst = DoMaskRRop((*pdst), piQxelAnd[0], piQxelXor[0], 0xFF000000);
567
*pdst = DoRRop((*pdst), piQxelAnd[1], piQxelXor[1]);
569
*pdst = DoRRop((*pdst), piQxelAnd[2], piQxelXor[2]);
575
*pdst = (((*pdst) & 0xFFFF) | (piQxelXor[1] & 0xFFFF0000));
577
*pdst++ = piQxelXor[2];
580
*pdst++ ^=(piQxelXor[1] & 0xFFFF0000);
581
*pdst++ ^= piQxelXor[2];
584
*pdst++ &= (piQxelAnd[1] | 0xFFFF);
585
*pdst++ &= piQxelAnd[2];
588
*pdst++ |= (piQxelOr[1] & 0xFFFF0000);
589
*pdst++ |= piQxelOr[2];
592
*pdst = DoMaskRRop((*pdst), piQxelAnd[1], piQxelXor[1], 0xFFFF0000);
594
*pdst = DoRRop((*pdst), piQxelAnd[2], piQxelXor[2]);
600
*pdst = ((*pdst) & 0xFF) | (piQxelXor[2] & 0xFFFFFF00);
604
*pdst++ ^= (piQxelXor[2] & 0xFFFFFF00);
607
*pdst++ &= (piQxelAnd[2] | 0xFF);
610
*pdst++ |= (piQxelOr[2] & 0xFFFFFF00);
613
*pdst = DoMaskRRop((*pdst), piQxelAnd[2], piQxelXor[2], 0xFFFFFF00);
621
*pdst++ = piQxelXor[0];
622
*pdst++ = piQxelXor[1];
623
*pdst++ = piQxelXor[2];
626
*pdst++ ^= piQxelXor[0];
627
*pdst++ ^= piQxelXor[1];
628
*pdst++ ^= piQxelXor[2];
631
*pdst++ &= piQxelAnd[0];
632
*pdst++ &= piQxelAnd[1];
633
*pdst++ &= piQxelAnd[2];
636
*pdst++ |= piQxelOr[0];
637
*pdst++ |= piQxelOr[1];
638
*pdst++ |= piQxelOr[2];
641
*pdst = DoRRop((*pdst), piQxelAnd[0], piQxelXor[0]);
643
*pdst = DoRRop((*pdst), piQxelAnd[1], piQxelXor[1]);
645
*pdst = DoRRop((*pdst), piQxelAnd[2], piQxelXor[2]);
654
*pdst = ((*pdst) & 0xFF000000) | (piQxelXor[0] & 0xFFFFFF);
658
*pdst++ ^= (piQxelXor[0] & 0xFFFFFF);
661
*pdst++ &= (piQxelAnd[0] | 0xFF);
664
*pdst++ |= (piQxelOr[0] & 0xFFFFFF);
667
*pdst = DoMaskRRop((*pdst), piQxelAnd[0], piQxelXor[0], 0xFFFFFF);
673
*pdst++ = piQxelXor[0];
674
*pdst = ((*pdst) & 0xFFFF0000) | (piQxelXor[1] & 0xFFFF);
678
*pdst++ ^= piQxelXor[0];
679
*pdst++ ^= (piQxelXor[1] & 0xFFFF);
682
*pdst++ &= piQxelAnd[0];
683
*pdst++ &= (piQxelAnd[1] | 0xFFFF0000);
686
*pdst++ |= piQxelOr[0];
687
*pdst++ |= (piQxelOr[1] & 0xFFFF);
690
*pdst = DoRRop((*pdst), piQxelAnd[0], piQxelXor[0]);
692
*pdst = DoMaskRRop((*pdst), piQxelAnd[1], piQxelXor[1], 0xFFFF);
698
*pdst++ = piQxelXor[0];
699
*pdst++ = piQxelXor[1];
700
*pdst = ((*pdst) & 0xFFFFFF00) | (piQxelXor[2] & 0xFF);
704
*pdst++ ^= piQxelXor[0];
705
*pdst++ ^= piQxelXor[1];
706
*pdst++ ^= (piQxelXor[2] & 0xFF);
709
*pdst++ &= piQxelAnd[0];
710
*pdst++ &= piQxelAnd[1];
711
*pdst++ &= (piQxelAnd[2] | 0xFFFFFF00);
714
*pdst++ |= piQxelOr[0];
715
*pdst++ |= piQxelOr[1];
716
*pdst++ |= (piQxelOr[2] & 0xFF);
719
*pdst = DoRRop((*pdst), piQxelAnd[0], piQxelXor[0]);
721
*pdst = DoRRop((*pdst), piQxelAnd[1], piQxelXor[1]);
723
*pdst = DoMaskRRop((*pdst), piQxelAnd[2], piQxelXor[2], 0xFF);
728
pdstRect += widthDst;
732
#else /* PSZ != 24 */
733
pdstRect += (pBox->x1 >> PWSH);
734
if ((pBox->x1 & PIM) + w <= PPW)
736
maskpartialbits(pBox->x1, w, leftMask);
739
RROP_SOLID_MASK (pdst, leftMask);
745
maskbits (pBox->x1, w, leftMask, rightMask, nmiddle);
748
if (rightMask) /* left mask and right mask */
750
Expand(RROP_SOLID_MASK (pdst, leftMask); pdst++;,
751
RROP_SOLID_MASK (pdst, rightMask);, 1)
753
else /* left mask and no right mask */
755
Expand(RROP_SOLID_MASK (pdst, leftMask); pdst++;,
761
if (rightMask) /* no left mask and right mask */
764
RROP_SOLID_MASK (pdst, rightMask);, 0)
766
else /* no left mask and no right mask */
782
RROP_NAME(cfbSolidSpans) (pDrawable, pGC, nInit, pptInit, pwidthInit, fSorted)
783
DrawablePtr pDrawable;
785
int nInit; /* number of spans to fill */
786
DDXPointPtr pptInit; /* pointer to list of start points */
787
int *pwidthInit; /* pointer to list of n widths */
795
register CfbBits *pdst;
796
register int nlmiddle;
800
/* next three parameters are post-clip */
801
int n; /* number of spans to fill */
802
DDXPointPtr ppt; /* pointer to list of start points */
803
int *pwidthFree;/* copies of the pointers to free */
806
cfbPrivGCPtr devPriv;
808
int leftIndex, rightIndex;
810
register CfbBits startmask, endmask;
813
devPriv = cfbGetGCPrivate(pGC);
814
RROP_FETCH_GCPRIV(devPriv)
815
n = nInit * miFindMaxBand(pGC->pCompositeClip);
816
pwidthFree = (int *)ALLOCATE_LOCAL(n * sizeof(int));
817
pptFree = (DDXPointRec *)ALLOCATE_LOCAL(n * sizeof(DDXPointRec));
818
if(!pptFree || !pwidthFree)
820
if (pptFree) DEALLOCATE_LOCAL(pptFree);
821
if (pwidthFree) DEALLOCATE_LOCAL(pwidthFree);
826
n = miClipSpans(pGC->pCompositeClip, pptInit, pwidthInit, nInit,
827
ppt, pwidth, fSorted);
829
cfbGetLongWidthAndPointer (pDrawable, widthDst, pdstBase)
834
pdst = pdstBase + (ppt->y * widthDst);
841
/* rightIndex = ((leftIndex+w)<5)?0:(x+w)&3;*/
842
rightIndex = (x+w)&3;
844
nlmiddle = w - rightIndex;
846
nlmiddle -= (4 - leftIndex);
854
pdst += leftIndex? (leftIndex -1):0;
860
*pdst++ = piQxelXor[0];
861
*pdst++ = piQxelXor[1];
862
*pdst-- = piQxelXor[2];
865
*pdst++ ^= piQxelXor[0];
866
*pdst++ ^= piQxelXor[1];
867
*pdst-- ^= piQxelXor[2];
870
*pdst++ &= piQxelAnd[0];
871
*pdst++ &= piQxelAnd[1];
872
*pdst-- &= piQxelAnd[2];
875
*pdst++ |= piQxelOr[0];
876
*pdst++ |= piQxelOr[1];
877
*pdst-- |= piQxelOr[2];
880
*pdst = DoRRop((*pdst), piQxelAnd[0], piQxelXor[0]);
882
*pdst = DoRRop((*pdst), piQxelAnd[1], piQxelXor[1]);
884
*pdst = DoRRop((*pdst), piQxelAnd[2], piQxelXor[2]);
891
*pdst = ((*pdst) & 0xFFFFFF) | (piQxelXor[0] & 0xFF000000);
893
*pdst++ = piQxelXor[1];
894
*pdst-- = piQxelXor[2];
897
*pdst++ ^= (piQxelXor[0] & 0xFF000000);
898
*pdst++ ^= piQxelXor[1];
899
*pdst-- ^= piQxelXor[2];
902
*pdst++ &= (piQxelAnd[0] | 0x00FFFFFF);
903
*pdst++ &= piQxelAnd[1];
904
*pdst-- &= piQxelAnd[2];
907
*pdst++ |= (piQxelOr[0] & 0xFF000000);
908
*pdst++ |= piQxelOr[1];
909
*pdst-- |= piQxelOr[2];
912
*pdst = DoMaskRRop((*pdst), piQxelAnd[0], piQxelXor[0], 0xFF000000);
914
*pdst = DoRRop((*pdst), piQxelAnd[1], piQxelXor[1]);
916
*pdst = DoRRop((*pdst), piQxelAnd[2], piQxelXor[2]);
923
*pdst = ((*pdst) & 0xFFFF) | (piQxelXor[1] & 0xFFFF0000);
925
*pdst-- = piQxelXor[2];
928
*pdst++ ^= (piQxelXor[1] & 0xFFFF0000);
929
*pdst-- ^= piQxelXor[2];
932
*pdst++ &= (piQxelAnd[1] | 0xFFFF);
933
*pdst-- &= piQxelAnd[2];
936
*pdst++ |= (piQxelOr[1] & 0xFFFF0000);
937
*pdst-- |= piQxelOr[2];
940
*pdst = DoMaskRRop((*pdst), piQxelAnd[1], piQxelXor[1], 0xFFFF0000);
942
*pdst = DoRRop((*pdst), piQxelAnd[2], piQxelXor[2]);
948
*pdst = ((*pdst) & 0xFF) | (piQxelXor[2] & 0xFFFFFF00);
951
*pdst ^= (piQxelXor[2] & 0xFFFFFF00);
954
*pdst &= (piQxelAnd[2] | 0xFF);
957
*pdst |= (piQxelOr[2] & 0xFFFFFF00);
960
*pdst = DoMaskRRop((*pdst), piQxelAnd[2], piQxelXor[2], 0xFFFFFF00);
969
*pdst++ = piQxelXor[0];
970
*pdst++ = piQxelXor[1];
971
*pdst = ((*pdst) & 0xFFFFFF00) | (piQxelXor[2] & 0xFF);
975
*pdst++ ^= piQxelXor[0];
976
*pdst++ ^= piQxelXor[1];
977
*pdst-- ^= (piQxelXor[2] & 0xFF);
980
*pdst++ &= piQxelAnd[0];
981
*pdst++ &= piQxelAnd[1];
982
*pdst-- &= (piQxelAnd[2] | 0xFFFFFF00);
985
*pdst++ |= piQxelOr[0];
986
*pdst++ |= piQxelOr[1];
988
*pdst-- |= (piQxelOr[2] & 0xFF);
991
*pdst = DoRRop((*pdst), piQxelAnd[0], piQxelXor[0]);
993
*pdst = DoRRop((*pdst), piQxelAnd[1], piQxelXor[1]);
995
*pdst = DoMaskRRop((*pdst), piQxelAnd[2], piQxelXor[2], 0xFF);
1002
*pdst = ((*pdst) & 0xFFFFFF) | (piQxelXor[0] & 0xFF000000);
1004
*pdst++ = piQxelXor[1];
1005
*pdst = ((*pdst) & 0xFFFFFF00) | (piQxelXor[2] & 0xFF);
1009
*pdst++ ^= (piQxelXor[0] & 0xFF000000);
1010
*pdst++ ^= piQxelXor[1];
1011
*pdst-- ^= (piQxelXor[2] & 0xFF);
1014
*pdst++ &= (piQxelAnd[0] | 0x00FFFFFF);
1015
*pdst++ &= piQxelAnd[1];
1016
*pdst-- &= (piQxelAnd[2] | 0xFFFFFF00);
1019
*pdst++ |= (piQxelOr[0] & 0xFF000000);
1020
*pdst++ |= piQxelOr[1];
1021
*pdst-- |= (piQxelOr[2] & 0xFF);
1024
*pdst = DoMaskRRop((*pdst), piQxelAnd[0], piQxelXor[0], 0xFF000000);
1026
*pdst = DoRRop((*pdst), piQxelAnd[1], piQxelXor[1]);
1028
*pdst = DoMaskRRop((*pdst), piQxelAnd[2], piQxelXor[2], 0xFF);
1036
*pdst = ((*pdst) & 0xFFFF) | (piQxelXor[1] & 0xFFFF0000);
1038
*pdst = ((*pdst) & 0xFFFFFF00) | (piQxelXor[2] & 0xFF);
1042
*pdst++ ^= (piQxelXor[1] & 0xFFFF0000);
1043
*pdst-- ^= (piQxelXor[2] & 0xFF);
1046
*pdst++ &= (piQxelAnd[1] | 0xFFFF);
1047
*pdst-- &= (piQxelAnd[2] | 0xFFFFFF00);
1050
*pdst++ |= (piQxelOr[1] & 0xFFFF0000);
1051
*pdst-- |= (piQxelOr[2] & 0xFF);
1054
*pdst = DoMaskRRop((*pdst), piQxelAnd[1], piQxelXor[1], 0xFFFF0000);
1056
*pdst = DoMaskRRop((*pdst), piQxelAnd[2], piQxelXor[2], 0xFF);
1062
case 2: /* leftIndex + w = 2*/
1065
*pdst = ((*pdst) & 0xFFFFFF) | (piQxelXor[0] & 0xFF000000);
1067
*pdst = ((*pdst) & 0xFFFF0000) | (piQxelXor[1] & 0xFFFF);
1071
*pdst++ ^= (piQxelXor[0] & 0xFF000000);
1072
*pdst-- ^= (piQxelXor[1] & 0xFFFF);
1075
*pdst++ &= (piQxelAnd[0] | 0xFFFFFF);
1076
*pdst-- &= (piQxelAnd[1] | 0xFFFF0000);
1079
*pdst++ |= (piQxelOr[0] & 0xFF000000);
1080
*pdst-- |= (piQxelOr[1] & 0xFFFF);
1083
*pdst = DoMaskRRop((*pdst), piQxelAnd[0], piQxelXor[0], 0xFF000000);
1085
*pdst = DoMaskRRop((*pdst), piQxelAnd[1], piQxelXor[1], 0xFFFF);
1089
else{ /*case 2 leftIndex === 0 */
1091
*pdst++ = piQxelXor[0];
1092
*pdst = ((*pdst) & 0xFFFF0000) | (piQxelXor[1] & 0xFFFF);
1096
*pdst++ ^= piQxelXor[0];
1097
*pdst-- ^= (piQxelXor[1] & 0xFFFF);
1100
*pdst++ &= piQxelAnd[0];
1101
*pdst-- &= (piQxelAnd[1] | 0xFFFF0000);
1104
*pdst++ |= piQxelOr[0];
1105
*pdst-- |= (piQxelOr[1] & 0xFFFF);
1108
*pdst = DoRRop((*pdst), piQxelAnd[0], piQxelXor[0]);
1110
*pdst = DoMaskRRop((*pdst), piQxelAnd[1], piQxelXor[1], 0xFFFF);
1115
case 1: /*only if leftIndex = 0 and w = 1*/
1117
*pdst = ((*pdst) & 0xFF000000) | (piQxelXor[0] & 0xFFFFFF);
1120
*pdst ^= (piQxelXor[0] & 0xFFFFFF);
1123
*pdst &= (piQxelAnd[0] | 0xFF000000);
1126
*pdst |= (piQxelOr[0] & 0xFFFFFF);
1129
*pdst = DoMaskRRop((*pdst), piQxelAnd[0], piQxelXor[0], 0xFFFFFF);
1141
*pdst = ((*pdst) & 0xFFFFFF) | (piQxelXor[0] & 0xFF000000);
1143
*pdst++ = piQxelXor[1];
1144
*pdst++ = piQxelXor[2];
1147
*pdst++ ^= (piQxelXor[0] & 0xFF000000);
1148
*pdst++ ^= piQxelXor[1];
1149
*pdst++ ^= piQxelXor[2];
1152
*pdst++ &= (piQxelAnd[0] | 0xFFFFFF);
1153
*pdst++ &= piQxelAnd[1];
1154
*pdst++ &= piQxelAnd[2];
1157
*pdst++ |= (piQxelOr[0] & 0xFF000000);
1158
*pdst++ |= piQxelOr[1];
1159
*pdst++ |= piQxelOr[2];
1162
*pdst = DoMaskRRop((*pdst), piQxelAnd[0], piQxelXor[0], 0xFF000000);
1164
*pdst = DoRRop((*pdst), piQxelAnd[1], piQxelXor[1]);
1166
*pdst = DoRRop((*pdst), piQxelAnd[2], piQxelXor[2]);
1172
*pdst = (((*pdst) & 0xFFFF) | (piQxelXor[1] & 0xFFFF0000));
1174
*pdst++ = piQxelXor[2];
1177
*pdst++ ^=(piQxelXor[1] & 0xFFFF0000);
1178
*pdst++ ^= piQxelXor[2];
1181
*pdst++ &= (piQxelAnd[1] | 0xFFFF);
1182
*pdst++ &= piQxelAnd[2];
1185
*pdst++ |= (piQxelOr[1] & 0xFFFF0000);
1186
*pdst++ |= piQxelOr[2];
1189
*pdst = DoMaskRRop((*pdst), piQxelAnd[1], piQxelXor[1], 0xFFFF0000);
1191
*pdst = DoRRop((*pdst), piQxelAnd[2], piQxelXor[2]);
1197
*pdst = ((*pdst) & 0xFF) | (piQxelXor[2] & 0xFFFFFF00);
1201
*pdst++ ^= (piQxelXor[2] & 0xFFFFFF00);
1204
*pdst++ &= (piQxelAnd[2] | 0xFF);
1207
*pdst++ |= (piQxelOr[2] & 0xFFFFFF00);
1210
*pdst = DoMaskRRop((*pdst), piQxelAnd[2], piQxelXor[2], 0xFFFFFF00);
1217
*pdst++ = piQxelXor[0];
1218
*pdst++ = piQxelXor[1];
1219
*pdst++ = piQxelXor[2];
1222
*pdst++ ^= piQxelXor[0];
1223
*pdst++ ^= piQxelXor[1];
1224
*pdst++ ^= piQxelXor[2];
1227
*pdst++ &= piQxelAnd[0];
1228
*pdst++ &= piQxelAnd[1];
1229
*pdst++ &= piQxelAnd[2];
1232
*pdst++ |= piQxelOr[0];
1233
*pdst++ |= piQxelOr[1];
1234
*pdst++ |= piQxelOr[2];
1237
*pdst = DoRRop((*pdst), piQxelAnd[0], piQxelXor[0]);
1239
*pdst = DoRRop((*pdst), piQxelAnd[1], piQxelXor[1]);
1241
*pdst = DoRRop((*pdst), piQxelAnd[2], piQxelXor[2]);
1250
*pdst = ((*pdst) & 0xFF000000) | (piQxelXor[0] & 0xFFFFFF);
1254
*pdst++ ^= (piQxelXor[0] & 0xFFFFFF);
1257
*pdst++ &= (piQxelAnd[0] | 0xFF);
1260
*pdst++ |= (piQxelOr[0] & 0xFFFFFF);
1263
*pdst = DoMaskRRop((*pdst), piQxelAnd[0], piQxelXor[0], 0xFFFFFF);
1268
*pdst++ = piQxelXor[0];
1269
*pdst = ((*pdst) & 0xFFFF0000) | (piQxelXor[1] & 0xFFFF);
1273
*pdst++ ^= piQxelXor[0];
1274
*pdst++ ^= (piQxelXor[1] & 0xFFFF);
1277
*pdst++ &= piQxelAnd[0];
1278
*pdst++ &= (piQxelAnd[1] | 0xFFFF0000);
1281
*pdst++ |= piQxelOr[0];
1282
*pdst++ |= (piQxelOr[1] & 0xFFFF);
1285
*pdst = DoRRop((*pdst), piQxelAnd[0], piQxelXor[0]);
1287
*pdst = DoMaskRRop((*pdst), piQxelAnd[1], piQxelXor[1], 0xFFFF);
1293
*pdst++ = piQxelXor[0];
1294
*pdst++ = piQxelXor[1];
1295
*pdst = ((*pdst) & 0xFFFFFF00) | (piQxelXor[2] & 0xFF);
1299
*pdst++ ^= piQxelXor[0];
1300
*pdst++ ^= piQxelXor[1];
1301
*pdst++ ^= (piQxelXor[2] & 0xFF);
1304
*pdst++ &= piQxelAnd[0];
1305
*pdst++ &= piQxelAnd[1];
1306
*pdst++ &= (piQxelAnd[2] | 0xFFFFFF00);
1309
*pdst++ |= piQxelOr[0];
1310
*pdst++ |= piQxelOr[1];
1311
*pdst++ |= (piQxelOr[2] & 0xFF);
1314
*pdst = DoRRop((*pdst), piQxelAnd[0], piQxelXor[0]);
1316
*pdst = DoRRop((*pdst), piQxelAnd[1], piQxelXor[1]);
1318
*pdst = DoMaskRRop((*pdst), piQxelAnd[2], piQxelXor[2], 0xFF);
1329
register char *addrb;
1331
addrb = ((char *) pdst) + x;
1339
if ((x & PIM) + w <= PPW)
1342
maskpartialbits (x, w, startmask);
1343
RROP_SOLID_MASK (pdst, startmask);
1349
maskbits (x, w, startmask, endmask, nlmiddle);
1352
RROP_SOLID_MASK (pdst, startmask);
1356
RROP_SPAN(pdst,nlmiddle)
1359
RROP_SOLID_MASK (pdst, endmask);
1364
DEALLOCATE_LOCAL(pptFree);
1365
DEALLOCATE_LOCAL(pwidthFree);