Statistics
| Revision:

root / trunk / libraries / libRaster / src / org / gvsig / raster / dataset / io / ErmapperWriter.java @ 12333

History | View | Annotate | Download (21.1 KB)

1
/* gvSIG. Sistema de Informaci?n Geogr?fica de la Generalitat Valenciana
2
 *
3
 * Copyright (C) 2007 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.dataset.io;
20

    
21
import java.io.IOException;
22

    
23
import org.cresques.io.GeoRasterFile;
24
import org.gvsig.raster.dataset.GeoRasterWriter;
25
import org.gvsig.raster.dataset.IBuffer;
26
import org.gvsig.raster.dataset.IDataWriter;
27
import org.gvsig.raster.dataset.Params;
28
import org.gvsig.raster.dataset.Params.Param;
29
import org.gvsig.raster.dataset.io.features.WriteFileFormatFeatures;
30
import org.gvsig.raster.shared.Extent;
31
import org.gvsig.raster.util.RasterUtilities;
32
import org.gvsig.raster.util.extensionPoints.ExtensionPoints;
33
import org.gvsig.raster.util.extensionPoints.ExtensionPointsSingleton;
34

    
35
import es.gva.cit.jecwcompress.EcwException;
36
import es.gva.cit.jecwcompress.JniObject;
37
import es.gva.cit.jecwcompress.NCSEcwCompressClient;
38
import es.gva.cit.jecwcompress.ReadCallBack;
39
import es.gva.cit.jgdal.GdalRasterBand;
40

    
41

    
42
/**
43
 * Driver para la compresi?n en formato Ecw.
44
 *
45
 * Puede exportar un fichero desde un GeoRasterFile en cualquier formato soportado
46
 * por los drivers de lectura a uno en formato Ecw.
47
 *
48
 * Puede salvar a disco en formato Ecw obteniendo los datos que van siendo servidos
49
 * desde el cliente. Este cliente debe implementar un IDataWriter o tener un objeto
50
 * que lo implemente. Inicialmente le pasar? los par?metros de la imagen de salida
51
 * y cuando el driver comience a escribir le ir? solicitando m?s a trav?s del m?todo
52
 * readData de IDataWriter. El cliente ser? el que lleve el control de lo que va
53
 * sirviendo y lo que le queda por servir.
54
 * @author Nacho Brodin (brodin_ign@gva.es)
55
 */
