1 /* Conversion functions: C to Java. These all throw fitz exceptions. */
2
to_ColorSpace(fz_context * ctx,JNIEnv * env,fz_colorspace * cs)3 static inline jobject to_ColorSpace(fz_context *ctx, JNIEnv *env, fz_colorspace *cs)
4 {
5 jobject jcs;
6
7 if (!ctx || !cs) return NULL;
8
9 fz_keep_colorspace(ctx, cs);
10 jcs = (*env)->CallStaticObjectMethod(env, cls_ColorSpace, mid_ColorSpace_fromPointer, jlong_cast(cs));
11 if (!jcs)
12 fz_drop_colorspace(ctx, cs);
13 if ((*env)->ExceptionCheck(env))
14 fz_throw_java(ctx, env);
15
16 return jcs;
17 }
18
to_FitzInputStream(fz_context * ctx,JNIEnv * env,fz_stream * stm)19 static inline jobject to_FitzInputStream(fz_context *ctx, JNIEnv *env, fz_stream *stm)
20 {
21 jobject jstm;
22
23 if (!ctx || !stm) return NULL;
24
25 fz_keep_stream(ctx, stm);
26 jstm = (*env)->NewObject(env, cls_FitzInputStream, mid_FitzInputStream_init, jlong_cast(stm));
27 if (!jstm)
28 fz_drop_stream(ctx, stm);
29 if ((*env)->ExceptionCheck(env))
30 fz_throw_java(ctx, env);
31
32 return jstm;
33 }
34
to_Image(fz_context * ctx,JNIEnv * env,fz_image * img)35 static inline jobject to_Image(fz_context *ctx, JNIEnv *env, fz_image *img)
36 {
37 jobject jimg;
38
39 if (!ctx || !img) return NULL;
40
41 fz_keep_image(ctx, img);
42 jimg = (*env)->NewObject(env, cls_Image, mid_Image_init, jlong_cast(img));
43 if (!jimg)
44 fz_drop_image(ctx, img);
45 if ((*env)->ExceptionCheck(env))
46 fz_throw_java(ctx, env);
47
48 return jimg;
49 }
50
to_Matrix(fz_context * ctx,JNIEnv * env,fz_matrix mat)51 static inline jobject to_Matrix(fz_context *ctx, JNIEnv *env, fz_matrix mat)
52 {
53 jobject jctm;
54
55 if (!ctx) return NULL;
56
57 jctm = (*env)->NewObject(env, cls_Matrix, mid_Matrix_init, mat.a, mat.b, mat.c, mat.d, mat.e, mat.f);
58 if ((*env)->ExceptionCheck(env))
59 fz_throw_java(ctx, env);
60
61 return jctm;
62 }
63
to_Path(fz_context * ctx,JNIEnv * env,const fz_path * path)64 static inline jobject to_Path(fz_context *ctx, JNIEnv *env, const fz_path *path)
65 {
66 jobject jpath;
67
68 if (!ctx || !path) return NULL;
69
70 fz_keep_path(ctx, path);
71 jpath = (*env)->NewObject(env, cls_Path, mid_Path_init, jlong_cast(path));
72 if (!jpath)
73 fz_drop_path(ctx, path);
74 if ((*env)->ExceptionCheck(env))
75 fz_throw_java(ctx, env);
76
77 return jpath;
78 }
79
to_Rect(fz_context * ctx,JNIEnv * env,fz_rect rect)80 static inline jobject to_Rect(fz_context *ctx, JNIEnv *env, fz_rect rect)
81 {
82 jobject jrect;
83
84 if (!ctx) return NULL;
85
86 jrect = (*env)->NewObject(env, cls_Rect, mid_Rect_init, rect.x0, rect.y0, rect.x1, rect.y1);
87 if ((*env)->ExceptionCheck(env))
88 fz_throw_java(ctx, env);
89
90 return jrect;
91 }
92
to_Shade(fz_context * ctx,JNIEnv * env,fz_shade * shd)93 static inline jobject to_Shade(fz_context *ctx, JNIEnv *env, fz_shade *shd)
94 {
95 jobject jshd;
96
97 if (!ctx || !shd) return NULL;
98
99 fz_keep_shade(ctx, shd);
100 jshd = (*env)->NewObject(env, cls_Shade, mid_Shade_init, jlong_cast(shd));
101 if (!jshd)
102 fz_drop_shade(ctx, shd);
103 if ((*env)->ExceptionCheck(env))
104 fz_throw_java(ctx, env);
105
106 return jshd;
107 }
108
to_StrokeState(fz_context * ctx,JNIEnv * env,const fz_stroke_state * state)109 static inline jobject to_StrokeState(fz_context *ctx, JNIEnv *env, const fz_stroke_state *state)
110 {
111 jobject jstate;
112
113 if (!ctx || !state) return NULL;
114
115 fz_keep_stroke_state(ctx, state);
116 jstate = (*env)->NewObject(env, cls_StrokeState, mid_StrokeState_init, jlong_cast(state));
117 if (!jstate)
118 fz_drop_stroke_state(ctx, state);
119 if ((*env)->ExceptionCheck(env))
120 fz_throw_java(ctx, env);
121
122 return jstate;
123 }
124
to_Text(fz_context * ctx,JNIEnv * env,const fz_text * text)125 static inline jobject to_Text(fz_context *ctx, JNIEnv *env, const fz_text *text)
126 {
127 jobject jtext;
128
129 if (!ctx) return NULL;
130
131 fz_keep_text(ctx, text);
132 jtext = (*env)->NewObject(env, cls_Text, mid_Text_init, jlong_cast(text));
133 if (!jtext)
134 fz_drop_text(ctx, text);
135 if ((*env)->ExceptionCheck(env))
136 fz_throw_java(ctx, env);
137
138 return jtext;
139 }
140
to_byteArray(fz_context * ctx,JNIEnv * env,const unsigned char * arr,jint n)141 static inline jbyteArray to_byteArray(fz_context *ctx, JNIEnv *env, const unsigned char *arr, jint n)
142 {
143 jbyteArray jarr;
144
145 if (!ctx) return NULL;
146
147 jarr = (*env)->NewByteArray(env, n);
148 if ((*env)->ExceptionCheck(env))
149 fz_throw_java(ctx, env);
150 if (!jarr)
151 fz_throw(ctx, FZ_ERROR_GENERIC, "cannot allocate byte array");
152
153 (*env)->SetByteArrayRegion(env, jarr, 0, n, (jbyte *) arr);
154 if ((*env)->ExceptionCheck(env))
155 fz_throw_java(ctx, env);
156
157 return jarr;
158 }
159
to_floatArray(fz_context * ctx,JNIEnv * env,const float * arr,jint n)160 static inline jfloatArray to_floatArray(fz_context *ctx, JNIEnv *env, const float *arr, jint n)
161 {
162 jfloatArray jarr;
163
164 if (!ctx) return NULL;
165
166 jarr = (*env)->NewFloatArray(env, n);
167 if ((*env)->ExceptionCheck(env))
168 fz_throw_java(ctx, env);
169 if (!jarr)
170 fz_throw(ctx, FZ_ERROR_GENERIC, "cannot allocate float array");
171
172 (*env)->SetFloatArrayRegion(env, jarr, 0, n, arr);
173 if ((*env)->ExceptionCheck(env))
174 fz_throw_java(ctx, env);
175
176 return jarr;
177 }
178
179 /* Conversion functions: C to Java. None of these throw fitz exceptions. */
180
to_ColorParams_safe(fz_context * ctx,JNIEnv * env,fz_color_params cp)181 static inline jint to_ColorParams_safe(fz_context *ctx, JNIEnv *env, fz_color_params cp)
182 {
183 if (!ctx) return 0;
184 return (((int) (!!cp.bp)<<5) | ((int) (!!cp.op)<<6) | ((int) (!!cp.opm)<<7) | (cp.ri & 31));
185 }
186
to_ColorSpace_safe(fz_context * ctx,JNIEnv * env,fz_colorspace * cs)187 static inline jobject to_ColorSpace_safe(fz_context *ctx, JNIEnv *env, fz_colorspace *cs)
188 {
189 jobject jcs;
190
191 if (!ctx || !cs) return NULL;
192
193 fz_keep_colorspace(ctx, cs);
194 jcs = (*env)->CallStaticObjectMethod(env, cls_ColorSpace, mid_ColorSpace_fromPointer, jlong_cast(cs));
195 if (!jcs) fz_drop_colorspace(ctx, cs);
196 if ((*env)->ExceptionCheck(env)) return NULL;
197
198 return jcs;
199 }
200
to_Font_safe(fz_context * ctx,JNIEnv * env,fz_font * font)201 static inline jobject to_Font_safe(fz_context *ctx, JNIEnv *env, fz_font *font)
202 {
203 jobject jfont;
204
205 if (!ctx || !font) return NULL;
206
207 fz_keep_font(ctx, font);
208 jfont = (*env)->NewObject(env, cls_Font, mid_Font_init, jlong_cast(font));
209 if (!jfont)
210 fz_drop_font(ctx, font);
211
212 return jfont;
213 }
214
to_Image_safe(fz_context * ctx,JNIEnv * env,fz_image * img)215 static inline jobject to_Image_safe(fz_context *ctx, JNIEnv *env, fz_image *img)
216 {
217 jobject jimg;
218
219 if (!ctx || !img) return NULL;
220
221 fz_keep_image(ctx, img);
222 jimg = (*env)->NewObject(env, cls_Image, mid_Image_init, jlong_cast(img));
223 if (!jimg)
224 fz_drop_image(ctx, img);
225
226 return jimg;
227 }
228
to_Matrix_safe(fz_context * ctx,JNIEnv * env,fz_matrix mat)229 static inline jobject to_Matrix_safe(fz_context *ctx, JNIEnv *env, fz_matrix mat)
230 {
231 if (!ctx) return NULL;
232
233 return (*env)->NewObject(env, cls_Matrix, mid_Matrix_init, mat.a, mat.b, mat.c, mat.d, mat.e, mat.f);
234 }
235
to_Outline_safe(fz_context * ctx,JNIEnv * env,fz_document * doc,fz_outline * outline)236 static inline jobject to_Outline_safe(fz_context *ctx, JNIEnv *env, fz_document *doc, fz_outline *outline)
237 {
238 jobject joutline = NULL;
239 jobject jarr = NULL;
240 jsize jindex = 0;
241 jsize count = 0;
242 fz_outline *counter = outline;
243
244 if (!ctx || !outline) return NULL;
245
246 while (counter)
247 {
248 count++;
249 counter = counter->next;
250 }
251
252 jarr = (*env)->NewObjectArray(env, count, cls_Outline, NULL);
253 if (!jarr || (*env)->ExceptionCheck(env)) return NULL;
254
255 while (outline)
256 {
257 jstring jtitle = NULL;
258 jstring juri = NULL;
259 jobject jdown = NULL;
260
261 if (outline->title)
262 {
263 jtitle = (*env)->NewStringUTF(env, outline->title);
264 if (!jtitle || (*env)->ExceptionCheck(env)) return NULL;
265 }
266
267 if (outline->uri)
268 {
269 juri = (*env)->NewStringUTF(env, outline->uri);
270 if (!juri || (*env)->ExceptionCheck(env)) return NULL;
271 }
272
273 if (outline->down)
274 {
275 jdown = to_Outline_safe(ctx, env, doc, outline->down);
276 if (!jdown) return NULL;
277 }
278
279 joutline = (*env)->NewObject(env, cls_Outline, mid_Outline_init, jtitle, juri, jdown);
280 if (!joutline) return NULL;
281
282 if (jdown)
283 (*env)->DeleteLocalRef(env, jdown);
284 if (juri)
285 (*env)->DeleteLocalRef(env, juri);
286 if (jtitle)
287 (*env)->DeleteLocalRef(env, jtitle);
288
289 (*env)->SetObjectArrayElement(env, jarr, jindex++, joutline);
290 if ((*env)->ExceptionCheck(env)) return NULL;
291
292 (*env)->DeleteLocalRef(env, joutline);
293 outline = outline->next;
294 }
295
296 return jarr;
297 }
298
to_PDFAnnotation_safe(fz_context * ctx,JNIEnv * env,pdf_annot * annot)299 static inline jobject to_PDFAnnotation_safe(fz_context *ctx, JNIEnv *env, pdf_annot *annot)
300 {
301 jobject jannot;
302
303 if (!ctx || !annot) return NULL;
304
305 pdf_keep_annot(ctx, annot);
306 jannot = (*env)->NewObject(env, cls_PDFAnnotation, mid_PDFAnnotation_init, jlong_cast(annot));
307 if (!jannot)
308 pdf_drop_annot(ctx, annot);
309
310 return jannot;
311 }
312
to_PDFObject_safe(fz_context * ctx,JNIEnv * env,jobject pdf,pdf_obj * obj)313 static inline jobject to_PDFObject_safe(fz_context *ctx, JNIEnv *env, jobject pdf, pdf_obj *obj)
314 {
315 jobject jobj;
316
317 if (!ctx || !pdf) return NULL;
318
319 if (obj == NULL)
320 return (*env)->GetStaticObjectField(env, cls_PDFObject, fid_PDFObject_Null);
321
322 pdf_keep_obj(ctx, obj);
323 jobj = (*env)->NewObject(env, cls_PDFObject, mid_PDFObject_init, jlong_cast(obj), pdf);
324 if (!jobj)
325 pdf_drop_obj(ctx, obj);
326
327 return jobj;
328 }
329
to_Point_safe(fz_context * ctx,JNIEnv * env,fz_point point)330 static inline jobject to_Point_safe(fz_context *ctx, JNIEnv *env, fz_point point)
331 {
332 if (!ctx) return NULL;
333
334 return (*env)->NewObject(env, cls_Point, mid_Point_init, point.x, point.y);
335 }
336
to_Quad_safe(fz_context * ctx,JNIEnv * env,fz_quad quad)337 static inline jobject to_Quad_safe(fz_context *ctx, JNIEnv *env, fz_quad quad)
338 {
339 if (!ctx) return NULL;
340
341 return (*env)->NewObject(env, cls_Quad, mid_Quad_init,
342 quad.ul.x, quad.ul.y,
343 quad.ur.x, quad.ur.y,
344 quad.ll.x, quad.ll.y,
345 quad.lr.x, quad.lr.y);
346 }
347
to_QuadArray_safe(fz_context * ctx,JNIEnv * env,const fz_quad * quads,jint n)348 static inline jobjectArray to_QuadArray_safe(fz_context *ctx, JNIEnv *env, const fz_quad *quads, jint n)
349 {
350 jobjectArray arr;
351 int i;
352
353 if (!ctx || !quads) return NULL;
354
355 arr = (*env)->NewObjectArray(env, n, cls_Quad, NULL);
356 if (!arr || (*env)->ExceptionCheck(env)) return NULL;
357
358 for (i = 0; i < n; i++)
359 {
360 jobject jquad = to_Quad_safe(ctx, env, quads[i]);
361 if (!jquad) return NULL;
362
363 (*env)->SetObjectArrayElement(env, arr, i, jquad);
364 if ((*env)->ExceptionCheck(env)) return NULL;
365
366 (*env)->DeleteLocalRef(env, jquad);
367 }
368
369 return arr;
370 }
371
to_Rect_safe(fz_context * ctx,JNIEnv * env,fz_rect rect)372 static inline jobject to_Rect_safe(fz_context *ctx, JNIEnv *env, fz_rect rect)
373 {
374 if (!ctx) return NULL;
375
376 return (*env)->NewObject(env, cls_Rect, mid_Rect_init, rect.x0, rect.y0, rect.x1, rect.y1);
377 }
378
to_StringArray_safe(fz_context * ctx,JNIEnv * env,const char ** strings,int n)379 static inline jobjectArray to_StringArray_safe(fz_context *ctx, JNIEnv *env, const char **strings, int n)
380 {
381 jobjectArray arr;
382 int i;
383
384 if (!ctx || !strings) return NULL;
385
386 arr = (*env)->NewObjectArray(env, n, cls_String, NULL);
387 if (!arr || (*env)->ExceptionCheck(env)) return NULL;
388
389 for (i = 0; i < n; i++)
390 {
391 jstring jstring;
392
393 jstring = (*env)->NewStringUTF(env, strings[i]);
394 if (!jstring || (*env)->ExceptionCheck(env)) return NULL;
395
396 (*env)->SetObjectArrayElement(env, arr, i, jstring);
397 if ((*env)->ExceptionCheck(env)) return NULL;
398
399 (*env)->DeleteLocalRef(env, jstring);
400 }
401
402 return arr;
403 }
404
to_PDFWidget_safe(fz_context * ctx,JNIEnv * env,pdf_widget * widget)405 static inline jobject to_PDFWidget_safe(fz_context *ctx, JNIEnv *env, pdf_widget *widget)
406 {
407 jobject jwidget;
408 int nopts;
409 char **opts = NULL;
410 jobjectArray jopts = NULL;
411
412 fz_var(opts);
413
414 pdf_keep_annot(ctx, widget);
415 jwidget = (*env)->NewObject(env, cls_PDFWidget, mid_PDFWidget_init, jlong_cast(widget));
416 if (!jwidget || (*env)->ExceptionCheck(env))
417 {
418 pdf_drop_annot(ctx, widget);
419 jni_throw_null(env, "cannot wrap PDF widget in java object");
420 }
421
422 fz_try(ctx)
423 {
424 int fieldType = pdf_widget_type(ctx, widget);
425 int fieldFlags = pdf_field_flags(ctx, widget->obj);
426 (*env)->SetIntField(env, jwidget, fid_PDFWidget_fieldType, fieldType);
427 (*env)->SetIntField(env, jwidget, fid_PDFWidget_fieldFlags, fieldFlags);
428 if (fieldType == PDF_WIDGET_TYPE_TEXT)
429 {
430 (*env)->SetIntField(env, jwidget, fid_PDFWidget_maxLen, pdf_text_widget_max_len(ctx, widget));
431 (*env)->SetIntField(env, jwidget, fid_PDFWidget_textFormat, pdf_text_widget_format(ctx, widget));
432 }
433 if (fieldType == PDF_WIDGET_TYPE_COMBOBOX || fieldType == PDF_WIDGET_TYPE_LISTBOX)
434 {
435 nopts = pdf_choice_widget_options(ctx, widget, 0, NULL);
436 if (nopts > 0)
437 {
438 opts = Memento_label(fz_malloc(ctx, nopts * sizeof(*opts)), "to_PDFWidget");
439 pdf_choice_widget_options(ctx, widget, 0, (const char **)opts);
440 jopts = to_StringArray_safe(ctx, env, (const char **)opts, nopts);
441 if (!jopts || (*env)->ExceptionCheck(env))
442 fz_throw_java(ctx, env);
443 }
444 }
445 }
446 fz_always(ctx)
447 {
448 fz_free(ctx, opts);
449 }
450 fz_catch(ctx)
451 {
452 jni_rethrow(env, ctx);
453 }
454
455 (*env)->SetObjectField(env, jwidget, fid_PDFWidget_options, jopts);
456
457 return jwidget;
458 }
459
460 /* Conversion functions: C to Java. Take ownership of fitz object. None of these throw fitz exceptions. */
461
to_Document_safe_own(fz_context * ctx,JNIEnv * env,fz_document * doc)462 static inline jobject to_Document_safe_own(fz_context *ctx, JNIEnv *env, fz_document *doc)
463 {
464 jobject obj;
465 pdf_document *pdf;
466
467 if (!ctx || !doc) return NULL;
468
469 pdf = pdf_document_from_fz_document(ctx, doc);
470 if (pdf)
471 obj = (*env)->NewObject(env, cls_PDFDocument, mid_PDFDocument_init, jlong_cast(pdf));
472 else
473 obj = (*env)->NewObject(env, cls_Document, mid_Document_init, jlong_cast(doc));
474 if (!obj)
475 fz_drop_document(ctx, doc);
476
477 return obj;
478 }
479
to_Device_safe_own(fz_context * ctx,JNIEnv * env,fz_device * device)480 static inline jobject to_Device_safe_own(fz_context *ctx, JNIEnv *env, fz_device *device)
481 {
482 jobject jdev;
483
484 if (!ctx || !device) return NULL;
485
486 jdev = (*env)->NewObject(env, cls_DisplayList, mid_Device_init, jlong_cast(device));
487 if (!jdev)
488 fz_drop_device(ctx, device);
489
490 return jdev;
491 }
492
to_DisplayList_safe_own(fz_context * ctx,JNIEnv * env,fz_display_list * list)493 static inline jobject to_DisplayList_safe_own(fz_context *ctx, JNIEnv *env, fz_display_list *list)
494 {
495 jobject jlist;
496
497 if (!ctx || !list) return NULL;
498
499 jlist = (*env)->NewObject(env, cls_DisplayList, mid_DisplayList_init, jlong_cast(list));
500 if (!jlist)
501 fz_drop_display_list(ctx, list);
502
503 return jlist;
504 }
505
to_Page_safe_own(fz_context * ctx,JNIEnv * env,fz_page * page)506 static inline jobject to_Page_safe_own(fz_context *ctx, JNIEnv *env, fz_page *page)
507 {
508 jobject jobj;
509 pdf_page *ppage;
510
511 if (!ctx || !page) return NULL;
512
513 ppage = pdf_page_from_fz_page(ctx, page);
514 if (ppage)
515 jobj = (*env)->NewObject(env, cls_PDFPage, mid_PDFPage_init, jlong_cast(page));
516 else
517 jobj = (*env)->NewObject(env, cls_Page, mid_Page_init, jlong_cast(page));
518 if (!jobj)
519 fz_drop_page(ctx, page);
520
521 return jobj;
522 }
523
to_PDFAnnotation_safe_own(fz_context * ctx,JNIEnv * env,pdf_annot * annot)524 static inline jobject to_PDFAnnotation_safe_own(fz_context *ctx, JNIEnv *env, pdf_annot *annot)
525 {
526 jobject jannot;
527
528 if (!ctx || !annot) return NULL;
529
530 jannot = (*env)->NewObject(env, cls_PDFAnnotation, mid_PDFAnnotation_init, jlong_cast(annot));
531 if (!jannot)
532 pdf_drop_annot(ctx, annot);
533
534 return jannot;
535 }
536
to_PDFGraftMap_safe_own(fz_context * ctx,JNIEnv * env,jobject pdf,pdf_graft_map * map)537 static inline jobject to_PDFGraftMap_safe_own(fz_context *ctx, JNIEnv *env, jobject pdf, pdf_graft_map *map)
538 {
539 jobject jmap;
540
541 if (!ctx || !map || !pdf) return NULL;
542
543 jmap = (*env)->NewObject(env, cls_PDFGraftMap, mid_PDFGraftMap_init, jlong_cast(map), pdf);
544 if (!jmap)
545 pdf_drop_graft_map(ctx, map);
546
547 return jmap;
548 }
549
to_PDFObject_safe_own(fz_context * ctx,JNIEnv * env,jobject pdf,pdf_obj * obj)550 static inline jobject to_PDFObject_safe_own(fz_context *ctx, JNIEnv *env, jobject pdf, pdf_obj *obj)
551 {
552 jobject jobj;
553
554 if (!ctx || !obj || !pdf) return NULL;
555
556 jobj = (*env)->NewObject(env, cls_PDFObject, mid_PDFObject_init, jlong_cast(obj), pdf);
557 if (!jobj)
558 pdf_drop_obj(ctx, obj);
559
560 return jobj;
561 }
562
to_Pixmap_safe_own(fz_context * ctx,JNIEnv * env,fz_pixmap * pixmap)563 static inline jobject to_Pixmap_safe_own(fz_context *ctx, JNIEnv *env, fz_pixmap *pixmap)
564 {
565 jobject jobj;
566
567 if (!ctx || !pixmap) return NULL;
568
569 jobj = (*env)->NewObject(env, cls_Pixmap, mid_Pixmap_init, jlong_cast(pixmap));
570 if (!jobj)
571 fz_drop_pixmap(ctx, pixmap);
572
573 return jobj;
574 }
575
to_StructuredText_safe_own(fz_context * ctx,JNIEnv * env,fz_stext_page * text)576 static inline jobject to_StructuredText_safe_own(fz_context *ctx, JNIEnv *env, fz_stext_page *text)
577 {
578 jobject jtext;
579
580 if (!ctx || !text) return NULL;
581
582 jtext = (*env)->NewObject(env, cls_StructuredText, mid_StructuredText_init, jlong_cast(text));
583 if (!jtext)
584 fz_drop_stext_page(ctx, text);
585
586 return jtext;
587 }
588
589 /* Conversion functions: Java to C. These all throw java exceptions. */
590
from_Buffer(JNIEnv * env,jobject jobj)591 static inline fz_buffer *from_Buffer(JNIEnv *env, jobject jobj)
592 {
593 fz_buffer *buffer;
594 if (!jobj) return NULL;
595 buffer = CAST(fz_buffer *, (*env)->GetLongField(env, jobj, fid_Buffer_pointer));
596 if (!buffer) jni_throw_null(env, "cannot use already destroyed Buffer");
597 return buffer;
598 }
599
from_ColorSpace(JNIEnv * env,jobject jobj)600 static inline fz_colorspace *from_ColorSpace(JNIEnv *env, jobject jobj)
601 {
602 fz_colorspace *cs;
603 if (!jobj) return NULL;
604 cs = CAST(fz_colorspace *, (*env)->GetLongField(env, jobj, fid_ColorSpace_pointer));
605 if (!cs) jni_throw_null(env, "cannot use already destroyed ColorSpace");
606 return cs;
607 }
608
from_Cookie(JNIEnv * env,jobject jobj)609 static inline fz_cookie *from_Cookie(JNIEnv *env, jobject jobj)
610 {
611 fz_cookie *cookie;
612 if (!jobj) return NULL;
613 cookie = CAST(fz_cookie *, (*env)->GetLongField(env, jobj, fid_Cookie_pointer));
614 if (!cookie) jni_throw_null(env, "cannot use already destroyed Cookie");
615 return cookie;
616 }
617
from_Device(JNIEnv * env,jobject jobj)618 static fz_device *from_Device(JNIEnv *env, jobject jobj)
619 {
620 fz_device *dev;
621 if (!jobj) return NULL;
622 dev = CAST(fz_device *, (*env)->GetLongField(env, jobj, fid_Device_pointer));
623 if (!dev) jni_throw_null(env, "cannot use already destroyed Device");
624 return dev;
625 }
626
from_DisplayList(JNIEnv * env,jobject jobj)627 static inline fz_display_list *from_DisplayList(JNIEnv *env, jobject jobj)
628 {
629 fz_display_list *list;
630 if (!jobj) return NULL;
631 list = CAST(fz_display_list *, (*env)->GetLongField(env, jobj, fid_DisplayList_pointer));
632 if (!list) jni_throw_null(env, "cannot use already destroyed DisplayList");
633 return list;
634 }
635
from_Document(JNIEnv * env,jobject jobj)636 static inline fz_document *from_Document(JNIEnv *env, jobject jobj)
637 {
638 fz_document *doc;
639 if (!jobj) return NULL;
640 doc = CAST(fz_document *, (*env)->GetLongField(env, jobj, fid_Document_pointer));
641 if (!doc) jni_throw_null(env, "cannot use already destroyed Document");
642 return doc;
643 }
644
from_DocumentWriter(JNIEnv * env,jobject jobj)645 static inline fz_document_writer *from_DocumentWriter(JNIEnv *env, jobject jobj)
646 {
647 fz_document_writer *wri;
648 if (!jobj) return NULL;
649 wri = CAST(fz_document_writer *, (*env)->GetLongField(env, jobj, fid_DocumentWriter_pointer));
650 if (!wri) jni_throw_null(env, "cannot use already destroyed DocumentWriter");
651 return wri;
652 }
653
from_Font(JNIEnv * env,jobject jobj)654 static inline fz_font *from_Font(JNIEnv *env, jobject jobj)
655 {
656 fz_font *font;
657 if (!jobj) return NULL;
658 font = CAST(fz_font *, (*env)->GetLongField(env, jobj, fid_Font_pointer));
659 if (!font) jni_throw_null(env, "cannot use already destroyed Font");
660 return font;
661 }
662
from_Image(JNIEnv * env,jobject jobj)663 static inline fz_image *from_Image(JNIEnv *env, jobject jobj)
664 {
665 fz_image *image;
666 if (!jobj) return NULL;
667 image = CAST(fz_image *, (*env)->GetLongField(env, jobj, fid_Image_pointer));
668 if (!image) jni_throw_null(env, "cannot use already destroyed Image");
669 return image;
670 }
671
from_Page(JNIEnv * env,jobject jobj)672 static inline fz_page *from_Page(JNIEnv *env, jobject jobj)
673 {
674 fz_page *page;
675 if (!jobj) return NULL;
676 page = CAST(fz_page *, (*env)->GetLongField(env, jobj, fid_Page_pointer));
677 if (!page) jni_throw_null(env, "cannot use already destroyed Page");
678 return page;
679 }
680
from_Path(JNIEnv * env,jobject jobj)681 static inline fz_path *from_Path(JNIEnv *env, jobject jobj)
682 {
683 fz_path *path;
684 if (!jobj) return NULL;
685 path = CAST(fz_path *, (*env)->GetLongField(env, jobj, fid_Path_pointer));
686 if (!path) jni_throw_null(env, "cannot use already destroyed Path");
687 return path;
688 }
689
from_PDFAnnotation(JNIEnv * env,jobject jobj)690 static inline pdf_annot *from_PDFAnnotation(JNIEnv *env, jobject jobj)
691 {
692 pdf_annot *annot;
693 if (!jobj) return NULL;
694 annot = CAST(pdf_annot *, (*env)->GetLongField(env, jobj, fid_PDFAnnotation_pointer));
695 if (!annot) jni_throw_null(env, "cannot use already destroyed PDFAnnotation");
696 return annot;
697 }
698
from_PDFDocument(JNIEnv * env,jobject jobj)699 static inline pdf_document *from_PDFDocument(JNIEnv *env, jobject jobj)
700 {
701 pdf_document *pdf;
702 if (!jobj) return NULL;
703 pdf = CAST(pdf_document *, (*env)->GetLongField(env, jobj, fid_PDFDocument_pointer));
704 if (!pdf) jni_throw_null(env, "cannot use already destroyed PDFDocument");
705 return pdf;
706 }
707
from_PDFGraftMap(JNIEnv * env,jobject jobj)708 static inline pdf_graft_map *from_PDFGraftMap(JNIEnv *env, jobject jobj)
709 {
710 pdf_graft_map *map;
711 if (!jobj) return NULL;
712 map = CAST(pdf_graft_map *, (*env)->GetLongField(env, jobj, fid_PDFGraftMap_pointer));
713 if (!map) jni_throw_null(env, "cannot use already destroyed PDFGraftMap");
714 return map;
715 }
716
from_PDFObject(JNIEnv * env,jobject jobj)717 static inline pdf_obj *from_PDFObject(JNIEnv *env, jobject jobj)
718 {
719 pdf_obj *obj;
720 if (!jobj) return NULL;
721 obj = CAST(pdf_obj *, (*env)->GetLongField(env, jobj, fid_PDFObject_pointer));
722 return obj;
723 }
724
from_PDFPage(JNIEnv * env,jobject jobj)725 static inline pdf_page *from_PDFPage(JNIEnv *env, jobject jobj)
726 {
727 pdf_page *page;
728 if (!jobj) return NULL;
729 page = CAST(pdf_page *, (*env)->GetLongField(env, jobj, fid_PDFPage_pointer));
730 if (!page) jni_throw_null(env, "cannot use already destroyed PDFPage");
731 return page;
732 }
733
from_Pixmap(JNIEnv * env,jobject jobj)734 static inline fz_pixmap *from_Pixmap(JNIEnv *env, jobject jobj)
735 {
736 fz_pixmap *pixmap;
737 if (!jobj) return NULL;
738 pixmap = CAST(fz_pixmap *, (*env)->GetLongField(env, jobj, fid_Pixmap_pointer));
739 if (!pixmap) jni_throw_null(env, "cannot use already destroyed Pixmap");
740 return pixmap;
741 }
742
from_Shade(JNIEnv * env,jobject jobj)743 static inline fz_shade *from_Shade(JNIEnv *env, jobject jobj)
744 {
745 fz_shade *shd;
746 if (!jobj) return NULL;
747 shd = CAST(fz_shade *, (*env)->GetLongField(env, jobj, fid_Shade_pointer));
748 if (!shd) jni_throw_null(env, "cannot use already destroyed Shade");
749 return shd;
750 }
751
from_StrokeState(JNIEnv * env,jobject jobj)752 static inline fz_stroke_state *from_StrokeState(JNIEnv *env, jobject jobj)
753 {
754 fz_stroke_state *stroke;
755 if (!jobj) return NULL;
756 stroke = CAST(fz_stroke_state *, (*env)->GetLongField(env, jobj, fid_StrokeState_pointer));
757 if (!stroke) jni_throw_null(env, "cannot use already destroyed StrokeState");
758 return stroke;
759 }
760
from_StructuredText(JNIEnv * env,jobject jobj)761 static inline fz_stext_page *from_StructuredText(JNIEnv *env, jobject jobj)
762 {
763 fz_stext_page *stext;
764 if (!jobj) return NULL;
765 stext = CAST(fz_stext_page *, (*env)->GetLongField(env, jobj, fid_StructuredText_pointer));
766 if (!stext) jni_throw_null(env, "cannot use already destroyed StructuredText");
767 return stext;
768 }
769
from_Text(JNIEnv * env,jobject jobj)770 static inline fz_text *from_Text(JNIEnv *env, jobject jobj)
771 {
772 fz_text *text;
773 if (!jobj) return NULL;
774 text = CAST(fz_text *, (*env)->GetLongField(env, jobj, fid_Text_pointer));
775 if (!text) jni_throw_null(env, "cannot use already destroyed Text");
776 return text;
777 }
778
from_jfloatArray(JNIEnv * env,float * color,jint n,jfloatArray jcolor)779 static inline int from_jfloatArray(JNIEnv *env, float *color, jint n, jfloatArray jcolor)
780 {
781 jsize len;
782
783 if (!jcolor)
784 len = 0;
785 else
786 {
787 len = (*env)->GetArrayLength(env, jcolor);
788 if (len > n)
789 len = n;
790 (*env)->GetFloatArrayRegion(env, jcolor, 0, len, color);
791 if ((*env)->ExceptionCheck(env)) return 0;
792 }
793
794 if (len < n)
795 memset(color+len, 0, (n - len) * sizeof(float));
796
797 return 1;
798 }
799
from_Matrix(JNIEnv * env,jobject jmat)800 static inline fz_matrix from_Matrix(JNIEnv *env, jobject jmat)
801 {
802 fz_matrix mat;
803
804 if (!jmat)
805 return fz_identity;
806
807 mat.a = (*env)->GetFloatField(env, jmat, fid_Matrix_a);
808 mat.b = (*env)->GetFloatField(env, jmat, fid_Matrix_b);
809 mat.c = (*env)->GetFloatField(env, jmat, fid_Matrix_c);
810 mat.d = (*env)->GetFloatField(env, jmat, fid_Matrix_d);
811 mat.e = (*env)->GetFloatField(env, jmat, fid_Matrix_e);
812 mat.f = (*env)->GetFloatField(env, jmat, fid_Matrix_f);
813
814 return mat;
815 }
816
from_Point(JNIEnv * env,jobject jpt)817 static inline fz_point from_Point(JNIEnv *env, jobject jpt)
818 {
819 fz_point pt;
820
821 if (!jpt)
822 {
823 pt.x = pt.y = 0;
824 return pt;
825 }
826
827 pt.x = (*env)->GetFloatField(env, jpt, fid_Point_x);
828 pt.y = (*env)->GetFloatField(env, jpt, fid_Point_y);
829
830 return pt;
831 }
832
from_Rect(JNIEnv * env,jobject jrect)833 static inline fz_rect from_Rect(JNIEnv *env, jobject jrect)
834 {
835 fz_rect rect;
836
837 if (!jrect)
838 return fz_empty_rect;
839
840 rect.x0 = (*env)->GetFloatField(env, jrect, fid_Rect_x0);
841 rect.x1 = (*env)->GetFloatField(env, jrect, fid_Rect_x1);
842 rect.y0 = (*env)->GetFloatField(env, jrect, fid_Rect_y0);
843 rect.y1 = (*env)->GetFloatField(env, jrect, fid_Rect_y1);
844
845 return rect;
846 }
847
from_Quad(JNIEnv * env,jobject jquad)848 static inline fz_quad from_Quad(JNIEnv *env, jobject jquad)
849 {
850 fz_quad quad;
851
852 if (!jquad)
853 return fz_make_quad(0, 0, 0, 0, 0, 0, 0, 0);
854
855 quad.ul.x = (*env)->GetFloatField(env, jquad, fid_Quad_ul_x);
856 quad.ul.y = (*env)->GetFloatField(env, jquad, fid_Quad_ul_y);
857 quad.ur.x = (*env)->GetFloatField(env, jquad, fid_Quad_ur_x);
858 quad.ur.y = (*env)->GetFloatField(env, jquad, fid_Quad_ur_y);
859 quad.ll.x = (*env)->GetFloatField(env, jquad, fid_Quad_ll_x);
860 quad.ll.y = (*env)->GetFloatField(env, jquad, fid_Quad_ll_y);
861 quad.lr.x = (*env)->GetFloatField(env, jquad, fid_Quad_lr_x);
862 quad.lr.y = (*env)->GetFloatField(env, jquad, fid_Quad_lr_y);
863
864 return quad;
865 }
866
867
868 /* Conversion functions: Java to C. None of these throw java exceptions. */
869
from_Buffer_safe(JNIEnv * env,jobject jobj)870 static inline fz_buffer *from_Buffer_safe(JNIEnv *env, jobject jobj)
871 {
872 if (!jobj) return NULL;
873 return CAST(fz_buffer *, (*env)->GetLongField(env, jobj, fid_Buffer_pointer));
874 }
875
from_ColorParams_safe(JNIEnv * env,jint params)876 static inline fz_color_params from_ColorParams_safe(JNIEnv *env, jint params)
877 {
878 fz_color_params p;
879
880 p.bp = (params>>5) & 1;
881 p.op = (params>>6) & 1;
882 p.opm = (params>>7) & 1;
883 p.ri = (params & 31);
884
885 return p;
886 }
887
from_ColorSpace_safe(JNIEnv * env,jobject jobj)888 static inline fz_colorspace *from_ColorSpace_safe(JNIEnv *env, jobject jobj)
889 {
890 if (!jobj) return NULL;
891 return CAST(fz_colorspace *, (*env)->GetLongField(env, jobj, fid_ColorSpace_pointer));
892 }
893
from_Cookie_safe(JNIEnv * env,jobject jobj)894 static inline fz_cookie *from_Cookie_safe(JNIEnv *env, jobject jobj)
895 {
896 if (!jobj) return NULL;
897 return CAST(fz_cookie *, (*env)->GetLongField(env, jobj, fid_Cookie_pointer));
898 }
899
from_Device_safe(JNIEnv * env,jobject jobj)900 static fz_device *from_Device_safe(JNIEnv *env, jobject jobj)
901 {
902 if (!jobj) return NULL;
903 return CAST(fz_device *, (*env)->GetLongField(env, jobj, fid_Device_pointer));
904 }
905
from_DisplayList_safe(JNIEnv * env,jobject jobj)906 static inline fz_display_list *from_DisplayList_safe(JNIEnv *env, jobject jobj)
907 {
908 if (!jobj) return NULL;
909 return CAST(fz_display_list *, (*env)->GetLongField(env, jobj, fid_DisplayList_pointer));
910 }
911
from_Document_safe(JNIEnv * env,jobject jobj)912 static inline fz_document *from_Document_safe(JNIEnv *env, jobject jobj)
913 {
914 if (!jobj) return NULL;
915 return CAST(fz_document *, (*env)->GetLongField(env, jobj, fid_Document_pointer));
916 }
917
from_DocumentWriter_safe(JNIEnv * env,jobject jobj)918 static inline fz_document_writer *from_DocumentWriter_safe(JNIEnv *env, jobject jobj)
919 {
920 if (!jobj) return NULL;
921 return CAST(fz_document_writer *, (*env)->GetLongField(env, jobj, fid_DocumentWriter_pointer));
922 }
923
from_Font_safe(JNIEnv * env,jobject jobj)924 static inline fz_font *from_Font_safe(JNIEnv *env, jobject jobj)
925 {
926 if (!jobj) return NULL;
927 return CAST(fz_font *, (*env)->GetLongField(env, jobj, fid_Font_pointer));
928 }
929
from_Image_safe(JNIEnv * env,jobject jobj)930 static inline fz_image *from_Image_safe(JNIEnv *env, jobject jobj)
931 {
932 if (!jobj) return NULL;
933 return CAST(fz_image *, (*env)->GetLongField(env, jobj, fid_Image_pointer));
934 }
935
from_Page_safe(JNIEnv * env,jobject jobj)936 static inline fz_page *from_Page_safe(JNIEnv *env, jobject jobj)
937 {
938 if (!jobj) return NULL;
939 return CAST(fz_page *, (*env)->GetLongField(env, jobj, fid_Page_pointer));
940 }
941
from_Path_safe(JNIEnv * env,jobject jobj)942 static inline fz_path *from_Path_safe(JNIEnv *env, jobject jobj)
943 {
944 if (!jobj) return NULL;
945 return CAST(fz_path *, (*env)->GetLongField(env, jobj, fid_Path_pointer));
946 }
947
from_PDFAnnotation_safe(JNIEnv * env,jobject jobj)948 static inline pdf_annot *from_PDFAnnotation_safe(JNIEnv *env, jobject jobj)
949 {
950 if (!jobj) return NULL;
951 return CAST(pdf_annot *, (*env)->GetLongField(env, jobj, fid_PDFAnnotation_pointer));
952 }
953
from_PDFDocument_safe(JNIEnv * env,jobject jobj)954 static inline pdf_document *from_PDFDocument_safe(JNIEnv *env, jobject jobj)
955 {
956 if (!jobj) return NULL;
957 return CAST(pdf_document *, (*env)->GetLongField(env, jobj, fid_PDFDocument_pointer));
958 }
959
from_PDFGraftMap_safe(JNIEnv * env,jobject jobj)960 static inline pdf_graft_map *from_PDFGraftMap_safe(JNIEnv *env, jobject jobj)
961 {
962 if (!jobj) return NULL;
963 return CAST(pdf_graft_map *, (*env)->GetLongField(env, jobj, fid_PDFGraftMap_pointer));
964 }
965
from_PDFObject_safe(JNIEnv * env,jobject jobj)966 static inline pdf_obj *from_PDFObject_safe(JNIEnv *env, jobject jobj)
967 {
968 if (!jobj) return NULL;
969 return CAST(pdf_obj *, (*env)->GetLongField(env, jobj, fid_PDFObject_pointer));
970 }
971
from_PDFWidget_safe(JNIEnv * env,jobject jobj)972 static inline pdf_widget *from_PDFWidget_safe(JNIEnv *env, jobject jobj)
973 {
974 if (!jobj) return NULL;
975 return CAST(pdf_widget *, (*env)->GetLongField(env, jobj, fid_PDFWidget_pointer));
976 }
977
from_PKCS7Signer_safe(JNIEnv * env,jobject jobj)978 static inline pdf_pkcs7_signer *from_PKCS7Signer_safe(JNIEnv *env, jobject jobj)
979 {
980 if (!jobj) return NULL;
981 return CAST(pdf_pkcs7_signer *, (*env)->GetLongField(env, jobj, fid_PKCS7Signer_pointer));
982 }
983
from_PKCS7Verifier_safe(JNIEnv * env,jobject jobj)984 static inline java_pkcs7_verifier *from_PKCS7Verifier_safe(JNIEnv *env, jobject jobj)
985 {
986 if (!jobj) return NULL;
987 return CAST(java_pkcs7_verifier *, (*env)->GetLongField(env, jobj, fid_PKCS7Verifier_pointer));
988 }
989
from_FitzInputStream_safe(JNIEnv * env,jobject jobj)990 static inline fz_stream *from_FitzInputStream_safe(JNIEnv *env, jobject jobj)
991 {
992 if (!jobj) return NULL;
993 return CAST(fz_stream *, (*env)->GetLongField(env, jobj, fid_FitzInputStream_pointer));
994 }
995
from_Pixmap_safe(JNIEnv * env,jobject jobj)996 static inline fz_pixmap *from_Pixmap_safe(JNIEnv *env, jobject jobj)
997 {
998 if (!jobj) return NULL;
999 return CAST(fz_pixmap *, (*env)->GetLongField(env, jobj, fid_Pixmap_pointer));
1000 }
1001
from_Shade_safe(JNIEnv * env,jobject jobj)1002 static inline fz_shade *from_Shade_safe(JNIEnv *env, jobject jobj)
1003 {
1004 if (!jobj) return NULL;
1005 return CAST(fz_shade *, (*env)->GetLongField(env, jobj, fid_Shade_pointer));
1006 }
1007
from_StrokeState_safe(JNIEnv * env,jobject jobj)1008 static inline fz_stroke_state *from_StrokeState_safe(JNIEnv *env, jobject jobj)
1009 {
1010 if (!jobj) return NULL;
1011 return CAST(fz_stroke_state *, (*env)->GetLongField(env, jobj, fid_StrokeState_pointer));
1012 }
1013
from_StructuredText_safe(JNIEnv * env,jobject jobj)1014 static inline fz_stext_page *from_StructuredText_safe(JNIEnv *env, jobject jobj)
1015 {
1016 if (!jobj) return NULL;
1017 return CAST(fz_stext_page *, (*env)->GetLongField(env, jobj, fid_StructuredText_pointer));
1018 }
1019
from_Text_safe(JNIEnv * env,jobject jobj)1020 static inline fz_text *from_Text_safe(JNIEnv *env, jobject jobj)
1021 {
1022 if (!jobj) return NULL;
1023 return CAST(fz_text *, (*env)->GetLongField(env, jobj, fid_Text_pointer));
1024 }
1025