svn-gvsig-desktop / branches / org.gvsig.desktop-2018a / org.gvsig.desktop.compat.cdc / org.gvsig.fmap.mapcontext / org.gvsig.fmap.mapcontext.impl / src / main / java / org / gvsig / raster / lib / legend / impl / DefaultTransparency.java @ 43803
History | View | Annotate | Download (6.78 KB)
1 |
package org.gvsig.raster.lib.legend.impl; |
---|---|
2 |
|
3 |
import java.beans.PropertyChangeListener; |
4 |
import java.beans.PropertyChangeSupport; |
5 |
import java.util.ArrayList; |
6 |
import java.util.Collections; |
7 |
import java.util.List; |
8 |
|
9 |
import org.gvsig.raster.lib.legend.api.Transparency; |
10 |
import org.gvsig.raster.lib.legend.api.TransparencyRange; |
11 |
import org.gvsig.tools.ToolsLocator; |
12 |
import org.gvsig.tools.dynobject.DynStruct; |
13 |
import org.gvsig.tools.persistence.PersistenceManager; |
14 |
import org.gvsig.tools.persistence.PersistentState; |
15 |
import org.gvsig.tools.persistence.exception.PersistenceException; |
16 |
|
17 |
/**
|
18 |
* @author <a href="mailto:lmarques@disid.com">Lluis Marques</a>
|
19 |
*
|
20 |
*/
|
21 |
public class DefaultTransparency implements Transparency { |
22 |
|
23 |
private final static String PERSISTENCE_NAME = "transparency"; |
24 |
private final static String PERSISTENCE_DESCRIPTION = "Transparency persistence description"; |
25 |
private final static String OPACITY_PERSISTENCE_FIELD = "opacity"; |
26 |
private final static String TRANSPARENCY_RANGES_PERSISTENCE_FIELD = "transparencyRanges"; |
27 |
|
28 |
public final static String OPACITY_PROPERTY_NAME = "opacity"; |
29 |
public final static String TRANSPARENCY_RANGES_PROPERTY_NAME = "transparencyRanges"; |
30 |
|
31 |
private PropertyChangeSupport propertyChangeSupport; |
32 |
private int value; |
33 |
private List<TransparencyRange> transparencyRanges; |
34 |
|
35 |
/**
|
36 |
*
|
37 |
*/
|
38 |
public DefaultTransparency() {
|
39 |
this.propertyChangeSupport = new PropertyChangeSupport(this); |
40 |
this.value = 255; |
41 |
this.transparencyRanges = new ArrayList<TransparencyRange>(); |
42 |
} |
43 |
|
44 |
/**
|
45 |
* @param transparency
|
46 |
* @param transparencyRanges
|
47 |
*/
|
48 |
public DefaultTransparency(int transparency, List<TransparencyRange> transparencyRanges) { |
49 |
this();
|
50 |
this.setValue(transparency);
|
51 |
if(transparencyRanges != null){ |
52 |
this.transparencyRanges = transparencyRanges;
|
53 |
} |
54 |
} |
55 |
|
56 |
@Override
|
57 |
public void addPropertyChangeListener(PropertyChangeListener listener) { |
58 |
propertyChangeSupport.addPropertyChangeListener(listener); |
59 |
} |
60 |
|
61 |
@Override
|
62 |
public void removePropertyChangeListener(PropertyChangeListener listener) { |
63 |
propertyChangeSupport.removePropertyChangeListener(listener); |
64 |
} |
65 |
|
66 |
@Override
|
67 |
public int getAlpha() { |
68 |
return this.value; |
69 |
} |
70 |
|
71 |
@Override
|
72 |
public List<TransparencyRange> getTransparencyRanges() { |
73 |
return Collections.unmodifiableList(this.transparencyRanges); |
74 |
} |
75 |
|
76 |
@Override
|
77 |
public void addTransparencyRange(TransparencyRange range) { |
78 |
if (this.transparencyRanges == null) { |
79 |
this.transparencyRanges = new ArrayList<TransparencyRange>(); |
80 |
} |
81 |
|
82 |
List<TransparencyRange> oldTransparencyRanges = getTransparencyRanges();
|
83 |
this.transparencyRanges.add(range);
|
84 |
propertyChangeSupport.firePropertyChange(TRANSPARENCY_RANGES_PROPERTY_NAME, |
85 |
oldTransparencyRanges, transparencyRanges); |
86 |
} |
87 |
|
88 |
@Override
|
89 |
public void removeTransparencyRange(TransparencyRange range) { |
90 |
if (this.transparencyRanges == null) { |
91 |
return;
|
92 |
} |
93 |
|
94 |
List<TransparencyRange> oldTransparencyRanges = getTransparencyRanges();
|
95 |
this.transparencyRanges.remove(range);
|
96 |
propertyChangeSupport.firePropertyChange(TRANSPARENCY_RANGES_PROPERTY_NAME, |
97 |
oldTransparencyRanges, transparencyRanges); |
98 |
} |
99 |
|
100 |
@Override
|
101 |
public void setValue(int value) { |
102 |
|
103 |
if(value < 0 || value > 255){ |
104 |
throw new IllegalArgumentException("Opacity value has to be between 0 and 255"); |
105 |
} |
106 |
|
107 |
if(value != this.value){ |
108 |
propertyChangeSupport.firePropertyChange(OPACITY_PROPERTY_NAME, this.value, value);
|
109 |
this.value = value;
|
110 |
} |
111 |
} |
112 |
|
113 |
@Override
|
114 |
public void setTransparencyRanges(List<TransparencyRange> ranges) { |
115 |
propertyChangeSupport.firePropertyChange(TRANSPARENCY_RANGES_PROPERTY_NAME, |
116 |
this.transparencyRanges, ranges);
|
117 |
this.transparencyRanges = ranges;
|
118 |
} |
119 |
|
120 |
public static void registerPersistence() { |
121 |
|
122 |
PersistenceManager persistenceManager = ToolsLocator.getPersistenceManager(); |
123 |
DynStruct definition = persistenceManager.getDefinition(PERSISTENCE_NAME); |
124 |
if (definition == null) { |
125 |
definition = |
126 |
persistenceManager.addDefinition(DefaultTransparency.class, PERSISTENCE_NAME, |
127 |
PERSISTENCE_DESCRIPTION, null, null); |
128 |
|
129 |
definition.addDynFieldInt(OPACITY_PERSISTENCE_FIELD).setMandatory(false);
|
130 |
definition.addDynFieldList(TRANSPARENCY_RANGES_PERSISTENCE_FIELD) |
131 |
.setClassOfValue(TransparencyRange.class).setMandatory(false);
|
132 |
} |
133 |
} |
134 |
|
135 |
@Override
|
136 |
public void saveToState(PersistentState state) throws PersistenceException { |
137 |
state.set(OPACITY_PERSISTENCE_FIELD, value); |
138 |
state.set(TRANSPARENCY_RANGES_PERSISTENCE_FIELD, this.transparencyRanges);
|
139 |
} |
140 |
|
141 |
@Override
|
142 |
public void loadFromState(PersistentState state) throws PersistenceException { |
143 |
this.value = state.getInt(OPACITY_PERSISTENCE_FIELD);
|
144 |
this.transparencyRanges = state.getList(TRANSPARENCY_RANGES_PERSISTENCE_FIELD);
|
145 |
} |
146 |
|
147 |
@Override
|
148 |
public int getTransparencyRangeAlpha(byte r, byte g, byte b) { |
149 |
int red = r;
|
150 |
int green = g;
|
151 |
int blue = b;
|
152 |
if(red<0){ |
153 |
red = 255+red;
|
154 |
} |
155 |
if(green<0){ |
156 |
green = 255+green;
|
157 |
} |
158 |
if(blue<0){ |
159 |
blue = 255+blue;
|
160 |
} |
161 |
return getTransparencyRangeAlpha(red, green, blue);
|
162 |
} |
163 |
|
164 |
@Override
|
165 |
public int getTransparencyRangeAlpha(int red, int green, int blue) { |
166 |
|
167 |
int alpha = 255; |
168 |
for (int i = 0; i < transparencyRanges.size(); i++) { |
169 |
int alphaRange = 255; |
170 |
TransparencyRange tr = ((TransparencyRange) transparencyRanges.get(i)); |
171 |
if (tr == null){ |
172 |
continue;
|
173 |
} |
174 |
if (tr.isAnd()) {
|
175 |
if(isInRange(tr.getRed(),red) && isInRange(tr.getGreen(), green) && isInRange(tr.getBlue(), blue)){
|
176 |
alphaRange = tr.getAlpha(); |
177 |
} |
178 |
} else if(isInRange(tr.getRed(),red) || isInRange(tr.getGreen(), green) || isInRange(tr.getBlue(), blue)){ |
179 |
alphaRange = tr.getAlpha(); |
180 |
} else {
|
181 |
continue;
|
182 |
} |
183 |
alpha = alpha * alphaRange/255;
|
184 |
} |
185 |
return alpha;
|
186 |
} |
187 |
|
188 |
private boolean isInRange(int[] range, int value) { |
189 |
if(range==null){ |
190 |
return true; |
191 |
} |
192 |
if(range[0]<0 && value<=range[1]){ |
193 |
return true; |
194 |
} |
195 |
if(range[1]<0 && value>=range[0]){ |
196 |
return true; |
197 |
} |
198 |
if(range[0]<0 && range[1]<0){ |
199 |
return true; |
200 |
} |
201 |
if(value>=range[0] && value<=range[1]){ |
202 |
return true; |
203 |
} |
204 |
return false; |
205 |
} |
206 |
} |