Statistics
| Revision:

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
        }