@@ -76,6 +76,14 @@ void SmudgeManager::reset()
7676 }
7777}
7878
79+ void SmudgeManager::resetDraw ()
80+ {
81+ SmudgeSet* smudgeSet = m_usedSmudgeSetList.Head ();
82+ for (; smudgeSet; smudgeSet = smudgeSet->Succ ()) {
83+ smudgeSet->resetDraw ();
84+ }
85+ }
86+
7987SmudgeSet *SmudgeManager::addSmudgeSet ()
8088{
8189 SmudgeSet* set=m_freeSmudgeSetList.Head ();
@@ -89,12 +97,25 @@ SmudgeSet *SmudgeManager::addSmudgeSet()
8997 return set;
9098}
9199
92- void SmudgeManager::removeSmudgeSet (SmudgeSet &mySmudge )
100+ void SmudgeManager::removeSmudgeSet (SmudgeSet *&smudgeSet )
93101{
94- mySmudge.Remove (); // remove from used list
95- m_freeSmudgeSetList.Add_Head (&mySmudge); // add to free list.
102+ smudgeSet->Remove (); // remove from used list
103+ m_freeSmudgeSetList.Add_Head (smudgeSet); // add to free list.
104+ smudgeSet = nullptr ;
96105}
97106
107+ Smudge *SmudgeManager::findSmudge (Smudge::Identifier identifier)
108+ {
109+ SmudgeSet *smudgeSet = m_usedSmudgeSetList.Head ();
110+ for (; smudgeSet; smudgeSet = smudgeSet->Succ ()) {
111+ if (Smudge *smudge = smudgeSet->findSmudge (identifier)) {
112+ return smudge;
113+ }
114+ }
115+ return nullptr ;
116+ }
117+
118+
98119SmudgeSet::SmudgeSet ()
99120{
100121 m_usedSmudgeCount=0 ;
@@ -113,26 +134,50 @@ void SmudgeSet::reset()
113134 m_usedSmudgeList.Remove_Head ();
114135 m_freeSmudgeList.Add_Head (head); // add to free list
115136 }
137+
138+ m_usedSmudgeMap.clear ();
139+ m_usedSmudgeCount = 0 ;
140+ }
141+
142+ void SmudgeSet::resetDraw ()
143+ {
144+ Smudge* smudge = m_usedSmudgeList.Head ();
145+ for (; smudge; smudge = smudge->Succ ()) {
146+ smudge->m_draw = false ;
147+ }
116148}
117149
118- Smudge *SmudgeSet::addSmudgeToSet ()
150+ Smudge *SmudgeSet::addSmudgeToSet (Smudge::Identifier identifier )
119151{
120- Smudge* smudge=m_freeSmudgeList.Head ();
152+ DEBUG_ASSERTCRASH (m_usedSmudgeMap.find (identifier) == m_usedSmudgeMap.end (),
153+ (" SmudgeSet::addSmudgeToSet: identifier already present" ));
154+
155+ Smudge* smudge = m_freeSmudgeList.Head ();
121156 if (smudge) {
122157 smudge->Remove (); // remove from free list
123- m_usedSmudgeList.Add_Tail (smudge); // add to used list.
124- m_usedSmudgeCount++;
125- return smudge;
158+ } else {
159+ smudge = W3DNEW Smudge ();
126160 }
127- smudge=W3DNEW Smudge () ;
161+ smudge-> m_identifier = identifier ;
128162 m_usedSmudgeList.Add_Tail (smudge); // add to used list.
163+ m_usedSmudgeMap[identifier] = smudge;
129164 m_usedSmudgeCount++;
130165 return smudge;
131166}
132167
133- void SmudgeSet::removeSmudgeFromSet (Smudge &mySmudge )
168+ void SmudgeSet::removeSmudgeFromSet (Smudge *&smudge )
134169{
135- mySmudge.Remove (); // remove from used list.
136- m_freeSmudgeList.Add_Head (&mySmudge); // add to free list
170+ m_usedSmudgeMap.erase (smudge->m_identifier );
171+ smudge->Remove (); // remove from used list.
172+ m_freeSmudgeList.Add_Head (smudge); // add to free list
173+ smudge = nullptr ;
137174 m_usedSmudgeCount--;
138175}
176+
177+ Smudge *SmudgeSet::findSmudge (Smudge::Identifier identifier)
178+ {
179+ SmudgeIdToPtrMap::const_iterator it = m_usedSmudgeMap.find (identifier);
180+ if (it != m_usedSmudgeMap.end ())
181+ return it->second ;
182+ return nullptr ;
183+ }
0 commit comments