Statistics
| Revision:

root / trunk / libraries / libjni-ecwcompress / src / ncsecwcompressclient_wrapper.c @ 2211

History | View | Annotate | Download (14.6 KB)

1
/**********************************************************************
2
 * $Id: ncsecwcompressclient_wrapper.c 2211 2005-06-21 08:03:17Z igbrotru $
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 "../include/es_gva_cit_jecwcompress_NCSEcwCompressClient.h"
56
#include "NCSECWCompressClient.h"
57

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

    
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
        clase_client = (*env)->GetObjectClass(env, *(pReadInfo->jclient));
90
        clase_readcall = (*env)->GetObjectClass(env, *(pReadInfo->jreadcall));
91
        
92
        //Ponemos el valor de la banda un n?mero de l?nea en el objeto cliente                
93

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

    
122
        return(TRUE);        
123
}
124

    
125
/******************************************************************************/
126
//                                                                StatusCallback
127
/******************************************************************************/
128
//Asigna el tanto por cien de imagen que lleva comprimido en una variable de java
129
//Ejecuta la funci?n updatePercent de java despues de actualizar la varible.
130

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

    
154
/******************************************************************************/
155
//                                                                NCSEcwCompressClient
156
/******************************************************************************/
157

    
158
JNIEXPORT jlong JNICALL Java_es_gva_cit_jecwcompress_NCSEcwCompressClient_NCSEcwCompressClientNat
159
  (JNIEnv *env, jobject obj){
160
          
161
          NCSEcwCompressClient         *pClient;
162
          jlong                                         jresult = 0 ;
163
          
164
          if(pClient = NCSEcwCompressAllocClient()){
165
                  *(NCSEcwCompressClient **)&jresult = pClient;
166
                  return jresult;
167
          }else
168
                  return -1;
169
          
170
  }
171

    
172
/******************************************************************************/
173
//                                                                NCSEcwCompressOpen
174
/******************************************************************************/
175

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

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