2 Copyright © 1995-2001, The AROS Development Team. All rights reserved.
5 Desc: Graphics function ScrollRaster()
8 #include "graphics_intern.h"
9 #include <graphics/rastport.h>
10 #include "gfxfuncsupport.h"
12 /*****************************************************************************
15 #include <graphics/rastport.h>
16 #include <proto/graphics.h>
18 AROS_LH7(void, ScrollRaster
,
21 AROS_LHA(struct RastPort
*, rp
, A1
),
22 AROS_LHA(LONG
, dx
, D0
),
23 AROS_LHA(LONG
, dy
, D1
),
24 AROS_LHA(LONG
, xMin
, D2
),
25 AROS_LHA(LONG
, yMin
, D3
),
26 AROS_LHA(LONG
, xMax
, D4
),
27 AROS_LHA(LONG
, yMax
, D5
),
30 struct GfxBase
*, GfxBase
, 66, Graphics
)
33 Scroll the contents of a rastport (dx,dy) towards (0,0).
34 The empty spaces is filled by a call to RectFill().
35 Only the pixel in the rectangle (xMin,yMin)-(xMax,yMax)
36 will be affected. The lower right corner (xMax, yMax) is
37 automatically adjusted to the lower right corner in case
39 After this operation the Flags bit of the layer associated
40 with this rastport, if there is any layer, should be tested
41 for simple layers in case there has any damage been created.
45 rp - pointer to rastport
46 dx,dy - distance to move in x and y direction. Positive values go
48 xMin,yMin - upper left hand corner of the affected rectangle
49 xMax,yMax - lower right hand corner of the affected rectangle
64 29-10-95 digulla automatically created from
65 graphics_lib.fd and clib/graphics_protos.h
67 *****************************************************************************/
70 AROS_LIBBASE_EXT_DECL(struct GfxBase
*,GfxBase
)
72 ULONG old_drmd
= GetDrMd(rp
);
73 LONG width
, height
, absdx
, absdy
;
80 if ((xMin
> xMax
) || (yMin
> yMax
)) return;
83 This function will simply call ScrollRaster() and fill the empty
84 space with calls to RectFill
88 adjust xMax and yMax in case the lower right corner would be outside
91 /* Is it a window's rastport ? */
92 if (NULL
!= rp
->Layer
)
94 struct Layer
* L
= rp
->Layer
;
96 if (xMax
> (L
->bounds
.MaxX
- L
->bounds
.MinX
) )
97 xMax
= (L
->bounds
.MaxX
- L
->bounds
.MinX
) ;
99 if (yMax
> (L
->bounds
.MaxY
- L
->bounds
.MinY
) )
100 yMax
= (L
->bounds
.MaxY
- L
->bounds
.MinY
) ;
105 /* this one belongs to a screen */
106 struct BitMap
* bm
= rp
->BitMap
;
107 ULONG width
= GetBitMapAttr(bm
, BMA_WIDTH
);
108 ULONG height
= GetBitMapAttr(bm
, BMA_HEIGHT
);
109 if ((ULONG
)xMax
>= width
)
111 if ((ULONG
)yMax
>= height
)
115 absdx
= (dx
>= 0) ? dx
: -dx
;
116 absdy
= (dy
>= 0) ? dy
: -dy
;
118 width
= xMax
- xMin
+ 1;
119 height
= yMax
- yMin
+ 1;
121 if ((width
< 1) || (height
< 1)) return;
123 if ((absdx
>= width
) || (absdy
>= height
))
125 SetDrMd(rp
, old_drmd
^ INVERSVID
);
126 RectFill(rp
, xMin
, yMin
, xMax
, yMax
);
127 SetDrMd(rp
, old_drmd
);
132 if (FALSE
== MoveRaster(rp
, dx
, dy
, xMin
, yMin
, xMax
, yMax
, TRUE
, GfxBase
))
136 The raster is scrolled and I fill the empty area with the
140 SetDrMd(rp
, old_drmd
^ INVERSVID
);
142 /* was it scrolled left or right? */
147 /* scrolled towards left, clearing on the right */
156 /* scrolled towards right, clearing on the left */
160 xMin
- dx
- 1, /* a scroll by -1 should only erase a row of width 1 */
169 /* scrolled up, clearing on the bottom */
178 /* scrolled down, clearing on the top */
187 SetDrMd(rp
, old_drmd
);