Statistics
| Revision:

gvsig-raster / org.gvsig.raster / trunk / org.gvsig.raster / org.gvsig.raster.lib / org.gvsig.raster.lib.impl / src / main / java / org / gvsig / raster / impl / store / properties / DataStoreTransparency.java @ 859

History | View | Annotate | Download (20.1 KB)

1
/* gvSIG. Geographic Information System of the Valencian Government
2
 *
3
 * Copyright (C) 2007-2008 Infrastructures and Transports Department
4
 * of the Valencian Government (CIT)
5
 *
6
 * This program is free software; you can redistribute it and/or
7
 * modify it under the terms of the GNU General Public License
8
 * as published by the Free Software Foundation; either version 2
9
 * of the License, or (at your option) any later version.
10
 *
11
 * This program is distributed in the hope that it will be useful,
12
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14
 * GNU General Public License for more details.
15
 *
16
 * You should have received a copy of the GNU General Public License
17
 * along with this program; if not, write to the Free Software
18
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
19
 * MA  02110-1301, USA.
20
 *
21
 */
22
package org.gvsig.raster.impl.store.properties;
23

    
24
import java.util.ArrayList;
25
import java.util.List;
26

    
27
import org.gvsig.fmap.dal.coverage.RasterLocator;
28
import org.gvsig.fmap.dal.coverage.dataset.Buffer;
29
import org.gvsig.fmap.dal.coverage.datastruct.NoData;
30
import org.gvsig.fmap.dal.coverage.datastruct.TransparencyRange;
31
import org.gvsig.fmap.dal.coverage.store.props.Transparency;
32
import org.gvsig.fmap.dal.coverage.util.PropertyEvent;
33
import org.gvsig.fmap.dal.coverage.util.PropertyListener;
34
import org.gvsig.raster.impl.DefaultRasterManager;
35
import org.gvsig.tools.ToolsLocator;
36
import org.gvsig.tools.dynobject.DynStruct;
37
import org.gvsig.tools.persistence.PersistenceManager;
38
import org.gvsig.tools.persistence.Persistent;
39
import org.gvsig.tools.persistence.PersistentState;
40
import org.gvsig.tools.persistence.exception.PersistenceException;
41
/**
42
 * <p>
43
 * Esta clase contiene informaci?n de transparencia de un objeto. Los objetos
44
 * pueden ser dataset, grid u otros. Cuando un usuario quiere a?adir nueva
45
 * informaci?n de transparencia crea un objeto de este tipo que debe ser
46
 * mezclado (merge) con otros objetos de este tipo que existan para la misma
47
 * fuente de datos.
48
 * </p>
49
 * <p>
50
 * Un multirasterdatset obtiene los distintos objetos transparency de todos los
51
 * ficheros que los componen. Para realizar un solo objeto transparency se har?
52
 * un merge de todos ellos.
53
 * </p>
54
 * <p>
55
 * Finalmente y antes de renderizar se necesita un objeto Transparency. Este
56
 * estar? compuesto con toda la informaci?n de transparencia aplicar, es decir,
57
 * todos los objetos Transparency mezclados.Transparency con tiene el
58
 * m?todo de procesado de un pixel. Se le proporciona un pixel y devuelve este
59
 * mismo pixel con la transparencia aplicada.
60
 * </p>
61
 * <p>
62
 * Una transparencia que se aplica a un buffer puede tener cuatro procedencias distintas:
63
 * <UL>
64
 * <LI>Mascara: Un buffer de NxN aplicado sobre la zona a renderizar como una m?scara de
65
 * transparencia. Las bandas alpha de las imagenes se comportan de esta forma.</LI>
66
 * <LI>Opacidad global: Un valor de opacidad se aplicado a cada pixel a renderizar. Este es
67
 * igual para todos los p?xeles.</LI>
68
 * <LI>Rangos: Una lista de rangos de valores RGB. Cada pixel cuyo valor est? dentro de alguno
69
 * de los rangos se aplica como transparente.</LI>
70
 * <LI>Dato: Todos los valores del buffer que coincidan con ese dato son puestos como transparente.
71
 * Para que esto sea posible tenemos que disponer del buffer de datos originales sin ning?n proceso.</LI>
72
 * </UL>
73
 * </p>
74
 *
75
 * @version 07/06/2007
76
 * @author Nacho Brodin (nachobrodin@gmail.com)
77
 */