56
public class ErmapperWriter extends GeoRasterWriter {
57

    
58
        public static void register() {
59
                                ExtensionPoints extensionPoints = ExtensionPointsSingleton.getInstance();
60
                                WriteFileFormatFeatures features = null;
61

    
62
                        String os = System.getProperties().getProperty("os.version");
63
                                if (os.startsWith("2.4")){
64
                                        extensionPoints.add("RasterWriter", "ecw", ErmapperWriter.class);
65
                                        features = new WriteFileFormatFeatures("Ecw", "ecw", -1, null, ErmapperWriter.class);
66
                                fileFeature.put("ecw", features);
67
                                }
68
                                extensionPoints.add("RasterWriter", "jp2", ErmapperWriter.class);
69
                                features = new WriteFileFormatFeatures("Jpeg2000", "jp2", -1, null, ErmapperWriter.class);
70
                fileFeature.put("jp2", features);
71
                }
72

    
73
                public final int                                 windowSizeX = 386;
74
                public final int                                 windowSizeY = 220;
75
                public final int                                 panelSizeX = 358;
76
                public final int                                 panelSizeY = 125;
77
                public final String                         panelLayout = "BorderLayout";
78
                private NCSEcwCompressClient         compressclient = null;
79
                private Reader                                         readerObj;
80
                private double                                         pixelSizeX;
81
                private double                                         pixelSizeY;
82
                private double                                         geoCoordOrigenX;
83
                private double                                         geoCoordOrigenY;
84
                private boolean                                 consulta = false;
85

    
86
                /**
87
                 * Carga los par?metros de este driver.
88
                 */
89
                public void loadParams() {
90
                        WriteFileFormatFeatures wfff = new WriteFileFormatFeatures();
91
                        wfff.loadParams();
92
                        driverParams = wfff.getParams();
93

    
94
                        driverParams.setParam(        "compression",
95
                                                                "10",
96
                                                                Params.SLIDER,
97
                                                                new String[]{ "0", "20", "10", "1", "5" }); //min, max, valor defecto, intervalo peque?o, intervalo grande;
98

    
99
                        driverParams.setParam(        "format",
100
                                                                "RGB",
101
                                                                Params.CHOICE,
102
                                                                new String[]{ "NONE", "UINT8", "YUV", "MULTI", "RGB"});
103
                }
104

    
105
                /**
106
                 * Constructor para la obtenci?n de par?metros del driver.
107
                 */
108
                public ErmapperWriter(String fileName) {
109
                        ident = RasterUtilities.getExtensionFromFileName(fileName);
110
                        driver = ((WriteFileFormatFeatures)fileFeature.get(ident)).getDriverName();
111

    
112
                        loadParams();
113

    
114
                                consulta = true;
115
                }
116

    
117
                /**
118
                 * Constructor para la lectura de datos desde el objeto cliente a partir
119
                 * de un viewport dado.
120
                 * @param dataWriter        Objeto que sirve datos para el escritor
121
                 * @param vp        viewport de origen
122
                 * @param outFileName        Fichero de salida
123
                 * @param blockSize        Tama?o de bloque
124
                 * @param nBands        N?mero de bandas
125
                 * @param compresion        Compresi?n
126
                 * @throws EcwException
127
                 * @throws IOException
128
                 */
129
                public ErmapperWriter(        IDataWriter dataWriter,
130
                                                                                                 String outFileName,
131
                                                                                                 Integer nBands,
132
                                                                                                 Extent ex,
133
                                                                                                 Integer outSizeX,
134
                                                                                                 Integer outSizeY,
135
                                                                                                 Integer dataType,
136
                                                                         Params params) throws EcwException, IOException {
137
                        ident = RasterUtilities.getExtensionFromFileName(outFileName);
138
                        driver = ((WriteFileFormatFeatures)fileFeature.get(ident)).getDriverName();
139
                                this.dataType = dataType.intValue();
140

    
141
                                if (nBands.intValue() <= 0)
142
                                                throw new EcwException("N?mero de bandas erroneo.");
143

    
144
                                if ((ex.width() <= 0) || (ex.height() <= 0)) {
145
                                                throw new EcwException("Tama?o de la imagen de salida erroneo.");
146
                                }
147

    
148
                                this.outFileName = outFileName;
149
                                this.dataWriter = dataWriter;
150

    
151
                                this.nBands = nBands.intValue();
152

    
153
                                this.sizeWindowX = outSizeX.intValue();
154
                                this.sizeWindowY = outSizeY.intValue();
155

    
156
                                //Calculamos la georeferenciaci?n a partir del extend pasado por el cliente.
157
                                double maxX = ex.maxX();
158
                                geoCoordOrigenX = ex.minX();
159
                                geoCoordOrigenY = ex.maxY();
160

    
161
                                double minY = ex.minY();
162
                                pixelSizeX = (maxX - geoCoordOrigenX) / outSizeX.intValue();
163
                                pixelSizeY = (minY - geoCoordOrigenY) / outSizeY.intValue();
164

    
165
                                if (pixelSizeX == 0)
166
                                                pixelSizeX = 1.0;
167

    
168
                                if (pixelSizeY == 0)
169
                                                pixelSizeY = 1.0;
170

    
171
                                if(params == null)
172
                                        loadParams();
173
                                else
174
                                        driverParams = params;
175

    
176
                                init();
177
                }
178

    
179
                /**
180
                 * Inicializaci?n de los par?metros del compresor que ser?n obtenidos
181
                 * de PxRaster.
182
                 * @throws EcwException
183
                 */
184
                private void init() throws EcwException {
185
                        percent = 0;
186
                        int comp = new Integer((String) ((Param)driverParams.getParamById("compression")).defaultValue).intValue();
187
                        String format = (String) ((Param)driverParams.getParamById("format")).defaultValue;
188
                                if ( comp == 0 )
189
                                        driverParams.changeParamValue("compression", "1");
190

    
191
                                if (compressclient == null)
192
                                                compressclient = new NCSEcwCompressClient();
193

    
194
                                compressclient.setOutputFilename(outFileName);
195
                                compressclient.setInputFilename(inFileName);
196
                                compressclient.setTargetCompress(comp);
197
                                compressclient.setInOutSizeX(sizeWindowX);
198
                                compressclient.setInOutSizeY(sizeWindowY);
199
                                compressclient.setInputBands(nBands);
200
                                compressclient.setCompressFormat(convertFormatToInt(format));
201

    
202
                         /* boolean georef = new Boolean(((Param)driverParams.getParamById("georef")).defaultValue).booleanValue();
203
                                if (georef) {*/
204
                                compressclient.setCellIncrementX(pixelSizeX);
205
                                compressclient.setCellIncrementY(pixelSizeY);
206
                                compressclient.setOriginX(geoCoordOrigenX);
207
                                compressclient.setOriginY(geoCoordOrigenY);
208
                                //}
209

    
210
                                compressclient.setCellSizeUnits(1);
211

    
212
                                int blocksize = new Integer((String) ((Param)driverParams.getParamById("blocksize")).defaultValue).intValue();
213
                                if (dataWriter != null) {
214
                                                readerObj = new Reader(dataWriter, compressclient, sizeWindowX,
215
                                                                                                                                         sizeWindowY, blocksize, nBands, this, dataType);
216
                                }
217
                }
218

    
219
                /**
220
                 * Convierte la cadena que representa el formato en un valor n?merico
221
                 * que entiende el driver.
222
                 * @param format Cadena que representa el formato
223
                 * @return Entero que representa a la cadena
224
                 */
225
                private int convertFormatToInt(String format) {
226
                        if(format.compareTo("NONE") == 0)
227
                                return 0;
228
                        if(format.compareTo("UINT8") == 0)
229
                                return 1;
230
                                if(format.compareTo("YUV") == 0)
231
                                        return 2;
232
                                if(format.compareTo("MULTI") == 0)
233
                                        return 3;
234
                                if(format.compareTo("RGB") == 0)
235
                                        return 4;
236
                        return -1;
237
                }
238
                /**
239
                 * A partir de un elemento que contiene una propiedad y un valor
240
                 * lo parsea y asigna el valor a su variable.
241
                 * @param propValue        elemento con la forma propiedad=valor
242
                 */
243
                private void readProperty(String propValue) {
244
                                String prop = propValue.substring(0, propValue.indexOf("="));
245

    
246
                                if (propValue.startsWith(prop)) {
247
                                                String value = propValue.substring(propValue.indexOf("=") + 1, propValue.length());
248

    
249
                                                if ((value != null) && !value.equals("")) {
250
                                                                if (prop.equals("BLOCKSIZE"))
251
                                                                                driverParams.changeParamValue("blocksize", value);
252
                                                                if (prop.equals("FORMAT"))
253
                                                                        driverParams.changeParamValue("format", value);
254
                                                                if (prop.equals("COMPRESSION"))
255
                                                                        driverParams.changeParamValue("compression", value);
256
                                                }
257
                                }
258
                }
259

    
260
                /**
261
                 * Asigna propiedades al driver a partir de un vector de
262
                 * strings donde cada elemento tiene la estructura de
263
                 * propiedad=valor.
264
                 * @param props        Propiedades
265
                 */
266
                public void setProps(String[] props) {
267
                                for (int iProps = 0; iProps < props.length; iProps++)
268
                                                readProperty(props[iProps]);
269

    
270
                                loadParams();
271

    
272
                                try {
273
                                                if (!consulta) {
274
                                                                init();
275
                                                }
276
                                } catch (EcwException e) {
277
                                                e.printStackTrace();
278
                                }
279
                }
280

    
281
                /**
282
                 * Realiza la funci?n de compresi?n a partir de un GeoRasterFile.
283
                 * @throws IOException
284
                 */
285
                public void fileWrite() throws IOException {
286
                         /* try {
287
                                                compressclient.NCSEcwCompressOpen(false);
288
                                                compressclient.NCSEcwCompress(readerObj);
289
                                } catch (EcwException e) {
290
                                                e.printStackTrace();
291
                                }*/
292
                        //TODO: FUNCIONALIDAD: Compresi?n a partir de un dataset. De momento no es necesario y es posible que nunca lo sea.
293
                }
294

    
295
                /**
296
                 * Realiza la funci?n de compresi?n a partir de los datos pasados por el cliente.
297
                 * @throws IOException
298
                 */
299
                public void dataWrite() throws IOException {
300
                                if (dataWriter == null) {
301
                                                throw new IOException("No se ha obtenido un objeto para la lectura valido.");
302
                                }
303

    
304
                                try {
305
                                                compressclient.NCSEcwCompressOpen(false);
306
                                                compressclient.NCSEcwCompress(readerObj);
307
                                } catch (EcwException e) {
308
                                                e.printStackTrace();
309
                                }
310
                }
311

    
312
                /**
313
                 * Cierra el compresor ecw.
314
                 */
315
                public void writeClose() {
316
                                try {
317
                                                compressclient.NCSEcwCompressClose();
318
                                } catch (EcwException e) {
319
                                                e.printStackTrace();
320
                                }
321
                }
322

    
323
                /**
324
                 * Cancela el compresor ecw.
325
                 */
326
                public void writeCancel() {
327
                                try {
328
                                        if(readerObj != null)
329
                                                readerObj.setWrite(false);
330
                                                compressclient.NCSEcwCompressCancel();
331
                                } catch (EcwException e) {
332
                                                e.printStackTrace();
333
                                }
334
                }
335

    
336
}
337

    
338

    
339
/**
340
 * Clase que se encarga de la lectura de datos que ser?n escritos. Hereda de JniObject
341
 * para asegurar  para asegurar que el interfaz de la libreria tiene acceso a variables
342
 * necesarias para la petici?n de datos cuando vacia el buffer. Implementa ReadCallBack
343
 * para obligar escribir el m?todo loadBuffer encargado de servir los datos cuando el
344
 * buffer se vacia.
345
 *
346
 */
