Revision 1708

View differences:

org.gvsig.raster.tools/tags/2.0.0/org.gvsig.raster.tools.app/org.gvsig.raster.tools.app.basic/src/main/java/org/gvsig/raster/tools/app/basic/tool/histogram/HistogramPanelListener.java
44 44
import org.gvsig.fmap.dal.coverage.datastruct.BufferHistogram;
45 45
import org.gvsig.fmap.dal.coverage.datastruct.HistogramClass;
46 46
import org.gvsig.fmap.dal.coverage.exception.HistogramException;
47
import org.gvsig.fmap.dal.coverage.exception.InvalidSetViewException;
47 48
import org.gvsig.fmap.dal.coverage.exception.ProcessInterruptedException;
49
import org.gvsig.fmap.dal.coverage.exception.RasterDriverException;
48 50
import org.gvsig.fmap.dal.coverage.store.props.HistogramComputer;
49 51
import org.gvsig.fmap.dal.exception.DataException;
50 52
import org.gvsig.fmap.dal.exception.ValidateDataParametersException;
......
193 195
			ArrayList comboSource = getHistogramPanel().getComboSource();
194 196
			for (int i = 0; i < comboSource.size(); i++) {
195 197
				String name = (String) ((ArrayList) comboSource.get(i)).get(1);
196
				if (name.compareTo(RasterToolsUtil.getText(this, "datos_visualizados")) == 0) {
198
				if (cbo.getSelectedItem().equals(name) && 
199
					name.compareTo(RasterToolsUtil.getText(this, "datos_visualizados")) == 0) {
197 200
					((ArrayList) comboSource.get(i)).remove(0);
198
					((ArrayList) comboSource.get(i)).add(0, ((FLyrRaster) lyr).getRender().getLastRenderBuffer().getHistogramComputer());
201
					try {
202
						((ArrayList) comboSource.get(i)).add(0, ((FLyrRaster) lyr).getRender().getLastRenderBuffer().getHistogramComputer());
203
					} catch (RasterDriverException e1) {
204
						RasterToolsUtil.messageBoxError("histogram_error", getHistogramPanel(), e1);
205
					} catch (InvalidSetViewException e1) {
206
						RasterToolsUtil.messageBoxError("histogram_error", getHistogramPanel(), e1);
207
					} catch (ProcessInterruptedException e1) {
208
					}
199 209

  
200 210
				}
201
				if (name.compareTo(RasterToolsUtil.getText(this, "imagen_completa")) == 0) {
211
				if (cbo.getSelectedItem().equals(name) && 
212
					name.compareTo(RasterToolsUtil.getText(this, "imagen_completa")) == 0) {
202 213
					((ArrayList) comboSource.get(i)).remove(0);
203 214
					((ArrayList) comboSource.get(i)).add(0, ((FLyrRaster) lyr).getDataStore().getHistogramComputer());
204 215
				}
org.gvsig.raster.tools/tags/2.0.0/org.gvsig.raster.tools.app/org.gvsig.raster.tools.app.basic/src/main/java/org/gvsig/raster/tools/app/basic/tool/histogram/ui/HistogramDialog.java
34 34
 * <code>HistogramDialog</code>. Creaci?n de la ventana de histograma para gvSIG.
35 35
 *
36 36
 * @version 20/03/2007
37
 * @author Nacho Brodin (brodin_ign@gva.es)
38
 * @author BorSanZa - Borja Sanchez Zamorano (borja.sanchez@iver.es)
37
 * @author Nacho Brodin (nachobrodin@gmail.com)
38
 * @author BorSanZa - Borja Sanchez Zamorano 
39 39
 */
40 40
public class HistogramDialog extends JPanel implements IWindow, ButtonsPanelListener {
41 41
	private static final long serialVersionUID = 7362459094802955247L;
org.gvsig.raster/tags/2.0.0/org.gvsig.raster.fmap/src/main/java/org/gvsig/raster/fmap/layers/FLyrRaster.java
53 53
 * 
54 54
 * @author Nacho Brodin (nachobrodin@gmail.com)
55 55
 */
56
@SuppressWarnings("deprecation")
56 57
public interface FLyrRaster extends FLayer {
57 58
	/**
58 59
	 * Gets the uniform resource identifier
......
416 417
	 * @param t
417 418
	 */
418 419
	public void setNoDataTransparent(boolean t);
420

  
419 421
}
org.gvsig.raster/tags/2.0.0/org.gvsig.raster.fmap/src/main/java/org/gvsig/raster/fmap/layers/DefaultFLyrRaster.java
172 172
	static private IConfiguration   configuration                  = new DefaultLayerConfiguration();
173 173
	protected int                   zoomLevel                      =  1;
174 174
	public boolean                  recalcLevel                    = true;
175
	private String                  uri                            = null;
175 176
	
176
	private BufferedImage           image                          = null;
177 177
	private static GeometryManager  geomManager   	               = GeometryLocator.getGeometryManager();
178 178
	private static final Logger     logger                         = LoggerFactory.getLogger(DefaultFLyrRaster.class);
179 179
	protected FileUtils             fileUtil                       = RasterLocator.getManager().getFileUtils();
180 180
	protected RasterUtils           rasterUtil                     = RasterLocator.getManager().getRasterUtils();
181 181
	protected CRSUtils              crsUtil                        = RasterLocator.getManager().getCRSUtils();
182 182
	protected MathUtils             mathUtil                       = RasterLocator.getManager().getMathUtils();
183
	private String                  uri                            = null;
184
	//private boolean                 noDataTransparent              = true;
183

  
185 184
	
186 185
	public class RasterTaskStatus extends BaseTaskStatus {
187 186
		Cancellable c = null;
......
552 551
	 * 		com.iver.utiles.swing.threads.Cancellable)
553 552
	 */
554 553
	public void draw(BufferedImage image, Graphics2D g, ViewPort vp, Cancellable cancel, double scale) throws ReadException {
555
		this.image = image;
556 554
		TaskEventManager task = rManager.getRasterTask();
557 555
		task.setEvent(null);
558 556
		
......
718 716
	 * @param y Posici?n y
719 717
	 * @return valor de pixel
720 718
	 */
721
	public int[] getPixel(int pxx, int pxy) {
722
		int[] argb = { -1, -1, -1, -1 };
723
		if (!isOpen() || (image == null))
724
			return argb;
725
		if (pxx >= 0 && pxx < image.getWidth() && pxy >= 0 && pxy < image.getHeight()) {
726
			int value = image.getRGB(pxx, pxy);
727
			argb[0] = ((value & 0xff000000) >> 24);
728
			argb[1] = ((value & 0x00ff0000) >> 16);
729
			argb[2] = ((value & 0x0000ff00) >> 8);
730
			argb[3] = (value & 0x000000ff);
731
		}
732
		return argb;
733
	}
719
//	public int[] getPixel(int pxx, int pxy) {
720
//		int[] argb = { -1, -1, -1, -1 };
721
//		if (!isOpen() || (image == null))
722
//			return argb;
723
//		if (pxx >= 0 && pxx < image.getWidth() && pxy >= 0 && pxy < image.getHeight()) {
724
//			int value = image.getRGB(pxx, pxy);
725
//			argb[0] = ((value & 0xff000000) >> 24);
726
//			argb[1] = ((value & 0x00ff0000) >> 16);
727
//			argb[2] = ((value & 0x0000ff00) >> 8);
728
//			argb[3] = (value & 0x000000ff);
729
//		}
730
//		return argb;
731
//	}
734 732

  
735 733
	/*
736 734
	 * (non-Javadoc)
......
850 848

  
851 849
		if (/*!isOpen() ||*/ !isVisible() || !isWithinScale(scale))
852 850
			return;
851
		
852
		TaskStatusManager manager = ToolsLocator.getTaskStatusManager();
853
		SimpleTaskStatus taskStatus = new RasterTaskStatus("Printing raster " + getName() + "...", cancel);
854
		manager.add(taskStatus);
855
		taskStatus.setAutoremove(true);
853 856

  
854 857
		if (!mustTilePrint)
855 858
			draw(null, g, viewPort, cancel,scale);
856 859
		else {
857
			// Para no pedir imagenes demasiado grandes, vamos
858
			// a hacer lo mismo que hace EcwFile: chunkear.
859
			// Llamamos a drawView con cuadraditos m?s peque?os
860
			// del BufferedImage ni caso, cuando se imprime viene con null
861 860
			Tiling tiles = new Tiling(maxTilePrintWidth, maxTilePrintHeight, g.getClipBounds());
862 861
			tiles.setAffineTransform((AffineTransform) viewPort.getAffineTransform().clone());
863

  
864
			//Si es la primera lectura salvamos los valores de m?ximo y m?nimo para la aplicaci?n
865
			//de realce si la imagen es de 16 bits.
866

  
867
			//RasterStats stats = getSource().getFilterStack().getStats();
868
			//if(stats != null)
869
			//stats.history.add(stats.new History(getName(), stats.minBandValue, stats.maxBandValue, stats.secondMinBandValue, stats.secondMaxBandValue));
870

  
871

  
872
			for (int tileNr = 0; tileNr < tiles.getNumTiles(); tileNr++)
862
			taskStatus.setRangeOfValues(0, tiles.getNumTiles());
863
			for (int tileNr = 0; tileNr < tiles.getNumTiles(); tileNr++) {
873 864
				// Parte que dibuja
874 865
				try {
875 866
					ViewPort vp = tiles.getTileViewPort(viewPort, tileNr);
876 867
					draw(null, g, vp, cancel, scale);
868
					taskStatus.setCurValue(tileNr);
877 869
				} catch (NoninvertibleTransformException e) {
878 870
					throw new ReadException("Error en la transformaci?n.", e);
871
				} finally {
872
					taskStatus.terminate();
879 873
				}
874
			}
880 875
		}
876
		
877
		taskStatus.terminate();
881 878
	}
882 879

  
883 880
	public void _print(Graphics2D g, ViewPort viewPort, Cancellable cancel,
......
991 988
			}
992 989

  
993 990
			if (this.isRemoveRasterFlag()) {
994
				image = null;
995 991
				if (getDataStore() != null) {
996 992
					String[] files = getFileName().clone();
997 993

  
......
1210 1206
			pReal.getY() < this.getMaxY()) {
1211 1207
			px = transformPoint(pReal);
1212 1208
		}
1213
		int[] rgb = getPixel((int) p.getX(), (int) p.getY());
1214
		ColorConversion conv = rManager.getColorConversion();
1209
		//int[] rgb = getPixel((int) p.getX(), (int) p.getY());
1210
		//ColorConversion conv = rManager.getColorConversion();
1211
		
1215 1212
		info.addField("File", normalizeAsXMLTag(getName()), 0);
1216 1213
		info.addField("View Point", "[" + p.getX() + " , " + p.getY() + "]", 1);
1217 1214
		info.addField("World Point", "[" + mathUtil.format(pReal.getX(), 3) + " , " + mathUtil.format(pReal.getY(), 3) + "]", 2);
......
1219 1216
			info.addField("Pixel Point", "Out", 3);
1220 1217
		else
1221 1218
			info.addField("Pixel Point", "[" + (int) px.getX() + ",  " + (int) px.getY() + "]", 3);
1222
		info.addField("RGB", "[" + rgb[1] + ",  " + rgb[2] + ",  " + rgb[3] + "]", 4);
1219
	
1220
		//La informaci?n RGB no puede obtener de la capa
1221
		
1222
		/*info.addField("RGB", "[" + rgb[1] + ",  " + rgb[2] + ",  " + rgb[3] + "]", 4);
1223 1223
		double[] cmyk = conv.RGBtoCMYK(rgb[1] & 0xff, rgb[2] & 0xff, rgb[3] & 0xff, 1D);
1224 1224
		info.addField("CMYK", "[" + mathUtil.format(cmyk[0], 4) + ",  " + mathUtil.format(cmyk[1], 4) + ",  " + mathUtil.format(cmyk[2], 4) + ",  " + mathUtil.format(cmyk[3], 4) + "]", 5);
1225 1225
		double[] hsl = conv.RGBtoHSL(rgb[1] & 0xff, rgb[2] & 0xff, rgb[3] & 0xff);
1226 1226
		hsl[0] = (int)(255.0 * hsl[0] / 360.0 + 0.5);
1227 1227
		hsl[2] = (int) (hsl[2] * 255. + 0.5);
1228 1228
		hsl[1] = (int) (hsl[1] * 255. + 0.5);
1229
		info.addField("HSL", "[" + mathUtil.format(hsl[0], 4) + ",  " + mathUtil.format(hsl[1], 4) + ",  " + mathUtil.format(hsl[2], 4) + "]", 6);
1229
		info.addField("HSL", "[" + mathUtil.format(hsl[0], 4) + ",  " + mathUtil.format(hsl[1], 4) + ",  " + mathUtil.format(hsl[2], 4) + "]", 6);*/
1230
		
1230 1231
		String data = "[";
1231 1232
		try {
1232 1233
			if (px != null) {
......
1698 1699
	}
1699 1700

  
1700 1701
	/**
1701
	 * Gets the last buffer which was rendered
1702
	 */
1703
	public Buffer getLastRenderBuffer() {
1704
		return getRender().getLastRenderBuffer();
1705
	}
1706

  
1707
	/**
1708 1702
	 *
1709 1703
	 * @return ROIs asociadas a la capa raster.
1710 1704
	 */
......
2159 2153
		} 
2160 2154
	}
2161 2155
	
2156
	public void setDataStore(DataStore dataStore, String domain) throws LoadLayerException {
2157
		setDataStore(dataStore);
2158
	}
2159
	
2162 2160
	/*
2163 2161
	 * (non-Javadoc)
2164 2162
	 * @see java.lang.Object#finalize()
......
2174 2172
		}
2175 2173
		strategy                       = null;
2176 2174
		configuration                  = null;
2177
		image                          = null;
2178 2175
		fileUtil                       = null;
2179 2176
		rasterUtil                     = null;
2180 2177
		crsUtil                        = null;
......
2186 2183
		render                         = null;
2187 2184
	}
2188 2185

  
2189
	public void setDataStore(DataStore dataStore, String domain)
2190
			throws LoadLayerException {
2191
		setDataStore(dataStore);
2192
	}
2193

  
2194 2186
}
org.gvsig.raster/tags/2.0.0/org.gvsig.raster.lib/org.gvsig.raster.lib.api/src/main/java/org/gvsig/fmap/dal/coverage/grid/render/Render.java
76 76
	public int getLastAlphaBandNumber();
77 77
	
78 78
	/**
79
	 * Obtiene el ?ltimo buffer renderizado.
80
	 * @return Buffer
81
	 */
82
	public Buffer getLastRenderBuffer();
83

  
84
	/**
85
	 * Asigna el ?ltimo renderizado.
86
	 * @param buf
87
	 */
88
	public void setLastRenderBuffer(Buffer buf);
89
	
90
	/**
91 79
	 * Informa de si el raster tiene tabla de color asociada o no.
92 80
	 * @return true si tiene tabla de color y false si no la tiene.
93 81
	 */
......
200 188
	 * @throws InvalidSetViewException
201 189
	 * @throws ArrayIndexOutOfBoundsException
202 190
	 */
203
	public void draw(Graphics2D g, ViewPortData vp, TaskStatus taskStatus)
191
	public Buffer draw(Graphics2D g, ViewPortData vp, TaskStatus taskStatus)
204 192
		throws RasterDriverException, InvalidSetViewException, ProcessInterruptedException;
205 193
	
206 194
	/**
......
238 226
	public void drawThread(Graphics2D g, ViewPortData vp);
239 227
	
240 228
	/**
229
	 * Draws the image with the parameters used in the last drawn. 
230
	 * @return
231
	 */
232
	public Buffer getLastRenderBuffer()
233
		throws RasterDriverException, InvalidSetViewException, ProcessInterruptedException;
234
	
235
	/**
241 236
	 * Sets the view structures to draw
242 237
	 * @param g
243 238
	 * @param vp
org.gvsig.raster/tags/2.0.0/org.gvsig.raster.lib/org.gvsig.raster.lib.api/src/main/java/org/gvsig/fmap/dal/coverage/store/props/HistogramComputer.java
67 67
	 */
68 68
	public void refreshHistogram();
69 69
	
70
	/**
71
	 * This value represents the percentage of the image that will be used 
72
	 * for this process. The default value is one, that means that the entire 
73
	 * image will be processed
74
	 */
75
	public void setScaleHistogram(double scale);
76
	
70 77
}
org.gvsig.raster/tags/2.0.0/org.gvsig.raster.lib/org.gvsig.raster.lib.impl/src/main/java/org/gvsig/raster/impl/grid/render/DefaultRender.java
61 61
import org.gvsig.raster.cache.tile.exception.TileGettingException;
62 62
import org.gvsig.raster.cache.tile.provider.TileListener;
63 63
import org.gvsig.raster.impl.DefaultRasterManager;
64
import org.gvsig.raster.impl.buffer.DefaultRasterQuery;
64 65
import org.gvsig.raster.impl.datastruct.DefaultViewPortData;
65 66
import org.gvsig.raster.impl.datastruct.ExtentImpl;
66 67
import org.gvsig.raster.impl.grid.GridImpl;
......
111 112
	 */
112 113
	private int[]            renderBands              = { 0, 1, 2 };
113 114

  
114
	private ImageDrawerImpl      drawer                   = null;
115
	private ImageDrawerImpl  drawer                   = null;
115 116
	/**
116 117
	 * Ultima transparencia aplicada en la visualizaci?n que es obtenida desde el
117 118
	 * grid
......
124 125
	 */
125 126
	private RasterFilterList filterList               = null;
126 127

  
127
	private Buffer           lastRenderBuffer         = null;
128

  
129 128
	/**
130 129
	 * Ancho y alto del objeto Image en una petici?n de dibujado a un raster
131 130
	 * raster
......
330 329
		}
331 330
		
332 331
		if (dataStore != null) {
333
			if (lastTransparency == null) {
334
				lastTransparency = dataStore.getTransparency().cloneTransparency();
335
				lastTransparency.addPropertyListener(this);
336
				lastTransparency.setTransparencyBand(dataStore.getTransparency().getAlphaBandNumber());
337
			}
332
			if(getLastTransparency().getAlphaBandNumber() == -1)
333
				getLastTransparency().setTransparencyBand(dataStore.getTransparency().getAlphaBandNumber());
338 334
			
339
			lastAlphaBand = lastTransparency.getAlphaBandNumber();
335
			lastAlphaBand = getLastTransparency().getAlphaBandNumber();
340 336
			
341 337
			// Asignamos la banda de transparencia si existe esta
342 338
			RasterQuery query = DefaultRasterManager.getInstance().createQuery();
......
345 341
			query.setSupersamplingLoadingBuffer(false); // Desactivamos el supersampleo en la carga del buffer.
346 342
			query.setDrawableBands(getRenderBands());
347 343
			query.setFrameWidth(0);
348
			query.setAlphaBand(lastTransparency.getAlphaBandNumber());
344
			query.setAlphaBand(getLastTransparency().getAlphaBandNumber());
349 345
			query.setAreaOfInterest(vp.getExtent(), 
350 346
					(int)Math.round(vp.getWidth()), 
351 347
					(int)Math.round(vp.getHeight()), this);
......
355 351
			return;
356 352
	}
357 353
	
358
	/*
359
	 * (non-Javadoc)
360
	 * @see org.gvsig.fmap.dal.coverage.grid.render.Render#draw(java.awt.Graphics2D, org.cresques.geo.ViewPortData)
361
	 */
362
	public synchronized void draw(Graphics2D g, ViewPortData vp, TaskStatus taskStatus)
354
	public synchronized Buffer getLastRenderBuffer() 
363 355
		throws RasterDriverException, InvalidSetViewException, ProcessInterruptedException {
356
		return draw(null, lastViewPortData, null);
357
	}
358
	
359
	public synchronized Buffer draw(Graphics2D g, ViewPortData vp, TaskStatus taskStatus)
360
		throws RasterDriverException, InvalidSetViewException, ProcessInterruptedException {
364 361
		lastGraphics = g;
365 362
		lastViewPortData = vp;
366 363

  
367 364
		if(util.isOutside(vp.getExtent(), dataStore.getExtent())) {
368 365
			endReading();
369
			return;
366
			return null;
370 367
		}
371 368

  
372 369
		Extent adjustedRotedRequest = request(vp, dataStore);
373 370

  
374 371
		if ((widthImage <= 0) || (heightImage <= 0)) {
375 372
			endReading();
376
			return;
373
			return null;
377 374
		}
378 375

  
379 376
		if (dataStore == null) 
380
			return;
377
			return null;
381 378
		
382
		//If the transparency hasn't been defined yet then we'll take that from the store
383
		if (lastTransparency == null) {
384
			lastTransparency = dataStore.getTransparency().cloneTransparency();
385
			lastTransparency.addPropertyListener(this);
386
		}
387
		
388 379
		Buffer buf = null; 
389 380
		double[] step = null;
390 381
		
......
394 385
					(int)Math.round(heightImage), 
395 386
					vp.getTime(), 
396 387
					renderBands, 
397
					lastTransparency);
388
					getLastTransparency());
398 389
		} else {
399 390
			// Asignamos la banda de transparencia si existe esta
400 391
			RasterQuery query = DefaultRasterManager.getInstance().createQuery();
392
			//query.setReadOnly(true);
401 393
			query.setTaskStatus(taskStatus);
402 394
			query.setTime(vp.getTime());
403 395
			query.setSupersamplingLoadingBuffer(false); // Desactivamos el supersampleo en la carga del buffer.
404 396
			query.setAreaOfInterest(adjustedRotedRequest, (int)Math.round(widthImage), (int)Math.round(heightImage));
405 397

  
406
			if (lastTransparency.getAlphaBandNumber() != -1) {
407
				query.setDrawableBands(new int[] { lastTransparency.getAlphaBandNumber()});
408
				lastTransparency.setAlphaBand(dataStore.query(query));
398
			if (getLastTransparency().getAlphaBandNumber() != -1) {
399
				query.setDrawableBands(new int[] { getLastTransparency().getAlphaBandNumber()});
400
				getLastTransparency().setAlphaBand(dataStore.query(query));
409 401
			}
410
			lastAlphaBand = lastTransparency.getAlphaBandNumber();
402
			lastAlphaBand = getLastTransparency().getAlphaBandNumber();
411 403

  
412 404
			query.setAreaOfInterest(adjustedRotedRequest, (int)Math.round(widthImage), (int)Math.round(heightImage));
413 405
			query.setDrawableBands(getRenderBands());
414 406
			buf = dataStore.query(query);
407
			((DefaultRasterQuery)query).setBuffer(null);
415 408
			query.setSupersamplingLoadingBuffer(true);
416 409
			step = dataStore.getStep();
417 410
		}
......
420 413
			init();
421 414
		}
