Statistics
| Revision:

gvsig-raster / org.gvsig.raster.tools / trunk / org.gvsig.raster.tools / org.gvsig.raster.tools.app / org.gvsig.raster.tools.app.basic / src / main / java / org / gvsig / raster / tools / app / basic / tool / enhanced / ui / EnhancedHistogramController.java @ 1426

History | View | Annotate | Download (8.89 KB)

1
/* gvSIG. Geographic Information System of the Valencian Government
2
 *
3
 * Copyright (C) 2007-2008 Infrastructures and Transports Department
4
 * of the Valencian Government (CIT)
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., 51 Franklin Street, Fifth Floor, Boston,
19
 * MA  02110-1301, USA.
20
 *
21
 */
22
package org.gvsig.raster.tools.app.basic.tool.enhanced.ui;
23

    
24
import org.gvsig.fmap.dal.coverage.RasterLocator;
25
import org.gvsig.fmap.dal.coverage.datastruct.Params;
26
import org.gvsig.raster.swing.gcanvas.StraightLine;
27
import org.gvsig.raster.tools.app.basic.tool.enhanced.graphics.HistogramGraphicBase;
28
import org.gvsig.raster.tools.app.basic.tool.enhanced.graphics.InputHistogram;
29
import org.gvsig.raster.tools.app.basic.tool.enhanced.graphics.OutputHistogram;
30
import org.gvsig.raster.tools.app.basic.tool.enhanced.graphics.HistogramGraphicBase.HistogramStatus;
31
/**
32
 * Manager para actualizar la vista previa y el histograma de salida del cuadro
33
 * de realce
34
 * 
35
 * @version 04/03/2008
36
 * @author BorSanZa - Borja S?nchez Zamorano (borja.sanchez@iver.es)
37
 */
