Statistics
| Revision:

svn-gvsig-desktop / branches / CqCMSDvp / libraries / libCq CMS for java.old / src / org / cresques / io / raster / RasterFilterStackManager.java @ 2167

History | View | Annotate | Download (20.6 KB)

1
/*
2
 * Created on 17-may-2005
3
 *
4
 * To change the template for this generated file go to
5
 * Window>Preferences>Java>Code Generation>Code and Comments
6
 */
7
/* gvSIG. Sistema de Informaci?n Geogr?fica de la Generalitat Valenciana
8
 *
9
 * Copyright (C) 2004 IVER T.I. and Generalitat Valenciana.
10
 *
11
 * This program is free software; you can redistribute it and/or
12
 * modify it under the terms of the GNU General Public License
13
 * as published by the Free Software Foundation; either version 2
14
 * of the License, or (at your option) any later version.
15
 *
16
 * This program is distributed in the hope that it will be useful,
17
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
18
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
19
 * GNU General Public License for more details.
20
 *
21
 * You should have received a copy of the GNU General Public License
22
 * along with this program; if not, write to the Free Software
23
 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307,USA.
24
 *
25
 * For more information, contact:
26
 *
27
 *  Generalitat Valenciana
28
 *   Conselleria d'Infraestructures i Transport
29
 *   Av. Blasco Ib??ez, 50
30
 *   46010 VALENCIA
31
 *   SPAIN
32
 *
33
 *      +34 963862235
34
 *   gvsig@gva.es
35
 *      www.gvsig.gva.es
36
 *
37
 *    or
38
 *
39
 *   IVER T.I. S.A
40
 *   Salamanca 50
41
 *   46005 Valencia
42
 *   Spain
43
 *
44
 *   +34 963163400
45
 *   dac@iver.es
46
 */
47
package org.cresques.io.raster;
48

    
49
import java.lang.reflect.Constructor;
50
import java.util.ArrayList;
51
import java.util.Hashtable;
52
import java.util.StringTokenizer;
53
import java.util.regex.Matcher;
54
import java.util.regex.Pattern;
55
 
56
/**
57
 * 
58
 * @author Nacho Brodin <brodin_ign@gva.es>
59
 * 
60
 * Esta clase es de la parte cliente y es la encargada de la gesti?n 
61
 * de la pila de filtros. Es la que conoce el orden en que se deben apilar
62
 * estos para que la ejecuci?n sea correcta. Un cliente que desee aplicar un 
63
 * filtro deber? introducirlo en la pila usando para ello esta clase.
64
 */
