Statistics
| Revision:

gvsig-raster / org.gvsig.raster.ermapper / trunk / org.gvsig.raster.ermapper / org.gvsig.raster.ermapper.jni / src / main / native / jecw / ncsecwcompressclient_wrapper.c @ 2449

History | View | Annotate | Download (15.5 KB)

1
/**********************************************************************
2
 * $Id: ncsecwcompressclient_wrapper.c 4274 2006-03-06 07:32:00Z nacho $
3
 *
4
 * Name:     bsb_interfaz.c
5
 * Project:  JGDAL. Interface java to gdal (Frank Warmerdam).
6
 * Purpose:  Interface functions to manage bsb files. This include gdal
7
 *                         code but it doesn't use the gdal API.
8
 * Author:   Nacho Brodin, brodin_ign@gva.es
9
 *
10
 **********************************************************************/
11
/* gvSIG. Sistema de Informaci?n Geogr?fica de la Generalitat Valenciana
12
*
13
* Copyright (C) 2004 IVER T.I. and Generalitat Valenciana.
14
*
15
* This program is free software; you can redistribute it and/or
16
* modify it under the terms of the GNU General Public License
17
* as published by the Free Software Foundation; either version 2
18
* of the License, or (at your option) any later version.
19
*
20
* This program is distributed in the hope that it will be useful,
21
* but WITHOUT ANY WARRANTY; without even the implied warranty of
22
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
23
* GNU General Public License for more details.
24
*
25
* You should have received a copy of the GNU General Public License
26
* along with this program; if not, write to the Free Software
27
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307,USA.
28
*
29
* For more information, contact:
30
*
31
*  Generalitat Valenciana
32
*   Conselleria d'Infraestructures i Transport
33
*   Av. Blasco Ib??ez, 50
34
*   46010 VALENCIA
35
*   SPAIN
36
*
37
*      +34 963862235
38
*   gvsig@gva.es
39
*      www.gvsig.gva.es
40
*
41
*    or
42
*
43
*   IVER T.I. S.A
44
*   Salamanca 50
45
*   46005 Valencia
46
*   Spain
47
*
48
*   +34 963163400
49
*   dac@iver.es
50
*/
51

    
52
#include <jni.h>
53
#include <string.h>
54
#include <malloc.h>
55
#include "NCSECWCompressClient.h"
56

    
57
typedef struct ReadInfo {
58
        //NCSFileView         *pNCSFileView;
59
        UINT8                         **ppInputBandBufferArray;
60
        UINT32                         nPercentComplete;
61
        jclass                        clase;
62
        jobject                        *jclient;
63
        jobject                        *jreadcall;
64
        JNIEnv                         *env;
65
        char                         pErrorBuffer[1024];
66
} ReadInfo;
67

    
68
static BOOLEAN         callBackOn = TRUE;
69

    
70
/******************************************************************************/
71
//                                                                ReadCallback
72
/******************************************************************************/
73

    
74

    
75
static BOOLEAN ReadCallback(NCSEcwCompressClient *pClient,
76
                                                        UINT32 nNextLine,
77
                                                        IEEE4 **ppOutputBandBufferArray)
