gvsig-raster / org.gvsig.raster.ermapper / trunk / org.gvsig.raster.ermapper / org.gvsig.raster.ermapper.jni / src / main / java / com / ermapper / ecw / JNCSFile.java @ 2449
History | View | Annotate | Download (13 KB)
1 | 2449 | nbrodin | // Decompiled by Jad v1.5.8f. Copyright 2001 Pavel Kouznetsov.
|
---|---|---|---|
2 | // Jad home page: http://www.kpdus.com/jad.html
|
||
3 | // Decompiler options: packimports(3)
|
||
4 | // Source File Name: JNCSFile.java
|
||
5 | // [01] 01-Oct-2005 nbt New call to JNI function ECWOpenArray to convert name string to char array.
|
||
6 | |||
7 | package com.ermapper.ecw; |
||
8 | |||
9 | import com.ermapper.util.JNCSDatasetPoint; |
||
10 | import com.ermapper.util.JNCSWorldPoint; |
||
11 | import java.io.FileInputStream; |
||
12 | import java.io.PrintStream; |
||
13 | import java.lang.reflect.Field; |
||
14 | import java.lang.reflect.Method; |
||
15 | import java.util.Properties; |
||
16 | |||
17 | // Referenced classes of package com.ermapper.ecw:
|
||
18 | // JNCSNativeLibraryException, JNCSFileOpenFailedException, JNCSInvalidSetViewException, JNCSException,
|
||
19 | // JNCSFileNotOpenException, JNCSProgressiveUpdate
|
||
20 | |||
21 | /**
|
||
22 | * Clase que representa a un fichero Ecw
|
||
23 | */
|
||
24 | |||
25 | public class JNCSFile |
||
26 | implements JNCSProgressiveUpdate
|
||
27 | { |
||
28 | |||
29 | private native int ECWOpen(String s, boolean flag); |
||
30 | |||
31 | private native int ECWOpenArray(String s, boolean flag, byte[] b); |
||
32 | |||
33 | private native void ECWClose(boolean flag); |
||
34 | |||
35 | private native int ECWSetView(int i, int ai[], int j, int k, int l, int i1, double d, double d1, double d2, double d3, |
||
36 | int j1, int k1); |
||
37 | |||
38 | private native int ECWReadLineRGBA(int ai[]); |
||
39 | |||
40 | private native int ECWReadImageRGBA(int ai[], int i, int j); |
||
41 | |||
42 | private native short ECWGetPercentComplete(); |
||
43 | |||
44 | private static native String ECWGetErrorString(int i); |
||
45 | |||
46 | private static native int NCSJNIInit(); |
||
47 | |||
48 | private static native String ECWGetLibVersion(); |
||
49 | |||
50 | /**
|
||
51 | * Carga la libreria libecw.so que contiene el wrapper y llama a la
|
||
52 | * funci�n de inicializaci�n
|
||
53 | * @throws JNCSNativeLibraryException
|
||
54 | */
|
||
55 | |||
56 | static void initClass() |
||
57 | throws JNCSNativeLibraryException
|
||
58 | { |
||
59 | boolean flag = false; |
||
60 | boolean flag1 = false; |
||
61 | |||
62 | |||
63 | try
|
||
64 | { |
||
65 | System.loadLibrary("jecw2.0.0"); |
||
66 | bUseNativeMethods = true;
|
||
67 | bUnsatisfiedLink = false;
|
||
68 | int i = NCSJNIInit();
|
||
69 | if(i != 0) |
||
70 | { |
||
71 | System.err.println("JNCSFile classes found on PATH failed to initialize correctly. Attempting to locate other libecw.so...."); |
||
72 | } |
||
73 | } |
||
74 | catch(Exception e) |
||
75 | { |
||
76 | e.printStackTrace(); |
||
77 | } |
||
78 | } |
||
79 | |||
80 | /**
|
||
81 | * Constructor
|
||
82 | * @throws JNCSException
|
||
83 | */
|
||
84 | |||
85 | public JNCSFile()
|
||
86 | throws JNCSException
|
||
87 | { |
||
88 | bSetViewIsWorld = false;
|
||
89 | progImageClient = null;
|
||
90 | initClass(); |
||
91 | cellSizeUnits = 0;
|
||
92 | bIsOpen = false;
|
||
93 | } |
||
94 | |||
95 | /**
|
||
96 | * Constructor con open del fichero.
|
||
97 | * @throws JNCSException
|
||
98 | */
|
||
99 | |||
100 | public JNCSFile(String s, boolean flag) |
||
101 | throws JNCSException
|
||
102 | { |
||
103 | bSetViewIsWorld = false;
|
||
104 | progImageClient = null;
|
||
105 | initClass(); |
||
106 | open(s, flag); |
||
107 | } |
||
108 | |||
109 | /**
|
||
110 | * Llama al close del ecw para liberar la memoria de C.
|
||
111 | * @throws Throwable
|
||
112 | */
|
||
113 | |||
114 | protected void finalize() |
||
115 | throws Throwable |
||
116 | { |
||
117 | if(bIsOpen)
|
||
118 | ECWClose(false);
|
||
119 | super.finalize();
|
||
120 | } |
||
121 | |||
122 | /**
|
||
123 | * Abre el fichero de imagen.
|
||
124 | * @throws JNCSFileOpenFailedException
|
||
125 | */
|
||
126 | |||
127 | public int open(String s, boolean flag) |
||
128 | throws JNCSFileOpenFailedException
|
||
129 | { |
||
130 | if(s == null) |
||
131 | throw new IllegalArgumentException(); |
||
132 | |||
133 | //int i = ECWOpen(s, flag);
|
||
134 | int i = ECWOpenArray(s, flag, s.getBytes());
|
||
135 | |||
136 | if(i != 0) |
||
137 | { |
||
138 | bIsOpen = false;
|
||
139 | String s1 = JNCSError.getError(i);
|
||
140 | throw new JNCSFileOpenFailedException(s1); |
||
141 | } else
|
||
142 | { |
||
143 | bIsOpen = true;
|
||
144 | progressive = flag; |
||
145 | return 0; |
||
146 | } |
||
147 | } |
||
148 | |||
149 | /**
|
||
150 | * Cierra el fichero de imagen.
|
||
151 | * @param flag par�metro para la funci�n NCScbmCloseFileViewEx
|
||
152 | */
|
||
153 | |||
154 | public void close(boolean flag) |
||
155 | { |
||
156 | ECWClose(flag); |
||
157 | if(!flag);
|
||
158 | } |
||
159 | |||
160 | public void addProgressiveUpdateListener(JNCSProgressiveUpdate jncsprogressiveupdate) |
||
161 | { |
||
162 | progImageClient = jncsprogressiveupdate; |
||
163 | } |
||
164 | |||
165 | public void refreshUpdate(int i, int j, double d, double d1, double d2, double d3) |
||
166 | { |
||
167 | if(progImageClient != null) |
||
168 | progImageClient.refreshUpdate(i, j, d, d1, d2, d3); |
||
169 | } |
||
170 | |||
171 | public void refreshUpdate(int i, int j, int k, int l, int i1, int j1) |
||
172 | { |
||
173 | if(progImageClient != null) |
||
174 | progImageClient.refreshUpdate(i, j, k, l, i1, j1); |
||
175 | } |
||
176 | |||
177 | /**
|
||
178 | * Crea una vista en un fichero ecw abierto dando las coordenadas de la vista
|
||
179 | * @param nBands N�mero de bandas en bandList
|
||
180 | * @param bandList Array de �ndices de bandas
|
||
181 | * @param width ancho de la vista en pixels
|
||
182 | * @param height alto de la vista en pixels
|
||
183 | * @param tlx coordenada X arriba-izquierda de la vista
|
||
184 | * @param tly coordenada Y arriba-izquierda de la vista
|
||
185 | * @param brx coordenada X abajo-derecha de la vista
|
||
186 | * @param bry coordenada Y abajo-derecha de la vista
|
||
187 | * @throws JNCSFileNotOpenException, JNCSInvalidSetViewException
|
||
188 | */
|
||
189 | |||
190 | public int setView(int i, int ai[], int j, int k, int l, int i1, int j1, |
||
191 | int k1)
|
||
192 | throws JNCSFileNotOpenException, JNCSInvalidSetViewException
|
||
193 | { |
||
194 | if(!bIsOpen)
|
||
195 | throw new JNCSFileNotOpenException("File not open"); |
||
196 | |||
197 | if (ai == null) |
||
198 | throw new JNCSInvalidSetViewException("Wrong parameter value"); |
||
199 | |||
200 | |||
201 | int l1 = ECWSetView(i, ai, j, k, l, i1, 0.0D, 0.0D, 0.0D, 0.0D, j1, k1); |
||
202 | if(l1 != 0) |
||
203 | { |
||
204 | //String s = ECWGetErrorString(l1);
|
||
205 | String s = JNCSError.getError(l1);
|
||
206 | throw new JNCSInvalidSetViewException(s); |
||
207 | } else
|
||
208 | { |
||
209 | bSetViewIsWorld = false;
|
||
210 | return 0; |
||
211 | } |
||
212 | } |
||
213 | |||
214 | /**
|
||
215 | * Asigna la vista pasando por par�metros los pixeles de inicio y fin y coordenadas de georreferenciaci�n solicitadas-
|
||
216 | * El cliente de esta funci�n tendr� que convertir las coordenadas reales en pixeles.
|
||
217 | */
|
||
218 | public int setView(int nBands, int posBands[], int iniX, int iniY, int endX, int endY, double tlX, double tlY, double brX, double brY, |
||
219 | int bufW, int bufH)throws JNCSFileNotOpenException, JNCSInvalidSetViewException{ |
||
220 | |||
221 | if(!bIsOpen)
|
||
222 | throw new JNCSFileNotOpenException("File not open"); |
||
223 | |||
224 | if (posBands == null) |
||
225 | throw new JNCSInvalidSetViewException("Wrong parameter value"); |
||
226 | |||
227 | int l = ECWSetView(nBands, posBands, iniX, iniY, endX, endY, tlX, tlY, brX, brY, bufW, bufH);
|
||
228 | if(l != 0){ |
||
229 | String s = JNCSError.getError(l);
|
||
230 | throw new JNCSInvalidSetViewException(s); |
||
231 | }else{
|
||
232 | bSetViewIsWorld = true;
|
||
233 | return 0; |
||
234 | } |
||
235 | |||
236 | } |
||
237 | |||
238 | /**
|
||
239 | * Crea una vista en un fichero ecw abierto.
|
||
240 | *
|
||
241 | * @param nBands N�mero de bandas en bandList
|
||
242 | * @param bandList Array de �ndices de bandas
|
||
243 | * @param width ancho de la vista en pixels
|
||
244 | * @param height alto de la vista en pixels
|
||
245 | * @param dWorldTLX coordenada X arriba-izquierda)
|
||
246 | * @param dWorldTLY coordenada Y arriba-izquierda
|
||
247 | * @param dWorldBRX coordenada X abajo-derecha)
|
||
248 | * @param dWorldBRY coordenada Y abajo-derecha
|
||
249 | * @throws JNCSFileNotOpenException, JNCSInvalidSetViewException
|
||
250 | */
|
||
251 | |||
252 | public int setView(int i, int ai[], double d, double d1, double d2, double d3, int j, int k) |
||
253 | throws JNCSFileNotOpenException, JNCSInvalidSetViewException
|
||
254 | { |
||
255 | if(!bIsOpen)
|
||
256 | throw new JNCSFileNotOpenException("File not open"); |
||
257 | |||
258 | if (ai == null) |
||
259 | throw new JNCSInvalidSetViewException("Wrong parameter value"); |
||
260 | JNCSDatasetPoint jncsdatasetpoint = convertWorldToDataset(d, d1); |
||
261 | JNCSDatasetPoint jncsdatasetpoint1 = convertWorldToDataset(d2, d3); |
||
262 | int l = ECWSetView(i, ai, jncsdatasetpoint.x, jncsdatasetpoint.y, jncsdatasetpoint1.x - 1, jncsdatasetpoint1.y - 1, d, d1, d2, d3, j, k); |
||
263 | if(l != 0) |
||
264 | { |
||
265 | //String s = ECWGetErrorString(l);
|
||
266 | String s = JNCSError.getError(l);
|
||
267 | throw new JNCSInvalidSetViewException(s); |
||
268 | } else
|
||
269 | { |
||
270 | bSetViewIsWorld = true;
|
||
271 | return 0; |
||
272 | } |
||
273 | } |
||
274 | |||
275 | /**
|
||
276 | * Lee una l�nea del fichero Ecw
|
||
277 | * @param buffer Buffer donde se almacenan los datos de la l�nea
|
||
278 | * @throws JNCSException
|
||
279 | */
|
||
280 | |||
281 | public int readLineRGBA(int ai[]) |
||
282 | throws JNCSException
|
||
283 | { |
||
284 | if(!bIsOpen)
|
||
285 | throw new JNCSFileNotOpenException("File not open"); |
||
286 | int i = ECWReadLineRGBA(ai);
|
||
287 | if(i != 0) |
||
288 | { |
||
289 | String s = JNCSError.getError(i);
|
||
290 | throw new JNCSException(s); |
||
291 | } else
|
||
292 | { |
||
293 | return 0; |
||
294 | } |
||
295 | } |
||
296 | |||
297 | public int readLineBGRA(int ai[]) |
||
298 | throws JNCSException
|
||
299 | { |
||
300 | throw new JNCSException("Not Yet Implemented!"); |
||
301 | } |
||
302 | |||
303 | public int readLineBIL(int ai[]) |
||
304 | throws JNCSException
|
||
305 | { |
||
306 | throw new JNCSException("Not Yet Implemented!"); |
||
307 | } |
||
308 | |||
309 | public int readLineBIL(double ad[]) |
||
310 | throws JNCSException
|
||
311 | { |
||
312 | throw new JNCSException("Not Yet Implemented!"); |
||
313 | } |
||
314 | |||
315 | public int readImageRGBA(int ai[], int i, int j) |
||
316 | throws JNCSException
|
||
317 | { |
||
318 | if(!bIsOpen)
|
||
319 | throw new JNCSFileNotOpenException("File not open"); |
||
320 | int k = ECWReadImageRGBA(ai, i, j);
|
||
321 | if(k != 0) |
||
322 | { |
||
323 | String s = JNCSError.getError(k);
|
||
324 | throw new JNCSException(s); |
||
325 | } else
|
||
326 | { |
||
327 | return 0; |
||
328 | } |
||
329 | } |
||
330 | |||
331 | /**
|
||
332 | * Obtiene una cadena que corresponde a un error a trav�s del entero que lo representa
|
||
333 | * @return String Cadena de error
|
||
334 | * @param error Entero que representa el error
|
||
335 | */
|
||
336 | |||
337 | public String getLastErrorText(int i) |
||
338 | { |
||
339 | return JNCSError.getError(i);
|
||
340 | } |
||
341 | |||
342 | /**
|
||
343 | * Convierte una coordenada del mundo real a coordenadas de la vista
|
||
344 | * @return JNCSDatasetPoint Clase que representa a un punto en la imagen
|
||
345 | * @param x Coordenada X del mundo real
|
||
346 | * @param y Coordenada Y del mundo real
|
||
347 | * @throws JNCSFileNotOpenException
|
||
348 | */
|
||
349 | |||
350 | public JNCSDatasetPoint convertWorldToDataset(double d, double d1) |
||
351 | throws JNCSFileNotOpenException
|
||
352 | { |
||
353 | int i;
|
||
354 | int j;
|
||
355 | if(bIsOpen)
|
||
356 | { |
||
357 | i = (int)Math.round((d - originX) / cellIncrementX); |
||
358 | j = (int)Math.round((d1 - originY) / cellIncrementY); |
||
359 | } else
|
||
360 | { |
||
361 | throw new JNCSFileNotOpenException(); |
||
362 | } |
||
363 | return new JNCSDatasetPoint(i, j); |
||
364 | } |
||
365 | |||
366 | /**
|
||
367 | * Convierte una coordenada de la vista a coordenadas del mundo real
|
||
368 | * @return JNCSWorldPoint Clase que representa una coordenada del mundo real
|
||
369 | * @param x Coordenada X de la imagen
|
||
370 | * @param y Coordenada Y de la imagen
|
||
371 | * @throws JNCSFileNotOpenException
|
||
372 | */
|
||
373 | |||
374 | public JNCSWorldPoint convertDatasetToWorld(int i, int j) |
||
375 | throws JNCSFileNotOpenException
|
||
376 | { |
||
377 | double d;
|
||
378 | double d1;
|
||
379 | if(bIsOpen)
|
||
380 | { |
||
381 | d = originX + (double)i * cellIncrementX;
|
||
382 | d1 = originY + (double)j * cellIncrementY;
|
||
383 | } else
|
||
384 | { |
||
385 | throw new JNCSFileNotOpenException(); |
||
386 | } |
||
387 | return new JNCSWorldPoint(d, d1); |
||
388 | } |
||
389 | |||
390 | public short getPercentComplete() |
||
391 | { |
||
392 | return ECWGetPercentComplete();
|
||
393 | } |
||
394 | |||
395 | /**
|
||
396 | * Obtiene una cadena con la versi�n de la libreria
|
||
397 | * @return versi�n
|
||
398 | */
|
||
399 | |||
400 | public static String getLibVersion() |
||
401 | { |
||
402 | return ECWGetLibVersion();
|
||
403 | } |
||
404 | |||
405 | private static void debug(String s) |
||
406 | { |
||
407 | if(debug)
|
||
408 | System.out.println(s);
|
||
409 | } |
||
410 | |||
411 | private static boolean bUseNativeMethods = false; |
||
412 | private static boolean bSecurityError = false; |
||
413 | private static boolean bUnsatisfiedLink = false; |
||
414 | static boolean bHaveClassInit = false; |
||
415 | static boolean debug = false; |
||
416 | public static final int ECW_CELL_UNITS_INVALID = 0; |
||
417 | public static final int ECW_CELL_UNITS_METERS = 1; |
||
418 | public static final int ECW_CELL_UNITS_DEGREES = 2; |
||
419 | public static final int ECW_CELL_UNITS_FEET = 3; |
||
420 | public int numBands; |
||
421 | public int width; |
||
422 | public int height; |
||
423 | public double originX; |
||
424 | public double originY; |
||
425 | public double cellIncrementX; |
||
426 | public double cellIncrementY; |
||
427 | public int cellSizeUnits; |
||
428 | public double compressionRate; |
||
429 | public boolean progressive; |
||
430 | public String fileName; |
||
431 | public String datum; |
||
432 | public String projection; |
||
433 | public boolean bIsOpen; |
||
434 | private long nativeDataPointer; |
||
435 | private static final boolean doGarbageCollectionOnClose = false; |
||
436 | private static final int ECW_OK = 0; |
||
437 | private int nFileSetViewDatasetTLX; |
||
438 | private int nFileSetViewDatasetTLY; |
||
439 | private int nFileSetViewDatasetBRX; |
||
440 | private int nFileSetViewDatasetBRY; |
||
441 | private int nFileSetViewWidth; |
||
442 | private int nFileSetViewHeight; |
||
443 | private double dFileSetViewWorldTLX; |
||
444 | private double dFileSetViewWorldTLY; |
||
445 | private double dFileSetViewWorldBRX; |
||
446 | private double dFileSetViewWorldBRY; |
||
447 | private boolean bSetViewIsWorld; |
||
448 | protected JNCSProgressiveUpdate progImageClient;
|
||
449 | |||
450 | } |