38
public class EnhancedHistogramController {
39
        private InputHistogram  inputHistogram  = null;
40
        private OutputHistogram outputHistogram = null;
41
        private EnhancedDialog  enhancedDialog  = null;
42

    
43
        public EnhancedHistogramController(InputHistogram inputHistogram, OutputHistogram outputHistogram, EnhancedDialog enhancedDialog) {
44
                this.inputHistogram = inputHistogram;
45
                this.outputHistogram = outputHistogram;
46
                this.enhancedDialog = enhancedDialog;
47
        }
48
        
49
        public void updatePreview() {
50
                Params params = RasterLocator.getManager().createParams("", 0, 0, null);
51

    
52
//                Double min = Double.valueOf(0.0D);
53
                boolean rgb = enhancedDialog.getGraphicsPanel().getRGB().isSelected();
54
                HistogramStatus histogram = inputHistogram.getHistogramStatus(HistogramGraphicBase.GRAY);
55
                if (enhancedDialog.getLayer().getRender().isRenderingAsGray()) {
56
                        if (histogram.getBaseFunction() instanceof StraightLine) {
57
                                StraightLine line = (StraightLine) histogram.getBaseFunction();
58
                                double[] valuesIn;
59
                                if (rgb)
60
                                        valuesIn = line.getInValues(0, 255);
61
                                else
62
                                        valuesIn = line.getInValues(histogram.getMin(), histogram.getMax());
63
                                int[] valuesOut = line.getOutValues();
64
                                params.setParam("StretchInRed", valuesIn, -1, null);
65
                                params.setParam("StretchOutRed", valuesOut, -1, null);
66
                                params.setParam("StretchRedFunctionType", Integer.valueOf(line.getFunctionType()), -1, null);
67
                                params.setParam("StretchRedValueFunction", Double.valueOf(line.getValueFunction()), -1, null);
68
                                params.setParam("StretchInGreen", valuesIn, -1, null);
69
                                params.setParam("StretchOutGreen", valuesOut, -1, null);
70
                                params.setParam("StretchGreenFunctionType", Integer.valueOf(line.getFunctionType()), -1, null);
71
                                params.setParam("StretchGreenValueFunction", Double.valueOf(line.getValueFunction()), -1, null);
72
                                params.setParam("StretchInBlue", valuesIn, -1, null);
73
                                params.setParam("StretchOutBlue", valuesOut, -1, null);
74
                                params.setParam("StretchBlueFunctionType", Integer.valueOf(line.getFunctionType()), -1, null);
75
                                params.setParam("StretchBlueValueFunction", Double.valueOf(line.getValueFunction()), -1, null);
76
                        }
77
                } else {
78
                        histogram = inputHistogram.getHistogramStatus(HistogramGraphicBase.RED);
79
                        if (histogram != null) {
80
                                if (histogram.getBaseFunction() instanceof StraightLine) {
81
                                        StraightLine line = (StraightLine) histogram.getBaseFunction();
82
                                        double[] valuesIn;
83
                                        if (rgb)
84
                                                valuesIn = line.getInValues(0, 255);
85
                                        else
86
                                                valuesIn = line.getInValues(histogram.getMin(), histogram.getMax());
87
                                        int[] valuesOut = line.getOutValues();
88

    
89
                                        params.setParam("StretchInRed", valuesIn, -1, null);
90
                                        params.setParam("StretchOutRed", valuesOut, -1, null);
91
                                        params.setParam("StretchRedFunctionType", Integer.valueOf(line.getFunctionType()), -1, null);
92
                                        params.setParam("StretchRedValueFunction", Double.valueOf(line.getValueFunction()), -1, null);
93
                                }
94
                        }
95
                        histogram = inputHistogram.getHistogramStatus(HistogramGraphicBase.GREEN);
96
                        if (histogram != null) {
97
                                if (histogram.getBaseFunction() instanceof StraightLine) {
98
                                        StraightLine line = (StraightLine) histogram.getBaseFunction();
99
                                        double[] valuesIn;
100
                                        if (rgb)
101
                                                valuesIn = line.getInValues(0, 255);
102
                                        else
103
                                                valuesIn = line.getInValues(histogram.getMin(), histogram.getMax());
104
                                        int[] valuesOut = line.getOutValues();
105

    
106
                                        params.setParam("StretchInGreen", valuesIn, -1, null);
107
                                        params.setParam("StretchOutGreen", valuesOut, -1, null);
108
                                        params.setParam("StretchGreenFunctionType", Integer.valueOf(line.getFunctionType()), -1, null);
109
                                        params.setParam("StretchGreenValueFunction", Double.valueOf(line.getValueFunction()), -1, null);
110
                                }
111
                        }
112
                        histogram = inputHistogram.getHistogramStatus(HistogramGraphicBase.BLUE);
113
                        if (histogram != null) {
114
                                if (histogram.getBaseFunction() instanceof StraightLine) {
115
                                        StraightLine line = (StraightLine) histogram.getBaseFunction();
116
                                        double[] valuesIn;
117
                                        if (rgb)
118
                                                valuesIn = line.getInValues(0, 255);
119
                                        else
120
                                                valuesIn = line.getInValues(histogram.getMin(), histogram.getMax());
121
                                        int[] valuesOut = line.getOutValues();
122

    
123
                                        params.setParam("StretchInBlue", valuesIn, -1, null);
124
                                        params.setParam("StretchOutBlue", valuesOut, -1, null);
125
                                        params.setParam("StretchBlueFunctionType", Integer.valueOf(line.getFunctionType()), -1, null);
126
                                        params.setParam("StretchBlueValueFunction", Double.valueOf(line.getValueFunction()), -1, null);
127
                                }
128
                        }
129
                }
130
                
131
                params.setParam("TailTrimRedMin",   Double.valueOf(0.0D), -1, null);
132
                params.setParam("TailTrimRedMax",   Double.valueOf(0.0D), -1, null);
133
                params.setParam("TailTrimGreenMin", Double.valueOf(0.0D), -1, null);
134
                params.setParam("TailTrimGreenMax", Double.valueOf(0.0D), -1, null);
135
                params.setParam("TailTrimBlueMin",  Double.valueOf(0.0D), -1, null);
136
                params.setParam("TailTrimBlueMax",  Double.valueOf(0.0D), -1, null);
137

    
138
                params.setParam("RGB", new Boolean(rgb), -1, null);
139
                String render = "";
140
                for (int i = 0; i < enhancedDialog.getLayer().getRender().getRenderBands().length; i++) {
141
                        if (render != "")
142
                                render += " ";
143
                        render = render + "" + enhancedDialog.getLayer().getRender().getRenderBands()[i];
144
                }
145
                params.setParam("RenderBands", render, -1, null);
146

    
147
                enhancedDialog.getFilteredPreview().getParamsList().clear();
148
                Class<?> filterClass = enhancedDialog.getLayer().getRender().getFilterList().getFilterClassByID("enhanced_stretch");
149
                enhancedDialog.getFilteredPreview().addNewParam("enhanced_stretch", params, filterClass);
150
                
151
                enhancedDialog.getPreviewBasePanel().refreshPreview();
152
        }
153

    
154
        /**
155
         * Actualiza el histograma de salida del cuadro de realce
156
         */
157
        public void updateHistogramOut() {
158
                HistogramStatus histogram = inputHistogram.getHistogramStatus(HistogramGraphicBase.DRAWED);
159
                if (histogram != null) {
160
                        if (histogram.getBaseFunction() instanceof StraightLine) {
161
                                StraightLine line = (StraightLine) histogram.getBaseFunction();
162
                                double[] valuesIn = line.getPercentInValues();
163
                                double[] valuesOut = line.getPercentOutValues();
164

    
165
                                double origenHistogram[] = inputHistogram.getHistogramStatus(HistogramGraphicBase.DRAWED).getHistogram();
166
                                double newHistogram[] = new double[origenHistogram.length];
167

    
168
                                for (int i = 0; i < newHistogram.length; i++)
169
                                        newHistogram[i] = 0.0D;
170

    
171
                                int pos;
172
                                double p;
173
                                for (int i = 0; i < origenHistogram.length; i++) {
174
                                        p = (((double) i) / (origenHistogram.length - 1.0D));
175
                                        
176
                                        for (int j = 0; j < (valuesIn.length - 1); j++) {
177
                                                if (valuesIn[j] == valuesIn[j + 1]) continue;
178
                                                if (p >= valuesIn[j] && p <= valuesIn[j + 1]) {
179
                                                        p = valuesOut[j] + ((valuesOut[j + 1] - valuesOut[j]) * ((p - valuesIn[j]) / (valuesIn[j + 1] - valuesIn[j])));
180
                                                        break;
181
                                                }
182
                                        }
183

    
184
                                        pos = (int) Math.round(p * (origenHistogram.length - 1.0D));
185
                                        if (pos < 0)
186
                                                pos = 0;
187
                                        if (pos > (origenHistogram.length - 1))
188
                                                pos = (origenHistogram.length - 1);
189

    
190
                                        newHistogram[pos] += origenHistogram[i];
191
                                }
192

    
193
                                HistogramStatus histogramOut = outputHistogram.getHistogramStatus(HistogramGraphicBase.DRAWED);
194
                                histogramOut.setHistogram(newHistogram);
195
                                histogramOut.setLimits(0.0D, 255.0D);
196
                                outputHistogram.repaint();
197
                        }
198
                }
199
        }
200
}