78
{
79
        ReadInfo *pReadInfo = (ReadInfo *)pClient->pClientData;
80
        UINT32 nBand;
81
        jfieldID fid;
82
        jbyteArray jarray;
83
        JNIEnv *env=pReadInfo->env;
84
        int longitud;
85
        jclass clase_client;
86
        jclass clase_readcall;
87
        jmethodID metodo;
88

    
89
    if(callBackOn){
90
                clase_client = (*env)->GetObjectClass(env, *(pReadInfo->jclient));
91
                clase_readcall = (*env)->GetObjectClass(env, *(pReadInfo->jreadcall));
92
                
93
                //Ponemos el valor de la banda un n?mero de l?nea en el objeto cliente                
94
        
95
                  fid = (*env)->GetFieldID(env, clase_readcall, "nNextLine", "I");
96
                  (*env)->SetIntField(env, *(pReadInfo->jreadcall), fid, nNextLine); 
97
                           
98
                   //Ejecutamos la funci?n de java que carga el buffer
99
                        
100
                metodo = (*env)->GetMethodID(env, clase_readcall, "loadBuffer", "()V");
101
                (*env)->CallVoidMethod(env, *(pReadInfo->jreadcall), metodo);
102
                
103
                //Obtenemos el array de bytes desde java
104
                
105
                fid = (*env)->GetFieldID(env, clase_client, "buffer", "[B");
106
            jarray =(jbyteArray)(*env)->GetObjectField(env, *(pReadInfo->jclient), fid);  
107
            longitud = (*env)->GetArrayLength(env, jarray);
108
            
109
            (*env)->GetByteArrayRegion(env,jarray,0,longitud,(jbyte *)pReadInfo->ppInputBandBufferArray[0]);
110
                
111
                for(nBand = 0; nBand < pClient->nInputBands; nBand++) {
112
                        UINT32 nCell;                
113
                        UINT8 *pInputValue = pReadInfo->ppInputBandBufferArray[nBand];
114
                        IEEE4 *pOutputValue = ppOutputBandBufferArray[nBand];
115
                    
116
                        // Compression needs input to be IEEE4
117
                        for (nCell = 0; nCell < pClient->nInOutSizeX; nCell++) {
118
                                *pOutputValue++ = (IEEE4)*pInputValue++;
119
                        }
120
                
121
                }
122

    
123
                return(TRUE);        
124
    }else {
125
        callBackOn = TRUE;
126
            return(FALSE);
127
    }
128
}
129

    
130
/******************************************************************************/
131
//                                                                StatusCallback
132
/******************************************************************************/
133
//Asigna el tanto por cien de imagen que lleva comprimido en una variable de java
134
//Ejecuta la funci?n updatePercent de java despues de actualizar la varible.
135

    
136
static void StatusCallback(NCSEcwCompressClient *pClient,
137
                                                   UINT32 nCurrentLine)
138
{
139
        ReadInfo         *pReadInfo = (ReadInfo *)pClient->pClientData;
140
        UINT32                 nPercentComplete = (nCurrentLine * 100) / (pClient->nInOutSizeY - 1);
141
        jclass                 clase_client;
142
        jclass                 clase_readcall;
143
        JNIEnv                 *env=pReadInfo->env;
144
        jfieldID         fid;
145
        jmethodID         metodo;
146
        
147
        clase_client = (*env)->GetObjectClass(env, *(pReadInfo->jclient));
148
        clase_readcall = (*env)->GetObjectClass(env, *(pReadInfo->jreadcall));
149
        
150
        if (nPercentComplete != pReadInfo->nPercentComplete) {
151
                fid = (*env)->GetFieldID(env, clase_client, "porcentaje", "I");
152
                  (*env)->SetIntField(env, *(pReadInfo->jclient), fid, nPercentComplete);
153
                  metodo = (*env)->GetMethodID(env, clase_readcall, "updatePercent", "()V");
154
                (*env)->CallVoidMethod(env, *(pReadInfo->jreadcall), metodo); 
155
                pReadInfo->nPercentComplete = nPercentComplete;
156
        }
157
}
158

    
159
/******************************************************************************/
160
//                                                                NCSEcwCompressClient
161
/******************************************************************************/
162

    
163
JNIEXPORT jlong JNICALL Java_es_gva_cit_jecwcompress_NCSEcwCompressClient_NCSEcwCompressClientNat
164
  (JNIEnv *env, jobject obj){
165
          
166
          NCSEcwCompressClient         *pClient;
167
          jlong                                         jresult = 0 ;
168
          
169
          if(pClient = NCSEcwCompressAllocClient()){
170
                  *(NCSEcwCompressClient **)&jresult = pClient;
171
                  return jresult;
172
          }else
173
                  return -1;
174
          
175
  }
