grub2: bring back build of aros-side grub2 tools
[AROS.git] / rom / graphics / scrollrasterbf.c
blob870970d1ef6d8b3744c7df1b933ed3c1dcac1c9d
1 /*
2 Copyright © 1995-2007, The AROS Development Team. All rights reserved.
3 $Id$
5 Desc: Graphics function ScrollRasterBF()
6 Lang: english
7 */
8 #include "graphics_intern.h"
9 #include <graphics/rastport.h>
10 #include <graphics/gfx.h>
11 #include "gfxfuncsupport.h"
13 /*****************************************************************************
15 NAME */
16 #include <graphics/rastport.h>
17 #include <proto/graphics.h>
19 AROS_LH7(void, ScrollRasterBF,
21 /* SYNOPSIS */
22 AROS_LHA(struct RastPort *, rp, A1),
23 AROS_LHA(LONG , dx, D0),
24 AROS_LHA(LONG , dy, D1),
25 AROS_LHA(LONG , xMin, D2),
26 AROS_LHA(LONG , yMin, D3),
27 AROS_LHA(LONG , xMax, D4),
28 AROS_LHA(LONG , yMax, D5),
30 /* LOCATION */
31 struct GfxBase *, GfxBase, 167, Graphics)
33 /* FUNCTION
34 Scroll the contents of a rastport (dx,dy) towards (0,0).
35 The empty spaces is filled by a call to EraseRect().
36 Only the pixel in the rectangle (xMin,yMin)-(xMax,yMax)
37 will be affected. The lower right corner (xMax, yMax) is
38 automatically adjusted to the lower right corner in case
39 it would be outside.
40 After this operation the Flags bit of the layer associated
41 with this rastport, if there is any layer, should be tested
42 for simple layers in case there has any damage been created.
45 INPUTS
46 rp - pointer to rastport
47 dx,dy - distance to move in x and y direction. Positive values go
48 towards (0,0)
49 xMin,yMin - upper left hand corner of the affected rectangle
50 xMax,yMax - lower right hand corner of the affected rectangle
52 RESULT
54 NOTES
56 EXAMPLE
58 BUGS
60 SEE ALSO
62 INTERNALS
64 HISTORY
66 *****************************************************************************/
68 AROS_LIBFUNC_INIT
70 LONG width, height, absdx, absdy;
72 FIX_GFXCOORD(xMin);
73 FIX_GFXCOORD(yMin);
74 FIX_GFXCOORD(xMax);
75 FIX_GFXCOORD(yMax);
77 if ((xMin > xMax) || (yMin > yMax)) return;
80 This function will simply call ScrollRaster() and fill the empty
81 space with calls to EraseRect()
85 adjust xMax and yMax in case the lower right corner would be outside
86 the rastport
88 /* Is it a window's rastport ? */
89 if (NULL != rp->Layer)
91 struct Layer * L = rp->Layer;
93 if (xMax > (L->bounds.MaxX - L->bounds.MinX) )
94 xMax = (L->bounds.MaxX - L->bounds.MinX) ;
96 if (yMax > (L->bounds.MaxY - L->bounds.MinY) )
97 yMax = (L->bounds.MaxY - L->bounds.MinY) ;
100 else
102 /* this one belongs to a screen */
103 struct BitMap * bm = rp->BitMap;
105 ULONG width = GetBitMapAttr(bm, BMA_WIDTH);
106 ULONG height = GetBitMapAttr(bm, BMA_HEIGHT);
108 if ((ULONG)xMax >= width )
109 xMax = width - 1;
111 if ((ULONG)yMax >= height)
112 yMax = height - 1;
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 EraseRect(rp, xMin, yMin, xMax, yMax);
126 return;
130 if (!MoveRaster(rp, dx, dy, xMin, yMin, xMax, yMax, TRUE, GfxBase))
131 return;
134 The raster is scrolled and I fill the empty area with the
135 EraseRect()
138 /* was it scrolled left or right? */
139 if (0 != dx)
141 if (dx > 0)
143 /* scrolled towards left, clearing on the right */
144 EraseRect(rp,
145 xMax - dx + 1,
146 yMin,
147 xMax,
148 yMax);
150 else
152 /* scrolled towards right, clearing on the left */
153 EraseRect(rp,
154 xMin,
155 yMin,
156 xMin - dx - 1, /* a scroll by -1 should only erase a row of width 1 */
157 yMax);
161 if (0 != dy)
163 if (dy > 0)
165 /* scrolled up, clearing on the bottom */
166 EraseRect(rp,
167 xMin,
168 yMax - dy + 1,
169 xMax,
170 yMax);
172 else
174 /* scrolled down, clearing on the top */
175 EraseRect(rp,
176 xMin,
177 yMin,
178 xMax,
179 yMin - dy - 1);
184 AROS_LIBFUNC_EXIT
185 } /* ScrollRasterBF */