3
* Fill odd tiled rectangles and spans.
4
* no depth dependencies.
9
Copyright (c) 1989 X Consortium
11
Permission is hereby granted, free of charge, to any person obtaining a copy
12
of this software and associated documentation files (the "Software"), to deal
13
in the Software without restriction, including without limitation the rights
14
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
15
copies of the Software, and to permit persons to whom the Software is
16
furnished to do so, subject to the following conditions:
18
The above copyright notice and this permission notice shall be included in
19
all copies or substantial portions of the Software.
21
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
22
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
23
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
24
X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
25
AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
26
CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
28
Except as contained in this notice, the name of the X Consortium shall not be
29
used in advertising or otherwise to promote the sale, use or other dealings
30
in this Software without prior written authorization from the X Consortium.
33
/* $XConsortium: ipltileodd.c,v 1.16 94/04/17 20:29:06 dpw Exp $ */
35
/* Modified nov 94 by Martin Schaller (Martin_Schaller@maus.r.de) for use with
38
#ifdef HAVE_DIX_CONFIG_H
39
#include <dix-config.h>
47
#include "pixmapstr.h"
48
#include "scrnintstr.h"
49
#include "windowstr.h"
53
#include "iplmskbits.h"
54
#include "iplmergerop.h"
56
#define LEFTSHIFT_AMT 0
58
#define LastTileBits {\
59
INTER_COPY(bits, tmp); \
61
INTER_MSKINSM(tileEndMask, 0, pSrc, \
62
~0, tileEndLeftShift, pSrcLine, bits) \
64
INTER_COPY(pSrc, bits); \
67
#define ResetTileBits {\
71
if (INTER_PPG - xoff + tileEndPart <= INTER_PPG) {\
72
INTER_COPY(pSrc, bits); INTER_NEXT_GROUP(pSrc); \
75
INTER_MSKINSM(~0, tileEndLeftShift, tmp, \
76
~0, tileEndRightShift, bits, bits); \
77
xoff = (xoff + xoffStep) & INTER_PIM; \
78
leftShift = xoff << LEFTSHIFT_AMT; \
79
rightShift = INTER_PGSZ - leftShift; \
83
#define NextTileBits {\
93
INTER_COPY(bits, tmp); \
94
INTER_COPY(pSrc, bits); INTER_NEXT_GROUP(pSrc); \
101
INTER_MROP_NAME(iplFillBoxTileOdd) (pDrawable, nBox, pBox, tile, xrot, yrot, alu, planemask)
102
DrawablePtr pDrawable;
103
int nBox; /* number of boxes to fill */
104
register BoxPtr pBox; /* pointer to list of boxes to fill */
105
PixmapPtr tile; /* tile */
108
unsigned long planemask;
110
int tileWidth; /* width of tile in pixels */
111
int tileHeight; /* height of the tile */
114
int widthDst; /* width in longwords of the dest pixmap */
115
int w; /* width of current box */
116
int h; /* height of current box */
117
INTER_DECLAREG(startmask);
118
INTER_DECLAREG(endmask);/* masks for reggedy bits at either end of line */
119
int nlwMiddle; /* number of longwords between sides of boxes */
120
int nlwSrc; /* number of whole longwords in source */
122
register int nlw; /* loop version of nlwMiddle */
123
int srcy; /* current tile y position */
124
int srcx; /* current tile x position */
125
int xoffDst, xoffSrc;
126
int leftShift, rightShift;
128
INTER_MROP_DECLARE_REG()
130
INTER_DECLAREG(*pDstBase); /* pointer to start of dest */
131
INTER_DECLAREG(*pDstLine); /* poitner to start of dest box */
132
INTER_DECLAREG(*pSrcBase); /* pointer to start of source */
133
INTER_DECLAREG(*pSrcLine); /* pointer to start of source line */
134
INTER_DECLAREG(*pDst);
135
INTER_DECLAREG(*pSrc);
136
INTER_DECLAREGP(bits);
137
INTER_DECLAREGP(tmp);
138
INTER_DECLAREGP(tmp1);
139
register int nlwPart;
141
int leftShiftStart, rightShiftStart, nlwSrcStart;
142
INTER_DECLAREG(tileEndMask);
143
int tileEndLeftShift, tileEndRightShift;
147
unsigned short narrow[2 * INTER_PLANES];
148
INTER_DECLAREG(narrowMask);
153
INTER_MROP_INITIALIZE (alu, planemask)
155
tileHeight = tile->drawable.height;
156
tileWidth = tile->drawable.width;
157
widthSrc = tile->devKind / (INTER_PGSZB * INTER_PLANES);
162
narrowRep = INTER_PPG / tileWidth;
163
narrowMask = iplendpartial [tileWidth];
164
tileWidth *= narrowRep;
165
narrowShift = tileWidth;
170
pSrcBase = (unsigned short *)tile->devPrivate.ptr;
172
iplGetGroupWidthAndPointer (pDrawable, widthDst, pDstBase)
174
tileEndPart = tileWidth & INTER_PIM;
175
tileEndMask = iplendpartial[tileEndPart];
176
tileEndLeftShift = (tileEndPart) << LEFTSHIFT_AMT;
177
tileEndRightShift = INTER_PGSZ - tileEndLeftShift;
178
xoffStep = INTER_PPG - tileEndPart;
180
* current assumptions: tile > 32 bits wide.
184
w = pBox->x2 - pBox->x1;
185
h = pBox->y2 - pBox->y1;
186
modulus (pBox->x1 - xrot, tileWidth, srcx);
187
modulus (pBox->y1 - yrot, tileHeight, srcy);
188
xoffDst = pBox->x1 & INTER_PIM;
189
if (xoffDst + w < INTER_PPG)
191
INTER_maskpartialbits(pBox->x1, w, startmask);
197
INTER_maskbits (pBox->x1, w, startmask, endmask, nlwMiddle)
199
pDstLine = pDstBase + (pBox->y1 * widthDst) +
200
(pBox->x1 >> INTER_PGSH) * INTER_PLANES;
201
pSrcLine = pSrcBase + (srcy * widthSrc) * INTER_PLANES;
202
xoffSrc = srcx & INTER_PIM;
203
if (xoffSrc >= xoffDst)
205
xoffStart = xoffSrc - xoffDst;
210
xoffStart = INTER_PPG - (xoffDst - xoffSrc);
213
leftShiftStart = (xoffStart) << LEFTSHIFT_AMT;
214
rightShiftStart = INTER_PGSZ - leftShiftStart;
215
nlwSrcStart = (widthSrc - (srcx >> INTER_PGSH));
218
/* XXX only works when narrowShift >= INTER_PPG/2 */
222
int shift=narrowShift/narrowRep;
223
INTER_ANDMSK(pSrcBase + srcy * INTER_PLANES, narrowMask, tmp);
224
tmpnarrowRep=narrowRep;
225
/* copy tile until its nearly a whole group wide */
226
while (--tmpnarrowRep)
227
INTER_MSKINSM(~0,0,tmp,~0,shift,tmp,tmp);
228
INTER_MSKINSM(~0, 0, tmp, ~0, narrowShift, tmp, narrow);
229
INTER_MSKINSM(~0, INTER_PPG - narrowShift, tmp,
230
~0, 2 * narrowShift - INTER_PPG, tmp,
231
narrow + INTER_PLANES);
235
leftShift = leftShiftStart;
236
rightShift = rightShiftStart;
237
nlwSrc = nlwSrcStart;
238
pSrc = pSrcLine + (srcx >> INTER_PGSH) * INTER_PLANES;
248
INTER_SCRLEFT(leftShift, tmp, tmp);
249
if (rightShift != INTER_PGSZ)
250
INTER_MSKINSM(~0, 0, tmp, ~0, rightShift, bits, tmp)
251
INTER_MROP_MASK (tmp, pDst, startmask, pDst);
252
INTER_NEXT_GROUP(pDst);
259
if (rightShift != INTER_PGSZ)
261
INTER_MSKINSM(~0, leftShift, tmp, ~0, rightShift, bits,
263
INTER_MROP_SOLID(tmp1, pDst, pDst);
267
INTER_MROP_SOLID (tmp, pDst, pDst);
269
INTER_NEXT_GROUP(pDst);
276
if (rightShift == INTER_PGSZ)
278
INTER_MSKINSM(~0, leftShift, tmp, ~0, rightShift, bits, tmp1);
279
INTER_MROP_MASK(tmp1, pDst, endmask, pDst);
281
pDstLine += widthDst;
282
pSrcLine += widthSrc * INTER_PLANES;
283
if (++srcy == tileHeight)
294
INTER_MROP_NAME(iplFillSpanTileOdd) (pDrawable, n, ppt, pwidth, tile, xrot, yrot, alu, planemask)
295
DrawablePtr pDrawable;
302
unsigned long planemask;
304
int tileWidth; /* width of tile in pixels */
305
int tileHeight; /* height of the tile */
308
int widthDst; /* width in longwords of the dest pixmap */
309
int w; /* width of current span */
310
INTER_DECLAREG(startmask);
311
INTER_DECLAREG (endmask); /* masks for reggedy bits at either end of line */
312
int nlwSrc; /* number of whole longwords in source */
314
register int nlw; /* loop version of nlwMiddle */
315
int srcy; /* current tile y position */
316
int srcx; /* current tile x position */
317
int xoffDst, xoffSrc;
318
int leftShift, rightShift;
320
INTER_MROP_DECLARE_REG()
322
INTER_DECLAREG(*pDstBase); /* pointer to start of dest */
323
INTER_DECLAREG(*pDstLine); /* poitner to start of dest box */
324
INTER_DECLAREG(*pSrcBase); /* pointer to start of source */
325
INTER_DECLAREG(*pSrcLine); /* pointer to start of source line */
326
INTER_DECLAREG(*pDst);
327
INTER_DECLAREG(*pSrc);
328
INTER_DECLAREGP(bits);
329
INTER_DECLAREGP(tmp);
330
INTER_DECLAREGP(tmp1);
331
register int nlwPart;
333
int leftShiftStart, rightShiftStart, nlwSrcStart;
334
INTER_DECLAREG(tileEndMask);
335
int tileEndLeftShift, tileEndRightShift;
339
unsigned short narrow[2 * INTER_PLANES];
340
INTER_DECLAREG(narrowMask);
345
INTER_MROP_INITIALIZE (alu, planemask)
347
tileHeight = tile->drawable.height;
348
tileWidth = tile->drawable.width;
349
widthSrc = tile->devKind / (INTER_PGSZB * INTER_PLANES);
353
narrowRep = INTER_PPG / tileWidth;
354
narrowMask = iplendpartial [tileWidth];
355
tileWidth *= narrowRep;
356
narrowShift = tileWidth;
361
pSrcBase = (unsigned short *)tile->devPrivate.ptr;
363
iplGetGroupWidthAndPointer (pDrawable, widthDst, pDstBase)
365
tileEndPart = tileWidth & INTER_PIM;
366
tileEndMask = iplendpartial[tileEndPart];
367
tileEndLeftShift = (tileEndPart) << LEFTSHIFT_AMT;
368
tileEndRightShift = INTER_PGSZ - tileEndLeftShift;
369
xoffStep = INTER_PPG - tileEndPart;
373
modulus (ppt->x - xrot, tileWidth, srcx);
374
modulus (ppt->y - yrot, tileHeight, srcy);
375
xoffDst = ppt->x & INTER_PIM;
376
if (xoffDst + w < INTER_PPG)
378
INTER_maskpartialbits(ppt->x, w, startmask);
384
INTER_maskbits (ppt->x, w, startmask, endmask, nlw)
386
pDstLine = pDstBase + (ppt->y * widthDst) +
387
(ppt->x >> INTER_PGSH) * INTER_PLANES;
388
pSrcLine = pSrcBase + (srcy * widthSrc) * INTER_PLANES;
389
xoffSrc = srcx & INTER_PIM;
390
if (xoffSrc >= xoffDst)
392
xoffStart = xoffSrc - xoffDst;
397
xoffStart = INTER_PPG - (xoffDst - xoffSrc);
400
leftShiftStart = (xoffStart) << LEFTSHIFT_AMT;
401
rightShiftStart = INTER_PGSZ - leftShiftStart;
402
nlwSrcStart = widthSrc - (srcx >> INTER_PGSH);
403
/* XXX only works when narrowShift >= INTER_PPG/2 */
407
int shift=narrowShift/narrowRep;
408
INTER_ANDMSK(pSrcBase + srcy * INTER_PLANES, narrowMask, tmp);
409
tmpnarrowRep=narrowRep;
410
/* copy tile until its nearly a whole group wide */
411
while (--tmpnarrowRep)
412
INTER_MSKINSM(~0,0,tmp,~0,shift,tmp,tmp);
413
INTER_MSKINSM(~0, 0, tmp, ~0, narrowShift, tmp, narrow);
414
INTER_MSKINSM(~0, INTER_PPG - narrowShift, tmp,
415
~0, 2 * narrowShift - INTER_PPG, tmp,
416
narrow + INTER_PLANES);
420
leftShift = leftShiftStart;
421
rightShift = rightShiftStart;
422
nlwSrc = nlwSrcStart;
423
pSrc = pSrcLine + (srcx >> INTER_PGSH) * INTER_PLANES;
433
INTER_SCRLEFT(leftShift, tmp, tmp);
434
if (rightShift != INTER_PGSZ)
435
INTER_MSKINSM(~0, 0, tmp, ~0, rightShift, bits, tmp);
436
INTER_MROP_MASK (tmp, pDst, startmask, pDst);
437
INTER_NEXT_GROUP(pDst);
443
if (rightShift != INTER_PGSZ)
445
INTER_MSKINSM(~0, leftShift, tmp, ~0, rightShift, bits,
447
INTER_MROP_SOLID(tmp1, pDst, pDst);
448
INTER_NEXT_GROUP(pDst);
452
INTER_MROP_SOLID (tmp, pDst, pDst);
453
INTER_NEXT_GROUP(pDst);
461
if (rightShift == INTER_PGSZ)
464
INTER_MSKINSM(~0, leftShift, tmp, ~0, rightShift, bits, tmp1);
465
INTER_MROP_MASK(tmp1, pDst, endmask, pDst);
471
# include "fastblt.h"
473
#define IncSrcPtr INTER_NEXT_GROUP(psrc); if (!--srcRemaining) { srcRemaining = widthSrc; psrc = psrcStart; }
476
INTER_MROP_NAME(iplFillBoxTile32s) (pDrawable, nBox, pBox, tile, xrot, yrot, alu, planemask)
477
DrawablePtr pDrawable;
478
int nBox; /* number of boxes to fill */
479
register BoxPtr pBox; /* pointer to list of boxes to fill */
480
PixmapPtr tile; /* tile */
483
unsigned long planemask;
485
int tileWidth; /* width of tile */
486
int tileHeight; /* height of the tile */
487
int widthSrc; /* width in longwords of the source tile */
489
int widthDst; /* width in longwords of the dest pixmap */
490
int w; /* width of current box */
491
int h; /* height of current box */
492
INTER_DECLAREG(startmask);
493
INTER_DECLAREG(endmask); /* masks for reggedy bits at either end of line */
494
int nlMiddle; /* number of longwords between sides of boxes */
496
register int nl; /* loop version of nlMiddle */
497
int srcy; /* current tile y position */
498
int srcx; /* current tile x position */
499
int srcRemaining; /* number of longwords remaining in source */
500
int xoffDst, xoffSrc;
501
int srcStart; /* number of longwords source offset at left of box */
502
int leftShift, rightShift;
504
INTER_MROP_DECLARE_REG()
506
INTER_DECLAREG(*pdstBase); /* pointer to start of dest */
507
INTER_DECLAREG(*pdstLine); /* poitner to start of dest box */
508
INTER_DECLAREG(*psrcBase); /* pointer to start of source */
509
INTER_DECLAREG(*psrcLine); /* pointer to fetch point of source */
510
INTER_DECLAREG(*psrcStart); /* pointer to start of source line */
511
INTER_DECLAREG(*pdst);
512
INTER_DECLAREG(*psrc);
513
INTER_DECLAREGP(bits);
514
INTER_DECLAREGP(bits1);
517
INTER_MROP_INITIALIZE (alu, planemask)
519
psrcBase = (unsigned short *)tile->devPrivate.ptr;
520
tileHeight = tile->drawable.height;
521
tileWidth = tile->drawable.width;
522
widthSrc = tile->devKind / (INTER_PGSZB * INTER_PLANES);
524
iplGetGroupWidthAndPointer (pDrawable, widthDst, pdstBase)
528
w = pBox->x2 - pBox->x1;
529
h = pBox->y2 - pBox->y1;
532
modulus (pBox->x1 - xrot, tileWidth, srcx);
533
modulus (pBox->y1 - yrot, tileHeight, srcy);
534
xoffSrc = srcx & INTER_PIM;
535
srcStart = srcx >> INTER_PGSH;
536
psrcStart = psrcBase + (srcy * widthSrc) * INTER_PLANES;
537
psrcLine = psrcStart + srcStart * INTER_PLANES;
540
xoffDst = pBox->x1 & INTER_PIM;
541
pdstLine = pdstBase + (pBox->y1 * widthDst) +
542
(pBox->x1 >> INTER_PGSH) * INTER_PLANES;
544
if (xoffDst + w < INTER_PPG)
546
INTER_maskpartialbits(pBox->x1, w, startmask);
552
INTER_maskbits (pBox->x1, w, startmask, endmask, nlMiddle)
554
if (xoffSrc == xoffDst)
560
srcRemaining = widthSrc - srcStart;
563
INTER_MROP_MASK (psrc, pdst, startmask, pdst);
564
INTER_NEXT_GROUP(pdst);
571
if (nl > srcRemaining)
578
INTER_MROP_SOLID (psrc, pdst, pdst);
579
INTER_NEXT_GROUP(pdst); INTER_NEXT_GROUP(psrc);
584
srcRemaining = widthSrc;
590
INTER_MROP_MASK (psrc, pdst, endmask, pdst);
592
pdstLine += widthDst;
593
psrcLine += widthSrc * INTER_PLANES;
594
psrcStart += widthSrc * INTER_PLANES;
595
if (++srcy == tileHeight)
597
psrcStart = psrcBase;
598
psrcLine = psrcStart + srcStart * INTER_PLANES;
605
if (xoffSrc > xoffDst)
607
leftShift = (xoffSrc - xoffDst) << LEFTSHIFT_AMT;
608
rightShift = INTER_PGSZ - leftShift;
612
rightShift = (xoffDst - xoffSrc) << LEFTSHIFT_AMT;
613
leftShift = INTER_PGSZ - rightShift;
620
srcRemaining = widthSrc - srcStart;
621
if (xoffSrc > xoffDst)
623
INTER_COPY(psrc, bits);
628
INTER_SCRLEFT(leftShift, bits, bits1);
629
INTER_COPY(psrc, bits);
631
INTER_MSKINSM(~0, 0, bits1, ~0, rightShift, bits, bits1);
632
INTER_MROP_MASK(bits1, pdst, startmask, pdst);
633
INTER_NEXT_GROUP(pdst);
639
if (nl > srcRemaining)
646
INTER_SCRLEFT(leftShift, bits, bits1);
647
INTER_COPY(psrc, bits); INTER_NEXT_GROUP(psrc);
648
INTER_MSKINSM(~0, 0, bits1, ~0, rightShift, bits, bits1);
649
INTER_MROP_SOLID (bits1, pdst, pdst);
650
INTER_NEXT_GROUP(pdst);
655
srcRemaining = widthSrc;
662
INTER_SCRLEFT(leftShift, bits, bits1);
663
if (endmask << rightShift)
665
INTER_COPY(psrc, bits);
666
INTER_MSKINSM(~0, 0, bits1, ~0, rightShift, bits, bits1);
668
INTER_MROP_MASK (bits1, pdst, endmask, pdst);
670
pdstLine += widthDst;
671
psrcLine += widthSrc * INTER_PLANES;
672
psrcStart += widthSrc * INTER_PLANES;
673
if (++srcy == tileHeight)
675
psrcStart = psrcBase;
676
psrcLine = psrcStart + srcStart * INTER_PLANES;
686
INTER_MROP_NAME(iplFillSpanTile32s) (pDrawable, n, ppt, pwidth, tile, xrot, yrot, alu, planemask)
687
DrawablePtr pDrawable;
694
unsigned long planemask;
696
int tileWidth; /* width of tile */
697
int tileHeight; /* height of the tile */
698
int widthSrc; /* width in longwords of the source tile */
700
int widthDst; /* width in longwords of the dest pixmap */
701
int w; /* width of current box */
702
INTER_DECLAREG(startmask);
703
INTER_DECLAREG(endmask);/* masks for reggedy bits at either end of line */
704
int nlMiddle; /* number of longwords between sides of boxes */
706
register int nl; /* loop version of nlMiddle */
707
int srcy; /* current tile y position */
708
int srcx; /* current tile x position */
709
int srcRemaining; /* number of longwords remaining in source */
710
int xoffDst, xoffSrc;
711
int srcStart; /* number of longwords source offset at left of box */
712
int leftShift, rightShift;
714
INTER_MROP_DECLARE_REG()
716
INTER_DECLAREG(*pdstBase); /* pointer to start of dest */
717
INTER_DECLAREG(*pdstLine); /* poitner to start of dest box */
718
INTER_DECLAREG(*psrcBase); /* pointer to start of source */
719
INTER_DECLAREG(*psrcLine); /* pointer to fetch point of source */
720
INTER_DECLAREG(*psrcStart); /* pointer to start of source line */
721
INTER_DECLAREG(*pdst);
722
INTER_DECLAREG(*psrc);
723
INTER_DECLAREGP(bits);
724
INTER_DECLAREGP(bits1);
727
INTER_MROP_INITIALIZE (alu, planemask)
729
psrcBase = (unsigned short *)tile->devPrivate.ptr;
730
tileHeight = tile->drawable.height;
731
tileWidth = tile->drawable.width;
732
widthSrc = tile->devKind / (INTER_PGSZB * INTER_PLANES);
734
iplGetGroupWidthAndPointer (pDrawable, widthDst, pdstBase)
741
modulus (ppt->x - xrot, tileWidth, srcx);
742
modulus (ppt->y - yrot, tileHeight, srcy);
743
xoffSrc = srcx & INTER_PIM;
744
srcStart = srcx >> INTER_PGSH;
745
psrcStart = psrcBase + (srcy * widthSrc) * INTER_PLANES;
746
psrcLine = psrcStart + srcStart * INTER_PLANES;
749
xoffDst = ppt->x & INTER_PIM;
750
pdstLine = pdstBase + (ppt->y * widthDst) +
751
(ppt->x >> INTER_PGSH) * INTER_PLANES;
753
if (xoffDst + w < INTER_PPG)
755
INTER_maskpartialbits(ppt->x, w, startmask);
761
INTER_maskbits (ppt->x, w, startmask, endmask, nlMiddle)
764
if (xoffSrc == xoffDst)
768
srcRemaining = widthSrc - srcStart;
771
INTER_MROP_MASK (psrc, pdst, startmask, pdst);
772
INTER_NEXT_GROUP(pdst);
779
if (nl > srcRemaining)
786
INTER_MROP_SOLID (psrc, pdst, pdst);
787
INTER_NEXT_GROUP(pdst); INTER_NEXT_GROUP(psrc);
792
srcRemaining = widthSrc;
798
INTER_MROP_MASK (psrc, pdst, endmask, pdst);
803
if (xoffSrc > xoffDst)
805
leftShift = (xoffSrc - xoffDst) << LEFTSHIFT_AMT;
806
rightShift = INTER_PGSZ - leftShift;
810
rightShift = (xoffDst - xoffSrc) << LEFTSHIFT_AMT;
811
leftShift = INTER_PGSZ - rightShift;
816
srcRemaining = widthSrc - srcStart;
817
if (xoffSrc > xoffDst)
819
INTER_COPY(psrc, bits);
824
INTER_SCRLEFT(leftShift, bits, bits1);
825
INTER_COPY(psrc, bits);
827
INTER_MSKINSM(~0, 0, bits1, ~0, rightShift, bits, bits1);
828
INTER_MROP_MASK(bits1, pdst, startmask, pdst);
829
INTER_NEXT_GROUP(pdst);
835
if (nl > srcRemaining)
842
INTER_SCRLEFT(leftShift, bits, bits1);
843
INTER_COPY(psrc, bits); INTER_NEXT_GROUP(psrc);
844
INTER_MSKINSM(~0, 0, bits1, ~0, rightShift, bits, bits1);
845
INTER_MROP_SOLID(bits1, pdst, pdst);
846
INTER_NEXT_GROUP(pdst);
851
srcRemaining = widthSrc;
858
INTER_SCRLEFT(leftShift, bits, bits1);
859
if (endmask << rightShift)
861
INTER_COPY(psrc, bits);
862
INTER_MSKINSM(~0, 0, bits1, ~0, rightShift, bits, bits1);
864
INTER_MROP_MASK (bits1, pdst, endmask, pdst);