Revision 6497
org.gvsig.raster/branches/org.gvsig.raster.2.4/org.gvsig.raster/org.gvsig.raster.tilecache/org.gvsig.raster.tilecache.provider/src/main/java/org/gvsig/raster/tilecache/provider/TileStructImage.java | ||
---|---|---|
266 | 266 |
return null; |
267 | 267 |
} finally { |
268 | 268 |
if (tileStore != null) { |
269 |
tileStore.dispose();
|
|
269 |
DisposeUtils.dispose(tileStore);
|
|
270 | 270 |
} |
271 | 271 |
} |
272 | 272 |
} |
... | ... | |
325 | 325 |
return tileStore; |
326 | 326 |
} |
327 | 327 |
|
328 |
private File requestTileFile(int zoomLevel, int structRow, int structCol) throws CloneNotSupportedException, |
|
329 |
CreateEnvelopeException, BufferException, ValidateDataParametersException, DataException { |
|
328 |
private File requestTileFile(int zoomLevel, int structRow, int structCol) throws CreateEnvelopeException, CloneNotSupportedException, BufferException, ValidateDataParametersException, DataException { |
|
330 | 329 |
|
331 | 330 |
RasterQuery rasterQuery = (RasterQuery) this.query.clone(); |
332 | 331 |
|
... | ... | |
339 | 338 |
double minY = structExtent.getMaximum(DIMENSIONS.Y) - ((structRow + 1) * (pixelSize * rowsPerTile)); |
340 | 339 |
double maxX = minX + pixelSize * columnsPerTile; |
341 | 340 |
double maxY = minY + pixelSize * rowsPerTile; |
341 |
Envelope envelope = geomManager.createEnvelope(minX, minY, maxX, maxY, SUBTYPES.GEOM2D); |
|
342 | 342 |
|
343 |
Buffer buffer; |
|
344 |
Buffer clippedBuffer; |
|
345 |
Buffer interpolatedBuffer; |
|
343 |
Buffer buffer = null; |
|
344 |
Buffer clippedBuffer = null; |
|
345 |
Buffer interpolatedBuffer = null; |
|
346 |
File destFile = null; |
|
346 | 347 |
|
347 |
Envelope envelope = geomManager.createEnvelope(minX, minY, maxX, maxY, SUBTYPES.GEOM2D);
|
|
348 |
buffer = innerProvider.createBuffer(rasterQuery); |
|
349 |
clippedBuffer = buffer.clip(envelope); |
|
350 |
interpolatedBuffer = |
|
351 |
clippedBuffer.createInterpolated( |
|
352 |
(int) (Math.round(clippedBuffer.getPixelSizeY() * clippedBuffer.getRows() / pixelSize)), |
|
353 |
(int) (Math.round(clippedBuffer.getPixelSizeX() * clippedBuffer.getColumns() / pixelSize)), |
|
354 |
Buffer.INTERPOLATION_NearestNeighbour, null); |
|
348 |
try {
|
|
349 |
buffer = innerProvider.createBuffer(rasterQuery);
|
|
350 |
clippedBuffer = buffer.clip(envelope);
|
|
351 |
interpolatedBuffer =
|
|
352 |
clippedBuffer.createInterpolated(
|
|
353 |
(int) (Math.round(clippedBuffer.getPixelSizeY() * clippedBuffer.getRows() / pixelSize)),
|
|
354 |
(int) (Math.round(clippedBuffer.getPixelSizeX() * clippedBuffer.getColumns() / pixelSize)),
|
|
355 |
Buffer.INTERPOLATION_NearestNeighbour, null);
|
|
355 | 356 |
|
356 |
DisposeUtils.dispose(clippedBuffer);
|
|
357 |
DisposeUtils.dispose(buffer);
|
|
357 |
String providerName = "GTiff";
|
|
358 |
String extension = "tif";
|
|
358 | 359 |
|
359 |
String providerName = "GTiff"; |
|
360 |
String extension = "tif"; |
|
360 |
DataManagerProviderServices manager = DALSPILocator.getDataManagerProviderServices(); |
|
361 |
DataServerExplorerParameters eparams; |
|
362 |
eparams = manager.createServerExplorerParameters("FilesystemExplorer"); |
|
361 | 363 |
|
362 |
DataManagerProviderServices manager = DALSPILocator.getDataManagerProviderServices(); |
|
363 |
DataServerExplorerParameters eparams; |
|
364 |
eparams = manager.createServerExplorerParameters("FilesystemExplorer"); |
|
364 |
StringBuilder builder = new StringBuilder(); |
|
365 |
builder.append(tilesFolder); |
|
366 |
builder.append(File.separator); |
|
367 |
builder.append(zoomLevel); |
|
368 |
builder.append(File.separator); |
|
369 |
builder.append(structCol); |
|
370 |
builder.append(File.separator); |
|
371 |
builder.append(structRow); |
|
372 |
builder.append("."); |
|
373 |
builder.append(extension); |
|
374 |
String path = builder.toString(); |
|
375 |
destFile = new File(path); |
|
376 |
File parent = destFile.getParentFile(); |
|
377 |
if (!parent.exists()) { |
|
378 |
parent.mkdirs(); |
|
379 |
} |
|
380 |
eparams.setDynValue("initialpath", path); |
|
381 |
DataServerExplorer serverExplorer = manager.createServerExplorer(eparams); |
|
365 | 382 |
|
366 |
StringBuilder builder = new StringBuilder(); |
|
367 |
builder.append(tilesFolder); |
|
368 |
builder.append(File.separator); |
|
369 |
builder.append(zoomLevel); |
|
370 |
builder.append(File.separator); |
|
371 |
builder.append(structCol); |
|
372 |
builder.append(File.separator); |
|
373 |
builder.append(structRow); |
|
374 |
builder.append("."); |
|
375 |
builder.append(extension); |
|
376 |
String path = builder.toString(); |
|
377 |
File destFile = new File(path); |
|
378 |
File parent = destFile.getParentFile(); |
|
379 |
if (!parent.exists()) { |
|
380 |
parent.mkdirs(); |
|
381 |
} |
|
382 |
eparams.setDynValue("initialpath", path); |
|
383 |
DataServerExplorer serverExplorer = manager.createServerExplorer(eparams); |
|
383 |
NewRasterStoreParameters params = (NewRasterStoreParameters) serverExplorer.getAddParameters(providerName); |
|
384 |
params.setDynValue("file", destFile); |
|
384 | 385 |
|
385 |
NewRasterStoreParameters params = (NewRasterStoreParameters) serverExplorer.getAddParameters(providerName); |
|
386 |
params.setDynValue("file", destFile); |
|
386 |
params.setDynValue("compress", "NONE"); |
|
387 |
params.setDynValue("tfw", false); |
|
388 |
params.setDynValue("photometric", "RGB"); |
|
389 |
params.setDynValue("alpha", "NON-PREMULTIPLIED"); |
|
387 | 390 |
|
388 |
params.setDynValue("compress", "NONE"); |
|
389 |
params.setDynValue("tfw", false); |
|
390 |
params.setDynValue("photometric", "RGB"); |
|
391 |
params.setDynValue("alpha", "NON-PREMULTIPLIED"); |
|
391 |
params.setBuffer(interpolatedBuffer); |
|
392 |
serverExplorer.add(providerName, params, true); |
|
393 |
} finally { |
|
394 |
if (buffer!=null){ |
|
395 |
DisposeUtils.dispose(buffer); |
|
396 |
} |
|
397 |
if (clippedBuffer!=null){ |
|
398 |
DisposeUtils.dispose(clippedBuffer); |
|
399 |
} |
|
400 |
if (interpolatedBuffer!=null){ |
|
401 |
DisposeUtils.dispose(interpolatedBuffer); |
|
402 |
} |
|
403 |
} |
|
392 | 404 |
|
393 |
params.setBuffer(interpolatedBuffer); |
|
394 |
serverExplorer.add(providerName, params, true); |
|
395 |
|
|
396 | 405 |
return destFile; |
397 | 406 |
} |
398 | 407 |
|
... | ... | |
473 | 482 |
|
474 | 483 |
} finally { |
475 | 484 |
if (rasterStore != null) { |
476 |
rasterStore.dispose();
|
|
485 |
DisposeUtils.dispose(rasterStore);
|
|
477 | 486 |
} |
478 | 487 |
} |
479 | 488 |
} |
org.gvsig.raster/branches/org.gvsig.raster.2.4/org.gvsig.raster/org.gvsig.fmap.dal.raster/org.gvsig.fmap.dal.raster.impl/src/main/java/org/gvsig/fmap/dal/raster/impl/DefaultRasterSet.java | ||
---|---|---|
26 | 26 |
|
27 | 27 |
import org.cresques.cts.ICoordTrans; |
28 | 28 |
import org.cresques.cts.IProjection; |
29 |
import org.slf4j.Logger; |
|
30 |
import org.slf4j.LoggerFactory; |
|
31 |
|
|
29 | 32 |
import org.gvsig.fmap.dal.DataStore; |
30 | 33 |
import org.gvsig.fmap.dal.exception.DataException; |
31 | 34 |
import org.gvsig.fmap.dal.raster.api.RasterQuery; |
... | ... | |
47 | 50 |
import org.gvsig.raster.lib.buffer.api.exceptions.BandException; |
48 | 51 |
import org.gvsig.raster.lib.buffer.api.exceptions.BufferException; |
49 | 52 |
import org.gvsig.raster.lib.buffer.api.statistics.Statistics; |
53 |
import org.gvsig.tools.ToolsLocator; |
|
54 |
import org.gvsig.tools.dispose.DisposableManager; |
|
55 |
import org.gvsig.tools.dispose.DisposeUtils; |
|
50 | 56 |
import org.gvsig.tools.exception.BaseException; |
51 | 57 |
import org.gvsig.tools.locator.LocatorException; |
52 | 58 |
import org.gvsig.tools.observer.Observable; |
... | ... | |
58 | 64 |
|
59 | 65 |
/** |
60 | 66 |
* Implements RasterSet |
61 |
*
|
|
67 |
* |
|
62 | 68 |
* @author dmartinezizquierdo |
63 | 69 |
* |
64 | 70 |
*/ |
65 | 71 |
public class DefaultRasterSet extends AbstractIndexedVisitable implements RasterSet, Observer { |
66 | 72 |
|
73 |
protected static final Logger logger = LoggerFactory.getLogger(DefaultRasterSet.class); |
|
74 |
|
|
67 | 75 |
private DefaultRasterStore store; |
68 | 76 |
protected RasterQuery query; |
69 | 77 |
protected Buffer buffer; |
70 | 78 |
|
79 |
// to make it disposable |
|
80 |
private final Object lock = new Object(); |
|
81 |
private boolean disposed = false; |
|
82 |
|
|
83 |
|
|
71 | 84 |
/** |
72 | 85 |
* Creates a RasterSet with the raster filtered by the query |
73 |
*
|
|
86 |
* |
|
74 | 87 |
* @param store |
75 | 88 |
* @param query |
76 | 89 |
* @throws DataException |
77 | 90 |
*/ |
78 | 91 |
public DefaultRasterSet(RasterStore store, RasterQuery query) throws DataException { |
79 | 92 |
|
93 |
logger.info("DefaultRasterSet CONSTRUCTOR hashCode = "+this.hashCode()+ " className = "+this.getClass().getSimpleName()); |
|
94 |
if(ToolsLocator.getDisposableManager() != null) { |
|
95 |
ToolsLocator.getDisposableManager().bind(this); |
|
96 |
} else { |
|
97 |
logger.warn("Can't retrieve the disposable manager,"); |
|
98 |
} |
|
99 |
|
|
100 |
DisposableManager disposableManager = ToolsLocator.getDisposableManager(); |
|
101 |
disposableManager.bind(store); |
|
80 | 102 |
this.store = (DefaultRasterStore) store; |
81 | 103 |
this.query = query; |
82 | 104 |
RasterStoreProvider provider = this.store.getProvider(); |
... | ... | |
264 | 286 |
} |
265 | 287 |
|
266 | 288 |
@Override |
267 |
public void dispose() { |
|
268 |
this.store.deleteObserver(this); |
|
269 |
|
|
270 |
this.store = null; |
|
271 |
|
|
272 |
this.query = null; |
|
273 |
this.buffer = null; |
|
274 |
} |
|
275 |
|
|
276 |
@Override |
|
277 | 289 |
public void update(Observable observable, Object notification) { |
278 | 290 |
// Do nothing |
279 | 291 |
} |
... | ... | |
291 | 303 |
} |
292 | 304 |
} |
293 | 305 |
|
306 |
|
|
307 |
public final void dispose() { |
|
308 |
synchronized (lock) { |
|
309 |
// Check if we have already been disposed, and don't do it again |
|
310 |
if (!disposed) { |
|
311 |
logger.info("DefaultRasterSet DISPOSE hashCode = "+this.hashCode()); |
|
312 |
if ( ToolsLocator.getDisposableManager().release(this) ) { |
|
313 |
try { |
|
314 |
doDispose(); |
|
315 |
} catch (BaseException ex) { |
|
316 |
logger.error("Error performing dispose", ex); |
|
317 |
} |
|
318 |
disposed = true; |
|
319 |
} |
|
320 |
} |
|
321 |
} |
|
322 |
} |
|
323 |
|
|
324 |
/** |
|
325 |
* Internal implementation for the {@link #dispose()} method. |
|
326 |
* |
|
327 |
* @see #dispose() |
|
328 |
*/ |
|
329 |
public void doDispose() throws BaseException { |
|
330 |
logger.info("DefaultRasterSet DO DISPOSE hashCode = "+this.hashCode()); |
|
331 |
|
|
332 |
DisposableManager disposableManager = ToolsLocator.getDisposableManager(); |
|
333 |
DisposeUtils.dispose(store); |
|
334 |
store = null; |
|
335 |
DisposeUtils.dispose(buffer); |
|
336 |
buffer = null; |
|
337 |
query = null; |
|
338 |
} |
|
339 |
|
|
340 |
@Override |
|
341 |
protected void finalize() throws Throwable { |
|
342 |
super.finalize(); |
|
343 |
logger.info("DefaultRasterSet CLEANED hashCode = "+this.hashCode()); |
|
344 |
|
|
345 |
} |
|
346 |
|
|
347 |
|
|
294 | 348 |
} |
org.gvsig.raster/branches/org.gvsig.raster.2.4/org.gvsig.raster/org.gvsig.fmap.mapcontext.raster/org.gvsig.fmap.mapcontext.raster.impl/src/main/java/org/gvsig/fmap/mapcontext/raster/impl/DefaultRasterLayer.java | ||
---|---|---|
37 | 37 |
import org.gvsig.fmap.dal.exception.DataException; |
38 | 38 |
import org.gvsig.fmap.dal.exception.ReadException; |
39 | 39 |
import org.gvsig.fmap.dal.raster.api.RasterQuery; |
40 |
import org.gvsig.fmap.dal.raster.api.RasterSet; |
|
40 | 41 |
import org.gvsig.fmap.dal.raster.api.RasterStore; |
41 | 42 |
import org.gvsig.fmap.dal.raster.api.RasterStoreNotification; |
42 | 43 |
import org.gvsig.fmap.geom.Geometry.SUBTYPES; |
... | ... | |
251 | 252 |
rasterQuery.addBand(this.store.createBandQuery(band)); |
252 | 253 |
} |
253 | 254 |
|
255 |
RasterSet rasterSet = null; |
|
254 | 256 |
try { |
255 | 257 |
|
256 | 258 |
long tini = System.currentTimeMillis(); |
... | ... | |
259 | 261 |
TaskStatusManager manager = ToolsLocator.getTaskStatusManager(); |
260 | 262 |
SimpleTaskStatus taskStatus = manager.createDefaultSimpleTaskStatus("Draw "+getDataStore().getName()); |
261 | 263 |
|
262 |
((RasterLegend) legend).draw(g, getRasterStore().getRasterSet(rasterQuery), viewPort, taskStatus); |
|
264 |
rasterSet = getRasterStore().getRasterSet(rasterQuery); |
|
265 |
((RasterLegend) legend).draw(g, rasterSet, viewPort, taskStatus); |
|
263 | 266 |
|
264 | 267 |
logger.debug("Layer " + this.getName() + " drawn in " |
265 | 268 |
+ (System.currentTimeMillis() - tini) + " milliseconds."); |
... | ... | |
269 | 272 |
this.setError(e); |
270 | 273 |
throw new ReadException(getName(), e); |
271 | 274 |
} finally { |
272 |
|
|
275 |
if(rasterSet!=null){ |
|
276 |
DisposeUtils.dispose(rasterSet); |
|
277 |
rasterSet = null; |
|
278 |
} |
|
273 | 279 |
} |
274 | 280 |
|
275 | 281 |
} |
org.gvsig.raster/branches/org.gvsig.raster.2.4/org.gvsig.raster/org.gvsig.raster.lib/org.gvsig.raster.lib.buffer/org.gvsig.raster.lib.buffer.impl/src/main/java/org/gvsig/raster/lib/buffer/impl/ClippedBuffer.java | ||
---|---|---|
14 | 14 |
import org.gvsig.raster.lib.buffer.api.BufferManager; |
15 | 15 |
import org.gvsig.raster.lib.buffer.api.exceptions.BandException; |
16 | 16 |
import org.gvsig.raster.lib.buffer.impl.exceptions.CreateBufferException; |
17 |
import org.gvsig.tools.ToolsLocator; |
|
18 |
import org.gvsig.tools.dispose.DisposeUtils; |
|
19 |
import org.gvsig.tools.exception.BaseException; |
|
17 | 20 |
|
18 | 21 |
|
19 | 22 |
/** |
... | ... | |
38 | 41 |
* @throws CreateBufferException |
39 | 42 |
*/ |
40 | 43 |
public ClippedBuffer(Buffer buffer, Envelope envelope) throws CreateBufferException { |
44 |
ToolsLocator.getDisposableManager().bind(buffer); |
|
41 | 45 |
this.buffer = buffer; |
42 | 46 |
try { |
43 | 47 |
this.envelope = buffer.getEnvelope().getGeometry().intersection(envelope.getGeometry()).getEnvelope(); |
... | ... | |
83 | 87 |
return this.firstColumn; |
84 | 88 |
} |
85 | 89 |
|
90 |
@Override |
|
91 |
public void doDispose() throws BaseException { |
|
92 |
super.doDispose(); |
|
93 |
DisposeUtils.dispose(buffer); |
|
94 |
buffer=null; |
|
95 |
} |
|
96 |
|
|
86 | 97 |
} |
org.gvsig.raster/branches/org.gvsig.raster.2.4/org.gvsig.raster/org.gvsig.raster.lib/org.gvsig.raster.lib.buffer/org.gvsig.raster.lib.buffer.impl/src/main/java/org/gvsig/raster/lib/buffer/impl/AbstractBuffer.java | ||
---|---|---|
70 | 70 |
private boolean disposed = false; |
71 | 71 |
|
72 | 72 |
public AbstractBuffer() { |
73 |
logger.info("AbstractBuffer CONSTRUCTOR with rows = "+rows+" columns = "+columns+ " hashCode = "+this.hashCode()+ " className = "+this.getClass().getSimpleName()); |
|
73 | 74 |
if(ToolsLocator.getDisposableManager() != null) { |
74 | 75 |
ToolsLocator.getDisposableManager().bind(this); |
75 | 76 |
} else { |
... | ... | |
526 | 527 |
synchronized (lock) { |
527 | 528 |
// Check if we have already been disposed, and don't do it again |
528 | 529 |
if (!disposed) { |
530 |
logger.info("AbstractBuffer with rows = "+rows+" columns = "+columns+" DISPOSE hashCode = "+this.hashCode()); |
|
529 | 531 |
if ( ToolsLocator.getDisposableManager().release(this) ) { |
530 | 532 |
try { |
531 | 533 |
doDispose(); |
... | ... | |
544 | 546 |
* @see #dispose() |
545 | 547 |
*/ |
546 | 548 |
public void doDispose() throws BaseException { |
549 |
logger.info("AbstractBuffer with rows = "+rows+" columns = "+columns+" DO DISPOSE hashCode = "+this.hashCode()); |
|
547 | 550 |
for (Iterator iterator = bands.iterator(); iterator.hasNext();) { |
548 | 551 |
Band band = (Band) iterator.next(); |
549 | 552 |
DisposeUtils.dispose(band); |
... | ... | |
562 | 565 |
@Override |
563 | 566 |
protected void finalize() throws Throwable { |
564 | 567 |
super.finalize(); |
565 |
logger.info("AbstractBuffer with rows = "+rows+" columns = "+columns+" CLEANED");
|
|
568 |
logger.info("AbstractBuffer with rows = "+rows+" columns = "+columns+" CLEANED hashCode = "+this.hashCode());
|
|
566 | 569 |
|
567 | 570 |
} |
568 | 571 |
} |
org.gvsig.raster/branches/org.gvsig.raster.2.4/org.gvsig.raster/org.gvsig.raster.lib/org.gvsig.raster.lib.buffer/org.gvsig.raster.lib.buffer.impl/src/main/java/org/gvsig/raster/lib/buffer/impl/AbstractPaginatedBand.java | ||
---|---|---|
154 | 154 |
// } |
155 | 155 |
|
156 | 156 |
logger.info("ALLOCATE rowsPerPage = " + rowsPerPage + " columns = " + columns + " bytes = " |
157 |
+ (rowsPerPage * columns)); |
|
157 |
+ (rowsPerPage * columns) + " hashCode = "+this.hashCode());
|
|
158 | 158 |
return rowsPerPage * columns; |
159 | 159 |
} |
160 | 160 |
|
... | ... | |
170 | 170 |
@Override |
171 | 171 |
protected void finalize() throws Throwable { |
172 | 172 |
super.finalize(); |
173 |
logger.info("AbstractPaginatedBand with rowsPerPage = "+rowsPerPage+" columns = "+columns+" CLEANED");
|
|
173 |
logger.info("AbstractPaginatedBand with rowsPerPage = "+rowsPerPage+" columns = "+columns+" CLEANED hashCode = "+this.hashCode());
|
|
174 | 174 |
|
175 | 175 |
} |
176 | 176 |
|
org.gvsig.raster/branches/org.gvsig.raster.2.4/org.gvsig.raster/org.gvsig.raster.lib/org.gvsig.raster.lib.buffer/org.gvsig.raster.lib.buffer.impl/src/main/java/org/gvsig/raster/lib/buffer/impl/AbstractBand.java | ||
---|---|---|
32 | 32 |
private boolean disposed = false; |
33 | 33 |
|
34 | 34 |
public AbstractBand() { |
35 |
logger.info("CONSTRUCTOR hashCode = "+this.hashCode()+ " className = "+this.getClass().getSimpleName()); |
|
36 |
|
|
35 | 37 |
if(ToolsLocator.getDisposableManager() != null) { |
36 | 38 |
ToolsLocator.getDisposableManager().bind(this); |
37 | 39 |
} else { |
... | ... | |
133 | 135 |
@Override |
134 | 136 |
protected void finalize() throws Throwable { |
135 | 137 |
super.finalize(); |
136 |
logger.info("AbstractBand with rows = "+rows+" columns = "+columns+" CLEANED");
|
|
138 |
logger.info("AbstractBand with rows = "+rows+" columns = "+columns+" CLEANED hashCode = "+this.hashCode());
|
|
137 | 139 |
|
138 | 140 |
} |
139 | 141 |
|
... | ... | |
141 | 143 |
synchronized (lock) { |
142 | 144 |
// Check if we have already been disposed, and don't do it again |
143 | 145 |
if (!disposed) { |
146 |
logger.info("AbstractBand with rows = "+rows+" columns = "+columns+" DISPOSE hashCode = "+this.hashCode()); |
|
144 | 147 |
if ( ToolsLocator.getDisposableManager().release(this) ) { |
145 | 148 |
try { |
146 | 149 |
doDispose(); |
... | ... | |
159 | 162 |
* @see #dispose() |
160 | 163 |
*/ |
161 | 164 |
public void doDispose() throws BaseException { |
165 |
logger.info("AbstractBand with rows = "+rows+" columns = "+columns+" DO DISPOSE hashCode = "+this.hashCode()); |
|
162 | 166 |
noData = null; |
163 | 167 |
} |
164 | 168 |
|
org.gvsig.raster/branches/org.gvsig.raster.2.4/org.gvsig.raster/org.gvsig.raster.lib/org.gvsig.raster.lib.buffer/org.gvsig.raster.lib.buffer.impl/src/main/java/org/gvsig/raster/lib/buffer/impl/AbstractClippedBand.java | ||
---|---|---|
4 | 4 |
import org.gvsig.raster.lib.buffer.api.BandInfo; |
5 | 5 |
import org.gvsig.raster.lib.buffer.api.Buffer; |
6 | 6 |
import org.gvsig.raster.lib.buffer.impl.exceptions.CopyFromBandException; |
7 |
import org.gvsig.tools.ToolsLocator; |
|
8 |
import org.gvsig.tools.dispose.DisposableManager; |
|
9 |
import org.gvsig.tools.dispose.DisposeUtils; |
|
10 |
import org.gvsig.tools.exception.BaseException; |
|
7 | 11 |
|
8 | 12 |
|
9 | 13 |
/** |
... | ... | |
19 | 23 |
* @param band |
20 | 24 |
*/ |
21 | 25 |
public AbstractClippedBand(Buffer buffer, Band band) { |
26 |
DisposableManager disposableManager = ToolsLocator.getDisposableManager(); |
|
27 |
disposableManager.bind(buffer); |
|
28 |
disposableManager.bind(band); |
|
22 | 29 |
this.band = band; |
23 | 30 |
this.clippedBuffer = (ClippedBuffer)buffer; |
24 | 31 |
|
... | ... | |
70 | 77 |
} |
71 | 78 |
|
72 | 79 |
// ?es necesario? ?es conveniente? |
73 |
// @Override |
|
74 |
// public void doDispose() throws BaseException { |
|
75 |
// super.doDispose(); |
|
76 |
// DisposeUtils.dispose (band); |
|
77 |
// DisposeUtils.dispose (clippedBuffer); |
|
78 |
// } |
|
80 |
@Override |
|
81 |
public void doDispose() throws BaseException { |
|
82 |
super.doDispose(); |
|
83 |
DisposeUtils.dispose(band); |
|
84 |
DisposeUtils.dispose(clippedBuffer); |
|
85 |
band = null; |
|
86 |
clippedBuffer = null; |
|
87 |
} |
|
79 | 88 |
} |
org.gvsig.raster/branches/org.gvsig.raster.2.4/org.gvsig.raster/org.gvsig.raster.lib/org.gvsig.raster.lib.legend/org.gvsig.raster.lib.legend.impl/src/main/java/org/gvsig/raster/lib/legend/impl/DefaultRasterLegend.java | ||
---|---|---|
26 | 26 |
import org.gvsig.raster.lib.legend.api.RasterLegend; |
27 | 27 |
import org.gvsig.raster.lib.legend.api.Transparency; |
28 | 28 |
import org.gvsig.tools.ToolsLocator; |
29 |
import org.gvsig.tools.dispose.DisposeUtils; |
|
29 | 30 |
import org.gvsig.tools.dynobject.DynStruct; |
30 | 31 |
import org.gvsig.tools.persistence.PersistenceManager; |
31 | 32 |
import org.gvsig.tools.persistence.PersistentState; |
... | ... | |
136 | 137 |
} |
137 | 138 |
|
138 | 139 |
// Check if viewport projection is the same as buffer projection |
139 |
Buffer bufferToDraw = null; |
|
140 |
if (!viewPort.getProjection().equals(buffer.getProjection())) { |
|
140 |
Buffer clip = null; |
|
141 |
Buffer interpolated = null; |
|
142 |
Buffer converted = null; |
|
143 |
Buffer bufferToDraw = buffer; |
|
144 |
try { |
|
141 | 145 |
|
142 |
// Convert extension to check if envelopes intersect |
|
143 |
ICoordTrans coordTrans = viewPort.getProjection().getCT(buffer.getProjection()); |
|
144 |
ICoordTrans invertedCoordTrans = buffer.getProjection().getCT(viewPort.getProjection()); |
|
145 |
Envelope convertedEnvelope = viewPort.getAdjustedEnvelope().convert(coordTrans); |
|
146 |
double viewPortPixelSizeX = viewPort.getAdjustedEnvelope().getLength(0) / viewPort.getImageWidth(); |
|
147 |
double viewPortPixelSizeY = viewPort.getAdjustedEnvelope().getLength(1) / viewPort.getImageHeight(); |
|
148 |
if (!convertedEnvelope.intersects(buffer.getEnvelope())) { |
|
149 |
return; |
|
150 |
} |
|
151 |
try { |
|
152 |
// Clip buffer with doubled converted envelope |
|
153 |
bufferToDraw = buffer.clip(convertedEnvelope); |
|
154 |
Envelope bufferEnvelopeInViewPortCoords = bufferToDraw.getEnvelope().convert(invertedCoordTrans); |
|
146 |
if (!viewPort.getProjection().equals(buffer.getProjection())) { |
|
155 | 147 |
|
156 |
double widthPixel =bufferEnvelopeInViewPortCoords.getLength(0)/viewPortPixelSizeX;; |
|
157 |
double heightPixel =bufferEnvelopeInViewPortCoords.getLength(1)/viewPortPixelSizeY;; |
|
148 |
// Convert extension to check if envelopes intersect |
|
149 |
ICoordTrans coordTrans = viewPort.getProjection().getCT(buffer.getProjection()); |
|
150 |
ICoordTrans invertedCoordTrans = buffer.getProjection().getCT(viewPort.getProjection()); |
|
151 |
Envelope convertedEnvelope = viewPort.getAdjustedEnvelope().convert(coordTrans); |
|
152 |
double viewPortPixelSizeX = viewPort.getAdjustedEnvelope().getLength(0) / viewPort.getImageWidth(); |
|
153 |
double viewPortPixelSizeY = viewPort.getAdjustedEnvelope().getLength(1) / viewPort.getImageHeight(); |
|
154 |
if (!convertedEnvelope.intersects(buffer.getEnvelope())) { |
|
155 |
return; |
|
156 |
} |
|
157 |
try { |
|
158 |
// Clip buffer with doubled converted envelope |
|
159 |
clip = buffer.clip(convertedEnvelope); |
|
160 |
Envelope bufferEnvelopeInViewPortCoords = clip.getEnvelope().convert(invertedCoordTrans); |
|
158 | 161 |
|
159 |
bufferToDraw = |
|
160 |
bufferToDraw.createInterpolated((int) Math.floor(heightPixel), |
|
161 |
(int) Math.floor(widthPixel), Buffer.INTERPOLATION_NearestNeighbour, |
|
162 |
taskStatus); |
|
163 |
// Convert interpolated clipped buffer |
|
164 |
bufferToDraw = bufferToDraw.convert(invertedCoordTrans, taskStatus); |
|
162 |
double widthPixel = bufferEnvelopeInViewPortCoords.getLength(0) / viewPortPixelSizeX; |
|
163 |
double heightPixel = bufferEnvelopeInViewPortCoords.getLength(1) / viewPortPixelSizeY; |
|
165 | 164 |
|
166 |
widthPixel = |
|
167 |
getWidthPixel(bufferToDraw.getEnvelope(), viewPortPixelSizeX); |
|
168 |
heightPixel = |
|
169 |
getHeightPixel(bufferToDraw.getEnvelope(), viewPortPixelSizeY); |
|
165 |
interpolated = |
|
166 |
clip.createInterpolated((int) Math.floor(heightPixel), (int) Math.floor(widthPixel), |
|
167 |
Buffer.INTERPOLATION_NearestNeighbour, taskStatus); |
|
168 |
// Convert interpolated clipped buffer |
|
169 |
converted = interpolated.convert(invertedCoordTrans, taskStatus); |
|
170 | 170 |
|
171 |
bufferToDraw = |
|
172 |
bufferToDraw.createInterpolated((int) Math.floor(heightPixel), |
|
173 |
(int) Math.floor(widthPixel), Buffer.INTERPOLATION_NearestNeighbour, |
|
174 |
taskStatus); |
|
171 |
widthPixel = getWidthPixel(converted.getEnvelope(), viewPortPixelSizeX); |
|
172 |
heightPixel = getHeightPixel(converted.getEnvelope(), viewPortPixelSizeY); |
|
175 | 173 |
|
174 |
bufferToDraw = converted; |
|
176 | 175 |
|
177 |
} catch (BufferException e) { |
|
178 |
LOG.warn("Buffer can not be clipped, converted or interpolated", e); |
|
179 |
taskStatus.abort(); |
|
180 |
return; |
|
181 |
} |
|
182 |
} else if (viewPort.getAdjustedEnvelope().intersects(buffer.getEnvelope())) { |
|
183 |
|
|
184 |
double widthPixel = 0; |
|
185 |
double heightPixel = 0; |
|
186 |
try { |
|
187 |
// Clip and interpolate buffer with view port envelope |
|
188 |
if(buffer.getEnvelope().equals(viewPort.getAdjustedEnvelope())){ |
|
189 |
bufferToDraw = buffer; |
|
190 |
} else { |
|
191 |
bufferToDraw = buffer.clip(viewPort.getAdjustedEnvelope()); |
|
176 |
} catch (BufferException e) { |
|
177 |
LOG.warn("Buffer can not be clipped, converted or interpolated", e); |
|
178 |
taskStatus.abort(); |
|
179 |
return; |
|
192 | 180 |
} |
193 |
widthPixel = |
|
194 |
getWidthPixel(bufferToDraw.getEnvelope(), viewPort.getAdjustedEnvelope().getLength(0) |
|
195 |
/ viewPort.getImageWidth()); |
|
196 |
heightPixel = |
|
197 |
getHeightPixel(bufferToDraw.getEnvelope(), viewPort.getAdjustedEnvelope().getLength(1) |
|
198 |
/ viewPort.getImageHeight()); |
|
181 |
} else if (viewPort.getAdjustedEnvelope().intersects(buffer.getEnvelope())) { |
|
199 | 182 |
|
200 |
bufferToDraw = |
|
201 |
bufferToDraw.createInterpolated((int) Math.floor(heightPixel), |
|
202 |
(int) Math.floor(widthPixel), Buffer.INTERPOLATION_NearestNeighbour, |
|
203 |
taskStatus); |
|
204 |
} catch (BufferException e) { |
|
205 |
LOG.warn( |
|
206 |
"Buffer can not be interpolated with [rows: {} , columns: {}, method: {}]", |
|
207 |
new String[] { String.valueOf((int) Math.floor(heightPixel)), |
|
208 |
String.valueOf((int) Math.floor(widthPixel)), |
|
183 |
double widthPixel = 0; |
|
184 |
double heightPixel = 0; |
|
185 |
try { |
|
186 |
// Clip and interpolate buffer with view port envelope |
|
187 |
if (!buffer.getEnvelope().equals(viewPort.getAdjustedEnvelope())) { |
|
188 |
clip = buffer.clip(viewPort.getAdjustedEnvelope()); |
|
189 |
bufferToDraw = clip; |
|
190 |
} |
|
191 |
widthPixel = |
|
192 |
getWidthPixel(bufferToDraw.getEnvelope(), viewPort.getAdjustedEnvelope().getLength(0) |
|
193 |
/ viewPort.getImageWidth()); |
|
194 |
heightPixel = |
|
195 |
getHeightPixel(bufferToDraw.getEnvelope(), viewPort.getAdjustedEnvelope().getLength(1) |
|
196 |
/ viewPort.getImageHeight()); |
|
197 |
|
|
198 |
interpolated = |
|
199 |
bufferToDraw.createInterpolated((int) Math.floor(heightPixel), (int) Math.floor(widthPixel), |
|
200 |
Buffer.INTERPOLATION_NearestNeighbour, taskStatus); |
|
201 |
bufferToDraw = interpolated; |
|
202 |
} catch (BufferException e) { |
|
203 |
LOG.warn("Buffer can not be interpolated with [rows: {} , columns: {}, method: {}]", new String[] { |
|
204 |
String.valueOf((int) Math.floor(heightPixel)), String.valueOf((int) Math.floor(widthPixel)), |
|
209 | 205 |
String.valueOf(Buffer.INTERPOLATION_NearestNeighbour) }); |
210 |
taskStatus.abort(); |
|
206 |
taskStatus.abort(); |
|
207 |
return; |
|
208 |
} |
|
209 |
} else { |
|
210 |
// Do nothing view port envelope does not intersect with buffer |
|
211 | 211 |
return; |
212 | 212 |
} |
213 |
} else { |
|
214 |
// Do nothing view port envelope does not intersect with buffer |
|
215 |
return; |
|
216 |
} |
|
217 | 213 |
|
218 |
if (bufferToDraw != null) { |
|
214 |
if (bufferToDraw != null) {
|
|
219 | 215 |
|
220 |
// Draw buffer |
|
221 |
Image image = null; |
|
222 |
if (this.colorInterpretation.isGray()) { |
|
223 |
// Draw buffer with gray scale |
|
224 |
image = drawGrayBuffer(graphics, bufferToDraw, transparency, filters); |
|
225 |
} else if (this.colorInterpretation.isPalette() && this.colorTable != null) { |
|
226 |
// Draw buffer with table color |
|
227 |
image = drawPaletteBuffer(graphics, bufferToDraw, colorTable, transparency, filters); |
|
228 |
} else if (this.colorInterpretation.isRGBA() || this.colorInterpretation.isRGB() |
|
229 |
|| this.colorInterpretation.isBGR()) { |
|
230 |
// Draw RGB, RGBA or BGR buffer without color table |
|
231 |
image = drawRGBBuffer(graphics, bufferToDraw, colorInterpretation, transparency, filters); |
|
232 |
} else if (this.colorInterpretation.isHSL()) { |
|
233 |
// Draw HSL buffer without color table |
|
234 |
image = drawHSLBuffer(graphics, bufferToDraw, colorInterpretation, transparency, filters); |
|
235 |
} else if (this.colorInterpretation.isCMYK()) { |
|
236 |
// Draw CMYK buffer without color table |
|
237 |
image = drawCMYKBuffer(graphics, bufferToDraw, colorInterpretation, transparency, filters); |
|
238 |
} else if (this.colorInterpretation.isYCBCR()) { |
|
239 |
// Draw YCBCR buffer without color table |
|
240 |
image = drawYCBCRBuffer(graphics, bufferToDraw, colorInterpretation, transparency, filters); |
|
241 |
} |
|
216 |
// Draw buffer
|
|
217 |
Image image = null;
|
|
218 |
if (this.colorInterpretation.isGray()) {
|
|
219 |
// Draw buffer with gray scale
|
|
220 |
image = drawGrayBuffer(graphics, bufferToDraw, transparency, filters);
|
|
221 |
} else if (this.colorInterpretation.isPalette() && this.colorTable != null) {
|
|
222 |
// Draw buffer with table color
|
|
223 |
image = drawPaletteBuffer(graphics, bufferToDraw, colorTable, transparency, filters);
|
|
224 |
} else if (this.colorInterpretation.isRGBA() || this.colorInterpretation.isRGB()
|
|
225 |
|| this.colorInterpretation.isBGR()) {
|
|
226 |
// Draw RGB, RGBA or BGR buffer without color table
|
|
227 |
image = drawRGBBuffer(graphics, bufferToDraw, colorInterpretation, transparency, filters);
|
|
228 |
} else if (this.colorInterpretation.isHSL()) {
|
|
229 |
// Draw HSL buffer without color table
|
|
230 |
image = drawHSLBuffer(graphics, bufferToDraw, colorInterpretation, transparency, filters);
|
|
231 |
} else if (this.colorInterpretation.isCMYK()) {
|
|
232 |
// Draw CMYK buffer without color table
|
|
233 |
image = drawCMYKBuffer(graphics, bufferToDraw, colorInterpretation, transparency, filters);
|
|
234 |
} else if (this.colorInterpretation.isYCBCR()) {
|
|
235 |
// Draw YCBCR buffer without color table
|
|
236 |
image = drawYCBCRBuffer(graphics, bufferToDraw, colorInterpretation, transparency, filters);
|
|
237 |
}
|
|
242 | 238 |
|
243 |
// Calculate where image has to be drawn |
|
244 |
double x = bufferToDraw.getEnvelope().getMinimum(0); |
|
245 |
double y = bufferToDraw.getEnvelope().getMaximum(1); |
|
246 |
AffineTransform affineTransform = |
|
247 |
calculateAffineTransform(viewPort.getAdjustedEnvelope(), viewPort.getImageWidth(), |
|
248 |
viewPort.getImageHeight()); |
|
239 |
// Calculate where image has to be drawn
|
|
240 |
double x = bufferToDraw.getEnvelope().getMinimum(0);
|
|
241 |
double y = bufferToDraw.getEnvelope().getMaximum(1);
|
|
242 |
AffineTransform affineTransform =
|
|
243 |
calculateAffineTransform(viewPort.getAdjustedEnvelope(), viewPort.getImageWidth(),
|
|
244 |
viewPort.getImageHeight());
|
|
249 | 245 |
|
250 |
Point point; |
|
251 |
try { |
|
252 |
point = GeometryLocator.getGeometryManager().createPoint(x, y, SUBTYPES.GEOM2D); |
|
253 |
point.transform(affineTransform.createInverse()); |
|
254 |
graphics.drawImage(image, (int) Math.floor(point.getX()), (int) Math.floor(point.getY()), null); |
|
255 |
} catch (CreateGeometryException | NoninvertibleTransformException e) { |
|
256 |
LOG.warn("Can not calculate the point of buffer in viewport image", e); |
|
257 |
taskStatus.abort(); |
|
258 |
return; |
|
246 |
Point point; |
|
247 |
try { |
|
248 |
point = GeometryLocator.getGeometryManager().createPoint(x, y, SUBTYPES.GEOM2D); |
|
249 |
point.transform(affineTransform.createInverse()); |
|
250 |
graphics.drawImage(image, (int) Math.floor(point.getX()), (int) Math.floor(point.getY()), null); |
|
251 |
} catch (CreateGeometryException | NoninvertibleTransformException e) { |
|
252 |
LOG.warn("Can not calculate the point of buffer in viewport image", e); |
|
253 |
taskStatus.abort(); |
|
254 |
return; |
|
255 |
} |
|
256 |
// if(bufferToDraw != buffer){ |
|
257 |
// DisposeUtils.dispose(bufferToDraw); |
|
258 |
bufferToDraw = null; |
|
259 |
// } |
|
259 | 260 |
} |
260 |
} |
|
261 |
} finally { |
|
262 |
if (clip != null) { |
|
263 |
DisposeUtils.dispose(clip); |
|
264 |
clip = null; |
|
265 |
} |
|
266 |
if (interpolated != null) { |
|
267 |
DisposeUtils.dispose(interpolated); |
|
268 |
interpolated = null; |
|
269 |
} |
|
270 |
if (converted != null) { |
|
271 |
DisposeUtils.dispose(converted); |
|
272 |
converted = null; |
|
273 |
} |
|
261 | 274 |
|
262 |
if (!isMyTask) { |
|
263 |
taskStatus.pop(); |
|
275 |
if (!isMyTask) { |
|
276 |
taskStatus.pop(); |
|
277 |
} |
|
264 | 278 |
} |
265 | 279 |
} |
266 | 280 |
|
Also available in: Unified diff