422 415
		
423
		drawBufferOnImage(lastGraphics, 
424
				lastViewPortData, 
425
				buf, 
426
				step, 
427
				dataStore.getAffineTransform(), 
428
				adjustedRotedRequest);
416
		return drawBufferOnImage(lastGraphics, 
417
					lastViewPortData, 
418
					buf, 
419
					step, 
420
					dataStore.getAffineTransform(), 
421
					adjustedRotedRequest);
429 422
	}
430 423
	
431 424
	/*
432 425
	 * (non-Javadoc)
433 426
	 * @see org.gvsig.fmap.dal.coverage.grid.render.Render#draw(java.awt.Graphics2D, org.cresques.geo.ViewPortData)
434 427
	 */
435
	private synchronized void drawBufferOnImage(Graphics2D g, ViewPortData vp, Buffer buf, double[] step, AffineTransform transf, Extent adjustedRotedRequest)
428
	private synchronized Buffer drawBufferOnImage(Graphics2D g, ViewPortData vp, Buffer buf, double[] step, AffineTransform transf, Extent adjustedRotedRequest)
436 429
		throws RasterDriverException, InvalidSetViewException, ProcessInterruptedException {
437 430
		
438 431
		grid = bufferPreprocessing(buf, lastTransparency);
439 432
		
440
		if(lastRenderBuffer != null)
441
			lastRenderBuffer.dispose();
442 433
		//Buffer filtrado para renderizar
443
		lastRenderBuffer = grid.getRasterBuf();
444
		drawer.setBuffer(lastRenderBuffer); // Buffer de datos a renderizar
434
		buf = grid.getRasterBuf();
435
		if(g == null)
436
			return buf;
437
		drawer.setBuffer(buf); // Buffer de datos a renderizar
445 438
		drawer.setSupersamplingOn(step); // Desplazamiento para supersampleo
446 439
		drawer.setOutputSize((int)Math.round(widthImage), (int)Math.round(heightImage)); // Ancho y alto del buffer
447 440
		drawer.setLastTransparency(getLastTransparency());
448 441
		Image geoImage = drawer.drawBufferOverImageObject(); // Acci?n de renderizado
442
		drawer.dispose();
449 443

  
450 444
		// Borramos el buffer de transparencia para que siempre se tenga que regenerar.
451
		lastTransparency.setAlphaBand(null);
445
		getLastTransparency().setAlphaBand(null);
452 446

  
453 447
		//En el caso de no tenga rotaci?n y el tama?o de pixel sea positivo en X y negativo en Y no aplicamos ninguna
454 448
		//transformaci?n. Esto no es necesario hacerlo, sin ello se visualiza igual. Unicamente se hace porque de esta
......
458 452
			Point2D lastGraphicOffset = new Point2D.Double(adjustedRotedRequest.getULX(), adjustedRotedRequest.getULY());
459 453
			((DefaultViewPortData)vp).mat.transform(lastGraphicOffset, lastGraphicOffset);
460 454
			g.drawImage(geoImage, (int) Math.round(lastGraphicOffset.getX()), (int) Math.round(lastGraphicOffset.getY()), null);
461
			return;
455
			return buf;
462 456
		}