176

    
177
/******************************************************************************/
178
//                                                                NCSEcwCompressOpen
179
/******************************************************************************/
180

    
181
JNIEXPORT jint JNICALL Java_es_gva_cit_jecwcompress_NCSEcwCompressClient_NCSEcwCompressOpenNat
182
  (JNIEnv *env, jobject obj, jlong cPtr, jboolean bCalculateSizesOnly){
183
          
184
          NCSEcwCompressClient         *pClient = (NCSEcwCompressClient *) 0 ;
185
          NCSError                                 eError;
186
          jfieldID                                 fid;
187
    jobject                                        obj_str;
188
    const char                                *str;
189
    ReadInfo                                 *compress_readInfo;
190
    jmethodID                                 metodo;
191

    
192
    UINT8 *pReadBuffer,nBand;
193
    
194
          pClient = *(NCSEcwCompressClient **)&cPtr;
195
          if(pClient!=NULL){
196
                  //Asignamos los valores de los campos de NCSEcwCompress
197
                  
198
                  jclass clase = (*env)->GetObjectClass(env, obj);
199
                                    
200
                  fid = (*env)->GetFieldID(env, clase, "inputFilename", "Ljava/lang/String;");
201
                  obj_str = (*env)->GetObjectField(env, obj, fid);
202
                  if(obj_str!=NULL){
203
                        str = (*env)->GetStringUTFChars(env,obj_str,0);
204
                          strcpy(pClient->szInputFilename,str);
205
                          str=NULL;
206
                          (*env)->ReleaseStringUTFChars(env, obj_str, str);
207
                          //printf("inputFilename=%s\n",pClient->szInputFilename);
208
                  }
209
                  
210
                  fid = (*env)->GetFieldID(env, clase, "outputFilename", "Ljava/lang/String;");
211
                  obj_str = (*env)->GetObjectField(env, obj, fid);
212
                  if(obj_str!=NULL){
213
                        str = (*env)->GetStringUTFChars(env,obj_str,0);
214
                          strcpy(pClient->szOutputFilename,str);
215
                          str=NULL;
216
                          (*env)->ReleaseStringUTFChars(env, obj_str, str);
217
                          //printf("outputFilename=%s\n",pClient->szOutputFilename);
218
                  }
219
                                    
220
                  fid = (*env)->GetFieldID(env, clase, "targetCompression", "D");
221
                  pClient->fTargetCompression = (IEEE4)(*env)->GetDoubleField(env, obj, fid);
222
                  //printf("targetCompression=%f\n",pClient->fTargetCompression);
223
                  
224
                  fid = (*env)->GetFieldID(env, clase, "eCompressFormat", "I");
225
                  pClient->eCompressFormat = (*env)->GetIntField(env, obj, fid);
226
                  //printf("eCompressFormat=%d\n",pClient->eCompressFormat);
227
                                    
228
                  fid = (*env)->GetFieldID(env, clase, "eCompressHint", "I");
229
                  pClient->eCompressHint = (*env)->GetIntField(env, obj, fid);
230
                  //printf("eCompressHint=%d\n",pClient->eCompressHint);
231
                  
232
                  fid = (*env)->GetFieldID(env, clase, "nBlockSizeX", "I");
233
                  pClient->nBlockSizeX = (*env)->GetIntField(env, obj, fid);
234
                  //printf("nBlockSizeX=%d\n",pClient->nBlockSizeX);
235
                  
236
                  fid = (*env)->GetFieldID(env, clase, "nBlockSizeY", "I");
237
                  pClient->nBlockSizeY = (*env)->GetIntField(env, obj, fid);
238
                  //printf("nBlockSizeY=%d\n",pClient->nBlockSizeY);
239
                  
240
                  fid = (*env)->GetFieldID(env, clase, "nInOutSizeX", "I");
241
                  pClient->nInOutSizeX = (*env)->GetIntField(env, obj, fid);
242
                  //printf("nInOutSizeX=%d\n",pClient->nInOutSizeX);
243
                  
244
                  fid = (*env)->GetFieldID(env, clase, "nInOutSizeY", "I");
245
                  pClient->nInOutSizeY = (*env)->GetIntField(env, obj, fid);
246
                  //printf("nInOutSizeY=%d\n",pClient->nInOutSizeY);
247
                  
248
                  fid = (*env)->GetFieldID(env, clase, "nInputBands", "I");
249
                  pClient->nInputBands = (*env)->GetIntField(env, obj, fid);
250
                  //printf("nInputBands=%d\n",pClient->nInputBands);
251
                  
252
                  fid = (*env)->GetFieldID(env, clase, "nOutputBands", "I");
253
                  pClient->nOutputBands = (*env)->GetIntField(env, obj, fid);
254
                //printf("nOutputBands=%d\n",pClient->nOutputBands);
255
                
256
                  fid = (*env)->GetFieldID(env, clase, "nInputSize", "J");
257
                  pClient->nInputSize = (*env)->GetLongField(env, obj, fid);
258
                  //printf("nInputSize=%ld\n",pClient->nInputSize);
259
                  
260
                  fid = (*env)->GetFieldID(env, clase, "fCellIncrementX", "D");
261
                  pClient->fCellIncrementX = (*env)->GetDoubleField(env, obj, fid);
262
                  //printf("fCellIncrementX=%f\n",pClient->fCellIncrementX);
263
                  
264
                  fid = (*env)->GetFieldID(env, clase, "fCellIncrementY", "D");
265
                  pClient->fCellIncrementY = (*env)->GetDoubleField(env, obj, fid);
266
                  //printf("fCellIncrementY=%f\n",pClient->fCellIncrementY);
267
                  
268
                  fid = (*env)->GetFieldID(env, clase, "fOriginX", "D");
269
                  pClient->fOriginX = (*env)->GetDoubleField(env, obj, fid);
270
                  //printf("fOriginX=%f\n",pClient->fOriginX);
271
                  
272
                  fid = (*env)->GetFieldID(env, clase, "fOriginY", "D");
273
                  pClient->fOriginY = (*env)->GetDoubleField(env, obj, fid);
274
                  //printf("fOriginY=%f\n",pClient->fOriginY);
275
                  
276
                  fid = (*env)->GetFieldID(env, clase, "eCellSizeUnits", "I");
277
                  pClient->fActualCompression = (IEEE4)(*env)->GetIntField(env, obj, fid);
278
                  //printf("eCellSizeUnits=%d\n",pClient->fActualCompression);
279
                  
280
                  fid = (*env)->GetFieldID(env, clase, "szDatum", "Ljava/lang/String;");
281
                  obj_str = (*env)->GetObjectField(env, obj, fid);
282
                  if(obj_str!=NULL){
283
                        str = (*env)->GetStringUTFChars(env,obj_str,0);
284
                          strcpy(pClient->szDatum,str);
285
                          str=NULL;
286
                          (*env)->ReleaseStringUTFChars(env, obj_str, str);
287
                          //printf("szDatum=%s\n",pClient->szDatum);
288
                  }
289
                  
290
                  fid = (*env)->GetFieldID(env, clase, "szProjection", "Ljava/lang/String;");
291
                  obj_str = (*env)->GetObjectField(env, obj, fid);
292
                  if(obj_str!=NULL){
293
                        str = (*env)->GetStringUTFChars(env,obj_str,0);
294
                          strcpy(pClient->szProjection,str);
295
                          str=NULL;
296
                          (*env)->ReleaseStringUTFChars(env, obj_str, str);
297
                          //printf("szProjection=%s\n",pClient->szProjection);
298
                  }
299
                  
300
                  fid = (*env)->GetFieldID(env, clase, "fActualCompression", "D");
301
                  pClient->fActualCompression = (IEEE4)(*env)->GetDoubleField(env, obj, fid);
302
                  //printf("fActualCompression=%f\n",pClient->fActualCompression);
303
                  
304
                  fid = (*env)->GetFieldID(env, clase, "fCompressionSeconds", "D");
305
                  pClient->fCompressionSeconds = (*env)->GetDoubleField(env, obj, fid);
306
                  //printf("fCompressionSeconds=%f\n",pClient->fCompressionSeconds);
307
                  
308
                  fid = (*env)->GetFieldID(env, clase, "fCompressionMBSec", "D");
309
                  pClient->fCompressionMBSec = (*env)->GetDoubleField(env, obj, fid);
310
                  //printf("fCompressionMBSec=%f\n",pClient->fCompressionMBSec);
311
                  
312
                  fid = (*env)->GetFieldID(env, clase, "nOutputSize", "J");
313
                  pClient->nOutputSize = (*env)->GetLongField(env, obj, fid);
314
                  //printf("nOutputSize=%ld\n",pClient->nOutputSize);
315
                  
316
                  pClient->pReadCallback = ReadCallback;
317
                pClient->pStatusCallback = StatusCallback;
318
                                
319
                //Inicializar el buffer que tendr? una l?nea de entrada x el n?m de bandas
320
                
321
                metodo = (*env)->GetMethodID(env, clase, "initialize", "()V");
322
                (*env)->CallIntMethod(env,obj,metodo);
323
                        
324
                compress_readInfo = (ReadInfo *)malloc(sizeof(ReadInfo));
325
                
326
                pReadBuffer = (UINT8 *)malloc(sizeof(UINT8) *
327
                                                                  pClient->nInOutSizeX *
328
                                                                  pClient->nInputBands);
329
                compress_readInfo->ppInputBandBufferArray = (UINT8 **)malloc(sizeof(UINT8 *) *
330
                                                                   pClient->nInputBands);
331
                for (nBand = 0; nBand < pClient->nInputBands; nBand++) {
332
                        compress_readInfo->ppInputBandBufferArray[nBand] = pReadBuffer + 
333
                        (nBand * pClient->nInOutSizeX * sizeof(UINT8));
334
                }
335
                                                                  
336
                if (compress_readInfo->ppInputBandBufferArray == NULL) return 46;
337
                compress_readInfo->nPercentComplete = 0;
338
                                
339
                pClient->pClientData = (void *)compress_readInfo;
340
                
341
                  eError = NCSEcwCompressOpen(pClient, ((bCalculateSizesOnly==0)? FALSE : TRUE));
342
                  
343
                return eError;
344
                
345
          }
346
          return -1;
347
  }
