Statistics
| Revision:

gvsig-raster / org.gvsig.raster.cache / trunk / org.gvsig.raster.cache / org.gvsig.raster.cache.lib.impl / src / main / java / org / gvsig / raster / cache / buffer / impl / stripecache / vertical / CacheStructVertImpl.java @ 992

History | View | Annotate | Download (4.06 KB)

1
package org.gvsig.raster.cache.buffer.impl.stripecache.vertical;
2

    
3
import org.gvsig.raster.cache.buffer.Buffer;
4
import org.gvsig.raster.cache.buffer.impl.stripecache.CacheStruct;
5

    
6
/**
7
 * Esta clase representa la estructura en memoria de la cache. Contiene el n?mero de p?ginas 
8
 * as? como los subconjuntos en las que se divide. Tendr? tambi?n datos como en ancho y alto de
9
 * cada p?gina y tama?o en memoria de esta. 
10
 * 
11
 * @author Nacho Brodin (nachobrodin@gmail.com)
12
 *
13
 */
14
public class CacheStructVertImpl extends CacheStruct {
15
        
16
        /**
17
         * Calcula los par?metros del tama?o de cach? y de p?gina, asi como la altura de las mismas y el n?mero
18
         * de grupos que salen en cach?.
19
         * @param nBands N?mero de bandas del raster
20
         * @param dataType Tipo de dato de la imagen
21
         * @param dataSourceWidth ancho de cada l?nea completa del raster.
22
         */
23
        public CacheStructVertImpl(int nBands, int dataType, int dataSourceWidth, int dataSourceHeight){
24
                this.width = dataSourceWidth;
25
                this.height = dataSourceHeight;
26
                init(nBands, dataType, dataSourceWidth, dataSourceHeight);
27
        }
28
        
29
        /**
30
         * Constructor de una sola banda y sin el calculo de par?metros. Estos deben ser asignados
31
         * posteriorimente. Esta llamada es usada en casos especiales de creaci?n de buffers cacheados.
32
         */
33
        public CacheStructVertImpl() {
34
        }
35
        
36
        /**
37
         * Constructor solo para test. No utilizar con un uso normal de la librer?a
38
         * Calcula los par?metros del tama?o de cach? y de p?gina, asi como la altura de las mismas y el n?mero
39
         * de grupos que salen en cach?.
40
         * @param nBands N?mero de bandas del raster
41
         * @param dataType Tipo de dato de la imagen
42
         * @param dataSourceWidth ancho de cada l?nea completa del raster.
43
         */
44
        public CacheStructVertImpl(int nBands, int dataType, int dataSourceWidth, int dataSourceHeight, long cacheSize, long pageSize) {
45
                this.cacheSize = cacheSize;
46
                this.pageSize = pageSize;
47
                init(nBands, dataType, dataSourceWidth, dataSourceHeight);
48
        }
49
        
50
        private void init(int nBands, int dataType, int dataSourceWidth, int dataSourceHeight) {
51
                this.nPageBandBuffers = nBands;
52
                this.dataType = dataType;
53
                
54
                //Pasamos los megas a bytes
55
                cacheSize = cacheSize * 1048576;
56
                pageSize = pageSize * 1048576;
57
                
58
                cacheSizePerBand = (long)(cacheSize / nBands);
59
                pageSizePerBand = (long)(pageSize / nBands);
60
                                
61
                //int dataSize = 0;
62
                int dataSizePerBand = 0;
63
                if (dataType == Buffer.TYPE_BYTE) {
64
                        dataSizePerBand = 1;
65
                } else if ((dataType == Buffer.TYPE_SHORT) | (dataType == Buffer.TYPE_USHORT)) {
66
                        dataSizePerBand = 2;
67
        } else if (dataType == Buffer.TYPE_INT) {
68
                dataSizePerBand = 4;
69
        } else if (dataType == Buffer.TYPE_FLOAT) {
70
                dataSizePerBand = 4;
71
        } else if (dataType == Buffer.TYPE_DOUBLE) {
72
                dataSizePerBand = 8;
73
        }
74
                //dataSize = dataSizePerBand * nBands;
75
                                
76
                //La anchura de la p?gina depende del alto de esta y del tipo de dato
77
                for(int i = (possiblePageHeights.length - 1); i >= 0; i --) {
78
                        long size = (long)dataSourceHeight * (long)possiblePageHeights[i] * (long)dataSizePerBand; 
79
                        if(size <= pageSizePerBand){
80
                                hPag = possiblePageHeights[i];
81
                                break;
82
                        }
83
                }
84
                //Calculamos el tama?o de p?gina en bytes 
85
                pageSizePerBand = dataSourceHeight * hPag * dataSizePerBand;
86
                
87
                //Calculamos el n?mero de p?ginas que tendr? el buffer completo
88
                nPags = (int)(cacheSizePerBand / pageSizePerBand);
89
                                
90
                while((nPags % pagsPerGroup) != 0)
91
                        nPags ++;        
92
                
93
                //Recalculamos el tama?o de la cach?
94
                cacheSizePerBand = (long)(pageSizePerBand * nPags);
95
                
96
                //Calculamos el n?mero de grupos de cach?
97
                nGroups = (int)(nPags / pagsPerGroup);
98
                
99
                int h = hPag; 
100
                while(h > 1){
101
                        h >>= 1;
102
                        bitsPag ++;
103
                }
104
                
105
                //Calculamos el n?mero total de p?ginas en cach?
106
                nTotalPags = (int)(dataSourceWidth / hPag);
107
                if((dataSourceWidth % hPag) != 0)
108
                        nTotalPags ++;
109
                
110
                offset = hPag - 1;
111
                
112
                cacheSize = cacheSizePerBand * nBands;
113
                pageSize = pageSizePerBand * nBands;
114
        }
115
        
116
        /*
117
         * (non-Javadoc)
118
         * @see java.lang.Object#clone()
119
         */
120
        public Object clone() {
121
                CacheStructVertImpl struct = new CacheStructVertImpl(nPageBandBuffers, dataType, width, height);
122
                return struct;
123
        }
124

    
125
}