Statistics
| Revision:

root / trunk / libraries / libRaster / src / org / gvsig / raster / buffer / cache / PageBuffer.java @ 11181

History | View | Annotate | Download (14.4 KB)

1

    
2
/* gvSIG. Sistema de Informaci?n Geogr?fica de la Generalitat Valenciana
3
 *
4
 * Copyright (C) 2006 IVER T.I. and Generalitat Valenciana.
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., 59 Temple Place - Suite 330, Boston, MA  02111-1307,USA.
19
 */
20
package org.gvsig.raster.buffer.cache;
21

    
22
import java.io.IOException;
23

    
24
import org.gvsig.raster.RasterLibrary;
25
import org.gvsig.raster.buffer.IBand;
26
import org.gvsig.raster.dataset.IBuffer;
27
import org.gvsig.raster.util.Histogram;
28
import org.gvsig.raster.util.HistogramException;
29

    
30
/**
31
 * Esta clase representa una p?gina de cache.Cada p?gina de cach? est? compuesta por
32
 * varios objetos PageBandBuffer donde cada uno es una p?gina que corresponde a una 
33
 * banda de raster cacheada. 
34
 * 
35
 * @author Nacho Brodin (nachobrodin@gmail.com)
36
 *
37
 */
38
public class PageBuffer implements IBuffer {
39

    
40
        private PageBandBuffer[]        pageBandBuffer = null;
41

    
42
        private int                                                                percent = 0;
43
        private boolean                                                canceled = false;
44
        
45
        /**
46
         * Constructor
47
         * @param dataType
48
         * @param width
49
         * @param height
50
         * @param bandNr
51
         * @param malloc
52
         */
53
        public PageBuffer(int dataType, int width, int height, int bandNr, boolean malloc, int nHddPags){
54
                pageBandBuffer = new PageBandBuffer[bandNr];
55
                for (int i = 0; i < pageBandBuffer.length; i++)
56
                        pageBandBuffer[i] = new PageBandBuffer(dataType, width, height, 1, malloc, i);
57
        }
58
        
59
        /*
60
     * (non-Javadoc)
61
     * @see org.gvsig.raster.driver.IBuffer#isBandSwitchable()
62
     */
63
    public boolean isBandSwitchable(){
64
            return false;
65
    }
66
        
67
        /**
68
         * Asigna la lista de paginas de disco
69
         * @param hddList Lista de p?ginas de disco
70
         */
71
        public void setHddPages(HddPage[] hddList){
72
                for (int i = 0; i < pageBandBuffer.length; i++)
73
                        pageBandBuffer[i].setHddPages(hddList);
74
        }
75
        
76
        /**
77
         * Carga una p?gina especificada en el par?metro nPag con los datos necesarios.
78
         * Para esto recorre todas las bandas de la p?gina llamando al load de cada una.
79
         *   
80
         * @param nPag N?mero de p?gina a cargar
81
         */
82
        public void loadPage(int nPag){
83
                for (int i = 0; i < pageBandBuffer.length; i++)
84
                        pageBandBuffer[i].loadPage(nPag);
85
        }
86
        
87
        /**
88
         * Salva una p?gina especificada en el par?metro nPag a disco. 
89
         * Para esto recorre todas las bandas de la p?gina llamando al save de cada una.
90
         *   
91
         * @param nPag N?mero de p?gina a salvar
92
         * @throws IOException
93
         */
94
        public void savePage(int nPag) throws IOException{
95
                for (int i = 0; i < pageBandBuffer.length; i++)
96
                        pageBandBuffer[i].savePage(nPag);
97
        }
98
        
99
        public void assign(int band, byte value) {
100
                pageBandBuffer[band].assign(0, value);
101
        }
102

    
103
        public void assign(int band, short value) {
104
                pageBandBuffer[band].assign(0, value);
105
        }
106

    
107
        public void assign(int band, int value) {
108
                pageBandBuffer[band].assign(0, value);
109
        }
110

    
111
        public void assign(int band, float value) {
112
                pageBandBuffer[band].assign(0, value);
113
        }
114

    
115
        public void assign(int band, double value) {
116
                pageBandBuffer[band].assign(0, value);
117
        }
118

    
119
        public void assignBand(int nBand, IBand band) {
120
        }
121

    
122
        public void assignBandToNotValid(int iBand) {
123
        }
124

    
125
        public IBuffer cloneBuffer() {
126
                return null;
127
        }
128

    
129
        public void copyBand(int nBand, IBand band) {
130
        }
131

    
132
        public IBand createBand(byte defaultValue) {
133
                return null;
134
        }
135

    
136
        public IBand getBand(int nBand) {
137
                return null;
138
        }
139

    
140
        public IBuffer getBandBuffer(int nBand) {
141
                return null;
142
        }
143

    
144
        public int getBandCount() {
145
                return pageBandBuffer[0].getBandCount();
146
        }
147
        
148
        public int getDataType() {
149
                return pageBandBuffer[0].getDataType();
150
        }
151

    
152
        public void setDataType(int dataType) {
153
        
154
        }
155
        
156
        public int getHeight() {
157
                return pageBandBuffer[0].getHeight();
158
        }
159
        
160
        public int getWidth() {
161
                return pageBandBuffer[0].getWidth();
162
        }
163

    
164
        
165
        
166
        public byte getByteNoDataValue() {
167
                return pageBandBuffer[0].getByteNoDataValue();
168
        }
169
        
170
        public float getFloatNoDataValue() {
171
                return pageBandBuffer[0].getFloatNoDataValue();
172
        }
173

    
174
        public int getIntNoDataValue() {
175
                return pageBandBuffer[0].getIntNoDataValue();
176
        }
177

    
178
        public double getNoDataValue() {
179
                return pageBandBuffer[0].getNoDataValue();
180
        }
181

    
182
        public double getNotValidValue() {
183
                return pageBandBuffer[0].getNotValidValue();
184
        }
185

    
186
        public short getShortNoDataValue() {
187
                return pageBandBuffer[0].getShortNoDataValue();
188
        }
189

    
190

    
191
        
192
        public byte getElemByte(int line, int col, int band) {
193
                return pageBandBuffer[band].getElemByte(line, col, 0);
194
        }
195

    
196
        public short getElemShort(int line, int col, int band) {
197
                return pageBandBuffer[band].getElemShort(line, col, 0);
198
        }
199
        
200
        public int getElemInt(int line, int col, int band) {
201
                return pageBandBuffer[band].getElemInt(line, col, 0);
202
        }
203

    
204
        public float getElemFloat(int line, int col, int band) {
205
                return pageBandBuffer[band].getElemFloat(line, col, 0);
206
        }
207
        
208
        public double getElemDouble(int line, int col, int band) {
209
                return pageBandBuffer[band].getElemDouble(line, col, 0);
210
        }
211

    
212
        
213

    
214

    
215
        public void getElemByte(int line, int col, byte[] data) {
216
                for (int i = 0; i < pageBandBuffer.length; i++) 
217
                        data[i] = pageBandBuffer[i].getElemByte(line, col, 0);
218
        }
219
        
220
        public void getElemShort(int line, int col, short[] data) {
221
                for (int i = 0; i < pageBandBuffer.length; i++) 
222
                        data[i] = pageBandBuffer[i].getElemShort(line, col, 0);
223
        }
224

    
225
        public void getElemInt(int line, int col, int[] data) {
226
                for (int i = 0; i < pageBandBuffer.length; i++) 
227
                        data[i] = pageBandBuffer[i].getElemInt(line, col, 0);
228
        }
229

    
230
        public void getElemFloat(int line, int col, float[] data) {
231
                for (int i = 0; i < pageBandBuffer.length; i++) 
232
                        data[i] = pageBandBuffer[i].getElemFloat(line, col, 0);
233
        }
234

    
235
        public void getElemDouble(int line, int col, double[] data) {
236
                for (int i = 0; i < pageBandBuffer.length; i++) 
237
                        data[i] = pageBandBuffer[i].getElemDouble(line, col, 0);
238
        }
239
        
240
        
241
        public byte[][] getLineByte(int line) {
242
                byte[][] b = new byte[pageBandBuffer.length][];
243
                for (int i = 0; i < pageBandBuffer.length; i++) 
244
                        b[i] = pageBandBuffer[i].getLineByte(line)[0];
245
                return b;
246
        }
247

    
248
        public double[][] getLineDouble(int line) {
249
                double[][] d = new double[pageBandBuffer.length][];
250
                for (int i = 0; i < pageBandBuffer.length; i++) 
251
                        d[i] = pageBandBuffer[i].getLineDouble(line)[0];
252
                return d;
253
        }
254

    
255
        public float[][] getLineFloat(int line) {
256
                float[][] f = new float[pageBandBuffer.length][];
257
                for (int i = 0; i < pageBandBuffer.length; i++) 
258
                        f[i] = pageBandBuffer[i].getLineFloat(line)[0];
259
                return f;
260
        }
261

    
262
        public int[][] getLineInt(int line) {
263
                int[][] in = new int[pageBandBuffer.length][];
264
                for (int i = 0; i < pageBandBuffer.length; i++) 
265
                        in[i] = pageBandBuffer[i].getLineInt(line)[0];
266
                return in;
267
        }
268

    
269
        public short[][] getLineShort(int line) {
270
                short[][] s = new short[pageBandBuffer.length][];
271
                for (int i = 0; i < pageBandBuffer.length; i++) 
272
                        s[i] = pageBandBuffer[i].getLineShort(line)[0];
273
                return s;
274
        }
275
        
276
        
277
        
278
        public byte[] getLineFromBandByte(int line, int band) {
279
                return pageBandBuffer[band].getLineFromBandByte(line, 0);
280
        }
281

    
282
        public double[] getLineFromBandDouble(int line, int band) {
283
                return pageBandBuffer[band].getLineFromBandDouble(line, 0);
284
        }
285

    
286
        public float[] getLineFromBandFloat(int line, int band) {
287
                return pageBandBuffer[band].getLineFromBandFloat(line, 0);
288
        }
289

    
290
        public int[] getLineFromBandInt(int line, int band) {
291
                return pageBandBuffer[band].getLineFromBandInt(line, 0);
292
        }
293

    
294
        public short[] getLineFromBandShort(int line, int band) {
295
                return pageBandBuffer[band].getLineFromBandShort(line, 0);
296
        }
297

    
298
        
299
        
300
        
301
        public void interchangeBands(int band1, int band2) {
302
        }
303

    
304
        public void mallocOneBand(int dataType, int width, int height, int band) {
305
        }
306

    
307
        public void replicateBand(int orig, int dest) {
308
        }
309

    
310

    
311

    
312
        public void setElem(int line, int col, int band, byte data) {
313
                pageBandBuffer[band].setElem(line, col, 0, data);
314
        }
315

    
316
        public void setElem(int line, int col, int band, short data) {
317
                pageBandBuffer[band].setElem(line, col, 0, data);
318
        }
319

    
320
        public void setElem(int line, int col, int band, int data) {
321
                pageBandBuffer[band].setElem(line, col, 0, data);
322
        }
323

    
324
        public void setElem(int line, int col, int band, float data) {
325
                pageBandBuffer[band].setElem(line, col, 0, data);
326
        }
327

    
328
        public void setElem(int line, int col, int band, double data) {
329
                pageBandBuffer[band].setElem(line, col, 0, data);
330
        }
331

    
332

    
333
        
334
        public void setElemByte(int line, int col, byte[] data) {
335
                byte[] b = new byte[1];
336
                for (int i = 0; i < pageBandBuffer.length; i++) {
337
                        b[0] = data[i];
338
                        pageBandBuffer[i].setElemByte(line, col, b);
339
                }
340
        }
341

    
342
        public void setElemDouble(int line, int col, double[] data) {
343
                double[] b = new double[1];
344
                for (int i = 0; i < pageBandBuffer.length; i++) {
345
                        b[0] = data[i];
346
                        pageBandBuffer[i].setElemDouble(line, col, b);
347
                }
348
        }
349

    
350
        public void setElemFloat(int line, int col, float[] data) {
351
                float[] b = new float[1];
352
                for (int i = 0; i < pageBandBuffer.length; i++) {
353
                        b[0] = data[i];
354
                        pageBandBuffer[i].setElemFloat(line, col, b);
355
                }
356
        }
357

    
358
        public void setElemInt(int line, int col, int[] data) {
359
                int[] b = new int[1];
360
                for (int i = 0; i < pageBandBuffer.length; i++) {
361
                        b[0] = data[i];
362
                        pageBandBuffer[i].setElemInt(line, col, b);
363
                }
364
        }
365

    
366
        public void setElemShort(int line, int col, short[] data) {
367
                short[] b = new short[1];
368
                for (int i = 0; i < pageBandBuffer.length; i++) {
369
                        b[0] = data[i];
370
                        pageBandBuffer[i].setElemShort(line, col, b);
371
                }
372
        }
373

    
374
        
375
        
376
        public void setLineByte(byte[][] data, int line) {
377
        }
378

    
379
        public void setLineDouble(double[][] data, int line) {
380
        }
381

    
382
        public void setLineFloat(float[][] data, int line) {
383
        }
384

    
385
        public void setLineInBandByte(byte[] data, int line, int band) {
386
        }
387

    
388
        public void setLineInBandDouble(double[] data, int line, int band) {
389
        }
390

    
391
        public void setLineInBandFloat(float[] data, int line, int band) {
392
        }
393

    
394
        public void setLineInBandInt(int[] data, int line, int band) {
395
        }
396

    
397
        public void setLineInBandShort(short[] data, int line, int band) {
398
        }
399

    
400
        public void setLineInt(int[][] data, int line) {
401
        }
402

    
403
        public void setLineShort(short[][] data, int line) {
404
        }
405

    
406
        public void setNoDataValue(double nd) {
407
        }
408

    
409
        public void setNotValidValue(double value) {
410
        }
411

    
412
        public void switchBands(int[] bands) {
413
        }
414

    
415
  /**
416
   * Calcula el m?nimo y el m?ximo del histograma previamente.
417
   * @return double[] con el m?nimo y el m?ximo.
418
   */
419
  private double[] getLimits() {
420
          double max = Double.MIN_VALUE;
421
          double min = Double.MAX_VALUE;
422
          double value = 0;
423

    
424
                switch (getDataType()) {
425
                        case IBuffer.TYPE_BYTE:
426
                                for (int i = 0; i < getBandCount(); i++)
427
                                        for (int r = 0; r < getHeight(); r++)
428
                                                for (int c = 0; c < getWidth(); c++) {
429
                                                        value = (double) (getElemByte(r, c, i) & 0xff);
430
                                                        if (value > max) max = value;
431
                                                        if (value < min) min = value;
432
                                                }
433
                                break;
434
                        case IBuffer.TYPE_SHORT:
435
                                for (int i = 0; i < getBandCount(); i++)
436
                                        for (int r = 0; r < getHeight(); r++)
437
                                                for (int c = 0; c < getWidth(); c++) {
438
                                                        value = (double) (getElemShort(r, c, i) & 0xffff);
439
                                                        if (value > max) max = value;
440
                                                        if (value < min) min = value;
441
                                                }
442
                                break;
443
                        case IBuffer.TYPE_INT:
444
                                for (int i = 0; i < getBandCount(); i++)
445
                                        for (int r = 0; r < getHeight(); r++)
446
                                                for (int c = 0; c < getWidth(); c++) {
447
                                                        value = (double) (getElemInt(r, c, i) & 0xffffffff);
448
                                                        if (value > max) max = value;
449
                                                        if (value < min) min = value;
450
                                                }
451
                                break;
452
                        case IBuffer.TYPE_FLOAT:
453
                                for (int i = 0; i < getBandCount(); i++)
454
                                        for (int r = 0; r < getHeight(); r++)
455
                                                for (int c = 0; c < getWidth(); c++) {
456
                                                        value =  (double) getElemFloat(r, c, i);
457
                                                        if (value > max) max = value;
458
                                                        if (value < min) min = value;
459
                                                }
460
                                break;
461
                        case IBuffer.TYPE_DOUBLE:
462
                                for (int i = 0; i < getBandCount(); i++)
463
                                        for (int r = 0; r < getHeight(); r++)
464
                                                for (int c = 0; c < getWidth(); c++) {
465
                                                        value = getElemDouble(r, c, i);
466
                                                        if (value > max) max = value;
467
                                                        if (value < min) min = value;
468
                                                }
469
                                break;
470
                }
471
                double[] values = new double[2];
472
                values[0] = min;
473
                values[1] = max;
474
          return values;
475
  }
476

    
477
  /*
478
   * (non-Javadoc)
479
   * @see org.gvsig.raster.driver.datasetproperties.IHistogramable#getHistogram()
480
   */
481
        public Histogram getHistogram() throws HistogramException {
482
                percent = 0;
483
                Histogram hist = null;
484
                double[] limits = getLimits();
485

    
486
                if (getDataType() == IBuffer.TYPE_BYTE)
487
                        hist = new Histogram(getBandCount(), 255, limits[0], limits[1]);
488
                else
489
                        hist = new Histogram(getBandCount(), RasterLibrary.defaultNumberOfClasses, limits[0], limits[1]);
490
                                
491
                for (int iBand = 0; iBand < getBandCount(); iBand++) {
492
                        for (int row = 0; row < getHeight(); row++) {
493
                                switch(getDataType()) {
494
                                case IBuffer.TYPE_BYTE:
495
                                        for (int col = 0; col < getWidth(); col++) 
496
                                                hist.incrementPxValue(iBand, (double)(getElemByte(row, col, iBand) & 0xff));
497
                                        break;
498
                                case IBuffer.TYPE_SHORT:
499
                                        for (int col = 0; col < getWidth(); col++) 
500
                                                hist.incrementPxValue(iBand, (double)(getElemShort(row, col, iBand) & 0xffff));
501
                                        break;
502
                                case IBuffer.TYPE_INT:
503
                                        for (int col = 0; col < getWidth(); col++) 
504
                                                hist.incrementPxValue(iBand, (double)(getElemInt(row, col, iBand) & 0xffffffff));
505
                                        break;
506
                                case IBuffer.TYPE_FLOAT:
507
                                        for (int col = 0; col < getWidth(); col++) 
508
                                                hist.incrementPxValue(iBand, (double)getElemFloat(row, col, iBand));
509
                                        break;
510
                                case IBuffer.TYPE_DOUBLE:
511
                                        for (int col = 0; col < getWidth(); col++) 
512
                                                hist.incrementPxValue(iBand, getElemDouble(row, col, iBand));
513
                                        break;
514
                                }
515
                                
516
                                if (isCanceled()) 
517
                                        return null;
518
                                percent = ((iBand*getHeight() + row) * 100) /(getHeight() * getBandCount());
519
                        }
520
                }
521
                percent = 100;
522
                return hist;
523
        }
524

    
525
        /*
526
         * (non-Javadoc)
527
         * @see org.gvsig.raster.util.IHistogramable#resetPercent()
528
         */
529
        public void resetPercent() {
530
                percent = 0;
531
        }
532

    
533
        /*
534
         * (non-Javadoc)
535
         * @see org.gvsig.raster.util.IHistogramable#getPercent()
536
         */
537
        public int getPercent() {
538
                return percent;
539
        }
540

    
541
        /*
542
         * (non-Javadoc)
543
         * @see org.gvsig.raster.util.ICancellable#isCanceled()
544
         */
545
        public boolean isCanceled() {
546
                return canceled;
547
        }
548

    
549
        /*
550
         * (non-Javadoc)
551
         * @see org.gvsig.raster.util.ICancellable#setCanceled(boolean)
552
         */
553
        public void setCanceled(boolean value) {
554
                canceled = value;
555
        }
556
}