348
  
349
/******************************************************************************/
350
//                                                                NCSEcwCompress
351
/******************************************************************************/
352
  
353
JNIEXPORT jint JNICALL Java_es_gva_cit_jecwcompress_NCSEcwCompressClient_NCSEcwCompressNat
354
  (JNIEnv *env, jobject obj, jlong cPtr, jobject obj_read){
355
          
356
          NCSEcwCompressClient         *pClient = (NCSEcwCompressClient *) 0 ;
357
          ReadInfo                                 *compress_readInfo = (ReadInfo *) 0 ;
358
          NCSError                                 eError;
359
   
360
        pClient = *(NCSEcwCompressClient **)&cPtr;
361
        compress_readInfo = (ReadInfo *)pClient->pClientData;
362
        compress_readInfo->jclient=&obj;
363
        compress_readInfo->jreadcall=&obj_read;
364
        compress_readInfo->env=env;        
365
        
366
        eError = NCSEcwCompress(pClient);
367
        return eError;          
368
  }
369
  
370
/******************************************************************************/
371
//                                                                NCSEcwCompressClose
372
/******************************************************************************/
373
  
374
JNIEXPORT jint JNICALL Java_es_gva_cit_jecwcompress_NCSEcwCompressClient_NCSEcwCompressCloseNat
375
  (JNIEnv *env, jobject obj, jlong cPtr){
376
          
377
          NCSEcwCompressClient         *pClient = (NCSEcwCompressClient *) 0 ;
378
          NCSError                                 eError;
379
            
380
        pClient = *(NCSEcwCompressClient **)&cPtr;        
381
        eError = NCSEcwCompressClose(pClient);
382
        return eError;          
383
  }  
