Statistics
| Revision:

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
}