source: branches/4.2/components/bio-formats/src/loci/formats/in/loci_formats_in_LegacyND2Reader.cpp @ 6026

Revision 6026, 10.6 KB checked in by melissa, 10 years ago (diff)

Merging cleanup branch back into trunk.

Line 
1#include <jni.h>
2#include "loci_formats_in_LegacyND2Reader.h"
3#include <stdio.h>
4#include "jp2sdk.h"
5
6#define UNICODE
7#define _UNICODE
8
9IJp2InputFile* nd2File = NULL;
10
11/*
12 * Class:     loci_formats_in_LegacyND2Reader
13 * Method:    openFile
14 * Signature: (Ljava/lang/String;)V
15 */
16JNIEXPORT void JNICALL Java_loci_formats_in_LegacyND2Reader_openFile
17  (JNIEnv *env, jobject obj, jstring filename)
18{
19  // convert filename to UTF-8
20  int length = env->GetStringLength(filename);
21  const jchar *str = env->GetStringChars(filename, 0);
22  nd2File = CreateJp2InputFile(str);
23  env->ReleaseStringChars(filename, str);
24}
25
26/*
27 * Class:     loci_formats_in_LegacyND2Reader
28 * Method:    getNumSeries
29 * Signature: ()I
30 */
31JNIEXPORT jint JNICALL Java_loci_formats_in_LegacyND2Reader_getNumSeries
32  (JNIEnv *env, jobject obj)
33{
34  if (nd2File == NULL) return -1;
35  int numDimensions = nd2File->GetDimensionCount();
36  for (int i=0; i<numDimensions; i++) {
37    if (nd2File->GetSeqType(i) == nd2File->Multipoint) {
38      return nd2File->GetSeqCount(i);
39    }
40  }
41  return 1;
42}
43
44/*
45 * Class:     loci_formats_in_LegacyND2Reader
46 * Method:    getWidth
47 * Signature: (I)I
48 */
49JNIEXPORT jint JNICALL Java_loci_formats_in_LegacyND2Reader_getWidth
50  (JNIEnv *env, jobject obj, jint series)
51{
52  if (nd2File == NULL) return -1;
53  unsigned long int uid = getUID(series);
54  unsigned long int width;
55  unsigned long int extra;
56  nd2File->GetImageAttributes(uid, width, extra, extra, extra, extra);
57  return (int) width;
58}
59
60/*
61 * Class:     loci_formats_in_LegacyND2Reader
62 * Method:    getHeight
63 * Signature: (I)I
64 */
65JNIEXPORT jint JNICALL Java_loci_formats_in_LegacyND2Reader_getHeight
66  (JNIEnv *env, jobject obj, jint series)
67{
68  if (nd2File == NULL) return -1;
69  unsigned long int uid = getUID(series);
70  unsigned long int height;
71  unsigned long int extra;
72  nd2File->GetImageAttributes(uid, extra, extra, height, extra, extra);
73  return (int) height;
74}
75
76/*
77 * Class:     loci_formats_in_LegacyND2Reader
78 * Method:    getZSlices
79 * Signature: (I)I
80 */
81JNIEXPORT jint JNICALL Java_loci_formats_in_LegacyND2Reader_getZSlices
82  (JNIEnv *env, jobject obj, jint series)
83{
84  if (nd2File == NULL) return -1;
85  int numDimensions = nd2File->GetDimensionCount();
86  for (int i=0; i<numDimensions; i++) {
87    if (nd2File->GetSeqType(i) == nd2File->ZSeries) {
88      return nd2File->GetSeqCount(i);
89    }
90  }
91  return 1;
92}
93
94/*
95 * Class:     loci_formats_in_LegacyND2Reader
96 * Method:    getTFrames
97 * Signature: (I)I
98 */
99JNIEXPORT jint JNICALL Java_loci_formats_in_LegacyND2Reader_getTFrames
100  (JNIEnv *env, jobject obj, jint series)
101{
102  if (nd2File == NULL) return -1;
103  int numDimensions = nd2File->GetDimensionCount();
104  for (int i=0; i<numDimensions; i++) {
105    if (nd2File->GetSeqType(i) == nd2File->Timelapse) {
106      return nd2File->GetSeqCount(i);
107        }
108  }
109  return 1;
110}
111
112/*
113 * Class:     loci_formats_in_LegacyND2Reader
114 * Method:    getChannels
115 * Signature: (I)I
116 */
117JNIEXPORT jint JNICALL Java_loci_formats_in_LegacyND2Reader_getChannels
118  (JNIEnv *env, jobject obj, jint series)
119{
120  if (nd2File == NULL) return -1;
121  int numDimensions = nd2File->GetDimensionCount();
122  for (int i=0; i<numDimensions; i++) {
123    if (nd2File->GetSeqType(i) == nd2File->Wavelength) {
124      return nd2File->GetSeqCount(i);
125    }
126  }
127
128  return 1;
129}
130
131/*
132 * Class:     loci_formats_in_LegacyND2Reader
133 * Method:    getBytesPerPixel
134 * Signature: (I)I
135 */
136JNIEXPORT jint JNICALL Java_loci_formats_in_LegacyND2Reader_getBytesPerPixel
137  (JNIEnv *env, jobject obj, jint series)
138{
139  if (nd2File == NULL) return -1;
140  unsigned long int uid = getUID(series);
141  unsigned long bytes;
142  unsigned long width;
143  unsigned long int extra;
144  nd2File->GetImageAttributes(uid, width, bytes, extra, extra, extra);
145  return bytes / width;
146}
147
148/*
149 * Class:     loci_formats_in_LegacyND2Reader
150 * Method:    getImage
151 * Signature: ([BIIII)[B
152 */
153JNIEXPORT jbyteArray JNICALL Java_loci_formats_in_LegacyND2Reader_getImage
154  (JNIEnv *env, jobject obj, jbyteArray buffer, jint series, jint z, jint c,
155  jint t)
156{
157  if (nd2File != NULL) {
158    int numDimensions = nd2File->GetDimensionCount();
159    unsigned long int *pos = new unsigned long int[numDimensions];
160    for (int i=0; i<numDimensions; i++) {
161      switch (nd2File->GetSeqType(i)) {
162                case nd2File->Multipoint:
163          pos[i] = series;
164          break;
165                case nd2File->ZSeries:
166          pos[i] = z;
167          break;
168                case nd2File->Wavelength:
169          pos[i] = c;
170          break;
171                case nd2File->Timelapse:
172          pos[i] = t;
173          break;
174        default:
175          pos[i] = 0;
176      }
177    }
178    unsigned long int uid = nd2File->GetImageID(pos);
179    unsigned long bytes;
180    unsigned long width;
181    unsigned long height;
182    unsigned long channels;
183        unsigned long extra;
184    nd2File->GetImageAttributes(uid, width, bytes, height, channels, extra);
185
186        bytes /= (width * channels);
187
188        unsigned long len = width * height * channels;
189
190    if (bytes == 1) {
191      unsigned char *buf = new unsigned char[len];
192      nd2File->GetImageData(uid, buf);
193
194      jbyte *body = env->GetByteArrayElements(buffer, 0);
195      for (int i=0; i<len; i++) {
196        body[i] = buf[i];
197      }
198      env->ReleaseByteArrayElements(buffer, body, 0);
199    }
200    else if (bytes == 2) {
201      unsigned short *buf = new unsigned short[len];
202      nd2File->GetImageData(uid, buf);
203
204          jbyte *body = env->GetByteArrayElements(buffer, 0);
205          for (int i=0; i<len; i++) {
206                body[i*2 + 1] = (buf[i] >> 8) & 0xff;
207                body[i*2] = buf[i] & 0xff;
208          }
209          env->ReleaseByteArrayElements(buffer, body, 0);
210        }
211        else if (bytes == 4)  {
212          unsigned long *buf = new unsigned long[len];
213          nd2File->GetImageData(uid, buf);
214       
215          jbyte *body = env->GetByteArrayElements(buffer, 0);
216          for (unsigned long i=0; i<len; i++) {
217                body[i*4 + 3] = (buf[i] >> 24) & 0xff;
218                body[i*4 + 2] = (buf[i] >> 16) & 0xff;
219                body[i*4 + 1] = (buf[i] >> 8) & 0xff;
220                body[i*4] = buf[i] & 0xff;
221          }
222          env->ReleaseByteArrayElements(buffer, body, 0);
223        }
224  }
225  return buffer;
226}
227
228/*
229 * Class:     loci_formats_in_LegacyND2Reader
230 * Method:    getDX
231 * Signature: (IIII)D
232 */
233JNIEXPORT jdouble JNICALL Java_loci_formats_in_LegacyND2Reader_getDX
234  (JNIEnv *env, jobject obj, jint series, jint z, jint c, jint t)
235{
236  if (nd2File == NULL) return -1;
237  unsigned long int uid = getUID(series);
238  double extra;
239  double rtn;
240  nd2File->GetImageCoordinates(uid, rtn, extra, extra);
241  return rtn;
242}
243
244/*
245 * Class:     loci_formats_in_LegacyND2Reader
246 * Method:    getDY
247 * Signature: (IIII)D
248 */
249JNIEXPORT jdouble JNICALL Java_loci_formats_in_LegacyND2Reader_getDY
250  (JNIEnv *env, jobject obj, jint series, jint z, jint c, jint t)
251{
252  if (nd2File == NULL) return -1;
253  unsigned long int uid = getUID(series);
254  double extra;
255  double rtn;
256  nd2File->GetImageCoordinates(uid, extra, rtn, extra);
257  return rtn;
258}
259
260/*
261 * Class:     loci_formats_in_LegacyND2Reader
262 * Method:    getDZ
263 * Signature: (IIII)D
264 */
265JNIEXPORT jdouble JNICALL Java_loci_formats_in_LegacyND2Reader_getDZ
266  (JNIEnv *env, jobject obj, jint series, jint z, jint c, jint t)
267{
268  if (nd2File == NULL) return -1;
269  unsigned long int uid = getUID(series);
270  double extra;
271  double rtn;
272  nd2File->GetImageCoordinates(uid, extra, extra, rtn);
273  return rtn;
274}
275
276/*
277 * Class:     loci_formats_in_LegacyND2Reader
278 * Method:    getDT
279 * Signature: (IIII)D
280 */
281JNIEXPORT jdouble JNICALL Java_loci_formats_in_LegacyND2Reader_getDT
282  (JNIEnv *env, jobject obj, jint series, jint z, jint c, jint t)
283{
284  if (nd2File == NULL) return -1;
285  unsigned long int uid = getUID(series);
286  double rtn;
287  nd2File->GetImageTime(uid, rtn);
288  return rtn;
289}
290
291/*
292 * Class:     loci_formats_in_LegacyND2Reader
293 * Method:    getWavelength
294 * Signature: (IIII)D
295 */
296JNIEXPORT jdouble JNICALL Java_loci_formats_in_LegacyND2Reader_getWavelength
297  (JNIEnv *env, jobject obj, jint series, jint z, jint c, jint t)
298{
299  if (nd2File == NULL) return -1;
300  unsigned long int uid = getUID(series);
301  unsigned char extra;
302  double rtn;
303  nd2File->GetImageWavelength(uid, rtn, NULL, 0, extra, extra, extra);
304  return rtn;
305}
306
307/*
308 * Class:     loci_formats_in_LegacyND2Reader
309 * Method:    getChannelName
310 * Signature: (IIII)Ljava/lang/String;
311 */
312JNIEXPORT jstring JNICALL Java_loci_formats_in_LegacyND2Reader_getChannelName
313  (JNIEnv *env, jobject obj, jint series, jint z, jint c, jint t)
314{
315  if (nd2File == NULL) return NULL;
316  unsigned long int uid = getUID(series);
317  unsigned short int *name = new unsigned short int[512];
318  unsigned char extra;
319  double wavelength;
320  nd2File->GetImageWavelength(uid, wavelength, name, 0, extra, extra, extra);
321  return env->NewString(name, 512);
322}
323
324/*
325 * Class:     loci_formats_in_LegacyND2Reader
326 * Method:    getMagnification
327 * Signature: (IIII)D
328 */
329JNIEXPORT jdouble JNICALL Java_loci_formats_in_LegacyND2Reader_getMagnification
330  (JNIEnv *env, jobject obj, jint series, jint z, jint c, jint t)
331{
332  if (nd2File == NULL) return -1;
333  unsigned long int uid = getUID(series);
334  double extra;
335  double rtn;
336  nd2File->GetImageObjectiveInfo(uid, NULL, 0, rtn, extra, extra);
337  return rtn;
338}
339
340/*
341 * Class:     loci_formats_in_LegacyND2Reader
342 * Method:    getNA
343 * Signature: (IIII)D
344 */
345JNIEXPORT jdouble JNICALL Java_loci_formats_in_LegacyND2Reader_getNA
346  (JNIEnv *env, jobject obj, jint series, jint z, jint c, jint t)
347{
348  if (nd2File == NULL) return -1;
349  unsigned long int uid = getUID(series);
350  double extra;
351  double rtn;
352  nd2File->GetImageObjectiveInfo(uid, NULL, 0, extra, rtn, extra);
353  return rtn;
354}
355
356/*
357 * Class:     loci_formats_in_LegacyND2Reader
358 * Method:    getObjectiveName
359 * Signature: (IIII)Ljava/lang/String;
360 */
361JNIEXPORT jstring JNICALL Java_loci_formats_in_LegacyND2Reader_getObjectiveName
362  (JNIEnv *env, jobject obj, jint series, jint z, jint c, jint t)
363{
364  if (nd2File == NULL) return NULL;
365  unsigned long int uid = getUID(series);
366  unsigned short int *name = new unsigned short int[512];
367  double extra;
368  nd2File->GetImageObjectiveInfo(uid, name, 512, extra, extra, extra);
369  return env->NewString(name, 512);
370}
371
372/*
373 * Class:     loci_formats_in_LegacyND2Reader
374 * Method:    getModality
375 * Signature: (IIII)I
376 */
377JNIEXPORT jint JNICALL Java_loci_formats_in_LegacyND2Reader_getModality
378  (JNIEnv *env, jobject obj, jint series, jint z, jint c, jint t)
379{
380  if (nd2File == NULL) return -1;
381  unsigned long int uid = getUID(series);
382  IJp2InputFile::eModality modality;
383  nd2File->GetImageModality(uid, modality);
384  return modality;
385}
386
387// -- Helper methods --
388
389unsigned long int getUID(int series) {
390  int numDimensions = nd2File->GetDimensionCount();
391  unsigned long int *pos = new unsigned long int[numDimensions];
392  for (int i=0; i<numDimensions; i++) {
393    if (nd2File->GetSeqType(i) == nd2File->Multipoint) {
394      pos[i] = series;
395    }
396    else pos[i] = 0;
397  }
398  return nd2File->GetImageID(pos);
399}
Note: See TracBrowser for help on using the repository browser.