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