78
public class DataStoreTransparency implements Transparency, Persistent {
79
        public static final String PERSISTENCE_NAME = "Transparency_Persistent";
80

    
81
        public static int     MAX_OPACITY           = 255;
82
        protected int         alphaBandNumber       = -1;
83
        /**
84
         * Buffer con la banda alpha correspondiente a la zona a renderizar
85
         */
86
        private Buffer       mask                   = null;
87
        /**
88
         * Buffer con los datos originales (sin filtrar) correspondiente a la zona a renderizar.
89
         * Esto es util para aplicar el valor NoData ya que hay que consultar el valor original del
90
         * dato. Despu?s de hacer un process es recomendable hacer free para poner a null los buffers.
91
         */
92
        protected Buffer     originalData           = null;
93
        /**
94
         * Valor de dato transparente. Todos los p?xeles de originalData que correspondan con este
95
         * valor se pondr?n 100% transparentes.
96
         */
97
        protected NoData     noData                 = null;
98
        /**
99
         * Flag que indica que el uso de noData para transparencia est? activo
100
         */
101
        protected boolean     noDataActive          = false;
102
        /**
103
         * Rangos de transparencia aplicados. Lista de TransparencyRange
104
         */
105
        protected ArrayList<TransparencyRange>   
106
                              transparencyRanges    = new ArrayList<TransparencyRange>();
107
        /**
108
         * Grado de opacidad de todo el raster
109
         */
110
        protected int         opacity               = 0xff;
111

    
112
        /**
113
         * Array de listeners que ser?n informados cuando cambia la propiedad de transparencia
114
         */
115
        private ArrayList<PropertyListener>     
116
                              transparencyPropertyListener = new ArrayList<PropertyListener>();
117
        /**
118
         * Flag de activaci?n de la transparencia cuando se visualiza o exporta.
119
         */
120
        private boolean       transparencyActive    = false;
121

    
122
        /**
123
         * Constructor
124
         */
125
        public DataStoreTransparency() {
126
        }
127

    
128
        /**
129
         * Constructor de copia
130
         */
131
        @SuppressWarnings("unchecked")
132
        public DataStoreTransparency(Transparency tParam) {
133
                DataStoreTransparency t = null;
134
                if(tParam instanceof DataStoreTransparency)
135
                        t = (DataStoreTransparency)tParam;
136
                else 
137
                        return;
138
                
139
                //TODO: FUNCIONALIDAD: Falta asignar lo necesario para la transparencia por selecci?n
140
                this.transparencyRanges = (ArrayList<TransparencyRange>) t.getTransparencyRange().clone();
141
                this.mask = t.getAlphaBand();
142
                this.opacity = t.getOpacity();
143
                this.alphaBandNumber = t.alphaBandNumber;
144
                this.noData = t.getNoData();
145
                this.noDataActive = t.isNoDataActive();
146
                this.originalData = t.originalData;
147
                this.transparencyActive = t.transparencyActive;
148
        }
149

    
150
        /*
151
         * (non-Javadoc)
152
         * @see org.gvsig.fmap.dal.coverage.store.props.Transparency#addPropertyListener(PropertyListener)
153
         */
154
        public void addPropertyListener(PropertyListener listener) {
155
                transparencyPropertyListener.add(listener);
156
        }
157

    
158
        /**
159
         * M?todo llamado cuando hay un cambio en una propiedad de transparencia
160
         */
161
        private void callPropertyChanged(Object obj) {
162
                for (int i = 0; i < transparencyPropertyListener.size(); i++) {
163
                        PropertyEvent ev = new PropertyEvent(this, "transparency", null, null);
164
                        ((PropertyListener)transparencyPropertyListener.get(i)).actionValueChanged(ev);
165
                }
166
        }
167

    
168
        /**
169
         * Obtiene la m?scara asociada
170
         * @return M?scara de transparencia
171
         */
172
        public Buffer getAlphaBand() {
173
                return mask;
174
        }
175

    
176
        /*
177
         * (non-Javadoc)
178
         * @see org.gvsig.fmap.dal.coverage.store.props.Transparency#setAlphaBand(org.gvsig.fmap.dal.coverage.dataset.Buffer)
179
         */
180
        public void setAlphaBand(Buffer b) {
181
                if(b == null && mask != null) {
182
                        mask = b;
183
                        callPropertyChanged(this);
184
                        return;
185
                } else {
186
                        mask = b;
187
                        if(b != null)
188
                                callPropertyChanged(this);
189
                }
190
        }
191

    
192
        /*
193
         * (non-Javadoc)
194
         * @see org.gvsig.fmap.dal.coverage.store.props.Transparency#existAlphaBand()
195
         */
196
        public boolean existAlphaBand() {
197
                return (mask != null);
198
        }
199

    
200

    
201
        /**
202
         * Obtiene el ?rea de datos
203
         * @return M?scara de transparencia
204
         */
205
        public Buffer getDataBuffer() {
206
                return originalData;
207
        }
208

    
209
        /*
210
         * (non-Javadoc)
211
         * @see org.gvsig.fmap.dal.coverage.store.props.Transparency#setDataBuffer(org.gvsig.fmap.dal.coverage.dataset.Buffer)
212
         */
213
        public void setDataBuffer(Buffer b) {
214
                originalData = b;
215
        }
216

    
217
        /**
218
         * Obtiene la informaci?n de si existe o no la posibilidad de aplicar valore no data
219
         * como transparentes. Para ello tiene que estar activo su uso y el buffer debe contener datos
220
         * @return true si puede aplicarse noData y false si no se puede
221
         */
222
        public boolean isNoDataActive() {
223
                return noDataActive;
224
        }
225

    
226
        /**
227
         * Obtiene el valor noData
228
         * @return
229
         */
230
        public NoData getNoData() {
231
                return noData;
232
        }
233

    
234
        /*
235
         * (non-Javadoc)
236
         * @see org.gvsig.fmap.dal.coverage.store.props.Transparency#setNoData(double)
237
         */
238
        public void setNoData(NoData noData) {
239
                this.noDataActive = true;
240
                if(this.noData != noData)
241
                        callPropertyChanged(this);
242
                this.noData = noData;
243
        }
244

    
245
        /*
246
         * (non-Javadoc)
247
         * @see org.gvsig.fmap.dal.coverage.store.props.Transparency#activeNoData(boolean)
248
         */
249
        public void activeNoData(boolean active) {
250
                this.noDataActive = active;
251
        }
252

    
253
        /**
254
         * Obtiene los rangos de pixels que son transparentes en el raster.
255
         * @return Rangos de transparencias a aplicar
256
         */
257
        public ArrayList<TransparencyRange> getTransparencyRange() {
258
                return transparencyRanges;
259
        }
260

    
261
        /*
262
         * (non-Javadoc)
263
         * @see org.gvsig.fmap.dal.coverage.store.props.Transparency#setTransparencyRange(org.gvsig.fmap.dal.coverage.datastruct.TransparencyRange)
264
         */
265
        public void setTransparencyRange(TransparencyRange range) {
266
                this.transparencyRanges.add(range);
267
                callPropertyChanged(this);
268
        }
269

    
270
        /**
271
         * Asigna la lista de rangos de transparencia
272
         * @param ranges
273
         */
274
        public void setTransparencyRangeList(ArrayList<TransparencyRange> ranges) {
275
                this.transparencyRanges = ranges;
276
                callPropertyChanged(this);
277
        }
278

    
279
        /*
280
         * (non-Javadoc)
281
         * @see org.gvsig.fmap.dal.coverage.store.props.Transparency#clearListOfTransparencyRange()
282
         */
283
        public void clearListOfTransparencyRange() {
284
                transparencyRanges.clear();
285
                callPropertyChanged(this);
286
        }
287

    
288
        /**
289
         * Obtiene el grado de opacidad de todo el raster
290
         * @return valor del grado de opacidad.
291
         */
292
        public int getOpacity() {
293
                return opacity;
294
        }
295

    
296
        /*
297
         * (non-Javadoc)
298
         * @see org.gvsig.fmap.dal.coverage.store.props.Transparency#setOpacity(int)
299
         */
300
        public void setOpacity(int opacity) {
301
                if(opacity != this.opacity)
302
                        callPropertyChanged(this);
303
                this.opacity = opacity;
304
        }
305

    
306
        /**
307
         * Asigna la transparencia a partir de un objeto con los metadatos del raster.
308
         * @param metadata
309
         */
310
        public void setTransparencyByPixelFromMetadata(DataStoreMetadata metadata){
311
                if (metadata != null) {
312
                        TransparencyRange[] noData = metadata.parserNodataInMetadata();
313
                        if (noData != null)
314
                                for (int i = 0; i < noData.length; i++)
315
                                        getTransparencyRange().add(noData[i]);
316
                        TransparencyRange noDataValue = metadata.parserNodataByBand();
317
                        if (noData == null && noDataValue != null)
318
                                getTransparencyRange().add(noDataValue);
319
                }
320
        }
321

    
322
        /**
323
         * Mezcla el alpha actual con el que nos pasan por parametro y se asigna
324
         * directamente a destino
325
         * @param buffer
326
         * @param dst
327
         */
328
        public void mergeBuffer(Buffer buffer, Buffer dst) {
329
                for (int y = 0; y < mask.getHeight(); y++)
330
                        for (int x = 0; x < mask.getWidth(); x++)
331
                                // ((a / 255) * (b / 255)) * 255
332
                                // Es lo mismo que:
333
                                // (a * b) / 255
334
                                dst.setElem(y, x, 0,
335
                                                (byte) (((mask.getElemByte(y, x, 0) & 0xff) * (buffer.getElemByte(y, x, 0) & 0xff)) / 255D));
336
        }
337

    
338
        /**
339
         * Mezcla un objeto Transparency con el actual
340
         * @param ts objeto TransparencyStatus
341
         */
342
        public Transparency merge(Transparency tParam) {
343
                DataStoreTransparency transp = null;
344
                if(tParam instanceof DataStoreTransparency)
345
                        transp = (DataStoreTransparency)tParam;
346
                else 
347
                        return null;
348
                
349
                DataStoreTransparency t = new DataStoreTransparency();
350
                // Mezclamos la opacidad
351
                double op1 = (double) opacity / (double) MAX_OPACITY;
352
                double op2 = (double) transp.getOpacity() / (double) MAX_OPACITY;
353
                t.setOpacity((int) (op1 * op2 * MAX_OPACITY));
354

    
355
                // Mezclamos los rangos de transparencia
356
                ArrayList<TransparencyRange> tr = transp.getTransparencyRange();
357
                for (int i = 0; i < tr.size(); i++)
358
                        transparencyRanges.add(tr.get(i));
359

    
360
                // TODO: FUNCIONALIDAD Mezclamos la m?scara
361
                if (mask != null && transp.getAlphaBand() != null) {
362
                        Buffer newMask = DefaultRasterManager.getInstance().createBuffer(Buffer.TYPE_BYTE, mask.getWidth(), mask.getHeight(), 1, true);
363
                        // Mezclamos alphaBand con el que nos pasan en transp y lo asignamos al nuevo buffer
364
                        mergeBuffer(transp.getAlphaBand(), newMask);
365

    
366
                        t.setAlphaBand(newMask);
367
                } else if (mask != null) {
368
                        t.setAlphaBand(mask);
369
                        t.alphaBandNumber = alphaBandNumber;
370
                } else {
371
                        t.setAlphaBand(transp.getAlphaBand());
372
                        t.alphaBandNumber = transp.alphaBandNumber;
373
                }
374

    
375
                // TODO: FUNCIONALIDAD Mezclamos las ?reas
376

    
377
                // TODO: FUNCIONALIDAD Mezclamos las mascaras
378
                return t;
379
        }
380

    
381
        /**
382
         * Obtiene la banda de transpareci si existe o -1 si no existe.
383
         * @return n?mero de banda de transparencia o -1 si no existe.
384
         */
385
        public int getAlphaBandNumber() {
386
                return alphaBandNumber;
387
        }
388

    
389
        /**
390
         * Asigna la informaci?n de si existe o no banda de transparencia cuando este
391
         * objeto va asociado a un dataset. Si tiene este tipo de banda en cada
392
         * dibujado se cargar? la informaci?n de m?scara de transparencia en el la
393
         * variable mask.
394
         * @param true si existe banda de transparencia y false si no lo es.
395
         */
396
        public void setTransparencyBand(int alphaBandNumber) {
397
                this.alphaBandNumber = alphaBandNumber;
398
        }
399

    
400
        /**
401
         * Consulta si el valor de la posici?n (line, col) del buffer es considerado
402
         * NoData o no.
403
         * @param line Linea del buffer
404
         * @param col Columna del buffer
405
         * @return
406
         */
407
        protected boolean isNoData(int line, int col) {
408
                if(noData == null)
409
                        return false;
410
                
411
                switch (originalData.getDataType()) {
412
                case Buffer.TYPE_BYTE:
413
                        if(noData.isDefined() && 
414
                                        originalData.getElemByte(line, col, 0) == noData.getValue().byteValue())
415
                                return true;
416
                        break;
417
                case Buffer.TYPE_SHORT:
418
                        if(noData.isDefined() && 
419
                                        originalData.getElemShort(line, col, 0) == noData.getValue().shortValue())
420
                                return true;
421
                        break;
422
                case Buffer.TYPE_INT:
423
                        if(noData.isDefined() && 
424
                                        originalData.getElemInt(line, col, 0) == noData.getValue().intValue())
425
                                return true;
426
                        break;
427
                case Buffer.TYPE_FLOAT:
428
                        if(noData.isDefined() && 
429
                                        originalData.getElemFloat(line, col, 0) == noData.getValue().floatValue())
430
                                return true;
431
                        break;
432
                case Buffer.TYPE_DOUBLE:
433
                        if(noData.isDefined() && 
434
                                        originalData.getElemDouble(line, col, 0) == noData.getValue().doubleValue())
435
                                return true;
436
                        break;
437
                }
438
                return false;
439
        }
440

    
441
        /*
442
         * (non-Javadoc)
443
         * @see org.gvsig.fmap.dal.coverage.store.props.Transparency#free()
444
         */
445
        public void free() {
446
                if (mask != null)
447
                        mask.free();
448
                if (originalData != null)
449
                        originalData.free();
450
                mask = null;
451
                originalData = null;
452
        }
453

    
454
        /*
455
         * (non-Javadoc)
456
         * @see org.gvsig.fmap.dal.coverage.store.props.Transparency#activeTransparency()
457
         */
458
        public void activeTransparency() {
459
                if(        existAlphaBand() || isNoDataActive() ||
460
                        (transparencyRanges.size() > 0) ||
461
                        (opacity != 0xff))
462
                        transparencyActive = true;
463
                else
464
                        transparencyActive = false;
465
        }
466
        
467
        /*
468
         * (non-Javadoc)
469
         * @see org.gvsig.fmap.dal.coverage.store.props.Transparency#isTransparencyActive()
470
         */
471
        public boolean isTransparencyActive() {
472
                return transparencyActive;
473
        }
474
        
475
        /**
476
         * Asigna el flag de transparencia activa o desactivada.
477
         * @param transparencyActive true activa la transparencia false la desactiva
478
         */
479
        public void setTransparencyActive(boolean transparencyActive) {
480
                this.transparencyActive = transparencyActive;
481
        }
482
        
483
        /*
484
         * (non-Javadoc)
485
         * @see org.gvsig.fmap.dal.coverage.store.props.Transparency#processRGB(int, int, int, int, int)
486
         */
487
        public int processRGB(int r, int g, int b, int line, int col) {
488
                // Si el valor es noData se pone totalmente transparente y ya no se tiene en
489
                // cuenta nada m?s.
490
                if (originalData != null && isNoDataActive()) {
491
                        if (isNoData(line, col))
492
                                // El alpha no se pone para dejarlo a 0, totalmente transparente
493
                                return (r << 16 | g << 8 | b);
494
                }
495

    
496
                /**
497
                 * Para sacar el valor del nuevo alpha, lo que hacemos es convertir a
498
                 * porcentajes todos los alphas posibles (en porcentajes) y multiplicarlos
499
                 * entre si. Con esto conseguimos un nuevo porcentaje de alpha entre 0 y 1.
500
                 * Una vez hecho esto se multiplica por 255 para tenerlo dentro del rango
501
                 * deseado. Como queremos evitar operaciones de m?s, podemos quitar una
502
                 * division de 255 y as? nos ahorramos luego multiplicarlo por 255 otra vez.
503
                 */
504

    
505
                // Quitada la division para optimizar
506
                //double a = opacity / 255D;
507
                double a = opacity;
508

    
509
                int alphaRange = processRange(r, g, b);
510
                if (alphaRange != 255)
511
                        a *= (alphaRange / 255D);
512

    
513
                if (existAlphaBand() && getAlphaBand() != null)
514
                        a *= (getAlphaBand().getElemByte(line, col, 0) & 0xff) / 255D;
515

    
516
                // Quitada la multiplicacion para optimizar
517
                // a = (int)(a * 255D);
518

    
519
                return ((int) a << 24) | r << 16 | g << 8 | b;
520
        }
521
        
522
        /**
523
         * Aplica la transparecia por rangos al pixel pasado por par?metro. El valor
524
         * en la posici?n cero es el alpha por lo tanto ser? esta posici?n la que se
525
         * modificar?.
526
         * @param r
527
         * @param g
528
         * @param b
529
         * @return Un valor de 0 a 255. Donde 255 es totalmente opaco
530
         */
531
        private int processRange(int r, int g, int b) {
532
                for (int i = 0; i < transparencyRanges.size(); i++) {
533
                        TransparencyRange tr = ((TransparencyRange) transparencyRanges.get(i));
534
                        if (tr == null) continue;
535
                        if (tr.isAnd()) {
536
                                if (tr.getRed() == null ||
537
                                                tr.getGreen() == null ||
538
                                                tr.getBlue() == null ||
539
                                                r < tr.getRed()[0]   || r > tr.getRed()[1] ||
540
                                                g < tr.getGreen()[0] || g > tr.getGreen()[1] ||
541
                                                b < tr.getBlue()[0]  || b > tr.getBlue()[1])
542
                                        continue;
543

    
544
                                return tr.getAlpha();
545
                        } else {
546
                                if (tr.getRed() != null) {
547
                                        if (r >= tr.getRed()[0] && r <= tr.getRed()[1]) {
548
                                                return tr.getAlpha();
549
                                        }
550
                                }
551
                                if (tr.getGreen() != null) {
552
                                        if (g >= tr.getGreen()[0] && g <= tr.getGreen()[1]) {
553
                                                return tr.getAlpha();
554
                                        }
555
                                }
556
                                if (tr.getBlue() != null) {
557
                                        if (b >= tr.getBlue()[0] && b <= tr.getBlue()[1]) {
558
                                                return tr.getAlpha();
559
                                        }
560
                                }
561
                        }
562
                }
563
                return 255;
564
        }
565
        
566
        /*
567
         * (non-Javadoc)
568
         * @see org.gvsig.fmap.dal.coverage.store.props.Transparency#cloneTransparency()
569
         */
570
        @SuppressWarnings("unchecked")
571
        public Transparency cloneTransparency() {
572
                DataStoreTransparency t = new DataStoreTransparency();
573
                
574
                //TODO: FUNCIONALIDAD: Falta asignar lo necesario para la transparencia por selecci?n
575
                t.transparencyRanges = (ArrayList<TransparencyRange>) getTransparencyRange().clone();
576
                t.mask = getAlphaBand();
577
                t.opacity = getOpacity();
578
                t.alphaBandNumber = alphaBandNumber;
579
                t.noData = getNoData();
580
                t.noDataActive = isNoDataActive();
581
                t.originalData = originalData;
582
                t.transparencyActive = t.transparencyActive;
583
                t.activeTransparency();
584
                return t;
585
        }
586
        
587
        /*
588
         * (non-Javadoc)
589
         * @see org.gvsig.tools.persistence.Persistent#loadFromState(org.gvsig.tools.persistence.PersistentState)
590
         */
591
        @SuppressWarnings("unchecked")
592
        public void loadFromState(PersistentState state)
593
        throws PersistenceException {                
594
                if (state.hasValue("opacity")) {
595
                        opacity = state.getInt("opacity");
596
                }
597
                
598
                List tr = state.getList("transparencyRange");
599
                if(tr != null) {
600
                        transparencyRanges = new ArrayList<TransparencyRange>(tr);        
601
                        if (state.hasValue("bandnumber")) {
602
                                alphaBandNumber = state.getInt("bandnumber");
603
                        }
604
                }
605

    
606
                this.transparencyActive = state.getBoolean("transparencyActive");
607
                this.noDataActive = state.getBoolean("noDataActive");
608
                //this.noData = state.getDouble("noData");
609
        }
610

    
611
        /*
612
         * (non-Javadoc)
613
         * @see org.gvsig.tools.persistence.Persistent#saveToState(org.gvsig.tools.persistence.PersistentState)
614
         */
615
        public void saveToState(PersistentState state) throws PersistenceException {
616
                if(getOpacity() != 255) {
617
                        state.set("opacity", getOpacity());
618
                }        
619

    
620
                //Rangos de transparencia                
621
                state.set("transparencyRange", transparencyRanges);
622

    
623
                if(getAlphaBandNumber() != -1) {
624
                        state.set("bandnumber", getAlphaBandNumber());
625
                }
626
                
627
                state.set("transparencyActive", transparencyActive);
628
                state.set("noDataActive", noDataActive);
629
                //state.set("noData", noData);
630
        }
631
        
632
        public static void registerPersistence() {
633
                PersistenceManager manager = ToolsLocator.getPersistenceManager();
634
                DynStruct definition = manager.addDefinition(
635
                                DataStoreTransparency.class,
636
                                PERSISTENCE_NAME,
637
                                "Transparency Persistent definition (FIXME)",
638
                                null, 
639
                                null
640
                );
641
                definition.addDynFieldInt("opacity").setMandatory(false);
642
                definition.addDynFieldInt("bandnumber").setMandatory(false);
643
                definition.addDynFieldList("transparencyRange").setClassOfItems(TransparencyRange.class).setMandatory(false);
644
                definition.addDynFieldBoolean("transparencyActive").setMandatory(false);
645
                definition.addDynFieldBoolean("noDataActive").setMandatory(false);
646
                //definition.addDynFieldDouble("noData").setMandatory(false);
647
        }
648
        
649
}