Statistics
| Revision:

gvsig-raster / org.gvsig.raster / trunk / org.gvsig.raster / org.gvsig.raster.lib / org.gvsig.raster.lib.api / src / main / java / org / gvsig / fmap / dal / coverage / dataset / Buffer.java @ 1030

History | View | Annotate | Download (16.8 KB)

1
/* gvSIG. Geographic Information System of the Valencian Government
2
 *
3
 * Copyright (C) 2007-2008 Infrastructures and Transports Department
4
 * of the Valencian Government (CIT)
5
 *
6
 * This program is free software; you can redistribute it and/or
7
 * modify it under the terms of the GNU General Public License
8
 * as published by the Free Software Foundation; either version 2
9
 * of the License, or (at your option) any later version.
10
 *
11
 * This program is distributed in the hope that it will be useful,
12
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14
 * GNU General Public License for more details.
15
 *
16
 * You should have received a copy of the GNU General Public License
17
 * along with this program; if not, write to the Free Software
18
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
19
 * MA  02110-1301, USA.
20
 *
21
 */
22
package org.gvsig.fmap.dal.coverage.dataset;
23

    
24
import java.awt.geom.Rectangle2D;
25
import java.awt.image.DataBuffer;
26

    
27
import org.gvsig.fmap.dal.DataSet;
28
import org.gvsig.fmap.dal.coverage.datastruct.Band;
29
import org.gvsig.fmap.dal.coverage.datastruct.NoData;
30
import org.gvsig.fmap.dal.coverage.exception.ProcessInterruptedException;
31
import org.gvsig.fmap.dal.coverage.process.IncrementableTask;
32
import org.gvsig.fmap.dal.coverage.store.RasterDataStore;
33
import org.gvsig.fmap.dal.coverage.store.props.Histogramable;
34

    
35
/**
36
 * Interfaz que contiene las operaciones que debe soportar un buffer de datos.
37
 * @author Nacho Brodin (nachobrodin@gmail.com)
38
 *
39
 */