463 457

  
464 458
		/*
......
495 489
			LoggerFactory.getLogger(getClass()).debug("Transformation error", e);
496 490
		}
497 491
		
498
		return;
492
		return buf;
499 493
		// long t2 = new Date().getTime();
500 494
		// System.out.println("Renderizando Raster: " + ((t2 - t1) / 1000D) + ", secs.");
501 495
	}
......
574 568
			} catch (ProcessInterruptedException e2) {
575 569
				return;
576 570
			}
577

  
571
			d.dispose();
572
			
578 573
			lastTransparency.setAlphaBand(null);
579 574
			
580 575
			AffineTransform at = new AffineTransform();
......
853 848
		return out;
854 849
	}
855 850

  
856
	/*
857
	 * (non-Javadoc)
858
	 * @see org.gvsig.fmap.dal.coverage.grid.Render#getLastTransparency()
859
	 */
860 851
	public Transparency getLastTransparency() {
852
		//If the transparency hasn't been defined yet then we'll take that from the store
853
		if (lastTransparency == null) {
854
			lastTransparency = dataStore.getTransparency().cloneTransparency();
855
			lastTransparency.addPropertyListener(this);
856
		}
861 857
		return lastTransparency;
862 858
	}
863 859
	
......
889 885

  
890 886
	/*
891 887
	 * (non-Javadoc)
892
	 * @see org.gvsig.fmap.dal.coverage.grid.render.Render#getLastRenderBuffer()
893
	 */
