r4493@vps: verhaegs | 2007-04-19 14:44:00 -0400
[AROS.git] / rom / graphics / sortglist.c
blob8e824fa4e2e7cfdae819933ec7241abcf64fefbd
1 /*
2 Copyright © 1995-2001, The AROS Development Team. All rights reserved.
3 $Id$
5 Desc: Graphics function SortGList()
6 Lang: english
7 */
8 #include <graphics/gels.h>
9 #include <graphics/rastport.h>
10 #include "graphics_intern.h"
12 /*****************************************************************************
14 NAME */
15 #include <proto/graphics.h>
17 AROS_LH1(void, SortGList,
19 /* SYNOPSIS */
20 AROS_LHA(struct RastPort *, rp, A1),
22 /* LOCATION */
23 struct GfxBase *, GfxBase, 25, Graphics)
25 /* FUNCTION
26 Sort the current gel list by the y and x coordinates of it's
27 elements.
28 You have to call this routine prior to calling DoCollision()
29 of DrawGList or make sure that the list is sorted!
31 INPUTS
32 rp = pointer to RastPort that has an GelsInfo linked to it
34 RESULT
36 NOTES
38 EXAMPLE
40 BUGS
42 SEE ALSO
43 InitGels() DrawGList() DoCollision() graphics/rastport.h
45 INTERNALS
47 HISTORY
49 *****************************************************************************/
51 AROS_LIBFUNC_INIT
52 AROS_LIBBASE_EXT_DECL(struct GfxBase *,GfxBase)
54 struct VSprite * CorrectVSprite = rp -> GelsInfo -> gelHead;
55 struct VSprite * CurVSprite = CorrectVSprite -> NextVSprite;
57 LONG Coord = JOIN_XY_COORDS( CorrectVSprite -> X, CorrectVSprite -> Y );
59 while ( NULL != CurVSprite ) {
60 LONG NewCoord = JOIN_XY_COORDS( CurVSprite -> X, CurVSprite -> Y );
62 if (0 != CurVSprite->VSBob)
63 CurVSprite->VSBob->Flags &= ~BDRAWN;
65 if (Coord <= NewCoord) {
66 /* sorting is not necessary for this VSprite */
67 CorrectVSprite = CurVSprite;
68 CurVSprite = CurVSprite -> NextVSprite;
70 Coord = NewCoord;
71 } else {
72 struct VSprite * tmpVSprite = CorrectVSprite->PrevVSprite;
73 /*
74 The CurVSprite is at the wrong position. It has to appear
75 somewhere earlier in the list.
78 /* unlink it from it's current position */
79 CorrectVSprite -> NextVSprite = CurVSprite -> NextVSprite;
80 if (NULL != CurVSprite -> NextVSprite)
81 CurVSprite -> NextVSprite -> PrevVSprite = CorrectVSprite;
83 /* insert CurVSprite at some previous place */
85 while ( ( NULL != tmpVSprite ) &&
86 ( JOIN_XY_COORDS(tmpVSprite -> X, tmpVSprite -> Y) > NewCoord ) )
87 tmpVSprite = tmpVSprite -> PrevVSprite;
89 if (NULL == tmpVSprite) {
90 /* our CurVSprite becomes the fist one in the list */
91 /* Due to the head VSprite this should never happen!!! */
92 rp->GelsInfo->gelHead->PrevVSprite = CurVSprite;
93 CurVSprite->NextVSprite = rp->GelsInfo->gelHead;
94 CurVSprite->PrevVSprite = NULL;
95 rp->GelsInfo->gelHead = CurVSprite;
96 } else {
97 /* link it into the list *after* the tmpVSprite */
98 CurVSprite->PrevVSprite = tmpVSprite;
99 CurVSprite->NextVSprite = tmpVSprite->NextVSprite;
101 if (NULL != tmpVSprite->NextVSprite)
102 tmpVSprite->NextVSprite->PrevVSprite = CurVSprite;
104 tmpVSprite->NextVSprite = CurVSprite;
107 /* set the new CurVSprite */
108 CurVSprite = CorrectVSprite -> NextVSprite;
110 } /* while ( NULL != CurVSprite ) */
112 rp->GelsInfo->gelTail = CorrectVSprite;
114 AROS_LIBFUNC_EXIT
116 } /* SortGList */