OSSIM - Open Source Software Image Map  Version 1.9.0 (20180803)
ossimFixedTileCache.cpp
Go to the documentation of this file.
1 //******************************************************************
2 //
3 // License: See top level LICENSE.txt file.
4 //
5 // Author: Garrett Potts
6 //
7 // Description: This file contains the Application cache algorithm
8 //
9 //***********************************
10 // $Id: ossimFixedTileCache.cpp 16276 2010-01-06 01:54:47Z gpotts $
12 #include <algorithm>
13 
15  : theTileBoundaryRect(),
16  theTileSize(),
17  theBoundaryWidthHeight(),
18  theTilesHorizontal(0),
19  theTilesVertical(0),
20  theCacheSize(0),
21  theMaxCacheSize(0),
22  theTileMap(),
23  theLruQueue(),
24  theUseLruFlag(true)
25 {
27 
28  ossimIrect tempRect;
29  tempRect.makeNan();
30 
31  setRect(tempRect);
32 
33  // theCacheSize = 0;
34  // theMaxCacheSize = 0;
35  // theUseLruFlag = true;
36 }
37 
39 {
40  flush();
41 }
42 
44 {
45  {
46  std::lock_guard<std::mutex> lock(theMutex);
48  theTileBoundaryRect = rect;
54  }
55  flush();
56 }
57 
59  const ossimIpt& tileSize)
60 {
61  {
62  std::lock_guard<std::mutex> lock(theMutex);
63  theTileBoundaryRect = rect;
64  theTileSize = tileSize;
70  }
71  flush();
72 }
73 
74 
76 {
77  std::lock_guard<std::mutex> lock(theMutex);
78  std::map<ossim_int32, ossimFixedTileCacheInfo>::iterator tileIter = theTileMap.begin();
79 
80  while(tileIter != theTileMap.end())
81  {
82  ossimIrect tileRect = (*tileIter).second.theTile->getImageRectangle();
83  if(!tileRect.intersects(rect))
84  {
85  eraseFromLru(computeId((*tileIter).second.theTile->getOrigin()));
86  theCacheSize -= (*tileIter).second.theTile->getDataSizeInBytes();
87  (*tileIter).second.theTile = NULL;
88  theTileMap.erase(tileIter);
89  }
90  ++tileIter;
91  }
92 }
93 
95  bool duplicateData)
96 {
97  std::lock_guard<std::mutex> lock(theMutex);
98  ossimRefPtr<ossimImageData> result = NULL;
99  if(!imageData.valid())
100  {
101  return result;
102  }
103  if(!imageData->getBuf())
104  {
105  return result;
106  }
107 
108  ossim_int32 id = computeId(imageData->getOrigin());
109  if(id < 0)
110  {
111  return result;
112  }
113 
114  std::map<ossim_int32, ossimFixedTileCacheInfo>::iterator tileIter =
115  theTileMap.find(id);
116 
117  if(tileIter==theTileMap.end())
118  {
119  if(duplicateData)
120  {
121  result = (ossimImageData*)imageData->dup();
122  }
123  else
124  {
125  result = imageData;
126  }
127  ossimFixedTileCacheInfo cacheInfo(result, id);
128 
129  theCacheSize += imageData->getDataSizeInBytes();
130  theTileMap.insert(make_pair(id, cacheInfo));
131  if(theUseLruFlag)
132  {
133  theLruQueue.push_back(id);
134  }
135  }
136 
137  return result;
138 }
139 
141 {
142  std::lock_guard<std::mutex> lock(theMutex);
143  ossimRefPtr<ossimImageData> result = NULL;
144 
145  std::map<ossim_int32, ossimFixedTileCacheInfo>::iterator tileIter =
146  theTileMap.find(id);
147  if(tileIter!=theTileMap.end())
148  {
149  result = (*tileIter).second.theTile;
150  adjustLru(id);
151  }
152 
153  return result;
154 }
155 
157 {
158  std::lock_guard<std::mutex> lock(theMutex);
159  ossimIpt result;
160  result.makeNan();
161 
162  if(tileId < 0)
163  {
164  return result;
165  }
166  ossim_int32 ty = (tileId/theTilesHorizontal);
167  ossim_int32 tx = (tileId%theTilesVertical);
168 
170 
171  result = ossimIpt(ul.x + tx*theTileSize.x, ul.y + ty*theTileSize.y);
172 
173  return result;
174 }
175 
177 {
178  ossimIpt idDiff = tileOrigin - theTileBoundaryRect.ul();
179 
180  if((idDiff.x < 0)||
181  (idDiff.y < 0)||
182  (idDiff.x >= theBoundaryWidthHeight.x)||
183  (idDiff.y >= theBoundaryWidthHeight.y))
184  {
185  return -1;
186  }
187  ossim_uint32 y = idDiff.y/theTileSize.y;
189 
190  ossim_uint32 x = idDiff.x/theTileSize.x;
191 
192 
193  return (y + x);
194 }
195 
197 {
198  std::map<ossim_int32, ossimFixedTileCacheInfo>::iterator tileIter =
199  theTileMap.find(tileId);
200 
201  if(tileIter != theTileMap.end())
202  {
203  if((*tileIter).second.theTile.valid())
204  {
205  theCacheSize -= (*tileIter).second.theTile->getDataSizeInBytes();
206  (*tileIter).second.theTile = NULL;
207  }
208  theTileMap.erase(tileIter);
209  eraseFromLru(tileId);
210  }
211 }
212 
214 {
215  std::lock_guard<std::mutex> lock(theMutex);
216  ossimRefPtr<ossimImageData> result = NULL;
217 
218  std::map<ossim_int32, ossimFixedTileCacheInfo>::iterator tileIter =
219  theTileMap.find(tileId);
220 
221  if(tileIter != theTileMap.end())
222  {
223  theCacheSize -= (*tileIter).second.theTile->getDataSizeInBytes();
224  if((*tileIter).second.theTile.valid())
225  {
226  result = (*tileIter).second.theTile;
227  }
228  theTileMap.erase(tileIter);
229  eraseFromLru(tileId);
230  }
231 
232  return result;
233 }
234 
236 {
237  std::lock_guard<std::mutex> lock(theMutex);
238  std::map<ossim_int32, ossimFixedTileCacheInfo>::iterator tileIter =
239  theTileMap.begin();
240 
241  while(tileIter != theTileMap.end())
242  {
243  if( (*tileIter).second.theTile.valid())
244  {
245  (*tileIter).second.theTile = 0;
246  }
247  ++tileIter;
248  }
249  theLruQueue.clear();
250  theTileMap.clear();
251  theCacheSize = 0;
252 }
253 
255 {
256  std::lock_guard<std::mutex> lock(theMutex);
257  if(theUseLruFlag)
258  {
259  if(theLruQueue.begin() != theLruQueue.end())
260  {
261  deleteTile(*(theLruQueue.begin()));
262  }
263  }
264 }
265 
267 {
268  std::lock_guard<std::mutex> lock(theMutex);
269  if(theUseLruFlag)
270  {
271  if(theLruQueue.begin() != theLruQueue.end())
272  {
273  return removeTile(*(theLruQueue.begin()));
274  }
275  }
276 
277  return NULL;
278 }
279 
281 {
282  if(theUseLruFlag)
283  {
284  std::list<ossim_int32>::iterator iter = std::find(theLruQueue.begin(), theLruQueue.end(), id);
285 
286  if(iter != theLruQueue.end())
287  {
288  ossim_int32 value = *iter;
289  theLruQueue.erase(iter);
290  theLruQueue.push_back(value);
291  }
292  }
293 }
294 
296 {
297  if(theUseLruFlag)
298  {
299 
300  std::list<ossim_int32>::iterator iter = std::find(theLruQueue.begin(), theLruQueue.end(), id);
301 
302  if(iter != theLruQueue.end())
303  {
304  theLruQueue.erase(iter);
305  }
306  }
307 }
308 
309 
311 {
312  setRect(theTileBoundaryRect, tileSize);
313 }
ossim_uint32 x
virtual ossimRefPtr< ossimImageData > getTile(ossim_int32 id)
void makeNan()
Definition: ossimIpt.h:56
virtual void setTileSize(const ossimIpt &tileSize)
ossim_uint32 y
bool valid() const
Definition: ossimRefPtr.h:75
virtual void eraseFromLru(ossim_int32 id)
std::map< ossim_int32, ossimFixedTileCacheInfo > theTileMap
ossim_uint32 height() const
Definition: ossimIrect.h:487
OSSIM_DLL void defaultTileSize(ossimIpt &tileSize)
const ossimIpt & ul() const
Definition: ossimIrect.h:274
virtual ossimRefPtr< ossimImageData > removeTile()
bool intersects(const ossimIrect &rect) const
Definition: ossimIrect.cpp:183
void keepTilesWithinRect(const ossimIrect &rect)
virtual ossimObject * dup() const
virtual ossimIpt getTileOrigin(ossim_int32 tileId)
virtual void setRect(const ossimIrect &rect)
unsigned int ossim_uint32
ossim_uint32 width() const
Definition: ossimIrect.h:500
ossim_uint32 theTilesHorizontal
virtual ossim_int32 computeId(const ossimIpt &tileOrigin) const
ossim_int32 y
Definition: ossimIpt.h:142
void makeNan()
Definition: ossimIrect.h:329
virtual const void * getBuf() const
void stretchToTileBoundary(const ossimIpt &tileWidthHeight)
Definition: ossimIrect.cpp:212
virtual ossim_uint32 getDataSizeInBytes() const
ossim_int32 x
Definition: ossimIpt.h:141
std::list< ossim_int32 > theLruQueue
virtual ossimRefPtr< ossimImageData > addTile(ossimRefPtr< ossimImageData > imageData, bool duplicateData=true)
virtual const ossimIpt & getOrigin() const
int ossim_int32
void adjustLru(ossim_int32 id)