384
  
385
/******************************************************************************/
386
//                                                                NCSEcwCompressCancel
387
/******************************************************************************/
388
  
389
JNIEXPORT void JNICALL Java_es_gva_cit_jecwcompress_NCSEcwCompressClient_NCSEcwCompressCancelNat
390
  (JNIEnv *env, jobject obj, jlong cPtr){
391
          callBackOn = FALSE;
392
  }
393
  
394
/******************************************************************************/
395
//                                                                finalize
396
/******************************************************************************/
397
  
398
JNIEXPORT void JNICALL Java_es_gva_cit_jecwcompress_NCSEcwCompressClient_finalizeNat
399
  (JNIEnv *env, jobject obj, jlong cPtr){
400
          
401
          ReadInfo                                 *compress_readInfo = (ReadInfo *) 0 ;
402
          NCSEcwCompressClient         *pClient = (NCSEcwCompressClient *) 0 ;
403
    int                                         nBand;        
404
    
405
        pClient = *(NCSEcwCompressClient **)&cPtr;        
406
           
407
          //Liberamos la memoria
408
          
409
          compress_readInfo = pClient->pClientData;
410
          for (nBand = 0; nBand < pClient->nInputBands; nBand++) {
411
                        free(compress_readInfo->ppInputBandBufferArray[nBand]);
412
        }
413
          free(compress_readInfo->ppInputBandBufferArray);
414
          free(pClient->pClientData);
415
          pClient->pClientData = NULL;
416
          NCSEcwCompressFreeClient(pClient);
417
          
418
  }
419