Statistics
| Revision:

svn-gvsig-desktop / trunk / libraries / libRaster / src / org / gvsig / raster / grid / GridTransparency.java @ 20066

History | View | Annotate | Download (6.72 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.datastruct.Transparency;
22
import org.gvsig.raster.datastruct.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 mascara de transparencia.
87
         * </P><P>
88
         * Que exista un buffer de datos para la aplicaci?n de nodata
89
         * </P><P>
90
         * Que hayan reglas sobre la aplicaci?n de transparencia.
91
         * </P><P>
92
         * Que la opacidad sea distita de 255 (completamente opaco). 
93
         * </P>
94
         */
95
        public void activeTransparency() {
96
                if(        existAlphaBand() || isNoDataActive() ||
97
                        (transparencyRanges.size() > 0) ||
98
                        (opacity != 0xff))
99
                        transparencyActive = true;
100
                else
101
                        transparencyActive = false;
102
        }
103
        
104
        /**
105
         * Aplica las reglas de transparencia a un pixel RGB y devuelve el valor de ese
106
         * mismo pixel con la transparencia aplicada. Primero procesar? los rangos. Si
107
         * el pixel est? en alguno directamente lo pone transparente y lo devuelve, sino
108
         * comprueba si existe banda de transparencia y si es as? la aplica.
109
         * @param rgb
110
         * @param line
111
         * @param col
112
         * @return
113
         */
114
        public int processRGB(int rgb, int line, int col) {
115
                int[] px = {(rgb & 0xff000000) >> 24, (rgb & 0xff0000) >> 16,
116
                        (rgb & 0x00ff00) >> 8, (rgb & 0x0000ff)};
117
                
118
                //Si el valor es noData se pone totalmente transparente y ya no se tiene en cuenta nada m?s.
119
                if(originalData != null && isNoDataActive()) {
120
                        if(isNoData(line, col))
121
                                return (((0 << 24) & 0xff000000) | (rgb & 0x00ffffff));
122
                }
123
                
124
                double r = opacity / 255D;
125
                
126
                if(processRange(px))
127
                        r *= ((px[0] & 0xff) / 255D);
128
                                        
129
                if(existAlphaBand() && getAlphaBand() != null)
130
                        r *= (getAlphaBand().getElemByte(line, col, 0) & 0xff) / 255D;
131
                
132
                px[0] = (int)(r * 255D);
133
                                
134
                return (((px[0] << 24) & 0xff000000) | (rgb & 0x00ffffff));
135
        }
136
        
137
        /**     
138
         * Aplica la transparecia por rangos al pixel pasado por par?metro. El valor en la posici?n
139
         * cero es el alpha por lo tanto ser? esta posici?n la que se modificar?.
140
     * @param px Pixel
141
     * @return true si se ha modificado y false si no se ha hecho.
142
     */
143
    private boolean processRange(int[] px) {
144
            for (int i = 0; i < transparencyRanges.size(); i++) {
145
                    TransparencyRange tr = ((TransparencyRange)transparencyRanges.get(i));
146
                    if(tr == null)
147
                            continue;
148
                    if(tr.isAnd()){
149
                            if(tr.getRed() != null)
150
                                    if (px[1] < tr.getRed()[0] || px[1] > tr.getRed()[1])
151
                                            continue;
152
                            if(tr.getGreen() != null)
153
                                    if (px[2] < tr.getGreen()[0] || px[2] > tr.getGreen()[1])
154
                                            continue;
155
                            if(tr.getBlue() != null)
156
                                    if (px[3] < tr.getBlue()[0] || px[3] > tr.getBlue()[1])
157
                                            continue;
158
                            if(tr.getRed() != null || tr.getGreen() != null || tr.getBlue() != null){
159
                                    px[0] = (byte)tr.getAlpha();
160
                                    return true;
161
                            }
162
                            
163
                    }else{
164
                            if(tr.getRed() != null){
165
                                    if (px[1] >= tr.getRed()[0] && px[1] <= tr.getRed()[1]){
166
                                            px[0] = (byte)tr.getAlpha();
167
                                            return true;
168
                                    }
169
                            }
170
                            if(tr.getGreen() != null){
171
                                    if (px[2] >= tr.getGreen()[0] && px[2] <= tr.getGreen()[1]){
172
                                            px[0] = (byte)tr.getAlpha();
173
                                            return true;
174
                                    }
175
                            }
176
                            if(tr.getBlue() != null){
177
                                    if (px[3] >= tr.getBlue()[0] && px[3] <= tr.getBlue()[1]){
178
                                            px[0] = (byte)tr.getAlpha();
179
                                            return true;
180
                                    }
181
                            }
182
                    }
183
            }
184
            return false;
185
    }
186
    
187
        /**
188
         * Obtiene el flag de transparencia activa o desactivada.
189
         * @return true la transparencia est? activa y false desactiva
190
         */
191
        public boolean isTransparencyActive() {
192
                return transparencyActive;
193
        }
194
        
195
        /**
196
         * Asigna el flag de transparencia activa o desactivada.
197
         * @param transparencyActive true activa la transparencia false la desactiva
198
         */
199
        public void setTransparencyActive(boolean transparencyActive) {
200
                this.transparencyActive = transparencyActive;
201
        }
202
                        
203
}