Statistics
| Revision:

gvsig-raster / org.gvsig.raster / trunk / org.gvsig.raster / org.gvsig.raster.lib / org.gvsig.raster.lib.impl / src / main / java / org / gvsig / raster / impl / BufferFactoryImpl.java @ 2443

History | View | Annotate | Download (3.55 KB)

1
package org.gvsig.raster.impl;
2

    
3
import org.gvsig.fmap.dal.coverage.BufferFactory;
4
import org.gvsig.fmap.dal.coverage.RasterLibrary;
5
import org.gvsig.fmap.dal.coverage.dataset.Buffer;
6
import org.gvsig.fmap.dal.coverage.dataset.BufferParam;
7
import org.gvsig.fmap.dal.coverage.datastruct.BandList;
8
import org.gvsig.fmap.dal.coverage.exception.BufferCreationException;
9
import org.gvsig.fmap.dal.coverage.store.RasterDataStore;
10
import org.gvsig.raster.impl.buffer.BufferParamImpl;
11
import org.gvsig.raster.impl.buffer.RasterBuffer;
12
import org.gvsig.raster.impl.buffer.RasterMemoryBuffer;
13
import org.gvsig.raster.impl.buffer.cache.RasterCache;
14
import org.gvsig.raster.impl.buffer.cache.RasterReadOnlyBuffer;
15
import org.gvsig.raster.impl.store.QueryableRaster;
16
import org.gvsig.raster.util.DefaultRasterUtils;
17

    
18

    
19
/**
20
 * Factory for raster buffers
21
 * @author Nacho Brodin (nachobrodin@gmail.com)
22
 */
23
public class BufferFactoryImpl implements BufferFactory {
24

    
25
        public Buffer createBuffer(BufferParam param) throws BufferCreationException {
26
                if(param.getAccessType() == BufferParam.CACHED) {
27
                        if(RasterBuffer.cacheOn){
28
                                long sizeDataType = (long)new DefaultRasterUtils().getBytesFromRasterBufType(param.getDataType());
29
                                long size = (long)(sizeDataType * (long)param.getWidth() * (long)param.getHeight() * (long)param.getBandCount()) / 1024L;
30
                                long ms1 = RasterLibrary.cacheSize * 1024L;
31
                                if(size <= ms1)
32
                                        return createMemoryBuffer(param);
33
                                else
34
                                        return new RasterCache(
35
                                                        param.getDataType(), 
36
                                                        param.getWidth(), 
37
                                                        param.getHeight(),
38
                                                        param.getBandCount());
39
                        }else
40
                                return createMemoryBuffer(param);
41
                }
42
                if(param.getAccessType() == BufferParam.MEMORY) {
43
                        return createMemoryBuffer(param);
44
                }
45
                if(param.getAccessType() == BufferParam.READ_ONLY) {
46
                        RasterReadOnlyBuffer rb  = new RasterReadOnlyBuffer(                                        
47
                                                                                        param.getDataType(), 
48
                                                                                        param.getWidth(), 
49
                                                                                        param.getHeight(), 
50
                                                                                        param.getBandCount());
51
                        RasterDataStore store = param.getDataStore();
52
                        int[] window = param.getRoWindow();
53
                        checkROWindow(window, store);
54
                        try {
55
                                rb.setBufferParams(
56
                                                (QueryableRaster)param.getDataStore(),
57
                                                window[0],
58
                                                window[1],
59
                                                window[2],
60
                                                window[3],
61
                                                param.getBandList());
62
                                return rb;
63
                        } catch (Exception e) {
64
                                throw new BufferCreationException("error_creating_ro_buffer", e);
65
                        }
66
                }
67
                return null;
68
        }
69

    
70
        private void checkROWindow(int[] window, RasterDataStore store) throws BufferCreationException {
71
                if(        window[0] < 0 || 
72
                                window[1] < 0 || 
73
                                window[2] >= store.getWidth() || 
74
                                window[3] >= store.getHeight() ||
75
                                window[0] >= window[2] ||
76
                                window[1] >= window[3])
77
                        throw new BufferCreationException("window_not_valid");
78
        }
79

    
80
        private Buffer createMemoryBuffer(BufferParam param) {
81
                return new RasterMemoryBuffer(
82
                                param.getDataType(), 
83
                                param.getWidth(), 
84
                                param.getHeight(),
85
                                param.getBandCount(), 
86
                                param.isMalloc());
87
        }
88

    
89
        public BufferParam createBufferParams(
90
                        int w, 
91
                        int h, 
92
                        int bandCount, 
93
                        int dataType, 
94
                        boolean malloc) {
95
                return new BufferParamImpl(w, h, bandCount, dataType, malloc, BufferParam.CACHED);
96
        }
97

    
98
        public BufferParam createMemoryBufferParams(
99
                        int w, 
100
                        int h, 
101
                        int bandCount, 
102
                        int dataType, 
103
                        boolean malloc) {
104
                return new BufferParamImpl(w, h, bandCount, dataType, malloc, BufferParam.MEMORY);
105
        }
106

    
107
        public BufferParam createReadOnlyBufferParams(
108
                        RasterDataStore store,
109
                        int minx,
110
                        int miny,
111
                        int maxx,
112
                        int maxy,
113
                        BandList bandList) {
114
                return new BufferParamImpl(store, new int[]{minx, miny, maxx, maxy}, bandList);
115
        }
116

    
117
}