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 | 21 | nbrodin | /* 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 | 111 | nbrodin | import org.gvsig.fmap.dal.coverage.grid.GridTransparency; |
26 | 55 | nbrodin | import org.gvsig.fmap.dal.coverage.store.props.Transparency; |
27 | 162 | nbrodin | import org.gvsig.raster.impl.store.properties.DataStoreTransparency; |
28 | 21 | nbrodin | 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 | 107 | nbrodin | import org.gvsig.tools.persistence.PersistentState; |
33 | import org.gvsig.tools.persistence.exception.PersistenceException; |
||
34 | 21 | nbrodin | |
35 | 107 | nbrodin | |
36 | 21 | nbrodin | //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 | 162 | nbrodin | public class GridTransparencyImpl extends DataStoreTransparency implements GridTransparency { |
70 | 21 | nbrodin | /**
|
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 | 111 | nbrodin | public GridTransparencyImpl(){
|
80 | 21 | nbrodin | 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 | 111 | nbrodin | public GridTransparencyImpl(Transparency transp) { |
90 | 21 | nbrodin | 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 | 111 | nbrodin | /*
|
117 | * (non-Javadoc)
|
||
118 | * @see org.gvsig.fmap.dal.coverage.grid.GridTransparency#processRGB(int, int, int, int, int)
|
||
119 | 21 | nbrodin | */
|
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 | 111 | nbrodin | /*
|
200 | * (non-Javadoc)
|
||
201 | * @see org.gvsig.fmap.dal.coverage.grid.GridTransparency#isTransparencyActive()
|
||
202 | 21 | nbrodin | */
|
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 | 111 | nbrodin | GridTransparencyImpl.class, |
219 | 21 | nbrodin | "GridTransparency_Persistent",
|
220 | "GridTransparency Persistent definition",
|
||
221 | null,
|
||
222 | null
|
||
223 | ); |
||
224 | definition.extend( |
||
225 | (DynClass)ToolsLocator.getPersistenceManager() |
||
226 | .getDefinition(Transparency.class)
|
||
227 | ); |
||
228 | 107 | nbrodin | definition.addDynFieldBoolean("transparencyActive");
|
229 | 21 | nbrodin | } |
230 | |||
231 | 107 | nbrodin | @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 | 21 | nbrodin | } |