r4493@vps: verhaegs | 2007-04-19 14:44:00 -0400
[AROS.git] / rom / hyperlayers / beginupdate.c
blobc4993df78820db7592c1e1ae2c4f02764c3d3f04
1 /*
2 Copyright © 1995-2001, The AROS Development Team. All rights reserved.
3 $Id$
5 Desc:
6 Lang: english
7 */
8 #include <aros/libcall.h>
9 #include <graphics/clip.h>
10 #include <exec/types.h>
11 #include <proto/exec.h>
12 #include <graphics/layers.h>
13 #include <proto/graphics.h>
14 #include <proto/layers.h>
15 #include "layers_intern.h"
16 #include "basicfuncs.h"
18 /*****************************************************************************
20 NAME */
22 AROS_LH1(LONG, BeginUpdate,
24 /* SYNOPSIS */
25 AROS_LHA(struct Layer *, l, A0),
27 /* LOCATION */
28 struct LayersBase *, LayersBase, 13, Layers)
30 /* FUNCTION
31 Converts the damage list to ClipRects and exchanges the
32 two lists for faster redrawing. This routine allows a
33 faster update of the display as it will only be rendered
34 in the damaged areas.
35 This routine will automatically lock the layer to prevent
36 changes.
38 INPUTS
39 l - pointer to layer
41 RESULT
42 TRUE if damage list conversion was successful
43 FALSE if list could not be converted.
45 NOTES
47 EXAMPLE
49 BUGS
51 SEE ALSO
52 EndUpdate()
54 INTERNALS
56 HISTORY
57 27-11-96 digulla automatically created from
58 layers_lib.fd and clib/layers_protos.h
60 *****************************************************************************/
62 AROS_LIBFUNC_INIT
63 AROS_LIBBASE_EXT_DECL(struct LayersBase *,LayersBase)
65 struct Region *damage_region, *visible_damage_region;
66 /*
67 ** Convert the list of regionrectangles in the damage list
68 ** to a cliprect list.
71 LockLayer(0, l);
73 l->cr2 = l->ClipRect;
76 if (l->ClipRegion)
77 damage_region = AndRegionRegionND(l->ClipRegion, l->DamageList);
78 else
79 damage_region = CopyRegion(l->DamageList);
81 /* The DamageList is in layer coords. So convert it to screen coords */
83 _TranslateRect(&damage_region->bounds, l->bounds.MinX, l->bounds.MinY);
85 AndRectRegion(damage_region, &l->bounds);
87 visible_damage_region = AndRegionRegionND(l->VisibleRegion, damage_region);
88 AndRegionRegion(l->visibleshape, visible_damage_region);
90 if (l->shaperegion)
92 _TranslateRect(&visible_damage_region->bounds, -l->bounds.MinX, -l->bounds.MinY);
93 AndRegionRegion(l->shaperegion, visible_damage_region);
94 _TranslateRect(&visible_damage_region->bounds, l->bounds.MinX, l->bounds.MinY);
97 l->ClipRect = _CreateClipRectsFromRegion(visible_damage_region,
99 FALSE,
100 damage_region,
101 LayersBase);
103 if (IS_SMARTREFRESH(l))
105 _CopyClipRectsToClipRects(l,
106 l->cr2,
107 l->ClipRect,
110 FALSE,
111 FALSE,
112 FALSE,
113 LayersBase);
117 DisposeRegion(damage_region);
118 DisposeRegion(visible_damage_region);
121 ** Must not set flag before InstallClipRegion!!! Keep this order!!!
123 l-> Flags |= LAYERUPDATING;
125 return TRUE;
127 AROS_LIBFUNC_EXIT
128 } /* BeginUpdate */