Statistics
| Revision:

gvsig-raster / org.gvsig.raster.roimask / trunk / org.gvsig.raster.roimask / org.gvsig.raster.roimask.app / org.gvsig.raster.roimask.app.client / src / main / java / org / gvsig / raster / roimask / app / ROIMaskPreview.java @ 2352

History | View | Annotate | Download (8.19 KB)

1
package org.gvsig.raster.roimask.app;
2

    
3
import java.awt.Graphics2D;
4
import java.awt.geom.Rectangle2D;
5
import java.awt.image.BufferedImage;
6
import java.io.File;
7
import java.util.ArrayList;
8
import java.util.HashMap;
9
import java.util.List;
10

    
11
import org.gvsig.fmap.dal.coverage.RasterLocator;
12
import org.gvsig.fmap.dal.coverage.dataset.Buffer;
13
import org.gvsig.fmap.dal.coverage.datastruct.Extent;
14
import org.gvsig.fmap.dal.coverage.datastruct.NoData;
15
import org.gvsig.fmap.dal.coverage.exception.FilterTypeException;
16
import org.gvsig.fmap.dal.coverage.exception.ProcessInterruptedException;
17
import org.gvsig.fmap.dal.coverage.exception.ROIException;
18
import org.gvsig.fmap.dal.coverage.grid.RasterFilter;
19
import org.gvsig.fmap.dal.coverage.grid.RasterFilterList;
20
import org.gvsig.fmap.dal.coverage.grid.render.ImageDrawer;
21
import org.gvsig.fmap.dal.coverage.store.props.ColorInterpretation;
22
import org.gvsig.fmap.dal.coverage.store.props.Transparency;
23
import org.gvsig.gui.beans.imagenavigator.ImageUnavailableException;
24
import org.gvsig.raster.algorithm.RasterBaseAlgorithmLibrary;
25
import org.gvsig.raster.algorithm.process.DataProcess;
26
import org.gvsig.raster.algorithm.process.ProcessException;
27
import org.gvsig.raster.fmap.layers.FLyrRaster;
28
import org.gvsig.raster.roi.ROI;
29
import org.gvsig.raster.roimask.algorithm.ROIMaskProcess;
30
import org.gvsig.raster.roimask.app.ROIMaskExtension.LayerElement;
31
import org.gvsig.raster.roimask.swing.ROIMaskData;
32
import org.gvsig.raster.swing.preview.DataSourcePreview;
33
import org.gvsig.tools.task.Cancellable;
34
import org.slf4j.Logger;
35
import org.slf4j.LoggerFactory;
36

    
37
@SuppressWarnings("deprecation")
38
public class ROIMaskPreview implements DataSourcePreview {
39
        private FLyrRaster              inputLyr          = null;
40
        private Extent                  bbox              = null;
41
        private ROIMaskData             data              = null;
42
        private static final Logger     logger            = LoggerFactory.getLogger(ROIMaskPreview.class);
43
        
44
        
45
        public void setData(ROIMaskData data) {
46
                this.data = data;
47
                loadLayers();
48
        }
49
        
50
        private void loadLayers() {
51
                if(data == null)
52
                        return;
53
                Object obj = data.getInputLayer();
54
                if(obj != null)
55
                        inputLyr = (FLyrRaster)((LayerElement)data.getInputLayer()).getLayer();
56
                if(inputLyr != null)
57
                        bbox = inputLyr.getFullRasterExtent();                
58
        }
59
        
60
        public void closePreviewLayer() {
61
                
62
        }
63

    
64
        public double getCellSize() {
65
                if(inputLyr != null)
66
                        return inputLyr.getDataStore().getCellSize();
67
                return 1;
68
        }
69
        
70
        public DataSourcePreview cloneDataSourcePreview() {
71
                return this;
72
        }
73

    
74
        public void popStatus() {
75
        }
76

    
77
        public void pushStatus() {
78
        }
79
        
80
        public void draw(BufferedImage image, Graphics2D g, double[] coords, int w, int h, Cancellable cancel, double scale) throws ImageUnavailableException {
81
                //Posici?n de inicio dibujado dentro del Graphics
82
                int x = 0;
83
                int y = 0;
84
                //Coordenadas de la petici?n
85
                double iniX = coords[0];
86
                double iniY = coords[1];
87
                double endX = coords[2];
88
                double endY = coords[3];
89
                
90
                //Se ajustan las coordenadas de petici?n, ancho y alto en coordenadas p?xel, 
91
                //as? como la coordenada de inicio de dibujado 
92
                if(bbox.getULX() > coords[0]) {
93
                        iniX = bbox.getULX();
94
                        x = (int)(((iniX - coords[0]) * w) / Math.abs(coords[2] - coords[0]));
95
                }
96
                                
97
                if(bbox.getULY() < coords[1]) {
98
                        iniY = bbox.getULY();
99
                        y = (int)(((coords[1] - iniY) * h) / Math.abs(coords[3] - coords[1]));
100
                }
101
                
102
                if(bbox.getLRX() < coords[2]) 
103
                        endX = bbox.getLRX();
104
                
105
                if(bbox.getLRY() > coords[3]) 
106
                        endY = bbox.getLRY();
107
                
108
                if(iniX != coords[0] || endX != coords[2]) {
109
                        w = (int)((Math.abs(endX - iniX) * w) / Math.abs(coords[2] - coords[0]));
110
                }
111
                
112
                if(iniY != coords[1] || endY != coords[3]) {
113
                        h = (int)((Math.abs(iniY - endY) * h) / Math.abs(coords[3] - coords[1]));
114
                }
115
                
116
                Extent ext = RasterLocator.getManager().getDataStructFactory().createExtent(iniX, iniY, endX, endY);
117
                BufferedImage img = throwProcess(ext, w, h);
118
                g.drawImage(img, x, y, null);
119
        }
120
        
121
        /**
122
         * Throws the process sequentially. Since the preview is small,
123
         * it should not taken a lot of time
124
         * is small
125
         * @param ext
126
         * @param w
127
         * @param h
128
         * @return
129
         */
130
        private BufferedImage throwProcess(Extent ext, int w, int h) {
131
                loadLayers();
132
                
133
                DataProcess task;
134
                try {
135
                        task = RasterBaseAlgorithmLibrary.getManager().createRasterTask("ROIMaskProcess");
136
                        task.addParam(ROIMaskProcess.RASTER_STORE1, inputLyr.getDataStore());
137
                        task.addParam(ROIMaskProcess.TEST, true);
138
                        task.addParam(ROIMaskProcess.EXTENT, ext);
139
                        task.addParam(ROIMaskProcess.OUTPUT_WIDTH, w);
140
                        task.addParam(ROIMaskProcess.OUTPUT_HEIGHT, h);
141
                        task.addParam(ROIMaskProcess.ROIS, getROIsSelected());
142
                        task.addParam(ROIMaskProcess.ALPHA, data.getAlpha());
143
                        task.addParam(ROIMaskProcess.INVERSE, data.isInverse());
144
                        task.addParam(ROIMaskProcess.NODATA, getNoDataSelected());
145
                        task.addParam(ROIMaskProcess.EXPORT, false);
146
                } catch (ProcessException e1) {
147
                        e1.printStackTrace();
148
                        return null;
149
                } catch (ROIException e) {
150
                        e.printStackTrace();
151
                        return null;
152
                }
153
                
154
                task.init();
155
                try {
156
                        task.process();
157
                } catch (ProcessInterruptedException e1) {
158
                        return null;
159
                } catch (ProcessException e) {
160
                        logger.debug("Error in process");
161
                        return null;
162
                }
163
                
164
                HashMap<String, Object> map = (HashMap<String, Object>)task.getResult();
165
                Buffer buf = (Buffer)map.get(ROIMaskProcess.BUFFER);
166
                buf.setDataExtent(ext.toRectangle2D());
167
                
168
                ColorInterpretation ci = inputLyr.getDataStore().getColorInterpretation();
169
                Transparency transparency = null;
170
                if(ci.isRGB() || ci.isRGBA()) {
171
                        Integer alphaBandNumber = (Integer)map.get(ROIMaskProcess.ALPHA_BAND);
172
                        transparency = RasterLocator.getManager().getDataStructFactory().createTransparency(buf.getBandCount());
173
                        transparency.setTransparencyBand(alphaBandNumber);
174
                        transparency.activeTransparency();
175
                }
176
                
177
                ImageDrawer drawer = RasterLocator.getManager().createImageDrawerService();
178
                drawer.setBuffer(buf);
179
                drawer.setLastTransparency(transparency);
180
                try {
181
                        applyFiltersToPreview(drawer);
182
                        
183
                        return (BufferedImage)drawer.drawBufferOverImageObject();
184
                } catch (ProcessInterruptedException e) {
185
                        return null;
186
                } 
187
    }
188
        
189
        /**
190
         * Adds filters to the preview. If the original render has a color table
191
         * , a generic enhanced will be added.
192
         * @param drawer
193
         */
194
        private void applyFiltersToPreview(ImageDrawer drawer) {
195
                RasterFilterList filterList = inputLyr.getRender().getFilterList();
196
                List<RasterFilter> list = new ArrayList<RasterFilter>();
197
                if(filterList.lenght() > 0) {
198
                        for (int i = 0; i < filterList.lenght(); i++) {
199
                                RasterFilter rf = filterList.get(i);
200
                                if(rf.getName().equals("colortable")) {
201
                                        drawer.addEnhanced(inputLyr.getDataStore().getStatistics(), true, 0.2);
202
                                        return;
203
                                }
204
                                list.add(rf);
205
                        }
206
                }
207
                try {
208
                        drawer.addFilters(inputLyr.getDataStore().getStatistics(), list);
209
                } catch (FilterTypeException e) {
210
                        logger.debug("Tirando sin filtros", e);
211
                }
212
        }
213
        
214
        private NoData getNoDataSelected() {
215
                NoData nodata = RasterLocator.getManager().getDataStructFactory().createDefaultNoData(
216
                                inputLyr.getDataStore().getBandCount(), inputLyr.getDataStore().getDataType()[0]);
217
                nodata.setValue(data.getValueNoData());
218
                return nodata;
219
        }
220
        
221
        private ROI[] getROIsSelected() throws ROIException {
222
                List<ROI> roi = inputLyr.getRois();
223
                boolean[] roisSelected = data.getROIsSelected();
224
                List<ROI> roisToDraw = new ArrayList<ROI>(); 
225
                for (int i = 0; i < roisSelected.length; i++) {
226
                        if(roisSelected[i])
227
                                roisToDraw.add(roi.get(i));
228
                }
229
                return roisToDraw.toArray(new ROI[0]);
230
        }
231
        
232
        public Object getSource() {
233
                return null;
234
        }
235

    
236
        public Rectangle2D getBBoxRectangle() {
237
                if(inputLyr != null)
238
                        return inputLyr.getFullRasterExtent().toRectangle2D();
239
                return new Rectangle2D.Double();
240
        }
241

    
242
        public void addParams(DataProcess task, String path, String fileName) throws ROIException {
243
                if(!fileName.matches("([*]\\.[???])")) {
244
                        fileName += ".tif";
245
                }
246
                task.addParam(ROIMaskProcess.PATH, path + File.separator + fileName);
247
                task.addParam(ROIMaskProcess.RASTER_STORE1, inputLyr.getDataStore());
248
                task.addParam(ROIMaskProcess.ROIS, getROIsSelected());
249
                task.addParam(ROIMaskProcess.ALPHA, data.getAlpha());
250
                task.addParam(ROIMaskProcess.INVERSE, data.isInverse());
251
                task.addParam(ROIMaskProcess.NODATA, getNoDataSelected());
252
                task.addParam(ROIMaskProcess.EXPORT, true);
253
        }
254
}