Statistics
| Revision:

root / trunk / libraries / libRaster / src / org / gvsig / raster / grid / GridTransparency.java @ 12203

History | View | Annotate | Download (6.54 KB)

1
/* 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.grid;
20

    
21
import org.gvsig.raster.shared.Transparency;
22
import org.gvsig.raster.util.TransparencyRange;
23

    
24
//TODO: FUNCIONALIDAD: Convertir la transparencia a String y viceversa para salvar proyecto
25
/**
26
 * <P>
27
 * Representa el estado de transparencia de un grid. 
28
 * </P>
29
 * <P>
30
 * El estado de transparencia de un raster puede verse modificado desde los siguientes sitios:
31
 * <UL>
32
 * <LI>Color con transparencia definido en los metadatos de la imagen. Caracteristica de PNG.</LI>
33
 * <LI>Una banda del raster definida como banda de transparencia. PNGs, IMGs o TIFFs 
34
 * pueden tener bandas de transparencia</LI>
35
 * <LI>Tablas de color con valores de transparencia. GIF y PNG pueden tener tablas 
36
 * que definan entradas de color con transparencia</LI>
37
 * <LI>Informaci?n de transparencia en la cabecera raster. Tipicamente valores NO_DATA suelen 
38
 * ser interpretados como transparentes en la visualizaci?n.</LI>
39
 * <LI>Modificaci?n hecha por el usuario. En la visualizaci?n un usuario puede necesitar
40
 * asignar valores o rangos de valores como transparentes.</LI>
41
 * </UL> 
42
 * </P>
43
 * <P>
44
 * Estas transparencias quedan representadas por cinco tipo b?sicos:
45
 * <UL>
46
 * <LI><b>Transparencia por rangos. </b>Esta se aplicar? antes que ninguna y siempre sobre los valores
47
 * base del raster.</LI>
48
 * <LI><b>Banda de transparencia en un raster. </b></LI>
49
 * <LI>M?scara de transparencia</LI>
50
 * <LI>Opacidad</LI>
51
 * <LI>Zona de recorte</LI>
52
 * </UL>
53
 * </P>
54
 * @author Nacho Brodin (nachobrodin@gmail.com)
55
 *
56
 */
