Statistics
| Revision:

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

History | View | Annotate | Download (15.8 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.datastruct.Histogram;
28
import org.gvsig.raster.process.RasterTask;
29
import org.gvsig.raster.process.RasterTaskQueue;
30

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

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

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

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

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

    
120
        public void assign(int band, double value) {
121
                pageBandBuffer[band].assign(0, value);
122
        }
123

    
124
        public void assignBand(int nBand, IBand band) {
125
        }
126

    
127
        public void assignBandToNotValid(int iBand) {
128
        }
129

    
130
        public IBuffer cloneBuffer() {
131
                return null;
132
        }
133

    
134
        public void copyBand(int nBand, IBand band) {
135
        }
136

    
137
        public IBand createBand(byte defaultValue) {
138
                return null;
139
        }
140

    
141
        public IBand getBand(int nBand) {
142
                return null;
143
        }
144

    
145
        public IBuffer getBandBuffer(int nBand) {
146
                return null;
147
        }
148

    
149
        public int getBandCount() {
150
                return pageBandBuffer[0].getBandCount();
151
        }
152
        
153
        public int getDataType() {
154
                return pageBandBuffer[0].getDataType();
155
        }
156

    
157
        public void setDataType(int dataType) {
158
        
159
        }
160
        
161
        public int getHeight() {
162
                return pageBandBuffer[0].getHeight();
163
        }
164
        
165
        public int getWidth() {
166
                return pageBandBuffer[0].getWidth();
167
        }
168

    
169
        
170
        
171
        public byte getByteNoDataValue() {
172
                return pageBandBuffer[0].getByteNoDataValue();
173
        }
174
        
175
        public float getFloatNoDataValue() {
176
                return pageBandBuffer[0].getFloatNoDataValue();
177
        }
178

    
179
        public int getIntNoDataValue() {
180
                return pageBandBuffer[0].getIntNoDataValue();
181
        }
182

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

    
187
        public double getNotValidValue() {
188
                return pageBandBuffer[0].getNotValidValue();
189
        }
190

    
191
        public short getShortNoDataValue() {
192
                return pageBandBuffer[0].getShortNoDataValue();
193
        }
194

    
195

    
196
        
197
        public byte getElemByte(int line, int col, int band) {
198
                return pageBandBuffer[band].getElemByte(line, col, 0);
199
        }
200

    
201
        public short getElemShort(int line, int col, int band) {
202
                return pageBandBuffer[band].getElemShort(line, col, 0);
203
        }
204
        
205
        public int getElemInt(int line, int col, int band) {
206
                return pageBandBuffer[band].getElemInt(line, col, 0);
207
        }
208

    
209
        public float getElemFloat(int line, int col, int band) {
210
                return pageBandBuffer[band].getElemFloat(line, col, 0);
211
        }
212
        
213
        public double getElemDouble(int line, int col, int band) {
214
                return pageBandBuffer[band].getElemDouble(line, col, 0);
215
        }
216

    
217
        
218

    
219

    
220
        public void getElemByte(int line, int col, byte[] data) {
221
                for (int i = 0; i < pageBandBuffer.length; i++) 
222
                        data[i] = pageBandBuffer[i].getElemByte(line, col, 0);
223
        }
224
        
225
        public void getElemShort(int line, int col, short[] data) {
226
                for (int i = 0; i < pageBandBuffer.length; i++) 
227
                        data[i] = pageBandBuffer[i].getElemShort(line, col, 0);
228
        }
229

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

    
235
        public void getElemFloat(int line, int col, float[] data) {
236
                for (int i = 0; i < pageBandBuffer.length; i++) 
237
                        data[i] = pageBandBuffer[i].getElemFloat(line, col, 0);
238
        }
239

    
240
        public void getElemDouble(int line, int col, double[] data) {
241
                for (int i = 0; i < pageBandBuffer.length; i++) 
242
                        data[i] = pageBandBuffer[i].getElemDouble(line, col, 0);
243
        }
244
        
245
        
246
        public byte[][] getLineByte(int line) {
247
                byte[][] b = new byte[pageBandBuffer.length][];
248
                for (int i = 0; i < pageBandBuffer.length; i++) 
249
                        b[i] = pageBandBuffer[i].getLineByte(line)[0];
250
                return b;
251
        }
252

    
253
        public double[][] getLineDouble(int line) {
254
                double[][] d = new double[pageBandBuffer.length][];
255
                for (int i = 0; i < pageBandBuffer.length; i++) 
256
                        d[i] = pageBandBuffer[i].getLineDouble(line)[0];
257
                return d;
258
        }
259

    
260
        public float[][] getLineFloat(int line) {
261
                float[][] f = new float[pageBandBuffer.length][];
262
                for (int i = 0; i < pageBandBuffer.length; i++) 
263
                        f[i] = pageBandBuffer[i].getLineFloat(line)[0];
264
                return f;
265
        }
266

    
267
        public int[][] getLineInt(int line) {
268
                int[][] in = new int[pageBandBuffer.length][];
269
                for (int i = 0; i < pageBandBuffer.length; i++) 
270
                        in[i] = pageBandBuffer[i].getLineInt(line)[0];
271
                return in;
272
        }
273

    
274
        public short[][] getLineShort(int line) {
275
                short[][] s = new short[pageBandBuffer.length][];
276
                for (int i = 0; i < pageBandBuffer.length; i++) 
277
                        s[i] = pageBandBuffer[i].getLineShort(line)[0];
278
                return s;
279
        }
280
        
281
        
282
        
283
        public byte[] getLineFromBandByte(int line, int band) {
284
                return pageBandBuffer[band].getLineFromBandByte(line, 0);
285
        }
286

    
287
        public double[] getLineFromBandDouble(int line, int band) {
288
                return pageBandBuffer[band].getLineFromBandDouble(line, 0);
289
        }
290

    
291
        public float[] getLineFromBandFloat(int line, int band) {
292
                return pageBandBuffer[band].getLineFromBandFloat(line, 0);
293
        }
294

    
295
        public int[] getLineFromBandInt(int line, int band) {
296
                return pageBandBuffer[band].getLineFromBandInt(line, 0);
297
        }
298

    
299
        public short[] getLineFromBandShort(int line, int band) {
300
                return pageBandBuffer[band].getLineFromBandShort(line, 0);
301
        }
302

    
303
        
304
        
305
        
306
        public void interchangeBands(int band1, int band2) {
307
        }
308

    
309
        public void mallocOneBand(int dataType, int width, int height, int band) {
310
        }
311

    
312
        public void replicateBand(int orig, int dest) {
313
        }
314

    
315

    
316

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

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

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

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

    
333
        public void setElem(int line, int col, int band, double data) {
334
                pageBandBuffer[band].setElem(line, col, 0, data);
335
        }
336

    
337

    
338
        
339
        public void setElemByte(int line, int col, byte[] data) {
340
                byte[] b = new byte[1];
341
                for (int i = 0; i < pageBandBuffer.length; i++) {
342
                        b[0] = data[i];
343
                        pageBandBuffer[i].setElemByte(line, col, b);
344
                }
345
        }
346

    
347
        public void setElemDouble(int line, int col, double[] data) {
348
                double[] b = new double[1];
349
                for (int i = 0; i < pageBandBuffer.length; i++) {
350
                        b[0] = data[i];
351
                        pageBandBuffer[i].setElemDouble(line, col, b);
352
                }
353
        }
354

    
355
        public void setElemFloat(int line, int col, float[] data) {
356
                float[] b = new float[1];
357
                for (int i = 0; i < pageBandBuffer.length; i++) {
358
                        b[0] = data[i];
359
                        pageBandBuffer[i].setElemFloat(line, col, b);
360
                }
361
        }
362

    
363
        public void setElemInt(int line, int col, int[] data) {
364
                int[] b = new int[1];
365
                for (int i = 0; i < pageBandBuffer.length; i++) {
366
                        b[0] = data[i];
367
                        pageBandBuffer[i].setElemInt(line, col, b);
368
                }
369
        }
370

    
371
        public void setElemShort(int line, int col, short[] data) {
372
                short[] b = new short[1];
373
                for (int i = 0; i < pageBandBuffer.length; i++) {
374
                        b[0] = data[i];
375
                        pageBandBuffer[i].setElemShort(line, col, b);
376
                }
377
        }
378
        
379
        public void setLineByte(byte[][] data, int line) {
380
                byte[][] bAux = new byte[1][];
381
                for (int i = 0; i < pageBandBuffer.length; i++) {
382
                        bAux[0] = data[i];
383
                        pageBandBuffer[i].setLineByte(bAux, line);
384
                }
385
        }
386

    
387
        public void setLineDouble(double[][] data, int line) {
388
                double[][] bAux = new double[1][];
389
                for (int i = 0; i < pageBandBuffer.length; i++) {
390
                        bAux[0] = data[i];
391
                        pageBandBuffer[i].setLineDouble(bAux, line);
392
                }
393
        }
394

    
395
        public void setLineFloat(float[][] data, int line) {
396
                float[][] bAux = new float[1][];
397
                for (int i = 0; i < pageBandBuffer.length; i++) {
398
                        bAux[0] = data[i];
399
                        pageBandBuffer[i].setLineFloat(bAux, line);
400
                }
401
        }
402
        
403
        public void setLineInt(int[][] data, int line) {
404
                int[][] bAux = new int[1][];
405
                for (int i = 0; i < pageBandBuffer.length; i++) {
406
                        bAux[0] = data[i];
407
                        pageBandBuffer[i].setLineInt(bAux, line);
408
                }
409
        }
410

    
411
        public void setLineShort(short[][] data, int line) {
412
                short[][] bAux = new short[1][];
413
                for (int i = 0; i < pageBandBuffer.length; i++) {
414
                        bAux[0] = data[i];
415
                        pageBandBuffer[i].setLineShort(bAux, line);
416
                }
417
        }
418

    
419
        public void setLineInBandByte(byte[] data, int line, int band) {
420
                pageBandBuffer[band].setLineInBandByte(data, line, 0);
421
        }
422

    
423
        public void setLineInBandDouble(double[] data, int line, int band) {
424
                pageBandBuffer[band].setLineInBandDouble(data, line, 0);
425
        }
426

    
427
        public void setLineInBandFloat(float[] data, int line, int band) {
428
                pageBandBuffer[band].setLineInBandFloat(data, line, 0);
429
        }
430

    
431
        public void setLineInBandInt(int[] data, int line, int band) {
432
                pageBandBuffer[band].setLineInBandInt(data, line, 0);
433
        }
434

    
435
        public void setLineInBandShort(short[] data, int line, int band) {
436
                pageBandBuffer[band].setLineInBandShort(data, line, 0);
437
        }
438

    
439
        public void setNoDataValue(double nd) {
440
        }
441

    
442
        public void setNotValidValue(double value) {
443
        }
444

    
445
        public void switchBands(int[] bands) {
446
        }
447

    
448
  /**
449
   * Calcula el m?nimo y el m?ximo del histograma previamente.
450
   * @return double[] con el m?nimo y el m?ximo.
451
   */
452
  private double[] getLimits() {
453
          double max = Double.NEGATIVE_INFINITY;
454
          double min = Double.MAX_VALUE;
455
          double value = 0;
456

    
457
                switch (getDataType()) {
458
                        case IBuffer.TYPE_BYTE:
459
                                for (int i = 0; i < getBandCount(); i++)
460
                                        for (int r = 0; r < getHeight(); r++)
461
                                                for (int c = 0; c < getWidth(); c++) {
462
                                                        value = (double) (getElemByte(r, c, i) & 0xff);
463
                                                        if (value > max) max = value;
464
                                                        if (value < min) min = value;
465
                                                }
466
                                break;
467
                        case IBuffer.TYPE_SHORT:
468
                                for (int i = 0; i < getBandCount(); i++)
469
                                        for (int r = 0; r < getHeight(); r++)
470
                                                for (int c = 0; c < getWidth(); c++) {
471
                                                        value = (double) getElemShort(r, c, i);
472
                                                        if (value > max) max = value;
473
                                                        if (value < min) min = value;
474
                                                }
475
                                break;
476
                        case IBuffer.TYPE_INT:
477
                                for (int i = 0; i < getBandCount(); i++)
478
                                        for (int r = 0; r < getHeight(); r++)
479
                                                for (int c = 0; c < getWidth(); c++) {
480
                                                        value = (double) getElemInt(r, c, i);
481
                                                        if (value > max) max = value;
482
                                                        if (value < min) min = value;
483
                                                }
484
                                break;
485
                        case IBuffer.TYPE_FLOAT:
486
                                for (int i = 0; i < getBandCount(); i++)
487
                                        for (int r = 0; r < getHeight(); r++)
488
                                                for (int c = 0; c < getWidth(); c++) {
489
                                                        value =  (double) getElemFloat(r, c, i);
490
                                                        if (value > max) max = value;
491
                                                        if (value < min) min = value;
492
                                                }
493
                                break;
494
                        case IBuffer.TYPE_DOUBLE:
495
                                for (int i = 0; i < getBandCount(); i++)
496
                                        for (int r = 0; r < getHeight(); r++)
497
                                                for (int c = 0; c < getWidth(); c++) {
498
                                                        value = getElemDouble(r, c, i);
499
                                                        if (value > max) max = value;
500
                                                        if (value < min) min = value;
501
                                                }
502
                                break;
503
                }
504
                double[] values = new double[2];
505
                values[0] = min;
506
                values[1] = max;
507
          return values;
508
  }
509

    
510
  /*
511
   * (non-Javadoc)
512
   * @see org.gvsig.raster.driver.datasetproperties.IHistogramable#getHistogram()
513
   */
514
        public Histogram getHistogram() throws InterruptedException {
515
                RasterTask task = RasterTaskQueue.get(Thread.currentThread().toString());
516
                percent = 0;
517
                Histogram hist = null;
518
                double[] limits = getLimits();
519

    
520
                if (getDataType() == IBuffer.TYPE_BYTE)
521
                        hist = new Histogram(getBandCount(), 255, limits[0], limits[1]);
522
                else
523
                        hist = new Histogram(getBandCount(), RasterLibrary.defaultNumberOfClasses, limits[0], limits[1]);
524
                                
525
                for (int iBand = 0; iBand < getBandCount(); iBand++) {
526
                        for (int row = 0; row < getHeight(); row++) {
527
                                switch(getDataType()) {
528
                                case IBuffer.TYPE_BYTE:
529
                                        for (int col = 0; col < getWidth(); col++) 
530
                                                hist.incrementPxValue(iBand, (double)(getElemByte(row, col, iBand) & 0xff));
531
                                        break;
532
                                case IBuffer.TYPE_SHORT:
533
                                        for (int col = 0; col < getWidth(); col++) 
534
                                                hist.incrementPxValue(iBand, (double)(getElemShort(row, col, iBand) & 0xffff));
535
                                        break;
536
                                case IBuffer.TYPE_INT:
537
                                        for (int col = 0; col < getWidth(); col++) 
538
                                                hist.incrementPxValue(iBand, (double)(getElemInt(row, col, iBand) & 0xffffffff));
539
                                        break;
540
                                case IBuffer.TYPE_FLOAT:
541
                                        for (int col = 0; col < getWidth(); col++) 
542
                                                hist.incrementPxValue(iBand, (double)getElemFloat(row, col, iBand));
543
                                        break;
544
                                case IBuffer.TYPE_DOUBLE:
545
                                        for (int col = 0; col < getWidth(); col++) 
546
                                                hist.incrementPxValue(iBand, getElemDouble(row, col, iBand));
547
                                        break;
548
                                }
549
                                
550
                                if (task.getEvent() != null)
551
                                        task.manageEvent(task.getEvent());
552
                                percent = ((iBand*getHeight() + row) * 100) /(getHeight() * getBandCount());
553
                        }
554
                }
555
                percent = 100;
556
                return hist;
557
        }
558

    
559
        /*
560
         * (non-Javadoc)
561
         * @see org.gvsig.raster.util.IHistogramable#resetPercent()
562
         */
563
        public void resetPercent() {
564
                percent = 0;
565
        }
566

    
567
        /*
568
         * (non-Javadoc)
569
         * @see org.gvsig.raster.util.IHistogramable#getPercent()
570
         */
571
        public int getPercent() {
572
                return percent;
573
        }
574

    
575
        /*
576
         * (non-Javadoc)
577
         * @see org.gvsig.raster.dataset.IBuffer#isInside(int, int)
578
         */
579
        public boolean isInside(int x, int y) {
580
                 if (x < 0 || y < 0 || x >= getWidth() || y >= getHeight())
581
                          return false;
582
                  return true;
583
        }
584
        
585
        /**
586
         * Libera el buffer de memoria
587
         */
588
        public void free(){
589
                if(pageBandBuffer != null)
590
                        for (int i = 0; i < pageBandBuffer.length; i++) 
591
                                pageBandBuffer[i].free();
592
        }
593
}