svn-gvsig-desktop / trunk / libraries / libjni-ecw / src / main / native / jecw / ncsecwcompressclient_wrapper.cpp @ 20206
History | View | Annotate | Download (14.7 KB)
1 | 19218 | maquerol | /**********************************************************************
|
---|---|---|---|
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 | 20172 | maquerol | clase_client = (env)->GetObjectClass(*(pReadInfo->jclient)); |
91 | clase_readcall = (env)->GetObjectClass(*(pReadInfo->jreadcall)); |
||
92 | 19218 | maquerol | |
93 | //Ponemos el valor de la banda un n?mero de l?nea en el objeto cliente
|
||
94 | |||
95 | 20172 | maquerol | fid = (env)->GetFieldID(clase_readcall, "nNextLine", "I"); |
96 | (env)->SetIntField(*(pReadInfo->jreadcall), fid, nNextLine); |
||
97 | 19218 | maquerol | |
98 | //Ejecutamos la funci?n de java que carga el buffer
|
||
99 | |||
100 | 20172 | maquerol | metodo = (env)->GetMethodID(clase_readcall, "loadBuffer", "()V"); |
101 | (env)->CallVoidMethod(*(pReadInfo->jreadcall), metodo); |
||
102 | 19218 | maquerol | |
103 | //Obtenemos el array de bytes desde java
|
||
104 | |||
105 | 20172 | maquerol | fid = (env)->GetFieldID(clase_client, "buffer", "[B"); |
106 | jarray =(jbyteArray)(env)->GetObjectField(*(pReadInfo->jclient), fid); |
||
107 | longitud = (env)->GetArrayLength(jarray); |
||
108 | 19218 | maquerol | |
109 | 20172 | maquerol | (env)->GetByteArrayRegion(jarray,0,longitud,(jbyte *)pReadInfo->ppInputBandBufferArray[0]); |
110 | 19218 | maquerol | |
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 | return(FALSE);
|
||
126 | } |
||
127 | |||
128 | /******************************************************************************/
|
||
129 | // StatusCallback
|
||
130 | /******************************************************************************/
|
||
131 | //Asigna el tanto por cien de imagen que lleva comprimido en una variable de java
|
||
132 | //Ejecuta la funci?n updatePercent de java despues de actualizar la varible.
|
||
133 | |||
134 | static void StatusCallback(NCSEcwCompressClient *pClient, |
||
135 | UINT32 nCurrentLine) |
||
136 | { |
||
137 | ReadInfo *pReadInfo = (ReadInfo *)pClient->pClientData; |
||
138 | UINT32 nPercentComplete = (nCurrentLine * 100) / (pClient->nInOutSizeY - 1); |
||
139 | jclass clase_client; |
||
140 | jclass clase_readcall; |
||
141 | JNIEnv *env=pReadInfo->env; |
||
142 | jfieldID fid; |
||
143 | jmethodID metodo; |
||
144 | |||
145 | 20172 | maquerol | clase_client = (env)->GetObjectClass(*(pReadInfo->jclient)); |
146 | clase_readcall = (env)->GetObjectClass(*(pReadInfo->jreadcall)); |
||
147 | 19218 | maquerol | |
148 | if (nPercentComplete != pReadInfo->nPercentComplete) {
|
||
149 | 20172 | maquerol | fid = (env)->GetFieldID(clase_client, "porcentaje", "I"); |
150 | (env)->SetIntField(*(pReadInfo->jclient), fid, nPercentComplete); |
||
151 | metodo = (env)->GetMethodID(clase_readcall, "updatePercent", "()V"); |
||
152 | (env)->CallVoidMethod(*(pReadInfo->jreadcall), metodo); |
||
153 | 19218 | maquerol | pReadInfo->nPercentComplete = nPercentComplete; |
154 | } |
||
155 | } |
||
156 | |||
157 | /******************************************************************************/
|
||
158 | // NCSEcwCompressClient
|
||
159 | /******************************************************************************/
|
||
160 | |||
161 | JNIEXPORT jlong JNICALL Java_es_gva_cit_jecwcompress_NCSEcwCompressClient_NCSEcwCompressClientNat |
||
162 | (JNIEnv *env, jobject obj){ |
||
163 | |||
164 | NCSEcwCompressClient *pClient; |
||
165 | jlong jresult = 0 ;
|
||
166 | |||
167 | if(pClient = NCSEcwCompressAllocClient()){
|
||
168 | *(NCSEcwCompressClient **)&jresult = pClient; |
||
169 | return jresult;
|
||
170 | }else
|
||
171 | return -1; |
||
172 | |||
173 | } |
||
174 | |||
175 | /******************************************************************************/
|
||
176 | // NCSEcwCompressOpen
|
||
177 | /******************************************************************************/
|
||
178 | |||
179 | JNIEXPORT jint JNICALL Java_es_gva_cit_jecwcompress_NCSEcwCompressClient_NCSEcwCompressOpenNat |
||
180 | (JNIEnv *env, jobject obj, jlong cPtr, jboolean bCalculateSizesOnly){ |
||
181 | |||
182 | NCSEcwCompressClient *pClient = (NCSEcwCompressClient *) 0 ;
|
||
183 | NCSError eError; |
||
184 | jfieldID fid; |
||
185 | jobject obj_str; |
||
186 | const char *str; |
||
187 | ReadInfo *compress_readInfo; |
||
188 | jmethodID metodo; |
||
189 | |||
190 | UINT8 *pReadBuffer,nBand; |
||
191 | |||
192 | pClient = *(NCSEcwCompressClient **)&cPtr; |
||
193 | if(pClient!=NULL){ |
||
194 | |||
195 | //Asignamos los valores de los campos de NCSEcwCompress
|
||
196 | |||
197 | 20172 | maquerol | jclass clase = (env)->GetObjectClass(obj); |
198 | 19218 | maquerol | |
199 | 20172 | maquerol | fid = (env)->GetFieldID(clase, "inputFilename", "Ljava/lang/String;"); |
200 | obj_str = (env)->GetObjectField(obj, fid); |
||
201 | 19218 | maquerol | if(obj_str!=NULL){ |
202 | 20172 | maquerol | str = (env)->GetStringUTFChars((jstring)obj_str,0);
|
203 | 19218 | maquerol | strcpy(pClient->szInputFilename,str); |
204 | str=NULL;
|
||
205 | 20172 | maquerol | (env)->ReleaseStringUTFChars((jstring)obj_str, str); |
206 | 19218 | maquerol | //printf("inputFilename=%s\n",pClient->szInputFilename);
|
207 | } |
||
208 | |||
209 | 20172 | maquerol | fid = (env)->GetFieldID(clase, "outputFilename", "Ljava/lang/String;"); |
210 | obj_str = (env)->GetObjectField(obj, fid); |
||
211 | 19218 | maquerol | if(obj_str!=NULL){ |
212 | 20172 | maquerol | str = (env)->GetStringUTFChars((jstring)obj_str,0);
|
213 | 19218 | maquerol | strcpy(pClient->szOutputFilename,str); |
214 | str=NULL;
|
||
215 | 20172 | maquerol | (env)->ReleaseStringUTFChars((jstring)obj_str, str); |
216 | 19218 | maquerol | //printf("outputFilename=%s\n",pClient->szOutputFilename);
|
217 | } |
||
218 | |||
219 | 20172 | maquerol | fid = (env)->GetFieldID(clase, "targetCompression", "D"); |
220 | pClient->fTargetCompression = (IEEE4)(env)->GetDoubleField(obj, fid); |
||
221 | 19218 | maquerol | //printf("targetCompression=%f\n",pClient->fTargetCompression);
|
222 | |||
223 | 20172 | maquerol | fid = (env)->GetFieldID(clase, "eCompressFormat", "I"); |
224 | pClient->eCompressFormat = (CompressFormat)(env)->GetIntField(obj, fid); |
||
225 | 19218 | maquerol | //printf("eCompressFormat=%d\n",pClient->eCompressFormat);
|
226 | |||
227 | 20172 | maquerol | fid = (env)->GetFieldID(clase, "eCompressHint", "I"); |
228 | pClient->eCompressHint = (CompressHint)(env)->GetIntField(obj, fid); |
||
229 | 19218 | maquerol | //printf("eCompressHint=%d\n",pClient->eCompressHint);
|
230 | |||
231 | 20172 | maquerol | fid = (env)->GetFieldID(clase, "nBlockSizeX", "I"); |
232 | pClient->nBlockSizeX = (env)->GetIntField(obj, fid); |
||
233 | 19218 | maquerol | //printf("nBlockSizeX=%d\n",pClient->nBlockSizeX);
|
234 | |||
235 | 20172 | maquerol | fid = (env)->GetFieldID(clase, "nBlockSizeY", "I"); |
236 | pClient->nBlockSizeY = (env)->GetIntField(obj, fid); |
||
237 | 19218 | maquerol | //printf("nBlockSizeY=%d\n",pClient->nBlockSizeY);
|
238 | |||
239 | 20172 | maquerol | fid = (env)->GetFieldID(clase, "nInOutSizeX", "I"); |
240 | pClient->nInOutSizeX = (env)->GetIntField(obj, fid); |
||
241 | 19218 | maquerol | //printf("nInOutSizeX=%d\n",pClient->nInOutSizeX);
|
242 | |||
243 | 20172 | maquerol | fid = (env)->GetFieldID(clase, "nInOutSizeY", "I"); |
244 | pClient->nInOutSizeY = (env)->GetIntField(obj, fid); |
||
245 | 19218 | maquerol | //printf("nInOutSizeY=%d\n",pClient->nInOutSizeY);
|
246 | |||
247 | 20172 | maquerol | fid = (env)->GetFieldID(clase, "nInputBands", "I"); |
248 | pClient->nInputBands = (env)->GetIntField(obj, fid); |
||
249 | 19218 | maquerol | //printf("nInputBands=%d\n",pClient->nInputBands);
|
250 | |||
251 | 20172 | maquerol | fid = (env)->GetFieldID(clase, "nOutputBands", "I"); |
252 | pClient->nOutputBands = (env)->GetIntField(obj, fid); |
||
253 | 19218 | maquerol | //printf("nOutputBands=%d\n",pClient->nOutputBands);
|
254 | |||
255 | 20172 | maquerol | fid = (env)->GetFieldID(clase, "nInputSize", "J"); |
256 | pClient->nInputSize = (env)->GetLongField(obj, fid); |
||
257 | 19218 | maquerol | //printf("nInputSize=%ld\n",pClient->nInputSize);
|
258 | |||
259 | 20172 | maquerol | fid = (env)->GetFieldID(clase, "fCellIncrementX", "D"); |
260 | pClient->fCellIncrementX = (env)->GetDoubleField(obj, fid); |
||
261 | 19218 | maquerol | //printf("fCellIncrementX=%f\n",pClient->fCellIncrementX);
|
262 | |||
263 | 20172 | maquerol | fid = (env)->GetFieldID(clase, "fCellIncrementY", "D"); |
264 | pClient->fCellIncrementY = (env)->GetDoubleField(obj, fid); |
||
265 | 19218 | maquerol | //printf("fCellIncrementY=%f\n",pClient->fCellIncrementY);
|
266 | |||
267 | 20172 | maquerol | fid = (env)->GetFieldID(clase, "fOriginX", "D"); |
268 | pClient->fOriginX = (env)->GetDoubleField(obj, fid); |
||
269 | 19218 | maquerol | //printf("fOriginX=%f\n",pClient->fOriginX);
|
270 | |||
271 | 20172 | maquerol | fid = (env)->GetFieldID(clase, "fOriginY", "D"); |
272 | pClient->fOriginY = (env)->GetDoubleField(obj, fid); |
||
273 | 19218 | maquerol | //printf("fOriginY=%f\n",pClient->fOriginY);
|
274 | |||
275 | 20172 | maquerol | fid = (env)->GetFieldID(clase, "eCellSizeUnits", "I"); |
276 | pClient->fActualCompression = (IEEE4)(env)->GetIntField(obj, fid); |
||
277 | 19218 | maquerol | //printf("eCellSizeUnits=%d\n",pClient->fActualCompression);
|
278 | |||
279 | 20172 | maquerol | fid = (env)->GetFieldID(clase, "szDatum", "Ljava/lang/String;"); |
280 | obj_str = (env)->GetObjectField(obj, fid); |
||
281 | 19218 | maquerol | if(obj_str!=NULL){ |
282 | 20172 | maquerol | str = (env)->GetStringUTFChars((jstring)obj_str,0);
|
283 | 19218 | maquerol | strcpy(pClient->szDatum,str); |
284 | str=NULL;
|
||
285 | 20172 | maquerol | (env)->ReleaseStringUTFChars((jstring)obj_str, str); |
286 | 19218 | maquerol | //printf("szDatum=%s\n",pClient->szDatum);
|
287 | } |
||
288 | |||
289 | 20172 | maquerol | fid = (env)->GetFieldID(clase, "szProjection", "Ljava/lang/String;"); |
290 | obj_str = (env)->GetObjectField(obj, fid); |
||
291 | 19218 | maquerol | if(obj_str!=NULL){ |
292 | 20172 | maquerol | str = (env)->GetStringUTFChars((jstring)obj_str,0);
|
293 | 19218 | maquerol | strcpy(pClient->szProjection,str); |
294 | str=NULL;
|
||
295 | 20172 | maquerol | (env)->ReleaseStringUTFChars((jstring)obj_str, str); |
296 | 19218 | maquerol | //printf("szProjection=%s\n",pClient->szProjection);
|
297 | } |
||
298 | |||
299 | 20172 | maquerol | fid = (env)->GetFieldID(clase, "fActualCompression", "D"); |
300 | pClient->fActualCompression = (IEEE4)(env)->GetDoubleField(obj, fid); |
||
301 | 19218 | maquerol | //printf("fActualCompression=%f\n",pClient->fActualCompression);
|
302 | |||
303 | 20172 | maquerol | fid = (env)->GetFieldID(clase, "fCompressionSeconds", "D"); |
304 | pClient->fCompressionSeconds = (env)->GetDoubleField(obj, fid); |
||
305 | 19218 | maquerol | //printf("fCompressionSeconds=%f\n",pClient->fCompressionSeconds);
|
306 | |||
307 | 20172 | maquerol | fid = (env)->GetFieldID(clase, "fCompressionMBSec", "D"); |
308 | pClient->fCompressionMBSec = (env)->GetDoubleField(obj, fid); |
||
309 | 19218 | maquerol | //printf("fCompressionMBSec=%f\n",pClient->fCompressionMBSec);
|
310 | |||
311 | 20172 | maquerol | fid = (env)->GetFieldID(clase, "nOutputSize", "J"); |
312 | pClient->nOutputSize = (env)->GetLongField(obj, fid); |
||
313 | 19218 | maquerol | //printf("nOutputSize=%ld\n",pClient->nOutputSize);
|
314 | |||
315 | pClient->pReadCallback = ReadCallback; |
||
316 | pClient->pStatusCallback = StatusCallback; |
||
317 | |||
318 | //Inicializar el buffer que tendr? una l?nea de entrada x el n?m de bandas
|
||
319 | |||
320 | 20172 | maquerol | metodo = (env)->GetMethodID(clase, "initialize", "()V"); |
321 | (env)->CallIntMethod(obj,metodo); |
||
322 | 19218 | maquerol | |
323 | compress_readInfo = (ReadInfo *)malloc(sizeof(ReadInfo));
|
||
324 | |||
325 | pReadBuffer = (UINT8 *)malloc(sizeof(UINT8) *
|
||
326 | pClient->nInOutSizeX * |
||
327 | pClient->nInputBands); |
||
328 | compress_readInfo->ppInputBandBufferArray = (UINT8 **)malloc(sizeof(UINT8 *) *
|
||
329 | pClient->nInputBands); |
||
330 | for (nBand = 0; nBand < pClient->nInputBands; nBand++) { |
||
331 | compress_readInfo->ppInputBandBufferArray[nBand] = pReadBuffer + |
||
332 | (nBand * pClient->nInOutSizeX * sizeof(UINT8));
|
||
333 | } |
||
334 | |||
335 | if (compress_readInfo->ppInputBandBufferArray == NULL) return 46; |
||
336 | compress_readInfo->nPercentComplete = 0;
|
||
337 | |||
338 | pClient->pClientData = (void *)compress_readInfo;
|
||
339 | |||
340 | eError = NCSEcwCompressOpen(pClient, ((bCalculateSizesOnly==0)? FALSE : TRUE));
|
||
341 | |||
342 | return eError;
|
||
343 | |||
344 | } |
||
345 | return -1; |
||
346 | } |
||
347 | |||
348 | /******************************************************************************/
|
||
349 | // NCSEcwCompress
|
||
350 | /******************************************************************************/
|
||
351 | |||
352 | JNIEXPORT jint JNICALL Java_es_gva_cit_jecwcompress_NCSEcwCompressClient_NCSEcwCompressNat |
||
353 | (JNIEnv *env, jobject obj, jlong cPtr, jobject obj_read){ |
||
354 | |||
355 | NCSEcwCompressClient *pClient = (NCSEcwCompressClient *) 0 ;
|
||
356 | ReadInfo *compress_readInfo = (ReadInfo *) 0 ;
|
||
357 | NCSError eError; |
||
358 | |||
359 | pClient = *(NCSEcwCompressClient **)&cPtr; |
||
360 | compress_readInfo = (ReadInfo *)pClient->pClientData; |
||
361 | compress_readInfo->jclient=&obj; |
||
362 | compress_readInfo->jreadcall=&obj_read; |
||
363 | compress_readInfo->env=env; |
||
364 | |||
365 | eError = NCSEcwCompress(pClient); |
||
366 | return eError;
|
||
367 | } |
||
368 | |||
369 | /******************************************************************************/
|
||
370 | // NCSEcwCompressClose
|
||
371 | /******************************************************************************/
|
||
372 | |||
373 | JNIEXPORT jint JNICALL Java_es_gva_cit_jecwcompress_NCSEcwCompressClient_NCSEcwCompressCloseNat |
||
374 | (JNIEnv *env, jobject obj, jlong cPtr){ |
||
375 | |||
376 | NCSEcwCompressClient *pClient = (NCSEcwCompressClient *) 0 ;
|
||
377 | NCSError eError; |
||
378 | |||
379 | pClient = *(NCSEcwCompressClient **)&cPtr; |
||
380 | eError = NCSEcwCompressClose(pClient); |
||
381 | return eError;
|
||
382 | } |
||
383 | |||
384 | /******************************************************************************/
|
||
385 | // NCSEcwCompressCancel
|
||
386 | /******************************************************************************/
|
||
387 | |||
388 | JNIEXPORT void JNICALL Java_es_gva_cit_jecwcompress_NCSEcwCompressClient_NCSEcwCompressCancelNat
|
||
389 | (JNIEnv *env, jobject obj, jlong cPtr){ |
||
390 | callBackOn = FALSE; |
||
391 | } |
||
392 | |||
393 | /******************************************************************************/
|
||
394 | // finalize
|
||
395 | /******************************************************************************/
|
||
396 | |||
397 | JNIEXPORT void JNICALL Java_es_gva_cit_jecwcompress_NCSEcwCompressClient_finalizeNat
|
||
398 | (JNIEnv *env, jobject obj, jlong cPtr){ |
||
399 | |||
400 | ReadInfo *compress_readInfo = (ReadInfo *) 0 ;
|
||
401 | NCSEcwCompressClient *pClient = (NCSEcwCompressClient *) 0 ;
|
||
402 | int nBand;
|
||
403 | |||
404 | pClient = *(NCSEcwCompressClient **)&cPtr; |
||
405 | |||
406 | //Liberamos la memoria
|
||
407 | |||
408 | 20172 | maquerol | compress_readInfo = (ReadInfo *)pClient->pClientData; |
409 | 19218 | maquerol | for (nBand = 0; nBand < pClient->nInputBands; nBand++) { |
410 | free(compress_readInfo->ppInputBandBufferArray[nBand]); |
||
411 | } |
||
412 | free(compress_readInfo->ppInputBandBufferArray); |
||
413 | free(pClient->pClientData); |
||
414 | pClient->pClientData = NULL;
|
||
415 | NCSEcwCompressFreeClient(pClient); |
||
416 | |||
417 | } |