347
class Reader extends JniObject implements ReadCallBack {
348
                private NCSEcwCompressClient        compressclient = null;
349
                private int                                         width;
350
                private int                                         height;
351
                private int                                         ulX;
352
                private int                                         ulY;
353
                private GeoRasterFile                         grf = null;
354
                private IDataWriter                         dataWriter = null;
355
                private GdalRasterBand                         rband = null;
356
                private GeoRasterWriter                        writer = null;
357
                private int                                         blockSizeRead = 1; //Alto del bloque leido de la imagen origen
358
                private int                                         countLine = 1; //Contador de l?neas procesadas en cada lectura de bloque
359
                byte[][]                                                 buf = null;
360
                byte[]                                                         bufband1 = null;
361
                byte[]                                                         bufband2 = null;
362
                byte[]                                                         bufband3 = null;
363
                byte[]                                                         bufband4 = null;
364
                byte[]                                                         bufband5 = null;
365
                byte[]                                                         bufband6 = null;
366
                int[]                                                         dataBuffer = null;
367
                byte[][]                                                 byteBuffer = null;
368
                private int                                         lineasBloqueFinal = 0; //N?mero de l?neas leidas del bloque final
369
                private int                                         nBlocks = 0; //N?mero de bloques completos
370
                private int                                         countBlock = 1; //Contador de bloques completos procesados
371
                private int                                         nBands = 0;
372
                private        boolean                                        write = true; //Cuando est? a true se puede escribir en la imagen de salida. Si est? a false el proceso es interrumpido
373
                private int                                                dataType = IBuffer.TYPE_BYTE;
374

    
375
                /**
376
                 * Constructor para la escritura de un fichero desde un GeoRasterFile
377
                 * @param grf        GeorasterFile del fichero de origen
378
                 * @param compressclient        Objeto que representa al compresor ecw
379
                 * @param ulx        Coordenada X de la esquina superior izquierda
380
                 * @param uly        Coordenada Y de la esquina superior izquierda
381
                 * @param width        Ancho de la imagen
382
                 * @param height        Alto de la imagen
383
                 * @param blockSizeRead        Altura del bloque en la lectura
384
                 */
385
                public Reader(GeoRasterFile grf, NCSEcwCompressClient compressclient,
386
                                                                        int ulx, int uly, int width, int height, int blockSizeRead, int dataType) {
387
                                this.compressclient = compressclient;
388
                                this.width = width;
389
                                this.height = height;
390
                                this.ulX = ulx;
391
                                this.ulY = uly;
392
                                this.grf = grf;
393
                                this.nBands = grf.getBandCount();
394
                                this.dataType = dataType;
395

    
396
                                if (blockSizeRead != 0) {
397
                                                this.blockSizeRead = blockSizeRead;
398
                                }
399

    
400
                                nBlocks = (int) (height / this.blockSizeRead);
401
                                lineasBloqueFinal = height - (nBlocks * this.blockSizeRead);
402

    
403
                }
404

    
405
                /**
406
                 * Constructor para que los datos sean servidos desde el cliente a trav?s de un
407
                 * IDataWriter.
408
                 * @param dataWriter        Objeto servidor de datos del driver
409
                 * @param compressclient        Objeto que representa al compresor ecw
410
                 * @param width        Ancho de la imagen
411
                 * @param height        Alto de la imagen
412
                 * @param blockSizeRead        Altura del bloque en la lectura
413
                 * @param nBands        N?mero de bandas
414
                 */
415
                public Reader(IDataWriter dataWriter, NCSEcwCompressClient compressclient,
416
                                                                        int width, int height, int blockSizeRead, int nBands,
417
                                                                        GeoRasterWriter writer, int dataType) {
418
                                this.compressclient = compressclient;
419
                                this.width = width;
420
                                this.height = height;
421
                                this.dataWriter = dataWriter;
422
                                this.nBands = nBands;
423
                                this.writer = writer;
424
                                this.dataType = dataType;
425

    
426
                                if (blockSizeRead != 0) {
427
                                                this.blockSizeRead = blockSizeRead;
428
                                }
429

    
430
                                nBlocks = (int) (height / this.blockSizeRead);
431
                                lineasBloqueFinal = height - (nBlocks * this.blockSizeRead);
432
                }
433

    
434
                /**
435
                 * Lectura de bandas desde un GeoRasterFile
436
                 * @param ulX        Coordenada X de la esquina superior izquierda
437
                 * @param ulY        Coordenada Y de la esquina superior izquierda
438
                 * @param width        Ancho de la imagen
439
                 * @param lineasLeidas        N?mero de l?neas a leer del origen
440
                 */
441
                private void readBandsGRFile(int ulX, int ulY, int width, int lineasLeidas) {
442
                                if (nBands >= 1)
443
                                                bufband1 = grf.getWindow(ulX, ulY, width, lineasLeidas, 1);
444

    
445
                                if (nBands >= 2)
446
                                                bufband2 = grf.getWindow(ulX, ulY, width, lineasLeidas, 2);
447

    
448
                                if (nBands >= 3)
449
                                                bufband3 = grf.getWindow(ulX, ulY, width, lineasLeidas, 3);
450

    
451
                                if (nBands >= 4)
452
                                                bufband4 = grf.getWindow(ulX, ulY, width, lineasLeidas, 4);
453

    
454
                                if (nBands >= 5)
455
                                                bufband5 = grf.getWindow(ulX, ulY, width, lineasLeidas, 5);
456

    
457
                                if (nBands >= 6)
458
                                                bufband6 = grf.getWindow(ulX, ulY, width, lineasLeidas, 6);
459
                }
460

    
461
                /**
462
                 * Lectura de bandas llamando al objeto cliente para que nos cargue el buffer
463
                 * @param width        Ancho de la imagen
464
                 * @param height        Alto de la imagen
465
                 */
466
                private void readBands(int width, int height) {
467
                        if(dataType == IBuffer.TYPE_IMAGE)
468
                                dataBuffer = dataWriter.readARGBData(width, height, 0);
469
                        if(dataType == IBuffer.TYPE_BYTE) {
470
                                byte[][] b = dataWriter.readByteData(width, height);
471

    
472
                        }
473
                }
474

    
475
                /**
476
                 * M?todo obligado por el interfaz y que es llamado desde C cuando el
477
                 * compresor necesita que le sirvan m?s datos.
478
                 */
479
                public void loadBuffer() {
480
                                int lineasLeidas = 0;
481

    
482
                                //si se leen bloques completos lineasLeidas es == al tama?o de bloque sino
483
                                //es que es el ?ltimo con lo que ser? del tama?o del bloque final
484
                                if (countBlock <= nBlocks)
485
                                                lineasLeidas = blockSizeRead;
486
                                else
487
                                                lineasLeidas = lineasBloqueFinal;
488

    
489
                                //Leemos un bloque nuevo cuando se han procesado todas las l?neas del anterior
490
                                if ((nNextLine % blockSizeRead) == 0) {
491
                                                if (grf != null)
492
                                                                readBandsGRFile(ulX, ulY + nNextLine, width, lineasLeidas);
493
                                                else if (dataWriter != null) {
494
                                                        if(dataType == IBuffer.TYPE_IMAGE)
495
                                                                dataBuffer = dataWriter.readARGBData(width, lineasLeidas, 0);
496
                                                        if(dataType == IBuffer.TYPE_BYTE)
497
                                                                byteBuffer = dataWriter.readByteData(width, lineasLeidas);
498
                                                }
499

    
500
                                                countLine = 0;
501
                                                countBlock++;
502
                                }
503

    
504
                                if(dataType == IBuffer.TYPE_IMAGE)
505
                                loadBufferFromImageDataType(dataBuffer);
506
                        if(dataType == IBuffer.TYPE_BYTE)
507
                                loadBufferFromByteDataType(byteBuffer);
508

    
509
                         /* for (int iBand = 0; iBand < this.nBands; iBand++) {
510
                                                for (int pos = 0; pos < width; pos++) {
511
                                                                if (grf != null && write) {
512
                                                                                if (iBand == 0)
513
                                                                                                compressclient.buffer[pos + (width * iBand)] =
514
                                                                                                        bufband1[pos + (width * countLine)];
515

516
                                                                                if (iBand == 1)
517
                                                                                                compressclient.buffer[pos + (width * iBand)] =
518
                                                                                                        bufband2[pos + (width * countLine)];
519

520
                                                                                if (iBand == 2)
521
                                                                                                compressclient.buffer[pos + (width * iBand)] =
522
                                                                                                        bufband3[pos + (width * countLine)];
523

524
                                                                                if (iBand == 3)
525
                                                                                                compressclient.buffer[pos + (width * iBand)] =
526
                                                                                                        bufband4[pos + (width * countLine)];
527

528
                                                                                if (iBand == 4)
529
                                                                                                compressclient.buffer[pos + (width * iBand)] =
530
                                                                                                        bufband5[pos + (width * countLine)];
531

532
                                                                                if (iBand == 5)
533
                                                                                                compressclient.buffer[pos + (width * iBand)] =
534
                                                                                                        bufband6[pos + (width * countLine)];
535

536
                                                                } else {
537
                                                                                if (iBand == 0)
538
                                                                                                compressclient.buffer[pos + (width * iBand)] =
539
                                                                                                        (byte) ((dataBuffer[pos + (width * countLine)] & 0xff0000) >> 16);
540

541

542
                                                                                if (iBand == 1)
543
                                                                                                compressclient.buffer[pos + (width * iBand)] =
544
                                                                                                        (byte) ((dataBuffer[pos + (width * countLine)] & 0xff00) >> 8);
545

546

547
                                                                                if (iBand == 2)
548
                                                                                                compressclient.buffer[pos + (width * iBand)] =
549
                                                                                                        (byte) (dataBuffer[pos + (width * countLine)] & 0xff);
550

551
                                                                }
552

553
                                                                if ((pos == (width - 1)) && (iBand == (this.nBands - 1))) {
554
                                                                                countLine++;
555
                                                                }
556
                                                }
557
                                }*/
558
                }
559

    
560
                /**
561
                 * Carga el buffer de datos desde elementos de tipo entero con contenido ARGB
562
                 * @param data Array de datos enteros
563
                 */
564
                private void loadBufferFromImageDataType(int[] data) {
565
                                for (int iBand = 0; iBand < this.nBands; iBand++) {
566
                                                for (int pos = 0; pos < width; pos++) {
567
                                                        switch(iBand) {
568
                                                        case 0:
569
                                                                compressclient.buffer[pos + (width * iBand)] =
570
                                                                        (byte) ((data[pos + (width * countLine)] & 0xff0000) >> 16);
571
                                                                break;
572
                                                        case 1:
573
                                                                compressclient.buffer[pos + (width * iBand)] =
574
                                                                        (byte) ((data[pos + (width * countLine)] & 0xff00) >> 8);
575
                                                                break;
576
                                                        case 2:
577
                                                                compressclient.buffer[pos + (width * iBand)] =
578
                                                                        (byte) (data[pos + (width * countLine)] & 0xff);
579
                                                                break;
580
                                                        }
581
                                                        if ((pos == (width - 1)) && (iBand == (this.nBands - 1)))
582
                                                                countLine++;
583
                                                }
584
                                }
585
                }
586

    
587
                /**
588
                 * Carga el buffer de datos a comprimir desde un buffer byte[][] donde la primera dimensi?n
589
                 * es el n?mero de bandas y la segunda los elementos en lista (Ancho X Alto)
590
                 * @param b Buffer de datos de tipo byte[][]
591
                 */
592
                private void loadBufferFromByteDataType(byte[][] b) {
593
                                for (int iBand = 0; iBand < this.nBands; iBand++) {
594
                                                for (int pos = 0; pos < width; pos++) {
595
                                                        compressclient.buffer[pos + (width * iBand)] = b[iBand][pos + (width * countLine)];
596
                                                        if ((pos == (width - 1)) && (iBand == (this.nBands - 1)))
597
                                                                countLine++;
598
                                                }
599
                                }
600
                }
601

    
602
                /**
603
                 * M?todo obligado por el interfaz y que es llamado desde C cuando el
604
                 * compresor actualiza el porcentaje de compresi?n
605
                 */
606
                public void updatePercent() {
607
                        writer.setPercent(compressclient.getPercent());
608
                                //System.out.println(compressclient.getPercent() + "%");
609
                }
610

    
611
                /**
612
                 * Obtiene el valor a la variable write que estar? a true cuando se est? escribiendo
613
                 *  o puede escribirse la imagen de salida. El cancelar la operaci?n de escritura
614
                 * pondr? esta variable a false deteniendose la escritura y cerrandose el dataset
615
                 * de salida.
616
                 * @return True si puede escribirse y false si no puede
617
                 */
618
                public boolean isWrite() {
619
                return write;
620
        }
621

    
622
                /**
623
                 * Asigna el valor a la variable write que estar? a true cuando se est? escribiendo
624
                 *  o puede escribirse la imagen de salida. El cancelar la operaci?n de escritura
625
                 * pondr? esta variable a false deteniendose la escritura y cerrandose el dataset
626
                 * de salida.
627
                 * @param write Variable booleana. True si puede escribirse y false si no puede
628
                 */
629
        public void setWrite(boolean write) {
630
                this.write = write;
631
        }
632

    
633
}