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 / grid / GridTransparencyImpl.java @ 162

History | View | Annotate | Download (7.98 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.impl.grid;
23

    
24
import org.gvsig.fmap.dal.coverage.datastruct.TransparencyRange;
25
import org.gvsig.fmap.dal.coverage.grid.GridTransparency;
26
import org.gvsig.fmap.dal.coverage.store.props.Transparency;
27
import org.gvsig.raster.impl.store.properties.DataStoreTransparency;
28
import org.gvsig.tools.ToolsLocator;
29
import org.gvsig.tools.dynobject.DynClass;
30
import org.gvsig.tools.dynobject.DynStruct;
31
import org.gvsig.tools.persistence.PersistenceManager;
32
import org.gvsig.tools.persistence.PersistentState;
33
import org.gvsig.tools.persistence.exception.PersistenceException;
34

    
35

    
36
//TODO: FUNCIONALIDAD: Convertir la transparencia a String y viceversa para salvar proyecto
37
/**
38
 * <P>
39
 * Representa el estado de transparencia de un grid. 
40
 * </P>
41
 * <P>
42
 * El estado de transparencia de un raster puede verse modificado desde los siguientes sitios:
43
 * <UL>
44
 * <LI>Color con transparencia definido en los metadatos de la imagen. Caracteristica de PNG.</LI>
45
 * <LI>Una banda del raster definida como banda de transparencia. PNGs, IMGs o TIFFs 
46
 * pueden tener bandas de transparencia</LI>
47
 * <LI>Tablas de color con valores de transparencia. GIF y PNG pueden tener tablas 
48
 * que definan entradas de color con transparencia</LI>
49
 * <LI>Informaci?n de transparencia en la cabecera raster. Tipicamente valores NO_DATA suelen 
50
 * ser interpretados como transparentes en la visualizaci?n.</LI>
51
 * <LI>Modificaci?n hecha por el usuario. En la visualizaci?n un usuario puede necesitar
52
 * asignar valores o rangos de valores como transparentes.</LI>
53
 * </UL> 
54
 * </P>
55
 * <P>
56
 * Estas transparencias quedan representadas por cinco tipo b?sicos:
57
 * <UL>
58
 * <LI><b>Transparencia por rangos. </b>Esta se aplicar? antes que ninguna y siempre sobre los valores
59
 * base del raster.</LI>
60
 * <LI><b>Banda de transparencia en un raster. </b></LI>
61
 * <LI>M?scara de transparencia</LI>
62
 * <LI>Opacidad</LI>
63
 * <LI>Zona de recorte</LI>
64
 * </UL>
65
 * </P>
66
 * @author Nacho Brodin (nachobrodin@gmail.com)
67
 *
68
 */
69
public class GridTransparencyImpl extends DataStoreTransparency implements GridTransparency {
70
        /**
71
         * Flag de activaci?n de la transparencia cuando se visualiza o exporta.
72
         */
73
        private boolean                 transparencyActive           = false;
74
                        
75
        /**
76
         * Constructor. Crea un objeto con las propiedades de la transparencia de un grid. 
77
         * Las variables conservan sus valores por defecto
78
         */
79
        public GridTransparencyImpl(){
80
                super();
81
                activeTransparency();
82
        };
83
        
84
        /**
85
         * Constructor. Crea un objeto con las propiedades de la transparencia de fichero
86
         * pasado como par?metro.
87
         * @param fileStatus Transparencia.
88
         */
89
        public GridTransparencyImpl(Transparency transp) {
90
                super(transp);
91
                activeTransparency();
92
        }
93
        
94
        /**
95
         * Comprueba si hay criterios para la aplicaci?n de transparencia y la activa si es
96
         * as? sino se desactiva. Los criterios son:
97
         * <P>
98
         * Que haya una mascara de transparencia.
99
         * </P><P>
100
         * Que exista un buffer de datos para la aplicaci?n de nodata
101
         * </P><P>
102
         * Que hayan reglas sobre la aplicaci?n de transparencia.
103
         * </P><P>
104
         * Que la opacidad sea distita de 255 (completamente opaco). 
105
         * </P>
106
         */
107
        public void activeTransparency() {
108
                if(        existAlphaBand() || isNoDataActive() ||
109
                        (transparencyRanges.size() > 0) ||
110
                        (opacity != 0xff))
111
                        transparencyActive = true;
112
                else
113
                        transparencyActive = false;
114
        }
115
        
116
        /*
117
         * (non-Javadoc)
118
         * @see org.gvsig.fmap.dal.coverage.grid.GridTransparency#processRGB(int, int, int, int, int)
119
         */
120
        public int processRGB(int r, int g, int b, int line, int col) {
121
                // Si el valor es noData se pone totalmente transparente y ya no se tiene en
122
                // cuenta nada m?s.
123
                if (originalData != null && isNoDataActive()) {
124
                        if (isNoData(line, col))
125
                                // El alpha no se pone para dejarlo a 0, totalmente transparente
126
                                return (r << 16 | g << 8 | b);
127
                }
128

    
129
                /**
130
                 * Para sacar el valor del nuevo alpha, lo que hacemos es convertir a
131
                 * porcentajes todos los alphas posibles (en porcentajes) y multiplicarlos
132
                 * entre si. Con esto conseguimos un nuevo porcentaje de alpha entre 0 y 1.
133
                 * Una vez hecho esto se multiplica por 255 para tenerlo dentro del rango
134
                 * deseado. Como queremos evitar operaciones de m?s, podemos quitar una
135
                 * division de 255 y as? nos ahorramos luego multiplicarlo por 255 otra vez.
136
                 */
137

    
138
                // Quitada la division para optimizar
139
                //double a = opacity / 255D;
140
                double a = opacity;
141

    
142
                int alphaRange = processRange(r, g, b);
143
                if (alphaRange != 255)
144
                        a *= (alphaRange / 255D);
145

    
146
                if (existAlphaBand() && getAlphaBand() != null)
147
                        a *= (getAlphaBand().getElemByte(line, col, 0) & 0xff) / 255D;
148

    
149
                // Quitada la multiplicacion para optimizar
150
                // a = (int)(a * 255D);
151

    
152
                return ((int) a << 24) | r << 16 | g << 8 | b;
153
        }
154
        
155
        /**
156
         * Aplica la transparecia por rangos al pixel pasado por par?metro. El valor
157
         * en la posici?n cero es el alpha por lo tanto ser? esta posici?n la que se
158
         * modificar?.
159
         * @param r
160
         * @param g
161
         * @param b
162
         * @return Un valor de 0 a 255. Donde 255 es totalmente opaco
163
         */
164
        private int processRange(int r, int g, int b) {
165
                for (int i = 0; i < transparencyRanges.size(); i++) {
166
                        TransparencyRange tr = ((TransparencyRange) transparencyRanges.get(i));
167
                        if (tr == null) continue;
168
                        if (tr.isAnd()) {
169
                                if (tr.getRed() == null ||
170
                                                tr.getGreen() == null ||
171
                                                tr.getBlue() == null ||
172
                                                r < tr.getRed()[0]   || r > tr.getRed()[1] ||
173
                                                g < tr.getGreen()[0] || g > tr.getGreen()[1] ||
174
                                                b < tr.getBlue()[0]  || b > tr.getBlue()[1])
175
                                        continue;
176

    
177
                                return tr.getAlpha();
178
                        } else {
179
                                if (tr.getRed() != null) {
180
                                        if (r >= tr.getRed()[0] && r <= tr.getRed()[1]) {
181
                                                return tr.getAlpha();
182
                                        }
183
                                }
184
                                if (tr.getGreen() != null) {
185
                                        if (g >= tr.getGreen()[0] && g <= tr.getGreen()[1]) {
186
                                                return tr.getAlpha();
187
                                        }
188
                                }
189
                                if (tr.getBlue() != null) {
190
                                        if (b >= tr.getBlue()[0] && b <= tr.getBlue()[1]) {
191
                                                return tr.getAlpha();
192
                                        }
193
                                }
194
                        }
195
                }
196
                return 255;
197
        }
198
                
199
        /*
200
         * (non-Javadoc)
201
         * @see org.gvsig.fmap.dal.coverage.grid.GridTransparency#isTransparencyActive()
202
         */
203
        public boolean isTransparencyActive() {
204
                return transparencyActive;
205
        }
206
        
207
        /**
208
         * Asigna el flag de transparencia activa o desactivada.
209
         * @param transparencyActive true activa la transparencia false la desactiva
210
         */
211
        public void setTransparencyActive(boolean transparencyActive) {
212
                this.transparencyActive = transparencyActive;
213
        }
214
        
215
        public static void registerPersistent() {
216
                PersistenceManager manager = ToolsLocator.getPersistenceManager();
217
                DynStruct definition = manager.addDefinition(
218
                                GridTransparencyImpl.class,
219
                                "GridTransparency_Persistent",
220
                                "GridTransparency Persistent definition",
221
                                null, 
222
                                null
223
                );
224
                definition.extend(
225
                                (DynClass)ToolsLocator.getPersistenceManager()
226
                                        .getDefinition(Transparency.class)
227
                );
228
                definition.addDynFieldBoolean("transparencyActive");
229
        }
230
                        
231
        @Override
232
        public void loadFromState(PersistentState state)
233
                        throws PersistenceException {
234
                super.loadFromState(state);
235
                this.transparencyActive = state.getBoolean("transparencyActive");
236
        }
237
        
238
        @Override
239
        public void saveToState(PersistentState state) throws PersistenceException {
240
                super.saveToState(state);
241
                state.set("transparencyActive",transparencyActive);
242
        }
243
                        
244
}