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 @ 2355

History | View | Annotate | Download (8.34 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.algorithm.process.ProcessParamsManagement;
28
import org.gvsig.raster.fmap.layers.FLyrRaster;
29
import org.gvsig.raster.roi.ROI;
30
import org.gvsig.raster.roimask.algorithm.ROIMaskProcess;
31
import org.gvsig.raster.roimask.app.ROIMaskExtension.LayerElement;
32
import org.gvsig.raster.roimask.swing.ROIMaskData;
33
import org.gvsig.raster.swing.preview.DataSourcePreview;
34
import org.gvsig.tools.task.Cancellable;
35
import org.slf4j.Logger;
36
import org.slf4j.LoggerFactory;
37

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

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

    
75
        public void popStatus() {
76
        }
77

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

    
239
        public Rectangle2D getBBoxRectangle() {
240
                if(inputLyr != null)
241
                        return inputLyr.getFullRasterExtent().toRectangle2D();
242
                return new Rectangle2D.Double();
243
        }
244

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