40
public interface Buffer extends DataSet, Histogramable {
41
    public final static int TYPE_UNDEFINED                 = DataBuffer.TYPE_UNDEFINED;
42
    public final static int TYPE_BYTE                      = DataBuffer.TYPE_BYTE;
43
    public final static int TYPE_SHORT                     = DataBuffer.TYPE_SHORT;
44
    public final static int TYPE_USHORT                    = DataBuffer.TYPE_USHORT;
45
    public final static int TYPE_INT                       = DataBuffer.TYPE_INT;
46
    public final static int TYPE_FLOAT                     = DataBuffer.TYPE_FLOAT;
47
    public final static int TYPE_DOUBLE                    = DataBuffer.TYPE_DOUBLE;
48
    public final static int TYPE_IMAGE                     = -1;
49
    
50
        public final static int INTERPOLATION_Undefined        = 0;
51
        public final static int INTERPOLATION_NearestNeighbour = 1;
52
        public final static int INTERPOLATION_Bilinear         = 2;
53
        public final static int INTERPOLATION_InverseDistance  = 3;
54
        public final static int INTERPOLATION_BicubicSpline    = 4;
55
        public final static int INTERPOLATION_BSpline          = 5;
56
    
57
        /*public static int TYPE_UNDEFINED = 32;
58
        public static int TYPE_Byte = 0;                //Buffer byte (8)
59
        public static int TYPE_UInt16 = 1;                //Buffer short (16)
60
        public static int TYPE_Int16 = 2;                //Buffer short (16)
61
        public static int TYPE_UInt32 = 6;                //Buffer int (32)
62
        public static int TYPE_Int32 = 3;                //Buffer int (32)
63
        public static int TYPE_Float32 = 4;                //Buffer float (32)
64
        public static int TYPE_Float64 = 5;                //Buffer double (64)
65
        public static int TYPE_CInt16 = 7;                //Buffer short (16)
66
        public static int TYPE_CInt32 = 8;                //Buffer int (32)
67
        public static int TYPE_CFloat32 = 9;        //Buffer float (32)
68
        public static int TYPE_CFloat64 = 10;*/        //Buffer double (64)
69
    
70
        /**
71
         * Gets the RasterDataStore reference
72
         * @return
73
         */
74
        public RasterDataStore getStore();
75

    
76
        /**
77
         * Sets the RasterDataStore reference
78
         * @param store
79
         */
80
        public void setStore(RasterDataStore store);
81
        
82
    /**
83
     * Ancho del raster
84
     * @return Entero con el ancho del raster
85
     */
86
    public int getWidth();
87

    
88
    /**
89
     * Alto del raster
90
     * @return Entero con el alto del raster
91
     */
92
    public int getHeight();
93
    
94
    /**
95
     * Gets the height of a block of data.
96
     * @return
97
     */
98
    public int getBlockHeight();
99

    
100
    /**
101
     * N?mero de bandas
102
     * @return Entero con el n?mero de bandas
103
     */
104
    public int getBandCount();
105

    
106
    /**
107
     * Obtiene el tipo de dato. Los tipos de dato posibles est?n definidos en IRaster.
108
     * @return tipo de datos
109
     */
110
        public int getDataType();
111
        
112
        /**
113
         * Asigna el tipo de dato. Los tipos de dato posibles est?n definidos en IRaster.
114
         * @param dataType Tipo de dato del buffer
115
         */
116
        public void setDataType(int dataType);
117
        
118
    /**
119
     * Gets the NoData value of this buffer
120
     * @return 
121
     */
122
     public NoData getNoDataValue();
123
    
124
    /**
125
     * Obtiene true si el pixel pasado por par?metro cae dentro de los l?mites
126
     * del rater y false si cae fuera. 
127
     * @param x Posici?n X del pixel a averiguar
128
     * @param y Posici?n Y del pixel a averiguar
129
     * @return true si est? dentro y false si cae fuera.
130
     */
131
    public boolean isInside(int x, int y);
132

    
133
    /**
134
     * Calcula el m?nimo y el m?ximo del histograma previamente.
135
     * @return double[] con el m?nimo y m?ximo y el segundo minimo y maximo.
136
     * @throws ProcessInterruptedException 
137
     */
138
    public double[] getLimits() throws ProcessInterruptedException;
139

    
140
    /**
141
     * Sets the NoData value 
142
     * @param nd
143
     */
144
    public void setNoDataValue(NoData nd);
145
    
146
    /**
147
     * Reserva de memoria para el rasterbuf solo en la banda solicitada
148
     * @param dataType Tipo de dato
149
     * @param width Ancho
150
     * @param height Alto
151
     * @param band N?mero de banda
152
     * @param orig
153
     */
154
    public void mallocOneBand(int dataType, int width, int height, int band);
155
    
156
    /**
157
     * Informa de si el buffer tiene la capacidad de intercambio de bandas o
158
     * no la tiene.
159
     * @return Devuelve true si tiene la capacidad de intercambio de bandas y 
160
     * false si no la tiene.
161
     */
162
    public boolean isBandSwitchable();
163
    
164
    /**
165
     * Returns true if the current buffer can't be writed
166
     * @return
167
     */
168
    public boolean isReadOnlyBuffer();
169
    
170
    /**
171
     * Returns true if it is a cached buffer
172
     * @return
173
     */
174
    public boolean isCached();
175
    
176
        /**
177
         * Gets a bouding box of this buffer
178
         * @return
179
         */
180
        public Rectangle2D getDataExtent();
181
        
182
        /**
183
         * Sets a bounding box of this buffer
184
         * @param r
185
         */
186
        public void setDataExtent(Rectangle2D r);
187
        
188
        /**
189
         * Assigns the band list but only for a read only buffer 
190
         * @param bandList
191
         */
192
        public void addDrawableBands(int[] db);
193
        
194
        /**
195
         * Libera el buffer de memoria
196
         */
197
        public void free();
198

    
199
    //***********************************************
200
    //Obtiene una linea de datos de todas las bandas
201
    
202
        /**
203
         * Obtiene una l?nea de datos con todas las bandas para buffers con tipo
204
         * de dato byte.
205
         * @param line N?mero de l?nea del buffer a recuperar
206
         * @return Array bidimensional conteniendo la l?nea de datos donde la primera
207
         * dimensi?n representa las bandas y la segunda la posici?n en la l?nea
208
         */    
209
    public byte[][] getLineByte(int line);
210

    
211
    /**
212
         * Obtiene una l?nea de datos con todas las bandas para buffers con tipo
213
         * de dato short.
214
         * @param line N?mero de l?nea del buffer a recuperar
215
         * @return Array bidimensional conteniendo la l?nea de datos donde la primera
216
         * dimensi?n representa las bandas y la segunda la posici?n en la l?nea
217
         */  
218
    public short[][] getLineShort(int line);
219

    
220
    /**
221
         * Obtiene una l?nea de datos con todas las bandas para buffers con tipo
222
         * de dato int.
223
         * @param line N?mero de l?nea del buffer a recuperar
224
         * @return Array bidimensional conteniendo la l?nea de datos donde la primera
225
         * dimensi?n representa las bandas y la segunda la posici?n en la l?nea
226
         */  
227
    public int[][] getLineInt(int line);
228
        
229
    /**
230
         * Obtiene una l?nea de datos con todas las bandas para buffers con tipo
231
         * de dato float.
232
         * @param line N?mero de l?nea del buffer a recuperar
233
         * @return Array bidimensional conteniendo la l?nea de datos donde la primera
234
         * dimensi?n representa las bandas y la segunda la posici?n en la l?nea
235
         */  
236
    public float[][] getLineFloat(int line);
237
    
238
    /**
239
         * Obtiene una l?nea de datos con todas las bandas para buffers con tipo
240
         * de dato double.
241
         * @param line N?mero de l?nea del buffer a recuperar
242
         * @return Array bidimensional conteniendo la l?nea de datos donde la primera
243
         * dimensi?n representa las bandas y la segunda la posici?n en la l?nea
244
         */  
245
    public double[][] getLineDouble(int line);
246
    
247
    //***********************************************
248
    //Obtiene una linea de datos de una banda
249
    
250
    /**
251
     * Obtiene una l?nea de datos de la banda solicitada para buffers con tipo
252
         * de dato byte.
253
     * @param line N?mero de l?nea del buffer a recuperar
254
     * @param band N?mero de banda a recuperar
255
     * @return Array unidimensional que representa la l?nea de datos.
256
     */
257
    public byte[] getLineFromBandByte(int line, int band);
258

    
259
    /**
260
     * Obtiene una l?nea de datos de la banda solicitada para buffers con tipo
261
         * de dato short.
262
     * @param line N?mero de l?nea del buffer a recuperar
263
     * @param band N?mero de banda a recuperar
264
     * @return Array unidimensional que representa la l?nea de datos.
265
     */
266
    public short[] getLineFromBandShort(int line, int band);
267

    
268
    /**
269
     * Obtiene una l?nea de datos de la banda solicitada para buffers con tipo
270
         * de dato int.
271
     * @param line N?mero de l?nea del buffer a recuperar
272
     * @param band N?mero de banda a recuperar
273
     * @return Array unidimensional que representa la l?nea de datos.
274
     */
275
    public int[] getLineFromBandInt(int line, int band);
276
        
277
    /**
278
     * Obtiene una l?nea de datos de la banda solicitada para buffers con tipo
279
         * de dato float.
280
     * @param line N?mero de l?nea del buffer a recuperar
281
     * @param band N?mero de banda a recuperar
282
     * @return Array unidimensional que representa la l?nea de datos.
283
     */
284
    public float[] getLineFromBandFloat(int line, int band);
285
    
286
    /**
287
     * Obtiene una l?nea de datos de la banda solicitada para buffers con tipo
288
         * de dato double.
289
     * @param line N?mero de l?nea del buffer a recuperar
290
     * @param band N?mero de banda a recuperar
291
     * @return Array unidimensional que representa la l?nea de datos.
292
     */
293
    public double[] getLineFromBandDouble(int line, int band);
294
    
295
    //***********************************************    
296
    //Obtiene un elemento de la matriz
297
    
298
    public byte getElemByte(int line, int col, int band);
299
    
300
    public short getElemShort(int line, int col, int band);
301
    
302
    public int getElemInt(int line, int col, int band);
303
    
304
    public float getElemFloat(int line, int col, int band);
305
    
306
    public double getElemDouble(int line, int col, int band);
307
    
308
    //***********************************************
309
    //Copia un elemento de todas la bandas en el buffer pasado por par?metro
310
    
311
    public void getElemByte(int line, int col, byte[] data);
312
    
313
    public void getElemShort(int line, int col, short[] data);
314
    
315
    public void getElemInt(int line, int col, int[] data);
316
    
317
    public void getElemFloat(int line, int col, float[] data);
318
    
319
    public void getElemDouble(int line, int col, double[] data);
320
    
321
    //***********************************************
322
    
323
    /**
324
     * Sustituye una banda completa copiando los datos de la que se pasa por par?metro
325
     * @param nBand N?mero de banda a sustituir
326
     * @param banda a copiar
327
     */
328
    public void copyBand(int nBand, Band band);
329
    
330
    /**
331
     * Sustituye una banda completa que se asigna por referencia
332
     * @param nBand N?mero de banda a sustituir
333
     * @param banda a asignar por referencia
334
     */
335
    public void assignBand(int nBand, Band band);
336
    
337
    /**
338
     * Obtiene una banda completa del raster
339
     * @param nBand N?mero de banda 
340
     */
341
    public Band getBand(int nBand);
342
    
343
    /**
344
     * Obtiene una banda completa del raster
345
     * @param nBand N?mero de banda 
346
     */
347
    public Buffer getBandBuffer(int nBand);
348
        
349
    //***********************************************
350
    //Asigna una linea de datos a una banda
351
    
352
    public void setLineInBandByte(byte[] data, int line, int band);
353

    
354
    public void setLineInBandShort(short[] data, int line, int band);
355

    
356
    public void setLineInBandInt(int[] data, int line, int band);
357
        
358
    public void setLineInBandFloat(float[] data, int line, int band);
359
    
360
    public void setLineInBandDouble(double[] data, int line, int band);
361
    
362
    //***********************************************
363
    //Asigna una linea de datos a todas las bandas
364
    
365
    public void setLineByte(byte[][] data, int line);
366

    
367
    public void setLineShort(short[][] data, int line);
368

    
369
    public void setLineInt(int[][] data, int line);
370
        
371
    public void setLineFloat(float[][] data, int line);
372
    
373
    public void setLineDouble(double[][] data, int line);
374
    
375
    //**********************************************    
376
    //Asigna un elemento de la matriz
377
    
378
    public void setElem(int line, int col, int band, byte data);
379
    
380
    public void setElem(int line, int col, int band, short data);
381
    
382
    public void setElem(int line, int col, int band, int data);
383
    
384
    public void setElem(int line, int col, int band, float data);
385
    
386
    public void setElem(int line, int col, int band, double data);
387
    
388
    //***********************************************
389
    //Asigna un elemento a todas la bandas en el buffer pasado por par?metro
390
    
391
    public void setElemByte(int line, int col, byte[] data);
392
    
393
    public void setElemShort(int line, int col, short[] data);
394
    
395
    public void setElemInt(int line, int col, int[] data);
396

    
397
    public void setElemFloat(int line, int col, float[] data);
398
    
399
    public void setElemDouble(int line, int col, double[] data);
400
    
401
    //***********************************************
402
    //Inicializa una banda a un valor pasado por par?metro
403
    
404
    public void assign(int band, byte value);
405
    
406
    public void assign(int band, short value);
407
    
408
    public void assign(int band, int value);
409

    
410
    public void assign(int band, float value);
411
    
412
    public void assign(int band, double value);
413
    
414
    //***********************************************
415
   
416
    /**
417
     * Crea un buffer banda inicializado con el valor pasado por par?metro. Las dimensiones
418
     * corresponden a las del buffer existente.
419
     * @param defaultValue Valor con el que se inicializa la banda creada
420
     */
421
    public Band createBand(byte defaultValue);
422
    
423
    /**
424
     * Replica la banda de una posici?n sobre otra. Si la banda de destino no existe
425
     * se crea nueva. Si la posici?n de la banda de destino est? intercalada entre bandas 
426
     * que ya existen las otras se desplazan hacia abajo, NO se machacan los datos de ninguna.
427
     * Los datos se replican por referencia por lo que al modificar la banda original las
428
     * del resto quedar?n afectadas.   
429
     * @param orig. Posici?n de la banda de origen. 
430
     * @param dest. Posici?n de la banda destino
431
     */   
432
    public void replicateBand(int orig, int dest);
433
    
434
    /**
435
     * Clona el buffer actual y devuelve el clone
436
     * @return Buffer clonado
437
     */
438
    public Buffer cloneBuffer();
439
    
440
    /**
441
     * Intercambia dos bandas.
442
     * @param band1 Banda 1 a intercambiar 
443
     * @param band2 Banda 2 a intercambiar
444
     */
445
    public void interchangeBands(int band1, int band2);
446
    
447
    /**
448
     * Intercambia la posici?n de las bandas. La nueva posici?n viene dada por el vector
449
     * pasado por par?metro. Cada posici?n del vector es una banda del buffer y el contenido de 
450
     * esa posici?n es la banda que se dibujar? sobre ese buffer.
451
         * <P> 
452
     * Por ejemplo un array con los valores:
453
     * [2, 0, 1] significa que la banda que ocupa ahora la posici?n 2 pasar? a ocupar la 0, la que 
454
     * tiene la posici?n 0 pasa a ocupar la 1 y la que tiene la posici?n 1 pasa a ocupar la 2.
455
     * </P>
456
     * @param bands  Array con la nueva distribuci?n de bandas
457
     */
458
    public void switchBands(int[] bands);
459
    
460
    /**
461
     * Asigna el valor de no valido.
462
     * @param value
463
     */
464
    public void setNotValidValue(double value);
465
    
466
    /**
467
     * Obtiene el valor de no valido.
468
     * @return value
469
     */
470
    public double getNotValidValue();
471
    
472
    /**
473
     * Asigna una banda al valor especificado como no valido. Esta banda es com?n para todas las bandas
474
     * del buffer, es decir se asigna por referencia. No tiene el mismo resultado que asignar una banda
475
     * a un valor fijo.
476
     * @param iBand N?mero de banda
477
     */
478
    public void assignBandToNotValid(int iBand);
479
    
480
        /**
481
         * Ajusta el ?rea del grid a un ancho y un alto dado en pixeles. Este ajuste se har? 
482
         * en relaci?n a un m?todo de interpolaci?n definido en el par?metro.
483
         * @param w Ancho de la nueva imagen.
484
         * @param h Alto de la nueva imagen.
485
         * @param interpolation M?todo de interpolaci?n que se usar? en el ajuste.
486
         */
487
        public Buffer getAdjustedWindow(int w, int h, int interpolationMethod) throws ProcessInterruptedException;
488
        
489
        /**
490
         * This call returns an incrementable task that is needed to load the buffer. Usually 
491
         * this is a BufferInterpolation class.
492
         * @return
493
         */
494
        public IncrementableTask getIncrementableTask();
495
        
496
        public double[][] getAllBandsLimits() throws ProcessInterruptedException;
497
}