65
public class RasterFilterStackManager{
66
        
67
        protected RasterFilterStack        filterStack = null;
68
        private boolean                                debug = false;
69
        
70
        protected Hashtable                 typeFilters = new Hashtable();
71
        public        int[]                                order = null;
72
        
73
        public RasterFilterStackManager(RasterFilterStack filterStack){
74
                this.filterStack = filterStack;
75
                typeFilters.put("transparency", new Integer(0));
76
                typeFilters.put("enhanced", new Integer(1));
77
                typeFilters.put("computeminmax", new Integer(2));
78
                typeFilters.put("tail", new Integer(3));
79
                init();
80
                this.filterStack.setOrder(order);
81
        }
82
        
83
        protected void init(){
84
                order = new int[typeFilters.size()];
85
                order[0] = ((Integer)typeFilters.get("computeminmax")).intValue();
86
                order[1] = ((Integer)typeFilters.get("tail")).intValue();
87
                order[2] = ((Integer)typeFilters.get("enhanced")).intValue();
88
                order[3] = ((Integer)typeFilters.get("transparency")).intValue();
89
        }
90
                
91
        /**
92
         * A?ade un nuevo tipo de filtro 
93
         * @param key        Nombre del filtro
94
         * @param type        Constante entera asignada a ese tipo
95
         */
96
        protected void addTypeFilter(String key, int type, int position){
97
                typeFilters.put(key, new Integer(type));
98
                int[] newOrder = new int[order.length+1];
99
                for(int i=0;i<position;i++)
100
                        newOrder[i] = order[i];
101
                newOrder[position] = type;
102
                for(int i=position+1;i<newOrder.length;i++)
103
                        newOrder[i] = order[i-1];
104
                order = newOrder;
105
                this.filterStack.setOrder(order);
106
        }
107
        
108
        /**
109
         * Obtiene la constante correspondiente a un tipo de filtro
110
         * @param key        Clave para obtener la constante que corresponde al nombre del filtro
111
         * @return        Tipo de filtro
112
         */
113
        public int getTypeFilter(String key){
114
                return ((Integer)typeFilters.get(key)).intValue();
115
        }
116
        
117
        /**
118
         * A?ade un filtro de transparencia
119
         * @param red        Intervalos de la banda del rojo a poner transparentes
120
         * @param green        Intervalos de la banda del verde a poner transparentes
121
         * @param blue        Intervalos de la banda del azul a poner transparentes
122
         * @param alpha        Transparencia
123
         * @param transparencyRed        Color en la banda del rojo de la transparencia
124
         * @param transparencyGreen        Color en la banda del verde de la transparencia
125
         * @param transparencyBlue        Color en la banda del azul de la transparencia
126
         */
127
        public void addTransparencyFilter(        int[][] red,
128
                                                                                int[][] green,
129
                                                                                int[][] blue,
130
                                                                                int alpha,
131
                                                                                int transparencyRed,
132
                                                                                int transparencyGreen,
133
                                                                                int transparencyBlue){
134
                RasterFilter filtro = null;
135
                switch(filterStack.getDataTypeInFilter(((Integer)typeFilters.get("transparency")).intValue())){
136
                        case RasterBuf.TYPE_IMAGE:filtro = new TransparencyImageFilter();break;
137
                        case RasterBuf.TYPE_SHORT:
138
                        case RasterBuf.TYPE_USHORT:
139
                        case RasterBuf.TYPE_INT:filtro = new TransparencyShortFilter();break;
140
                }
141
                if(red != null)filtro.addParam("red", red);
142
                if(green != null)filtro.addParam("green", green);
143
                if(blue != null)filtro.addParam("blue", blue);
144
                filtro.addParam("alpha", new Integer(alpha));
145
                filtro.addParam("transparencyRed", new Integer(transparencyRed));
146
                filtro.addParam("transparencyGreen",  new Integer(transparencyGreen));
147
                filtro.addParam("transparencyBlue",  new Integer(transparencyBlue));
148
                
149
                //Elimina los filtros que son equivalentes a este
150
                
151
                /*for(int i=0;i<filterStack.lenght();i++){
152
                        if( filterStack.get(i) instanceof TransparencyImageFilter ||
153
                                filterStack.get(i) instanceof TransparencyShortFilter){
154
                                 
155
                                //Si este filtro es equivalente a uno de la pila se elimina este
156
                                if(((TransparencyFilter)filtro).isEquivalent((TransparencyFilter)filterStack.get(i)))
157
                                        filterStack.removeFilter(filterStack.get(i));        
158
                                
159
                        }        
160
                }
161
                
162
                //A?ade el filtro si no hay uno equivalente 
163
                
164
                boolean equivalentFilter = false;
165
                for(int i=0;i<filterStack.lenght();i++){
166
                        if( filterStack.get(i) instanceof TransparencyImageFilter ||
167
                                filterStack.get(i) instanceof TransparencyShortFilter){
168
                                
169
                                //Si no existe en la pila un filtro equivalente se a?ade
170
                                if(((TransparencyFilter)filterStack.get(i)).isEquivalent((TransparencyFilter)filtro)){
171
                                        equivalentFilter = true;
172
                                        break;
173
                                }
174
                        }        
175
                }
176
                if(!equivalentFilter)*/
177
                filterStack.removeFilter(((Integer)typeFilters.get("transparency")).intValue());
178
                filterStack.addFilter(((Integer)typeFilters.get("transparency")).intValue(), filtro);
179
                this.controlTypes();
180
        }
181
        
182
        /**
183
         * Obtiene el rango de rojo del filtro de transparencia de la pila
184
         * @return rango de rojo
185
         */
186
        public int[][] getTransparecyR(){
187
                for(int i=0;i<filterStack.lenght();i++){
188
                        if( filterStack.get(i) instanceof TransparencyImageFilter ||
189
                                filterStack.get(i) instanceof TransparencyShortFilter){
190
                                return ((TransparencyFilter)filterStack.get(i)).rangesR;
191
                        }        
192
                }
193
                return null;
194
        }
195
        
196
        /**
197
         * Obtiene el rango de verde del filtro de transparencia de la pila
198
         * @return rango de verde
199
         */
200
        public int[][] getTransparecyG(){
201
                for(int i=0;i<filterStack.lenght();i++){
202
                        if( filterStack.get(i) instanceof TransparencyImageFilter ||
203
                                filterStack.get(i) instanceof TransparencyShortFilter){
204
                                return ((TransparencyFilter)filterStack.get(i)).rangesG;
205
                        }        
206
                }
207
                return null;
208
        }
209
        
210
        /**
211
         * Obtiene el rango de azul del filtro de transparencia de la pila
212
         * @return rango de azul
213
         */
214
        public int[][] getTransparecyB(){
215
                for(int i=0;i<filterStack.lenght();i++){
216
                        if( filterStack.get(i) instanceof TransparencyImageFilter ||
217
                                filterStack.get(i) instanceof TransparencyShortFilter){
218
                                return ((TransparencyFilter)filterStack.get(i)).rangesB;
219
                        }        
220
                }
221
                return null;
222
        }
223
        
224
        /**
225
         * A?ade un filtro de recorte de colas.
226
         * @param tail        porcentaje de recorte
227
         * @param samples        porcentaje de muestras tomadas del total de la imagen
228
         */
229
        public void addTailFilter( double tail, double samples, boolean removeMaxValue){
230
                if(filterStack.isActive(((Integer)typeFilters.get("tail")).intValue()))
231
                        filterStack.removeFilter(((Integer)typeFilters.get("tail")).intValue());
232
                
233
                RasterFilter filtro = null;
234
                switch(filterStack.getDataTypeInFilter(((Integer)typeFilters.get("tail")).intValue())){
235
                        case RasterBuf.TYPE_IMAGE:filtro = new PercentTailTrimImageFilter();break;
236
                        case RasterBuf.TYPE_SHORT:
237
                        case RasterBuf.TYPE_USHORT:
238
                        case RasterBuf.TYPE_INT:filtro = new PercentTailTrimShortFilter();break;
239
                }
240
                filtro.addParam("stats", filterStack.getStats());
241
                filtro.addParam("tail", new Double(tail));
242
                filtro.addParam("samples", new Double(samples));
243
                filtro.addParam("remove", new Boolean(removeMaxValue));
244
                
245
                filterStack.addFilter(((Integer)typeFilters.get("tail")).intValue(), filtro);
246
                this.controlTypes();
247
        }
248
        
249
        /**
250
         * A?ade un filtro de realce. Esta versi?n tiene el par?metro para a?adirle el nombre
251
         * del fichero. Esto se usa para que si a un fichero se le ha calculado ya el recorte de colas
252
         * no se vuelva a calcular, evitando as? que si hacemos un draw a una imagen por bloques cada
253
         * bloque tenga un calculo distinto para el recorte.
254
         */
255
        public void addEnhancedFilter(boolean remove, String fileName){
256
                if(filterStack.isActive(((Integer)typeFilters.get("enhanced")).intValue()))
257
                        filterStack.removeFilter(((Integer)typeFilters.get("enhanced")).intValue());
258
                                
259
                RasterFilter filtro = null;
260
                switch(filterStack.getDataTypeInFilter(((Integer)typeFilters.get("enhanced")).intValue())){
261
                        case RasterBuf.TYPE_IMAGE:filtro = new LinearEnhancementImageFilter();break;
262
                        case RasterBuf.TYPE_SHORT:
263
                        case RasterBuf.TYPE_USHORT:
264
                        case RasterBuf.TYPE_INT:filtro = new LinearEnhancementShortFilter();break;
265
                }
266
                filtro.addParam("stats", filterStack.getStats());
267
                if(remove)
268
                        filtro.addParam("remove", new Boolean(true));
269
                else
270
                        filtro.addParam("remove", new Boolean(false));
271
                if(fileName != null)
272
                        filtro.addParam("filename", fileName);
273
                else
274
                        filtro.addParam("filename", new String(""));
275
                filterStack.addFilter(((Integer)typeFilters.get("enhanced")).intValue(), filtro);
276
                this.controlTypes();
277
        }
278
        
279
        /**
280
         * A?ade un filtro de realce
281
         */
282
        public void addEnhancedFilter(boolean remove){
283
                addEnhancedFilter( remove, "");
284
        }
285
        
286
        /**
287
         * A?ade un filtro ComputeMinMax
288
         */
289
        public void addComputeMinMaxFilter(){
290
                if(!filterStack.isActive(((Integer)typeFilters.get("computeminmax")).intValue())){  //Solo lo a?adimos si no est?
291
                        RasterFilter filtro = null;
292
                        switch(filterStack.getDataTypeInFilter(((Integer)typeFilters.get("computeminmax")).intValue())){
293
                                case RasterBuf.TYPE_IMAGE:filtro = new ComputeMinMaxImageFilter();break;
294
                                case RasterBuf.TYPE_SHORT:
295
                                case RasterBuf.TYPE_USHORT:
296
                                case RasterBuf.TYPE_INT:filtro = new ComputeMinMaxShortFilter();break;
297
                        }
298
                        filtro.addParam("stats", filterStack.getStats());
299
                        filterStack.addFilter(((Integer)typeFilters.get("computeminmax")).intValue(), filtro);
300
                }
301
                this.controlTypes();
302
        }
303

    
304
        /**
305
         * Obtiene el tipo de filtro a partir del objeto RasterFilter
306
         * @param rasterFilter        Objeto RasterFilter del cual se quiere saber que tipo de filtro contiene
307
         * @return        Tipo de filtro seg?n las constantes contenidas en RasterFilterStackManager
308
         */
309
        protected int getType(RasterFilter rasterFilter){
310
                if(rasterFilter instanceof TransparencyFilter)
311
                        return 0;
312
                if(rasterFilter instanceof LinearEnhancementFilter)
313
                        return 1;
314
                if(rasterFilter instanceof ComputeMinMaxFilter)
315
                        return 2;
316
                if(rasterFilter instanceof PercentTailTrimFilter)
317
                        return 3;
318
                return -1;
319
        }
320
        
321
        /**
322
         * Controla que los tipos de los filtros de la pila sean correctos, es decir, que
323
         * el tipo de salida de un filtro de salida coincida con el tipo de la entrada del
324
         * siguiente. En caso de no ser as? crea el filtro de tipo adecuado y lo sustituye
325
         * en el no coincidente. Esto es necesario ya que en la eliminaci?n de filtros puede
326
         * quedarse en inconsistencia de tipos.
327
         */
328
        protected void controlTypes(){
329
                if(debug)filterStack.show();
330
                for(int i=filterStack.lenght();i>=0;i--){
331
                        if(i-1 >= 0){
332
                                
333
                                //Para el primer filtro comprobamos con el tipo de dato de entrada a la pila
334
                                if(i == filterStack.lenght()){
335
                                        if(filterStack.getInitDataType() != filterStack.get(i-1).getInRasterDataType()){
336
                                                String oldClass = filterStack.get(i-1).getClass().toString().substring(
337
                                                                filterStack.get(i-1).getClass().toString().lastIndexOf(".")+1, 
338
                                                                filterStack.get(i-1).getClass().toString().length());
339
                                                Pattern p = Pattern.compile(RasterBuf.typesToString(filterStack.get(i-1).getInRasterDataType()));
340
                                                Matcher m = p.matcher(oldClass);
341
                                                String newClass = m.replaceAll(RasterBuf.typesToString(filterStack.getInitDataType()));
342
                                                //System.out.println("==>"+oldClass+" "+newClass);
343
                                                try{
344
                                                        Class filterClass = Class.forName("org.cresques.io.raster."+newClass);
345
                                                        Constructor con =  filterClass.getConstructor(null);
346
                                                        RasterFilter newFilter = (RasterFilter)con.newInstance(null);
347
                                                        newFilter.params = filterStack.get(i-1).params;
348
                                                        filterStack.replace(newFilter, i-1, this.getType(newFilter));
349
                                                } catch (Exception e) {
350
                                                        e.printStackTrace();
351
                                                } 
352
                                        }
353
                                
354
                                //Desde el filtro 2 en adelante se compara la salida de uno con la entrada del siguiente
355
                                        
356
                                }else if(filterStack.get(i).getOutRasterDataType() != filterStack.get(i-1).getInRasterDataType()){
357
                                        String oldClass = filterStack.get(i-1).getClass().toString().substring(
358
                                                                                        filterStack.get(i-1).getClass().toString().lastIndexOf(".")+1, 
359
                                                                                        filterStack.get(i-1).getClass().toString().length());
360
                                        Pattern p = Pattern.compile(RasterBuf.typesToString(filterStack.get(i-1).getInRasterDataType()));
361
                                        Matcher m = p.matcher(oldClass);
362
                                        String newClass = m.replaceAll(RasterBuf.typesToString(filterStack.get(i).getOutRasterDataType()));
363
                                        //System.out.println("==>"+oldClass+" "+newClass);
364
                                        try{
365
                                                Class filterClass = Class.forName("org.cresques.io.raster."+newClass);
366
                                                Constructor con =  filterClass.getConstructor(null);
367
                                                RasterFilter newFilter = (RasterFilter)con.newInstance(null);
368
                                                newFilter.params = filterStack.get(i-1).params;
369
                                                filterStack.replace(newFilter, i-1, this.getType(newFilter));
370
                                        } catch (Exception e) {
371
                                                e.printStackTrace();
372
                                        } 
373
                                }
374
                                
375
                                
376
                        }
377
                                        
378
                }
379
                if(debug)filterStack.show();
380
        }
381
        
382
        /**
383
         * M?todo que devuelve true si el tipo de filtro pasado por par?metro est? en la
384
         * pila y false si no lo est?.
385
         * @param filter        Tipo de filtro a comprobar
386
         * @return true si est? en la pila y false si no lo est?
387
         */
388
        public boolean isActive(int type){
389
                return filterStack.isActive(type);
390
        }
391
        
392
        /**
393
         * Elimina los filtros de la pila de un determinado tipo
394
         * @param type        Tipo de filtro a eliminar
395
         */
396
        public void removeFilter(int type){
397
                filterStack.removeFilter(type);
398
                this.controlTypes();
399
        }
400
        
401
        /**
402
         * Resetea el flag de temporalidad de los filtros de la pila. 
403
         * Esto equivale a fijar los filtros que ya existen en la pila. A partir de
404
         * ese momento los filtros que se introduzcan podr?n ser eliminados de golpe
405
         * llamando a la funci?n deleteTempFilters 
406
         */
407
        public void resetTempFilters(){
408
                filterStack.resetTempFilters();
409
        }
410
        
411
        /**
412
         * Elimina los filtros temporales, es decir, todos los filtros introducidos desde
413
         * el ?ltimo resetTempFilters que se ha realizado.
414
         */
415
        public void deleteTempFilters(){
416
                filterStack.deleteTempFilters();
417
        }
418
        
419
        /**
420
         * Obtiene el objeto de estadisticas asignado a la pila.
421
         * @return
422
         */
423
        public RasterStats getStackStats(){
424
                return filterStack.getStats();
425
        }
426
        
427
        /**
428
         * Convierte cada filtro o elemento de un filtro de la pila en un String de la forma
429
         * elemento=valor
430
         * @return ArrayList donde cada elemento es una cadena 
431
         */
432
        public ArrayList getStringsFromStack(){
433
                ArrayList lista = new ArrayList();
434
                for(int i=0;i<filterStack.lenght();i++){
435
                        RasterFilter rf = filterStack.get(i);
436
                        if(rf instanceof TransparencyFilter){
437
                                lista.add("filter.transparency.active=true");
438
                                lista.add("filter.transparency.rangeR="+rangeToString(((TransparencyFilter)rf).getRangeR()));
439
                                lista.add("filter.transparency.rangeG="+rangeToString(((TransparencyFilter)rf).getRangeG()));
440
                                lista.add("filter.transparency.rangeB="+rangeToString(((TransparencyFilter)rf).getRangeB()));
441
                                
442
                        }else if(rf instanceof LinearEnhancementFilter){
443
                                lista.add("filter.enhanced.active=true");
444
                                lista.add("filter.enhanced.remove="+((LinearEnhancementFilter)rf).getRemoveExtrema().toString());
445
                                                                
446
                        }else if(rf instanceof ComputeMinMaxFilter){
447
                                lista.add("filter.computeminmax.active=true");
448
                                                                                                
449
                        }else if(rf instanceof PercentTailTrimFilter){
450
                                lista.add("filter.tail.active=true");
451
                                lista.add("filter.tail.value="+this.getStackStats().tailPercent);
452
                                lista.add("filter.tail.remove="+((PercentTailTrimFilter)rf).removeMaxValue());
453
                        }
454
                }
455
                                
456
                return lista;
457
        }
458
        
459
        /**
460
         * Crea una pila de filtros a partir de un Array de Strings. Cada elemento del array debe
461
         * tener la forma elemento=valor. 
462
         * @param filters 
463
         */
464
        public void createStackFromStrings(ArrayList f){
465
                ArrayList filters = (ArrayList)f.clone();
466
                filterStack.clear();
467
                int filteri = 0;
468
                
469
                //Busca un filtro activo y despu?s todas las propiedades que necesita ese filtro para
470
                //ser creado. Una vez las tiene a?ade en la pila el tipo de filtro.
471
                
472
                while(filters.size()>0 && filteri<filters.size()){
473
                        String fil = (String)filters.get(filteri);
474
                        if(fil.startsWith("filter.transparency.active") && getValue(fil).equals("true")){
475
                                filters.remove(filteri);
476
                                int[][] r = null, g = null, b = null;
477
                                for(int propFilter=0;propFilter<filters.size();propFilter++){
478
                                        String elem = (String)filters.get(propFilter);
479
                                        if(elem.startsWith("filter.transparency.rangeR")){
480
                                                r = stringToRange(getValue(elem));
481
                                                filters.remove(propFilter);
482
                                                propFilter--;
483
                                        }
484
                                        if(elem.startsWith("filter.transparency.rangeG")){
485
                                                g = stringToRange(getValue(elem));
486
                                                filters.remove(propFilter);
487
                                                propFilter--;
488
                                        }
489
                                        if(elem.startsWith("filter.transparency.rangeB")){
490
                                                b = stringToRange(getValue(elem));
491
                                                filters.remove(propFilter);
492
                                                propFilter--;
493
                                        }
494
                                }
495
                                this.addTransparencyFilter(        r, g, b, 0x10, 0xff, 0xff, 0xff);
496
                                filteri = -1;
497
                        }
498
                        
499
                        if(fil.startsWith("filter.enhanced.active") && getValue(fil).equals("true")){
500
                                filters.remove(filteri);
501
                                boolean remove = false;
502
                                for(int propFilter=0;propFilter<filters.size();propFilter++){
503
                                        String elem = (String)filters.get(propFilter);
504
                                        if(elem.startsWith("filter.enhanced.remove")){
505
                                                this.addEnhancedFilter(Boolean.valueOf(getValue(elem)).booleanValue());
506
                                                filters.remove(propFilter);
507
                                                propFilter--;
508
                                        }
509
                                }
510
                                
511
                                this.addComputeMinMaxFilter();
512
                                filteri = -1;
513
                        }
514
                        
515
                        if(fil.startsWith("filter.tail.active") && getValue(fil).equals("true")){
516
                                filters.remove(filteri);
517
                                this.removeFilter(this.getTypeFilter("computeminmax"));
518
                                double recorte = 0D;
519
                                boolean remove = false;
520
                                for(int propFilter=0;propFilter<filters.size();propFilter++){
521
                                        String elem = (String)filters.get(propFilter);
522
                                        if(elem.startsWith("filter.tail.value")){
523
                                                recorte = Double.parseDouble(getValue(elem));
524
                                                filters.remove(propFilter);
525
                                                propFilter--;
526
                                        }
527
                                        if(elem.startsWith("filter.tail.remove")){
528
                                                remove = Boolean.valueOf(getValue(elem)).booleanValue();
529
                                                filters.remove(propFilter);
530
                                                propFilter--;
531
                                        }
532
                                }
533
                                this.addTailFilter( recorte, 0D, remove);
534
                                filteri = -1;
535
                        }
536
                        
537
                        filteri++;
538
                }
539
        }
540
        
541
        /**
542
         * Obtiene el elemento de una cadena de la forma elemento=valor
543
         * @param cadena 
544
         * @return
545
         */
546
        public String getElem(String cadena){
547
                if(cadena!=null)
548
                        return cadena.substring(0, cadena.indexOf("="));
549
                else 
550
                        return null;
551
        }
552
        
553
        /**
554
         * Obtiene el valor de una cadena de la forma elemento=valor
555
         * @param cadena 
556
         * @return
557
         */
558
        public String getValue(String cadena){
559
                if(cadena!=null)
560
                        return cadena.substring(cadena.indexOf("=")+1, cadena.length());
561
                else 
562
                        return null;
563
        }
564
        
565
        /**
566
         * Convierte un rango contenido en una array doble en una cadena
567
         * de strings para poder salvar a xml
568
         * @param rang
569
         * @return
570
         */
571
        private String rangeToString(int[][] rang){
572
                StringBuffer rangoStr = new StringBuffer();
573
                if(rang!=null){
574
                        for(int i=0;i<rang.length;i++){
575
                                rangoStr.append(String.valueOf(rang[i][0])+":");
576
                                rangoStr.append(String.valueOf(rang[i][1])+":");
577
                        }
578
                        String r = rangoStr.toString();
579
                        if(r.endsWith(":"))
580
                                r = r.substring(0, r.length()-1);
581
                        return r;
582
                }else
583
                        return null;
584
                
585
        }
586
        
587
        /**
588
         * Convierte una cadena en una lista de rangos numericos para poder 
589
         * asignar transparencias a la imagen
590
         * @param rang
591
         * @return
592
         */
593
        private int[][] stringToRange(String rang){
594
                if(rang!=null && !rang.equals("null")){
595
                        ArrayList lista = new ArrayList();
596
                        StringTokenizer tokenizer = new StringTokenizer(rang, ":");
597
                        while (tokenizer.hasMoreTokens())
598
                                lista.add(tokenizer.nextToken());
599
                        int[][] intervalos = new int[(int)(lista.size()/2)][2];
600

    
601
                        for(int i=0;i<lista.size();i=i+2){
602
                                intervalos[i/2][0] = Integer.valueOf((String)lista.get(i)).intValue();
603
                                intervalos[i/2][1] = Integer.valueOf((String)lista.get(i+1)).intValue();
604
                        }
605
                        return intervalos;
606
                }else 
607
                        return null;
608
        }
609
        
610
        
611
}