Revision 6497

View differences:

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