57
public class GridTransparency extends Transparency {
58
        /**
59
         * Flag de activaci?n de la transparencia cuando se visualiza o exporta.
60
         */
61
        private boolean                 transparencyActive = false;
62
                
63
        /**
64
         * Constructor. Crea un objeto con las propiedades de la transparencia de un grid. 
65
         * Las variables conservan sus valores por defecto
66
         */
67
        public GridTransparency(){
68
                super();
69
                activeTransparency();
70
        };
71
        
72
        /**
73
         * Constructor. Crea un objeto con las propiedades de la transparencia de fichero
74
         * pasado como par?metro.
75
         * @param fileStatus Transparencia.
76
         */
77
        public GridTransparency(Transparency transp) {
78
                super(transp);
79
                activeTransparency();
80
        }
81
        
82
        /**
83
         * Comprueba si hay criterios para la aplicaci?n de transparencia y la activa si es
84
         * as? sino se desactiva. Los criterios son:
85
         * <P>
86
         * Que haya una banda de transparencia.
87
         * </P>
88
         * <P>
89
         * Que hayan reglas sobre la aplicaci?n de transparencia.
90
         * </P>
91
         * <P>
92
         * Que la opacidad sea distita de 255 (completamente opaco). 
93
         * </P>
94
         */
95
        //TODO: FUNCIONALIDAD: Activaci?n de transparencia para selecci?n por ?rea cuando esta se implemente
96
        public void activeTransparency() {
97
                if(        existAlphaBand() || 
98
                        (transparencyRanges.size() > 0) ||
99
                        (opacity != 0xff))
100
                        transparencyActive = true;
101
                else
102
                        transparencyActive = false;
103
        }
104
        
105
        /**
106
         * Aplica las reglas de transparencia a un pixel RGB y devuelve el valor de ese
107
         * mismo pixel con la transparencia aplicada. Primero procesar? los rangos. Si
108
         * el pixel est? en alguno directamente lo pone transparente y lo devuelve, sino
109
         * comprueba si existe banda de transparencia y si es as? la aplica.
110
         * @param rgb
111
         * @param line
112
         * @param col
113
         * @return
114
         */
115
        //TODO: FUNCIONALIDAD: Falta tansparencia para selecci?n por ?rea cuando esta se implemente
116
        public int processRGB(int rgb, int line, int col) {
117
                int[] px = {(rgb & 0xff000000) >> 24, (rgb & 0xff0000) >> 16,
118
                        (rgb & 0x00ff00) >> 8, (rgb & 0x0000ff)};
119
                
120
                double r = opacity / 255D;
121
                if(processRange(px))
122
                        r *= ((px[0] & 0xff) / 255D);
123
                        
124
                if(existAlphaBand() && getAlphaBand() != null)
125
                        r *= (getAlphaBand().getElemByte(line, col, 0) & 0xff) / 255D;
126

    
127
                px[0] = (int)(r * 255D);
128
                
129
                return (((px[0] << 24) & 0xff000000) | (rgb & 0x00ffffff));
130
        }
131
        
132
        /**     
133
         * Aplica la transparecia por rangos al pixel pasado por par?metro. El valor en la posici?n
134
         * cero es el alpha por lo tanto ser? esta posici?n la que se modificar?.
135
     * @param px Pixel
136
     * @return true si se ha modificado y false si no se ha hecho.
137
     */
138
    private boolean processRange(int[] px) {
139
            for (int i = 0; i < transparencyRanges.size(); i++) {
140
                    TransparencyRange tr = ((TransparencyRange)transparencyRanges.get(i));
141
                    if(tr.isAnd()){
142
                            if(tr.getRed() != null)
143
                                    if (px[1] < tr.getRed()[0] || px[1] > tr.getRed()[1])
144
                                            continue;
145
                            if(tr.getGreen() != null)
146
                                    if (px[2] < tr.getGreen()[0] || px[2] > tr.getGreen()[1])
147
                                            continue;
148
                            if(tr.getBlue() != null)
149
                                    if (px[3] < tr.getBlue()[0] || px[3] > tr.getBlue()[1])
150
                                            continue;
151
                            if(tr.getRed() != null || tr.getGreen() != null || tr.getBlue() != null){
152
                                    px[0] = (byte)tr.getAlpha();
153
                                    return true;
154
                            }
155
                            
156
                    }else{
157
                            if(tr.getRed() != null){
158
                                    if (px[1] >= tr.getRed()[0] && px[1] <= tr.getRed()[1]){
159
                                            px[0] = (byte)tr.getAlpha();
160
                                            return true;
161
                                    }
162
                            }
163
                            if(tr.getGreen() != null){
164
                                    if (px[2] >= tr.getGreen()[0] && px[2] <= tr.getGreen()[1]){
165
                                            px[0] = (byte)tr.getAlpha();
166
                                            return true;
167
                                    }
168
                            }
169
                            if(tr.getBlue() != null){
170
                                    if (px[3] >= tr.getBlue()[0] && px[3] <= tr.getBlue()[1]){
171
                                            px[0] = (byte)tr.getAlpha();
172
                                            return true;
173
                                    }
174
                            }
175
                    }
176
            }
177
            return false;
178
    }
179
    
180
        /**
181
         * Obtiene el flag de transparencia activa o desactivada.
182
         * @return true la transparencia est? activa y false desactiva
183
         */
184
        public boolean isTransparencyActive() {
185
                return transparencyActive;
186
        }
187
        
188
        /**
189
         * Asigna el flag de transparencia activa o desactivada.
190
         * @param transparencyActive true activa la transparencia false la desactiva
191
         */
192
        public void setTransparencyActive(boolean transparencyActive) {
193
                this.transparencyActive = transparencyActive;
194
        }
195
                        
196
}