svn-gvsig-desktop / trunk / libraries / libRaster / src / org / gvsig / raster / datastruct / Transparency.java @ 12522
History | View | Annotate | Download (8.09 KB)
1 | 12383 | nacho | /* gvSIG. Sistema de Informaci?n Geogr?fica de la Generalitat Valenciana
|
---|---|---|---|
2 | *
|
||
3 | * Copyright (C) 2006 IVER T.I. and Generalitat Valenciana.
|
||
4 | *
|
||
5 | * This program is free software; you can redistribute it and/or
|
||
6 | * modify it under the terms of the GNU General Public License
|
||
7 | * as published by the Free Software Foundation; either version 2
|
||
8 | * of the License, or (at your option) any later version.
|
||
9 | *
|
||
10 | * This program is distributed in the hope that it will be useful,
|
||
11 | * but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||
12 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||
13 | * GNU General Public License for more details.
|
||
14 | *
|
||
15 | * You should have received a copy of the GNU General Public License
|
||
16 | * along with this program; if not, write to the Free Software
|
||
17 | * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307,USA.
|
||
18 | */
|
||
19 | package org.gvsig.raster.datastruct; |
||
20 | |||
21 | import java.io.IOException; |
||
22 | import java.util.ArrayList; |
||
23 | |||
24 | import org.gvsig.raster.buffer.RasterBuffer; |
||
25 | import org.gvsig.raster.dataset.IBuffer; |
||
26 | import org.gvsig.raster.dataset.properties.DatasetMetadata; |
||
27 | |||
28 | /**
|
||
29 | * <p>
|
||
30 | * Esta clase contiene informaci?n de transparencia de un objeto. Los objetos pueden ser
|
||
31 | * dataset, grid u otros. Cuando un usuario quiere a?adir nueva informaci?n de transparencia
|
||
32 | * crea un objeto de este tipo que debe ser mezclado (merge) con otros objetos de este tipo
|
||
33 | * que existan para la misma fuente de datos.
|
||
34 | * </p>
|
||
35 | * <p>
|
||
36 | * Un multirasterdatset obtiene los distintos objetos transparency de todos los ficheros que
|
||
37 | * los componen. Para realizar un solo objeto transparency se har? un merge de todos ellos.
|
||
38 | * </p>
|
||
39 | * <p>
|
||
40 | * Finalmente y antes de renderizar se necesita un objeto GridTransparency. Este estar? compuesto
|
||
41 | * con toda la informaci?n de transparencia aplicar, es decir, todos los objetos Transparency
|
||
42 | * mezclados. GridTransparency con tiene el m?todo de procesado de un pixel. Se le proporciona un
|
||
43 | * pixel y devuelve este mismo pixel con la transparencia aplicada.
|
||
44 | * </p>
|
||
45 | *
|
||
46 | * @version 07/06/2007
|
||
47 | * @author Nacho Brodin (nachobrodin@gmail.com)
|
||
48 | *
|
||
49 | */
|
||
50 | public class Transparency{ |
||
51 | public static int MAX_OPACITY = 255; |
||
52 | protected int alphaBandNumber = -1; |
||
53 | private IBuffer alphaBand = null; |
||
54 | /**
|
||
55 | * Rangos de transparencia aplicados. Lista de TransparencyRange
|
||
56 | */
|
||
57 | protected ArrayList transparencyRanges = new ArrayList(); |
||
58 | /**
|
||
59 | * Grado de opacidad de todo el raster
|
||
60 | */
|
||
61 | protected int opacity = 0xff; |
||
62 | |||
63 | /**
|
||
64 | * Constructor
|
||
65 | *
|
||
66 | */
|
||
67 | public Transparency(){ |
||
68 | |||
69 | } |
||
70 | |||
71 | /**
|
||
72 | * Constructor de copia
|
||
73 | */
|
||
74 | public Transparency(Transparency t) { |
||
75 | //TODO: FUNCIONALIDAD: Falta asignar lo necesario para la transparencia por selecci?n
|
||
76 | this.transparencyRanges = (ArrayList)t.getTransparencyRange().clone(); |
||
77 | this.alphaBand = t.getAlphaBand();
|
||
78 | this.opacity = t.getOpacity();
|
||
79 | this.alphaBandNumber = t.alphaBandNumber;
|
||
80 | } |
||
81 | |||
82 | /**
|
||
83 | * Obtiene la m?scara asociada
|
||
84 | * @return M?scara de transparencia
|
||
85 | */
|
||
86 | public IBuffer getAlphaBand() {
|
||
87 | return alphaBand;
|
||
88 | } |
||
89 | |||
90 | /**
|
||
91 | * Asigna el buffer con la m?scara
|
||
92 | * @param b
|
||
93 | */
|
||
94 | public void setAlphaBand(IBuffer b) { |
||
95 | alphaBand = b; |
||
96 | } |
||
97 | |||
98 | /**
|
||
99 | * Obtiene los rangos de pixels que son transparentes en el raster.
|
||
100 | * @return Rangos de transparencias a aplicar
|
||
101 | */
|
||
102 | public ArrayList getTransparencyRange() { |
||
103 | return transparencyRanges;
|
||
104 | } |
||
105 | |||
106 | /**
|
||
107 | * Asigna un rango de pixels que son transparentes en el raster.
|
||
108 | * @param range
|
||
109 | */
|
||
110 | public void setTransparencyRange(TransparencyRange range) { |
||
111 | this.transparencyRanges.add(range);
|
||
112 | } |
||
113 | |||
114 | /**
|
||
115 | * Asigna la lista de rangos de transparencia
|
||
116 | * @param ranges
|
||
117 | */
|
||
118 | public void setTransparencyRangeList(ArrayList ranges) { |
||
119 | this.transparencyRanges = ranges;
|
||
120 | } |
||
121 | |||
122 | /**
|
||
123 | * Inicializa la lista de rangos de transparencia.
|
||
124 | */
|
||
125 | public void clearListOfTransparencyRange(){ |
||
126 | transparencyRanges.clear(); |
||
127 | } |
||
128 | |||
129 | /**
|
||
130 | * Asigna un rango de pixels que son transparentes en el raster.
|
||
131 | * @param range
|
||
132 | */
|
||
133 | public void setTransparencyRange(String range)throws TransparencyRangeException{ |
||
134 | TransparencyRange tr = new TransparencyRange();
|
||
135 | int[] red = new int[2]; |
||
136 | int[] green = new int[2]; |
||
137 | int[] blue = new int[2]; |
||
138 | boolean and = true; |
||
139 | try{
|
||
140 | and = TransparencyRange.stringToInterval(range, red, green, blue); |
||
141 | if(red[0] == -1) |
||
142 | red = null;
|
||
143 | if(green[0] == -1) |
||
144 | green = null;
|
||
145 | if(blue[0] == -1) |
||
146 | blue = null;
|
||
147 | }catch(IOException e){ |
||
148 | throw new TransparencyRangeException("Cadena de rangos malformada."); |
||
149 | } |
||
150 | tr.setAnd(and); |
||
151 | tr.setRed(red); |
||
152 | tr.setGreen(green); |
||
153 | tr.setBlue(blue); |
||
154 | transparencyRanges.add(tr); |
||
155 | } |
||
156 | |||
157 | /**
|
||
158 | * Obtiene el grado de opacidad de todo el raster
|
||
159 | * @return valor del grado de opacidad.
|
||
160 | */
|
||
161 | public int getOpacity() { |
||
162 | return opacity;
|
||
163 | } |
||
164 | |||
165 | /**
|
||
166 | * Asigna el grado de opacidad de todo el raster
|
||
167 | * @param opacity valor del grado de opacidad.
|
||
168 | */
|
||
169 | public void setOpacity(int opacity) { |
||
170 | this.opacity = opacity;
|
||
171 | } |
||
172 | |||
173 | /**
|
||
174 | * Asigna la transparencia a partir de un objeto con los metadatos del raster.
|
||
175 | * @param metadata
|
||
176 | */
|
||
177 | public void setTransparencyByPixelFromMetadata(DatasetMetadata metadata){ |
||
178 | if(metadata != null){ |
||
179 | TransparencyRange[] noData = metadata.parserNodataInMetadata();
|
||
180 | if(noData != null){ |
||
181 | for(int i = 0; i < noData.length; i++) |
||
182 | getTransparencyRange().add(noData[i]); |
||
183 | } |
||
184 | TransparencyRange noDataValue = metadata.parserNodataByBand(); |
||
185 | if(noData == null && noDataValue != null) |
||
186 | getTransparencyRange().add(noDataValue); |
||
187 | } |
||
188 | } |
||
189 | |||
190 | /**
|
||
191 | * Mezcla un objeto Transparency con el actual
|
||
192 | * @param ts objeto TransparencyStatus
|
||
193 | */
|
||
194 | public Transparency merge(Transparency transp) { |
||
195 | Transparency t = new Transparency(); |
||
196 | //Mezclamos la opacidad
|
||
197 | double op1 = (double)opacity / (double)MAX_OPACITY; |
||
198 | double op2 = (double)transp.getOpacity() / (double)MAX_OPACITY; |
||
199 | t.setOpacity((int)(op1 * op2 * MAX_OPACITY));
|
||
200 | |||
201 | //Mezclamos los rangos de transparencia
|
||
202 | ArrayList tr = transp.getTransparencyRange();
|
||
203 | for (int i = 0; i < tr.size(); i++) |
||
204 | transparencyRanges.add(tr.get(i)); |
||
205 | |||
206 | //TODO: FUNCIONALIDAD Mezclamos la m?scara
|
||
207 | if(alphaBand != null && transp.getAlphaBand() != null) { |
||
208 | IBuffer newMask = RasterBuffer.getBuffer(IBuffer.TYPE_BYTE, alphaBand.getWidth(), alphaBand.getHeight(), 1, true); |
||
209 | for (int y = 0; y < alphaBand.getHeight(); y++) { |
||
210 | for (int x = 0; x < alphaBand.getWidth(); x++) { |
||
211 | double v = (alphaBand.getElemByte(y, x, 0) / 255D) * (transp.getAlphaBand().getElemByte(y, x, 0) / 255D); |
||
212 | newMask.setElem(y, x, 0, (byte)(v * 255)); |
||
213 | } |
||
214 | } |
||
215 | t.alphaBand = alphaBand; |
||
216 | } else if(alphaBand != null) { |
||
217 | t.setAlphaBand(alphaBand); |
||
218 | t.alphaBandNumber = alphaBandNumber; |
||
219 | } else {
|
||
220 | t.setAlphaBand(transp.getAlphaBand()); |
||
221 | t.alphaBandNumber = transp.alphaBandNumber; |
||
222 | } |
||
223 | |||
224 | //TODO: FUNCIONALIDAD Mezclamos las ?reas
|
||
225 | |||
226 | //TODO: FUNCIONALIDAD Mezclamos las mascaras
|
||
227 | return t;
|
||
228 | } |
||
229 | |||
230 | /**
|
||
231 | * Obtiene la informaci?n de si existe o no banda de transparencia cuando
|
||
232 | * este objeto va asociado a un dataset. Si tiene este tipo de banda en cada
|
||
233 | * dibujado se cargar? la informaci?n de m?scara de transparencia en el la
|
||
234 | * variable mask.
|
||
235 | * @return true si existe banda de transparencia y false si no lo es.
|
||
236 | */
|
||
237 | public boolean existAlphaBand() { |
||
238 | return (alphaBandNumber != -1); |
||
239 | } |
||
240 | |||
241 | /**
|
||
242 | * Obtiene la banda de transpareci si existe o -1 si no existe.
|
||
243 | * @return n?mero de banda de transparencia o -1 si no existe.
|
||
244 | */
|
||
245 | public int getAlphaBandNumber() { |
||
246 | return alphaBandNumber;
|
||
247 | } |
||
248 | |||
249 | /**
|
||
250 | * Asigna la informaci?n de si existe o no banda de transparencia cuando
|
||
251 | * este objeto va asociado a un dataset. Si tiene este tipo de banda en cada
|
||
252 | * dibujado se cargar? la informaci?n de m?scara de transparencia en el la
|
||
253 | * variable mask.
|
||
254 | * @param true si existe banda de transparencia y false si no lo es.
|
||
255 | */
|
||
256 | public void setTransparencyBand(int alphaBandNumber) { |
||
257 | this.alphaBandNumber = alphaBandNumber;
|
||
258 | } |
||
259 | |||
260 | } |