894
	public Buffer getLastRenderBuffer() {
895
		return this.lastRenderBuffer;
896
	}
897

  
898
	/*
899
	 * (non-Javadoc)
900
	 * @see org.gvsig.fmap.dal.coverage.grid.render.Render#setLastRenderBuffer(org.gvsig.fmap.dal.coverage.dataset.Buffer)
901
	 */
902
	public void setLastRenderBuffer(Buffer buf) {
903
		this.lastRenderBuffer = buf;
904
	}
905

  
906
	/*
907
	 * (non-Javadoc)
908 888
	 * @see org.gvsig.fmap.dal.coverage.grid.render.Render#setFilterList(org.gvsig.fmap.dal.coverage.grid.RasterFilterList)
909 889
	 */
910 890
	public void setFilterList(RasterFilterList filterList) {
......
1007 987
			grid.dispose();
1008 988
		if (getFilterList() != null)
1009 989
			getFilterList().dispose();
1010
		if (lastRenderBuffer != null)
1011
			lastRenderBuffer.dispose();
1012 990
		try {
1013 991
			finalize();
1014 992
		} catch (Throwable e) {
......
1026 1004
        drawer                   = null;
1027 1005
		lastTransparency         = null;
1028 1006
		filterList               = null;
1029
        lastRenderBuffer         = null;
1030 1007
        ulPxRequest              = null;
1031 1008
        lrPxRequest              = null;
1032 1009
		lastGraphics             = null;
org.gvsig.raster/tags/2.0.0/org.gvsig.raster.lib/org.gvsig.raster.lib.impl/src/main/java/org/gvsig/raster/impl/grid/render/ImageDrawerImpl.java
345 345
	public void dispose() {
346 346
		if(rasterBuf != null)
347 347
			rasterBuf.dispose();
348
		if(transparency != null)
349
			transparency.dispose();
348 350
		try {
349 351
			finalize();
350 352
		} catch (Throwable e) {
......
421 423
	protected void finalize() throws Throwable {
422 424
		step        = null;
423 425
		rasterBuf   = null;
426
		transparency = null;
424 427
		super.finalize();
425 428
	}
426 429

  
org.gvsig.raster/tags/2.0.0/org.gvsig.raster.lib/org.gvsig.raster.lib.impl/src/main/java/org/gvsig/raster/impl/buffer/BufferHistogramComputer.java
42 42
	protected int			            progressHistogram    = 0;
43 43
	private double[]                    limits               = null;
44 44
	private boolean                     refresh              = false;
45
	@SuppressWarnings("unused")
46
	private double                      scale                = 1;
45 47
	
46 48
	/**
47 49
	 * Constructor
......
51 53
		this.buffer = buffer;
52 54
	}
53 55
	
56
	public void setScaleHistogram(double scale) {
57
		this.scale = scale;
58
	}
59
	
54 60
	/*
55 61
	 * (non-Javadoc)
56 62
	 * @see org.gvsig.fmap.dal.coverage.store.props.HistogramComputer#getBufferHistogram()
org.gvsig.raster/tags/2.0.0/org.gvsig.raster.lib/org.gvsig.raster.lib.impl/src/main/java/org/gvsig/raster/impl/buffer/cache/RasterReadOnlyBuffer.java
97 97
	private int            offset = 1;
98 98
	
99 99
	private int            bufWidth, bufHeight;
100
	private int            blockHeight  = RasterLibrary.blockHeight;
100 101
	
101 102
	/**
102 103
	 * Constructor. Asigna las variables de inicializaci?n y crea la estructura de 
......
112 113
	 */
113 114
	public RasterReadOnlyBuffer(int dataType, int width, int height, int nBand) {
114 115
		this.dataType = dataType;
115
				this.width = width;
116
				this.height = height;
117
				this.nBands = nBand;	
116
		this.width = width;
117
		this.height = height;
118
		this.nBands = nBand;	
118 119
	}
119 120
	
120 121
	/**
......
174 175
		this.maxX = maxX;
175 176
		this.maxY = maxY;
176 177
		
177
		if(Math.abs(maxX - minX) != width)
178
		if(Math.abs(maxX - minX) != width || Math.abs(maxY - minY) != height) {
178 179
			bufWidth = width;
179
		if(Math.abs(maxY - minY) != height) 
180 180
			bufHeight = height;
181
		}
181 182
					
182 183
		init();
183 184
	}
......
190 191
	 */
191 192
	private void init() {
192 193
		//Calculo de los bits por p?gina
193
		int h = RasterLibrary.blockHeight; 
194
		int h = blockHeight; 
194 195
		while(h > 1) {
195 196
			h >>= 1;
196 197
			bitsPag ++;
197 198
		}
198 199
		
199 200
		//Calculo del desplazamiento
200
		offset = RasterLibrary.blockHeight - 1;    
201
		offset = blockHeight - 1;    
201 202
		
202 203
		//Creamos el bufferFactory asociado a la carga de p?ginas. Cada p?gina se fuerza
203 204
		//a que sea cargada en memoria.
......
205 206
		query.setMemoryBuffer(true);
206 207
		query.setDrawableBands(bandList.getDrawableBands());
207 208
		
208
		nPages = (int)Math.ceil((double)height / (double)RasterLibrary.blockHeight);
209
		nPages = (int)Math.ceil((double)height / (double)blockHeight);
209 210
		//double aux = ((double)height / (double)RasterLibrary.blockHeight);
210 211
		//heightLastPage = (int)((aux - (int)aux) * RasterLibrary.blockHeight);
211
		if(height % RasterLibrary.blockHeight == 0)
212
			heightLastPage = RasterLibrary.blockHeight;
212
		if(height % blockHeight == 0)
213
			heightLastPage = blockHeight;
213 214
		else {
214
			double aux = ((double)height / (double)RasterLibrary.blockHeight);
215
			heightLastPage = (int)((aux - (int)aux) * RasterLibrary.blockHeight);
215
			double aux = ((double)height / (double)blockHeight);
216
			heightLastPage = (int)((aux - (int)aux) * blockHeight);
216 217
		}
217 218
		
218 219
		drawableBands = new int[datasource.getBandCount()];
219
			for (int i = 0; i < drawableBands.length; i++) 
220
		for (int i = 0; i < drawableBands.length; i++) 
220 221
			drawableBands[i] = i;
221 222
	}
222 223
	
......
251 252
	 */
252 253
	public Extent[] calcExtentPages(DefaultRasterProvider dataset, int nPages) {
253 254
		Extent datasetExtent = dataset.getExtent();
254
		double h = (RasterLibrary.blockHeight * dataset.getExtent().height()) / dataset.getHeight();
255
		double h = (blockHeight * dataset.getExtent().height()) / dataset.getHeight();
255 256
		Extent[] ext = new Extent[nPages];
256 257
		
257 258
		double minX = datasetExtent.getMin().getX();
......
282 283
	private Buffer queryPage(int pag) throws RasterDriverException, ProcessInterruptedException, InvalidSetViewException {
283 284
		int w = maxX - minX + 1;
284 285
		int h = maxY - minY + 1;
286
		
287
		if((minX + w) > datasource.getWidth())
288
			w = (int)(datasource.getWidth() - minX);
289
		
285 290
		if(bufWidth == 0 && bufHeight == 0) {
286 291
			if(pag == nPages - 1)
287
				query.setAreaOfInterest(minX, (RasterLibrary.blockHeight * pag) + minY, w, heightLastPage);
292
				query.setAreaOfInterest(minX, (blockHeight * pag) + minY, w, heightLastPage);
288 293
			else 
289
				query.setAreaOfInterest(minX, (RasterLibrary.blockHeight * pag) + minY, w, RasterLibrary.blockHeight);
294
				query.setAreaOfInterest(minX, (blockHeight * pag) + minY, w, blockHeight);
290 295
		} else {
291
			int hPage = (int)Math.round((RasterLibrary.blockHeight * h) / (double)bufHeight);
296
			int hPage = (int)Math.round((blockHeight * h) / (double)bufHeight);
292 297
			if(pag == nPages - 1) {
293
				int hLastPage = (int)Math.round((heightLastPage * bufHeight) / (double)h);
294
				query.setAreaOfInterest(minX, (hPage * pag) + minY, w, hLastPage, bufWidth, heightLastPage);
298
				int hLastPage = 0;
299
				if(heightLastPage == bufHeight) {
300
					hLastPage = h;
301
					hPage = 0;
302
				} else
303
					hLastPage = (int)Math.round((heightLastPage * h) / (double)bufHeight);
304
				int newMiY = (hPage * pag) + minY;
305
				if((newMiY + hLastPage) > datasource.getHeight())
306
					hLastPage = (int)(datasource.getHeight() - newMiY);
307
				query.setAreaOfInterest(minX, newMiY, w, hLastPage, bufWidth, heightLastPage);
295 308
			} else 
296
				query.setAreaOfInterest(minX, (hPage * pag) + minY, w, hPage, bufWidth, RasterLibrary.blockHeight);
309
				query.setAreaOfInterest(minX, (hPage * pag) + minY, w, hPage, bufWidth, blockHeight);
297 310
		}
298 311
		return datasource.query(query);
299 312
	}
org.gvsig.raster/tags/2.0.0/org.gvsig.raster.lib/org.gvsig.raster.lib.impl/src/main/java/org/gvsig/raster/impl/store/properties/DataStoreTransparency.java
134 134
		
135 135
		//TODO: FUNCIONALIDAD: Falta asignar lo necesario para la transparencia por selecci?n
136 136
		this.transparencyRanges = (ArrayList<TransparencyRange>) t.getTransparencyRange().clone();
137
		this.mask = t.getAlphaBand();
137
		if(this.mask != null)
138
			this.mask = t.getAlphaBand();
138 139
		this.opacity = t.getOpacity();
139 140
		this.alphaBandNumber = t.alphaBandNumber;
140 141
		this.noData = (NoData)t.getNoData().clone();
141
		this.originalData = t.originalData;
142
		if(this.originalData != null)
143
			this.originalData = t.originalData;
142 144
		this.transparencyActive = t.transparencyActive;
143 145
	}
144 146

  
......
422 424
	 * @see org.gvsig.fmap.dal.coverage.store.props.Transparency#activeTransparency()
423 425
	 */
424 426
	public void activeTransparency() {
425
		if(	existAlphaBand() || (getNoData().isDefined() && getNoData().isNoDataTransparent()) ||
427
		if(	existAlphaBand() || 
428
			(getNoData() != null && getNoData().isDefined() && getNoData().isNoDataTransparent()) ||
426 429
			(transparencyRanges.size() > 0) ||
427 430
			(opacity != 0xff))
428 431
			transparencyActive = true;
......
617 620
			mask.dispose();
618 621
		if (originalData != null)
619 622
			originalData.dispose();
620
		try {
621
			finalize();
622
		} catch (Throwable e) {
623
		}
623
		mask = null;
624
		originalData = null;
624 625
	}
625 626
	
626 627
	/*
org.gvsig.raster/tags/2.0.0/org.gvsig.raster.lib/org.gvsig.raster.lib.impl/src/main/java/org/gvsig/raster/impl/store/properties/SimpleProviderHistogramComputer.java
61 61
	private RasterProvider          provider  = null;
62 62
	private int                     percent   = 0;
63 63
	private boolean                 refresh   = false;
64
	private double                  scale     = 1;
64 65
	
65 66
	/**
66 67
	 * Constructor
......
69 70
	public SimpleProviderHistogramComputer(RasterProvider provider) {
70 71
		this.provider = provider;
71 72
	}
73
	
74
	public void setScaleHistogram(double scale) {
75
		this.scale = scale;
76
	}
72 77

  
73 78
	/**
74 79
	 * Obtiene el minimo valor de las estadisticas de un histograma.
......
197 202
		for (int block = 0; block < provider.getHeight(); block += h) {
198 203
			Object buf = null;
199 204
			try {
200
				buf = provider.readBlock(block, h, RasterLibrary.statisticsScale);
205
				buf = provider.readBlock(block, h, scale);
201 206
			} catch (InvalidSetViewException e) {
202 207
				// La vista se asigna autom?ticamente
203 208
			}
......
206 211
			if ((block + hB) > provider.getHeight())
207 212
				hB = Math.abs(((int)provider.getHeight()) - block);
208 213
			
209
			hB *= RasterLibrary.statisticsScale;
214
			hB *= scale;
210 215

  
211 216
			if(buf instanceof Buffer) {
212 217
				loadHistogramFromBuffer((Buffer)buf);
org.gvsig.raster/tags/2.0.0/org.gvsig.raster.lib/org.gvsig.raster.lib.impl/src/main/java/org/gvsig/raster/impl/store/properties/MultiProviderHistogramComputer.java
21 21
 */
22 22
package org.gvsig.raster.impl.store.properties;
23 23

  
24
import org.gvsig.fmap.dal.coverage.RasterLibrary;
25 24
import org.gvsig.fmap.dal.coverage.datastruct.BufferHistogram;
26 25
import org.gvsig.fmap.dal.coverage.exception.FileNotOpenException;
27 26
import org.gvsig.fmap.dal.coverage.exception.HistogramException;
......
46 45
	private boolean                     refresh     = false;
47 46
	private int                         percent     = 0;
48 47
	private int                         files       = 0;
48
	private double                      scale       = 1;
49 49
	
50 50
	/**
51 51
	 * Constructor
......
56 56
		files = provider.getInternalProviderCount();
57 57
	}
58 58
	
59
	public void setScaleHistogram(double scale) {
60
		this.scale = scale;
61
	}
62
	
59 63
	/**
60 64
	 * Obtiene el histograma. Pregunta a todos los datasets que forman el multidataset
61 65
	 * por su histograma y luego los fusiona.
......
81 85
					return null;
82 86

  
83 87
				try {
84
					provider.getStatistics().calculate(RasterLibrary.statisticsScale);
88
					provider.getStatistics().calculate(scale);
85 89
				} catch (FileNotOpenException e) {
86 90
					throw new HistogramException("");
87 91
				} catch (RasterDriverException e) {
org.gvsig.raster/tags/2.0.0/org.gvsig.raster.lib/org.gvsig.raster.lib.impl/src/main/java/org/gvsig/raster/impl/store/properties/DataStoreColorTable.java
952 952
		}
953 953
	}
954 954
	
955
	public void finalize() {
956
		if(colorItems != null) {
957
			colorItems.clear();
958
			colorItems = null;
959
		}
960
		range             = null;
961
		paletteByBand     = null;
962
		if(nameClass != null) {
963
			for (int i = 0; i < nameClass.length; i++) {
964
				nameClass[i] = null;
965
			}
966
			nameClass = null;
967
		}
968
		name              = null;
969
		filePath          = null;
970
	}
971
	
972 955
}
org.gvsig.raster/tags/2.0.0/org.gvsig.raster.lib/org.gvsig.raster.lib.impl/src/main/java/org/gvsig/raster/impl/datastruct/BufferHistogramImpl.java
425 425

  
426 426
		double[][] res = new double[5][];
427 427

  
428
		double[] min = new double[bandCount];// M?nimo
429
		double[] max = new double[bandCount];// M?ximo
430
		for (int iBand = 0; iBand < bandCount; iBand++) {
431
			max[iBand] = Double.NEGATIVE_INFINITY;
432
			min[iBand] = Double.POSITIVE_INFINITY;
433
		}
434 428
		double[] average = new double[bandCount]; // Valor de pixel medio (Media)
435 429
		double[] middle = new double[bandCount]; // Mediana
436 430
		double[] nPixelsBand = new double[bandCount];// N?mero de pixels por banda
......
440 434
		for (int iBand = 0; iBand < histogram.length; iBand++) {
441 435
			if (bands[iBand]) {
442 436
				for (int i = beginPos; i <= endPos; i++) {
443
					// Calculo del m?nimo
444
					if (histogram[iBand][i].getValue() != 0 && histogram[iBand][i].getMin() < min[showBandCounter])
445
						min[showBandCounter] = histogram[iBand][i].getMin();
446

  
447
					// Calculo del m?ximo
448
					if (histogram[iBand][i].getValue() != 0 && histogram[iBand][i].getMax() > max[showBandCounter])
449
						max[showBandCounter] = histogram[iBand][i].getMin();
450

  
451 437
					// Calculo del n?mero de pixeles
452 438
					nPixelsBand[showBandCounter] += histogram[iBand][i].getValue();
453

  
454 439
					average[showBandCounter] += histogram[iBand][i].getValue() * ((histogram[iBand][i].getMax() + histogram[iBand][i].getMin())/2);
455 440
				}
456 441
				// Calculo de la media
......
462 447

  
463 448
				// Calculo de mediana
464 449
				double stopPos = nPixelsBand[showBandCounter] / 2;
465
				int aux = 0;
450
				double aux = 0;
466 451
				int i = beginPos;
467 452
				for (i = beginPos; aux <= stopPos; i++) {
468 453
					if (i >= histogram[iBand].length)
......
474 459
					}
475 460
				}
476 461
				middle[showBandCounter] = (histogram[iBand][i - 1].getMax() + histogram[iBand][i - 1].getMin()) / 2;
477

  
478 462
				showBandCounter++;
479 463
			}
480 464
		}
org.gvsig.raster.gdal/tags/2.0.0/org.gvsig.raster.gdal.io/src/main/java/org/gvsig/raster/gdal/io/GdalNative.java
1064 1064
			if(lastblock > 0)
1065 1065
				nBlocks ++;
1066 1066
			int initYSrc = inputWindow[1];
1067
			int stepYSrc = (buf.getBlockHeight() * inputWindow[3]) / buf.getHeight();
1068
			int lastBlockYSrc = (lastblock * inputWindow[3]) / buf.getHeight();
1067 1069
			int initYBuffer = 0;
1068 1070
			for (int i = 0; i < nBlocks; i++) {
1069 1071
				if(lastblock > 0 && i == (nBlocks - 1)) {
1070 1072
					int[] newStepBuffer = new int[]{0, initYBuffer, stepBuffer[2], initYBuffer + lastblock};
1073
					int[] newWindow = new int[]{inputWindow[0], initYSrc, inputWindow[2], lastBlockYSrc};
1071 1074
					readData(buf, 
1072 1075
							bandList, 
1073
							new int[]{inputWindow[0], initYSrc, inputWindow[2], lastblock}, 
1076
							newWindow, 
1074 1077
							bufWidth, lastblock, 0, 0, newStepBuffer);
1075 1078
				} else {
1076 1079
					int[] newStepBuffer = new int[]{0, initYBuffer, stepBuffer[2], initYBuffer + buf.getBlockHeight()};
1080
					int[] newWindow = new int[]{inputWindow[0], initYSrc, inputWindow[2], stepYSrc};
1077 1081
					readData(buf, 
1078 1082
							bandList, 
1079
							new int[]{inputWindow[0], initYSrc, inputWindow[2], buf.getBlockHeight()}, 
1083
							newWindow, 
1080 1084
							bufWidth, buf.getBlockHeight(), 0, 0, newStepBuffer);
1081
					initYSrc += buf.getBlockHeight();
1085
					initYSrc += stepYSrc;
1082 1086
					initYBuffer += buf.getBlockHeight();
1083 1087
				}
1084 1088
			}

Also available in: Unified diff