2 #ifdef HAVE_XORG_CONFIG_H
3 #include <xorg-config.h>
8 #include "xf86_OSproc.h"
11 #include "scrnintstr.h"
12 #include "pixmapstr.h"
18 static void XAARenderSolidRects(GCPtr
, int, BoxPtr
, int, int);
19 static void XAARenderColor8x8Rects(GCPtr
, int, BoxPtr
, int, int);
20 static void XAARenderMono8x8Rects(GCPtr
, int, BoxPtr
, int, int);
21 static void XAARenderColorExpandRects(GCPtr
, int, BoxPtr
, int, int);
22 static void XAARenderCacheExpandRects(GCPtr
, int, BoxPtr
, int, int);
23 static void XAARenderCacheBltRects(GCPtr
, int, BoxPtr
, int, int);
24 static void XAARenderImageWriteRects(GCPtr
, int, BoxPtr
, int, int);
25 static void XAARenderPixmapCopyRects(GCPtr
, int, BoxPtr
, int, int);
31 int nrectFill
, /* number of rectangles to fill */
32 xRectangle
*prectInit
/* Pointer to first rectangle to fill */
34 XAAInfoRecPtr infoRec
= GET_XAAINFORECPTR_FROM_GC(pGC
);
38 ClipAndRenderRectsFunc function
;
40 if((nrectFill
<= 0) || !pGC
->planemask
)
43 if(!REGION_NUM_RECTS(pGC
->pCompositeClip
))
46 switch(pGC
->fillStyle
) {
51 type
= (*infoRec
->StippledFillChooser
)(pGC
);
53 case FillOpaqueStippled
:
54 if((pGC
->fgPixel
== pGC
->bgPixel
) && infoRec
->FillSolidRects
&&
55 CHECK_PLANEMASK(pGC
,infoRec
->FillSolidRectsFlags
) &&
56 CHECK_ROP(pGC
,infoRec
->FillSolidRectsFlags
) &&
57 CHECK_ROPSRC(pGC
,infoRec
->FillSolidRectsFlags
) &&
58 CHECK_FG(pGC
,infoRec
->FillSolidRectsFlags
))
61 type
= (*infoRec
->OpaqueStippledFillChooser
)(pGC
);
64 type
= (*infoRec
->TiledFillChooser
)(pGC
);
70 function
= XAARenderSolidRects
;
73 function
= XAARenderColor8x8Rects
;
76 function
= XAARenderMono8x8Rects
;
79 function
= XAARenderCacheBltRects
;
82 function
= XAARenderColorExpandRects
;
85 function
= XAARenderCacheExpandRects
;
88 function
= XAARenderImageWriteRects
;
91 function
= XAARenderPixmapCopyRects
;
94 (*XAAFallbackOps
.PolyFillRect
)(pDraw
, pGC
, nrectFill
, prectInit
);
100 xRectangle
*prect
= prectInit
;
110 XAAClipAndRenderRects(pGC
, function
, nrectFill
, prectInit
, xorg
, yorg
);
115 /*********************\
117 \*********************/
126 XAAInfoRecPtr infoRec
= GET_XAAINFORECPTR_FROM_GC(pGC
);
128 (*infoRec
->FillSolidRects
) (infoRec
->pScrn
,
129 pGC
->fgPixel
, pGC
->alu
, pGC
->planemask
, nboxes
, pClipBoxes
);
133 /************************\
135 \************************/
138 XAARenderMono8x8Rects(
144 XAAInfoRecPtr infoRec
= GET_XAAINFORECPTR_FROM_GC(pGC
);
148 switch(pGC
->fillStyle
) {
150 pPriv
= XAA_GET_PIXMAP_PRIVATE(pGC
->stipple
);
151 fg
= pGC
->fgPixel
; bg
= -1;
153 case FillOpaqueStippled
:
154 pPriv
= XAA_GET_PIXMAP_PRIVATE(pGC
->stipple
);
155 fg
= pGC
->fgPixel
; bg
= pGC
->bgPixel
;
158 pPriv
= XAA_GET_PIXMAP_PRIVATE(pGC
->tile
.pixmap
);
159 fg
= pPriv
->fg
; bg
= pPriv
->bg
;
161 default: /* Muffle compiler */
162 pPriv
= NULL
; /* Kaboom */
167 (*infoRec
->FillMono8x8PatternRects
) (infoRec
->pScrn
,
168 fg
, bg
, pGC
->alu
, pGC
->planemask
,
169 nboxes
, pClipBoxes
, pPriv
->pattern0
, pPriv
->pattern1
,
170 (xorg
+ pGC
->patOrg
.x
), (yorg
+ pGC
->patOrg
.y
));
173 /*************************\
175 \*************************/
178 XAARenderColor8x8Rects(
184 XAAInfoRecPtr infoRec
= GET_XAAINFORECPTR_FROM_GC(pGC
);
185 XAACacheInfoPtr pCache
;
189 switch(pGC
->fillStyle
) {
192 fg
= pGC
->fgPixel
; bg
= -1;
194 case FillOpaqueStippled
:
196 fg
= pGC
->fgPixel
; bg
= pGC
->bgPixel
;
199 pPix
= pGC
->tile
.pixmap
;
202 default: /* Muffle compiler */
208 pCache
= (*infoRec
->CacheColor8x8Pattern
)(infoRec
->pScrn
, pPix
, fg
, bg
);
209 (*infoRec
->FillColor8x8PatternRects
) (infoRec
->pScrn
,
210 pGC
->alu
, pGC
->planemask
, nboxes
, pClipBoxes
,
211 (xorg
+ pGC
->patOrg
.x
), (yorg
+ pGC
->patOrg
.y
), pCache
);
215 /****************************\
216 | Color Expand Rects |
217 \****************************/
220 XAARenderColorExpandRects(
226 XAAInfoRecPtr infoRec
= GET_XAAINFORECPTR_FROM_GC(pGC
);
229 switch(pGC
->fillStyle
) {
231 fg
= pGC
->fgPixel
; bg
= -1;
233 case FillOpaqueStippled
:
234 fg
= pGC
->fgPixel
; bg
= pGC
->bgPixel
;
236 default: /* Muffle compiler */
241 (*infoRec
->FillColorExpandRects
) (infoRec
->pScrn
, fg
, bg
,
242 pGC
->alu
, pGC
->planemask
, nboxes
, pClipBoxes
,
243 (xorg
+ pGC
->patOrg
.x
), (yorg
+ pGC
->patOrg
.y
),
248 /*************************\
250 \*************************/
253 XAARenderCacheBltRects(
259 XAAInfoRecPtr infoRec
= GET_XAAINFORECPTR_FROM_GC(pGC
);
260 XAACacheInfoPtr pCache
;
262 switch(pGC
->fillStyle
) {
264 pCache
= (*infoRec
->CacheStipple
)(infoRec
->pScrn
, pGC
->stipple
,
267 case FillOpaqueStippled
:
268 pCache
= (*infoRec
->CacheStipple
)(infoRec
->pScrn
, pGC
->stipple
,
269 pGC
->fgPixel
, pGC
->bgPixel
);
272 pCache
= (*infoRec
->CacheTile
)(infoRec
->pScrn
, pGC
->tile
.pixmap
);
274 default: /* Muffle compiler */
279 (*infoRec
->FillCacheBltRects
) (infoRec
->pScrn
, pGC
->alu
,
280 pGC
->planemask
, nboxes
, pClipBoxes
,
281 (xorg
+ pGC
->patOrg
.x
), (yorg
+ pGC
->patOrg
.y
), pCache
);
285 /****************************\
286 | Cache Expand Rects |
287 \****************************/
290 XAARenderCacheExpandRects(
296 XAAInfoRecPtr infoRec
= GET_XAAINFORECPTR_FROM_GC(pGC
);
299 switch(pGC
->fillStyle
) {
301 fg
= pGC
->fgPixel
; bg
= -1;
303 case FillOpaqueStippled
:
304 fg
= pGC
->fgPixel
; bg
= pGC
->bgPixel
;
306 default: /* Muffle compiler */
311 (*infoRec
->FillCacheExpandRects
) (infoRec
->pScrn
, fg
, bg
,
312 pGC
->alu
, pGC
->planemask
, nboxes
, pClipBoxes
,
313 (xorg
+ pGC
->patOrg
.x
), (yorg
+ pGC
->patOrg
.y
),
319 /***************************\
320 | Image Write Rects |
321 \***************************/
324 XAARenderImageWriteRects(
330 XAAInfoRecPtr infoRec
= GET_XAAINFORECPTR_FROM_GC(pGC
);
332 (*infoRec
->FillImageWriteRects
) (infoRec
->pScrn
, pGC
->alu
,
333 pGC
->planemask
, nboxes
, pClipBoxes
,
334 (xorg
+ pGC
->patOrg
.x
), (yorg
+ pGC
->patOrg
.y
),
340 /***************************\
341 | Pixmap Copy Rects |
342 \***************************/
345 XAARenderPixmapCopyRects(
351 XAAInfoRecPtr infoRec
= GET_XAAINFORECPTR_FROM_GC(pGC
);
352 XAACacheInfoPtr pCache
= &(infoRec
->ScratchCacheInfoRec
);
353 XAAPixmapPtr pPriv
= XAA_GET_PIXMAP_PRIVATE(pGC
->tile
.pixmap
);
355 pCache
->x
= pPriv
->offscreenArea
->box
.x1
;
356 pCache
->y
= pPriv
->offscreenArea
->box
.y1
;
357 pCache
->w
= pCache
->orig_w
=
358 pPriv
->offscreenArea
->box
.x2
- pCache
->x
;
359 pCache
->h
= pCache
->orig_h
=
360 pPriv
->offscreenArea
->box
.y2
- pCache
->y
;
361 pCache
->trans_color
= -1;
363 (*infoRec
->FillCacheBltRects
) (infoRec
->pScrn
, pGC
->alu
,
364 pGC
->planemask
, nboxes
, pClipBoxes
,
365 (xorg
+ pGC
->patOrg
.x
), (yorg
+ pGC
->patOrg
.y
),
379 unsigned int planemask
,
380 int nBox
, /* number of rectangles to fill */
381 BoxPtr pBox
/* Pointer to first rectangle to fill */
383 XAAInfoRecPtr infoRec
= GET_XAAINFORECPTR_FROM_SCRNINFOPTR(pScrn
);
385 (*infoRec
->SetupForSolidFill
)(pScrn
, fg
, rop
, planemask
);
387 (*infoRec
->SubsequentSolidFillRect
)(pScrn
, pBox
->x1
, pBox
->y1
,
388 pBox
->x2
- pBox
->x1
, pBox
->y2
- pBox
->y1
);
391 SET_SYNC_FLAG(infoRec
);
397 /*********************\
398 | 8x8 Mono Patterns |
399 \*********************/
403 XAAFillMono8x8PatternRectsScreenOrigin(
405 int fg
, int bg
, int rop
,
406 unsigned int planemask
,
409 int pattern0
, int pattern1
,
410 int xorigin
, int yorigin
413 XAAInfoRecPtr infoRec
= GET_XAAINFORECPTR_FROM_SCRNINFOPTR(pScrn
);
414 int patx
= pattern0
, paty
= pattern1
;
415 int xorg
= (-xorigin
) & 0x07;
416 int yorg
= (-yorigin
) & 0x07;
419 if(infoRec
->Mono8x8PatternFillFlags
& HARDWARE_PATTERN_PROGRAMMED_BITS
) {
420 if(!(infoRec
->Mono8x8PatternFillFlags
&
421 HARDWARE_PATTERN_PROGRAMMED_ORIGIN
)){
422 XAARotateMonoPattern(&patx
, &paty
, xorg
, yorg
,
423 (infoRec
->Mono8x8PatternFillFlags
&
424 BIT_ORDER_IN_BYTE_MSBFIRST
));
425 xorg
= patx
; yorg
= paty
;
428 XAACacheInfoPtr pCache
=
429 (*infoRec
->CacheMono8x8Pattern
)(pScrn
, pattern0
, pattern1
);
430 patx
= pCache
->x
; paty
= pCache
->y
;
431 if(!(infoRec
->Mono8x8PatternFillFlags
&
432 HARDWARE_PATTERN_PROGRAMMED_ORIGIN
)){
433 int slot
= (yorg
<< 3) + xorg
;
434 patx
+= pCache
->offsets
[slot
].x
;
435 paty
+= pCache
->offsets
[slot
].y
;
436 xorg
= patx
; yorg
= paty
;
440 (*infoRec
->SetupForMono8x8PatternFill
)(pScrn
, patx
, paty
,
441 fg
, bg
, rop
, planemask
);
444 (*infoRec
->SubsequentMono8x8PatternFillRect
)(pScrn
,
445 xorg
, yorg
, pBox
->x1
, pBox
->y1
,
446 pBox
->x2
- pBox
->x1
, pBox
->y2
- pBox
->y1
);
449 SET_SYNC_FLAG(infoRec
);
453 XAAFillMono8x8PatternRects(
455 int fg
, int bg
, int rop
,
456 unsigned int planemask
,
459 int pattern0
, int pattern1
,
460 int xorigin
, int yorigin
463 XAAInfoRecPtr infoRec
= GET_XAAINFORECPTR_FROM_SCRNINFOPTR(pScrn
);
464 int patx
= pattern0
, paty
= pattern1
;
466 XAACacheInfoPtr pCache
= NULL
;
469 if(!(infoRec
->Mono8x8PatternFillFlags
& HARDWARE_PATTERN_PROGRAMMED_BITS
)){
470 pCache
= (*infoRec
->CacheMono8x8Pattern
)(pScrn
, pattern0
, pattern1
);
471 patx
= pCache
->x
; paty
= pCache
->y
;
475 (*infoRec
->SetupForMono8x8PatternFill
)(pScrn
, patx
, paty
,
476 fg
, bg
, rop
, planemask
);
480 xorg
= (pBox
->x1
- xorigin
) & 0x07;
481 yorg
= (pBox
->y1
- yorigin
) & 0x07;
483 if(!(infoRec
->Mono8x8PatternFillFlags
&
484 HARDWARE_PATTERN_PROGRAMMED_ORIGIN
)){
485 if(infoRec
->Mono8x8PatternFillFlags
&
486 HARDWARE_PATTERN_PROGRAMMED_BITS
) {
487 patx
= pattern0
; paty
= pattern1
;
488 XAARotateMonoPattern(&patx
, &paty
, xorg
, yorg
,
489 (infoRec
->Mono8x8PatternFillFlags
&
490 BIT_ORDER_IN_BYTE_MSBFIRST
));
491 xorg
= patx
; yorg
= paty
;
493 int slot
= (yorg
<< 3) + xorg
;
494 xorg
= patx
+ pCache
->offsets
[slot
].x
;
495 yorg
= paty
+ pCache
->offsets
[slot
].y
;
499 (*infoRec
->SubsequentMono8x8PatternFillRect
)(pScrn
,
500 xorg
, yorg
, pBox
->x1
, pBox
->y1
,
501 pBox
->x2
- pBox
->x1
, pBox
->y2
- pBox
->y1
);
505 SET_SYNC_FLAG(infoRec
);
509 /**********************\
510 | 8x8 Color Patterns |
511 \**********************/
515 XAAFillColor8x8PatternRectsScreenOrigin(
518 unsigned int planemask
,
521 int xorigin
, int yorigin
,
522 XAACacheInfoPtr pCache
524 XAAInfoRecPtr infoRec
= GET_XAAINFORECPTR_FROM_SCRNINFOPTR(pScrn
);
525 int patx
= pCache
->x
, paty
= pCache
->y
;
526 int xorg
= (-xorigin
) & 0x07;
527 int yorg
= (-yorigin
) & 0x07;
529 if(!(infoRec
->Color8x8PatternFillFlags
&
530 HARDWARE_PATTERN_PROGRAMMED_ORIGIN
)){
531 int slot
= (yorg
<< 3) + xorg
;
532 paty
+= pCache
->offsets
[slot
].y
;
533 patx
+= pCache
->offsets
[slot
].x
;
534 xorg
= patx
; yorg
= paty
;
537 (*infoRec
->SetupForColor8x8PatternFill
)(pScrn
, patx
, paty
,
538 rop
, planemask
, pCache
->trans_color
);
541 (*infoRec
->SubsequentColor8x8PatternFillRect
)(pScrn
,
542 xorg
, yorg
, pBox
->x1
, pBox
->y1
,
543 pBox
->x2
- pBox
->x1
, pBox
->y2
- pBox
->y1
);
546 SET_SYNC_FLAG(infoRec
);
550 XAAFillColor8x8PatternRects(
553 unsigned int planemask
,
556 int xorigin
, int yorigin
,
557 XAACacheInfoPtr pCache
559 XAAInfoRecPtr infoRec
= GET_XAAINFORECPTR_FROM_SCRNINFOPTR(pScrn
);
562 (*infoRec
->SetupForColor8x8PatternFill
)(pScrn
, pCache
->x
, pCache
->y
,
563 rop
, planemask
, pCache
->trans_color
);
566 xorg
= (pBox
->x1
- xorigin
) & 0x07;
567 yorg
= (pBox
->y1
- yorigin
) & 0x07;
569 if(!(infoRec
->Color8x8PatternFillFlags
&
570 HARDWARE_PATTERN_PROGRAMMED_ORIGIN
)){
571 int slot
= (yorg
<< 3) + xorg
;
572 yorg
= pCache
->y
+ pCache
->offsets
[slot
].y
;
573 xorg
= pCache
->x
+ pCache
->offsets
[slot
].x
;
576 (*infoRec
->SubsequentColor8x8PatternFillRect
)(pScrn
,
577 xorg
, yorg
, pBox
->x1
, pBox
->y1
,
578 pBox
->x2
- pBox
->x1
, pBox
->y2
- pBox
->y1
);
582 SET_SYNC_FLAG(infoRec
);
591 XAAFillCacheBltRects(
594 unsigned int planemask
,
598 XAACacheInfoPtr pCache
600 XAAInfoRecPtr infoRec
= GET_XAAINFORECPTR_FROM_SCRNINFOPTR(pScrn
);
601 int x
, y
, phaseY
, phaseX
, skipleft
, height
, width
, w
, blit_w
, blit_h
;
603 (*infoRec
->SetupForScreenToScreenCopy
)(pScrn
, 1, 1, rop
, planemask
,
604 pCache
->trans_color
);
608 phaseY
= (y
- yorg
) % pCache
->orig_h
;
609 if(phaseY
< 0) phaseY
+= pCache
->orig_h
;
610 phaseX
= (pBox
->x1
- xorg
) % pCache
->orig_w
;
611 if(phaseX
< 0) phaseX
+= pCache
->orig_w
;
612 height
= pBox
->y2
- y
;
613 width
= pBox
->x2
- pBox
->x1
;
618 w
= width
; skipleft
= phaseX
; x
= pBox
->x1
;
619 blit_h
= pCache
->h
- phaseY
;
620 if(blit_h
> height
) blit_h
= height
;
623 blit_w
= pCache
->w
- skipleft
;
624 if(blit_w
> w
) blit_w
= w
;
625 (*infoRec
->SubsequentScreenToScreenCopy
)(pScrn
,
626 pCache
->x
+ skipleft
, pCache
->y
+ phaseY
,
627 x
, y
, blit_w
, blit_h
);
631 skipleft
= (skipleft
+ blit_w
) % pCache
->orig_w
;
632 if(blit_w
>= pCache
->orig_w
) break;
635 /* Expand horizontally */
638 if (skipleft
< 0) skipleft
+= pCache
->orig_w
;
639 blit_w
= x
- pBox
->x1
- skipleft
;
641 if (blit_w
> w
) blit_w
= w
;
642 (*infoRec
->SubsequentScreenToScreenCopy
)(pScrn
,
643 pBox
->x1
+ skipleft
, y
, x
, y
, blit_w
, blit_h
);
653 phaseY
= (phaseY
+ blit_h
) % pCache
->orig_h
;
654 if(blit_h
>= pCache
->orig_h
) break;
657 /* Expand vertically */
659 blit_w
= pBox
->x2
- pBox
->x1
;
660 phaseY
-= (pBox
->y1
- yorg
) % pCache
->orig_h
;
661 if (phaseY
< 0) phaseY
+= pCache
->orig_h
;
662 blit_h
= y
- pBox
->y1
- phaseY
;
664 if (blit_h
> height
) blit_h
= height
;
665 (*infoRec
->SubsequentScreenToScreenCopy
)(pScrn
, pBox
->x1
,
666 pBox
->y1
+ phaseY
, pBox
->x1
, y
, blit_w
, blit_h
);
676 w
= width
; skipleft
= phaseX
; x
= pBox
->x1
;
677 blit_h
= pCache
->h
- phaseY
;
678 if(blit_h
> height
) blit_h
= height
;
681 blit_w
= pCache
->w
- skipleft
;
682 if(blit_w
> w
) blit_w
= w
;
683 (*infoRec
->SubsequentScreenToScreenCopy
)(pScrn
,
684 pCache
->x
+ skipleft
, pCache
->y
+ phaseY
,
685 x
, y
, blit_w
, blit_h
);
689 skipleft
= (skipleft
+ blit_w
) % pCache
->orig_w
;
694 phaseY
= (phaseY
+ blit_h
) % pCache
->orig_h
;
700 SET_SYNC_FLAG(infoRec
);
706 /*******************\
708 \*******************/
713 XAAFillCacheExpandRects(
715 int fg
, int bg
, int rop
,
716 unsigned int planemask
,
722 XAAInfoRecPtr infoRec
= GET_XAAINFORECPTR_FROM_SCRNINFOPTR(pScrn
);
723 int x
, y
, phaseY
, phaseX
, skipleft
, height
, width
, w
, blit_w
, blit_h
;
725 XAACacheInfoPtr pCache
;
727 pCache
= (*infoRec
->CacheMonoStipple
)(pScrn
, pPix
);
729 cacheWidth
= (pCache
->w
* pScrn
->bitsPerPixel
) /
730 infoRec
->CacheColorExpandDensity
;
732 (*infoRec
->SetupForScreenToScreenColorExpandFill
)(pScrn
, fg
, bg
, rop
,
737 phaseY
= (y
- yorg
) % pCache
->orig_h
;
738 if(phaseY
< 0) phaseY
+= pCache
->orig_h
;
739 phaseX
= (pBox
->x1
- xorg
) % pCache
->orig_w
;
740 if(phaseX
< 0) phaseX
+= pCache
->orig_w
;
741 height
= pBox
->y2
- y
;
742 width
= pBox
->x2
- pBox
->x1
;
745 w
= width
; skipleft
= phaseX
; x
= pBox
->x1
;
746 blit_h
= pCache
->h
- phaseY
;
747 if(blit_h
> height
) blit_h
= height
;
750 blit_w
= cacheWidth
- skipleft
;
751 if(blit_w
> w
) blit_w
= w
;
752 (*infoRec
->SubsequentScreenToScreenColorExpandFill
)(
753 pScrn
, x
, y
, blit_w
, blit_h
,
754 pCache
->x
, pCache
->y
+ phaseY
, skipleft
);
758 skipleft
= (skipleft
+ blit_w
) % pCache
->orig_w
;
763 phaseY
= (phaseY
+ blit_h
) % pCache
->orig_h
;
768 SET_SYNC_FLAG(infoRec
);
778 /* This requires all LEFT_EDGE clipping. You get too many problems
779 with reading past the edge of the pattern otherwise */
785 int x
, int y
, int w
, int h
,
791 XAAInfoRecPtr infoRec
= GET_XAAINFORECPTR_FROM_SCRNINFOPTR(pScrn
);
793 Bool PlusOne
= FALSE
;
794 int skipleft
, dwords
;
796 pSrc
+= (Bpp
* xoff
);
798 if((skipleft
= (long)pSrc
& 0x03L
)) {
800 skipleft
= 4 - skipleft
;
808 pSrc
-= 3 * skipleft
;
809 else /* is this Alpha friendly ? */
810 pSrc
= (unsigned char*)((long)pSrc
& ~0x03L
);
813 src
= pSrc
+ (yoff
* srcwidth
);
815 dwords
= ((w
* Bpp
) + 3) >> 2;
817 if((infoRec
->ImageWriteFlags
& CPU_TRANSFER_PAD_QWORD
) &&
818 ((dwords
* h
) & 0x01)) {
822 (*infoRec
->SubsequentImageWriteRect
)(pScrn
, x
, y
, w
, h
, skipleft
);
824 if(dwords
> infoRec
->ImageWriteRange
) {
826 XAAMoveDWORDS_FixedBase((CARD32
*)infoRec
->ImageWriteBase
,
827 (CARD32
*)src
, dwords
);
830 if(yoff
>= pHeight
) {
836 if(srcwidth
== (dwords
<< 2)) {
837 int maxLines
= infoRec
->ImageWriteRange
/dwords
;
841 step
= pHeight
- yoff
;
842 if(step
> maxLines
) step
= maxLines
;
843 if(step
> h
) step
= h
;
845 XAAMoveDWORDS((CARD32
*)infoRec
->ImageWriteBase
,
846 (CARD32
*)src
, dwords
* step
);
848 src
+= (srcwidth
* step
);
850 if(yoff
>= pHeight
) {
858 XAAMoveDWORDS((CARD32
*)infoRec
->ImageWriteBase
,
859 (CARD32
*)src
, dwords
);
862 if(yoff
>= pHeight
) {
871 CARD32
* base
= (CARD32
*)infoRec
->ImageWriteBase
;
877 XAAFillImageWriteRects(
880 unsigned int planemask
,
886 XAAInfoRecPtr infoRec
= GET_XAAINFORECPTR_FROM_SCRNINFOPTR(pScrn
);
887 int x
, phaseY
, phaseX
, height
, width
, blit_w
;
888 int pHeight
= pPix
->drawable
.height
;
889 int pWidth
= pPix
->drawable
.width
;
890 int Bpp
= pPix
->drawable
.bitsPerPixel
>> 3;
891 int srcwidth
= pPix
->devKind
;
893 (*infoRec
->SetupForImageWrite
)(pScrn
, rop
, planemask
, -1,
894 pPix
->drawable
.bitsPerPixel
, pPix
->drawable
.depth
);
898 phaseY
= (pBox
->y1
- yorg
) % pHeight
;
899 if(phaseY
< 0) phaseY
+= pHeight
;
900 phaseX
= (x
- xorg
) % pWidth
;
901 if(phaseX
< 0) phaseX
+= pWidth
;
902 height
= pBox
->y2
- pBox
->y1
;
903 width
= pBox
->x2
- x
;
906 blit_w
= pWidth
- phaseX
;
907 if(blit_w
> width
) blit_w
= width
;
909 WriteColumn(pScrn
, pPix
->devPrivate
.ptr
, x
, pBox
->y1
,
910 blit_w
, height
, phaseX
, phaseY
, pHeight
, srcwidth
, Bpp
);
915 phaseX
= (phaseX
+ blit_w
) % pWidth
;
920 if(infoRec
->ImageWriteFlags
& SYNC_AFTER_IMAGE_WRITE
)
921 (*infoRec
->Sync
)(pScrn
);
922 else SET_SYNC_FLAG(infoRec
);
932 XAAClipAndRenderRects(
934 ClipAndRenderRectsFunc BoxFunc
,
939 XAAInfoRecPtr infoRec
= GET_XAAINFORECPTR_FROM_GC(pGC
);
940 int Right
, Bottom
, MaxBoxes
;
941 BoxPtr pextent
, pboxClipped
, pboxClippedBase
;
943 MaxBoxes
= infoRec
->PreAllocSize
/sizeof(BoxRec
);
944 pboxClippedBase
= (BoxPtr
)infoRec
->PreAllocMem
;
945 pboxClipped
= pboxClippedBase
;
947 if (REGION_NUM_RECTS(pGC
->pCompositeClip
) == 1) {
948 pextent
= REGION_RECTS(pGC
->pCompositeClip
);
949 while (nrectFill
--) {
950 pboxClipped
->x1
= max(pextent
->x1
, prect
->x
);
951 pboxClipped
->y1
= max(pextent
->y1
, prect
->y
);
953 Right
= (int)prect
->x
+ (int)prect
->width
;
954 pboxClipped
->x2
= min(pextent
->x2
, Right
);
956 Bottom
= (int)prect
->y
+ (int)prect
->height
;
957 pboxClipped
->y2
= min(pextent
->y2
, Bottom
);
960 if ((pboxClipped
->x1
< pboxClipped
->x2
) &&
961 (pboxClipped
->y1
< pboxClipped
->y2
)) {
963 if(pboxClipped
>= (pboxClippedBase
+ MaxBoxes
)) {
964 (*BoxFunc
)(pGC
, MaxBoxes
, pboxClippedBase
, xorg
, yorg
);
965 pboxClipped
= pboxClippedBase
;
970 pextent
= REGION_EXTENTS(pGC
->pScreen
, pGC
->pCompositeClip
);
971 while (nrectFill
--) {
975 box
.x1
= max(pextent
->x1
, prect
->x
);
976 box
.y1
= max(pextent
->y1
, prect
->y
);
978 Right
= (int)prect
->x
+ (int)prect
->width
;
979 box
.x2
= min(pextent
->x2
, Right
);
981 Bottom
= (int)prect
->y
+ (int)prect
->height
;
982 box
.y2
= min(pextent
->y2
, Bottom
);
986 if ((box
.x1
>= box
.x2
) || (box
.y1
>= box
.y2
))
989 n
= REGION_NUM_RECTS (pGC
->pCompositeClip
);
990 pbox
= REGION_RECTS(pGC
->pCompositeClip
);
992 /* clip the rectangle to each box in the clip region
993 this is logically equivalent to calling Intersect()
996 pboxClipped
->x1
= max(box
.x1
, pbox
->x1
);
997 pboxClipped
->y1
= max(box
.y1
, pbox
->y1
);
998 pboxClipped
->x2
= min(box
.x2
, pbox
->x2
);
999 pboxClipped
->y2
= min(box
.y2
, pbox
->y2
);
1002 /* see if clipping left anything */
1003 if(pboxClipped
->x1
< pboxClipped
->x2
&&
1004 pboxClipped
->y1
< pboxClipped
->y2
) {
1006 if(pboxClipped
>= (pboxClippedBase
+ MaxBoxes
)) {
1007 (*BoxFunc
)(pGC
, MaxBoxes
, pboxClippedBase
, xorg
, yorg
);
1008 pboxClipped
= pboxClippedBase
;
1015 if(pboxClipped
!= pboxClippedBase
)
1016 (*BoxFunc
)(pGC
, pboxClipped
- pboxClippedBase
, pboxClippedBase
,
1022 XAAGetRectClipBoxes(
1024 BoxPtr pboxClippedBase
,
1026 xRectangle
*prectInit
1029 BoxPtr pextent
, pboxClipped
= pboxClippedBase
;
1030 xRectangle
*prect
= prectInit
;
1031 RegionPtr prgnClip
= pGC
->pCompositeClip
;
1033 if (REGION_NUM_RECTS(prgnClip
) == 1) {
1034 pextent
= REGION_RECTS(prgnClip
);
1035 while (nrectFill
--) {
1036 pboxClipped
->x1
= max(pextent
->x1
, prect
->x
);
1037 pboxClipped
->y1
= max(pextent
->y1
, prect
->y
);
1039 Right
= (int)prect
->x
+ (int)prect
->width
;
1040 pboxClipped
->x2
= min(pextent
->x2
, Right
);
1042 Bottom
= (int)prect
->y
+ (int)prect
->height
;
1043 pboxClipped
->y2
= min(pextent
->y2
, Bottom
);
1046 if ((pboxClipped
->x1
< pboxClipped
->x2
) &&
1047 (pboxClipped
->y1
< pboxClipped
->y2
)) {
1052 pextent
= REGION_EXTENTS(pGC
->pScreen
, prgnClip
);
1053 while (nrectFill
--) {
1057 box
.x1
= max(pextent
->x1
, prect
->x
);
1058 box
.y1
= max(pextent
->y1
, prect
->y
);
1060 Right
= (int)prect
->x
+ (int)prect
->width
;
1061 box
.x2
= min(pextent
->x2
, Right
);
1063 Bottom
= (int)prect
->y
+ (int)prect
->height
;
1064 box
.y2
= min(pextent
->y2
, Bottom
);
1068 if ((box
.x1
>= box
.x2
) || (box
.y1
>= box
.y2
))
1071 n
= REGION_NUM_RECTS (prgnClip
);
1072 pbox
= REGION_RECTS(prgnClip
);
1074 /* clip the rectangle to each box in the clip region
1075 this is logically equivalent to calling Intersect()
1078 pboxClipped
->x1
= max(box
.x1
, pbox
->x1
);
1079 pboxClipped
->y1
= max(box
.y1
, pbox
->y1
);
1080 pboxClipped
->x2
= min(box
.x2
, pbox
->x2
);
1081 pboxClipped
->y2
= min(box
.y2
, pbox
->y2
);
1084 /* see if clipping left anything */
1085 if(pboxClipped
->x1
< pboxClipped
->x2
&&
1086 pboxClipped
->y1
< pboxClipped
->y2
) {
1093 return(pboxClipped
- pboxClippedBase
);