comparison mupdf-source/platform/java/jni/helpers.c @ 2:b50eed0cc0ef upstream

ADD: MuPDF v1.26.7: the MuPDF source as downloaded by a default build of PyMuPDF 1.26.4. The directory name has changed: no version number in the expanded directory now.
author Franz Glasner <fzglas.hg@dom66.de>
date Mon, 15 Sep 2025 11:43:07 +0200
parents
children
comparison
equal deleted inserted replaced
1:1d09e1dec1d9 2:b50eed0cc0ef
1 // Copyright (C) 2025 Artifex Software, Inc.
2 //
3 // This file is part of MuPDF.
4 //
5 // MuPDF is free software: you can redistribute it and/or modify it under the
6 // terms of the GNU Affero General Public License as published by the Free
7 // Software Foundation, either version 3 of the License, or (at your option)
8 // any later version.
9 //
10 // MuPDF is distributed in the hope that it will be useful, but WITHOUT ANY
11 // WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
12 // FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for more
13 // details.
14 //
15 // You should have received a copy of the GNU Affero General Public License
16 // along with MuPDF. If not, see <https://www.gnu.org/licenses/agpl-3.0.en.html>
17 //
18 // Alternative licensing terms are available from the licensor.
19 // For commercial licensing, see <https://www.artifex.com/> or contact
20 // Artifex Software, Inc., 39 Mesa Street, Suite 108A, San Francisco,
21 // CA 94129, USA, for further information.
22
23 typedef struct {
24 JNIEnv *env;
25 jobject hits;
26 int error;
27 } search_state;
28
29 static int hit_callback(fz_context *ctx, void *opaque, int quads, fz_quad *quad)
30 {
31 search_state *state = (search_state *) opaque;
32 JNIEnv *env = state->env;
33 jobjectArray arr;
34 int i;
35 jboolean changed = JNI_FALSE;
36
37 arr = (*env)->NewObjectArray(env, quads, cls_Quad, NULL);
38 if (!arr || (*env)->ExceptionCheck(env))
39 {
40 state->error = 1;
41 return 1;
42 }
43
44 changed = (*env)->CallBooleanMethod(env, state->hits, mid_ArrayList_add, arr);
45 if (!changed || (*env)->ExceptionCheck(env))
46 {
47 state->error = 1;
48 return 1;
49 }
50
51 for (i = 0; i < quads; i++)
52 {
53 jobject jquad = to_Quad_safe(ctx, env, quad[i]);
54 if (!jquad || (*env)->ExceptionCheck(env))
55 {
56 state->error = 1;
57 return 1;
58 }
59 (*env)->SetObjectArrayElement(env, arr, i, jquad);
60 if ((*env)->ExceptionCheck(env))
61 {
62 state->error = 1;
63 return 1;
64 }
65 (*env)->DeleteLocalRef(env, jquad);
66 }
67
68 (*env)->DeleteLocalRef(env, arr);
69
70 return 0;
71 }
72
73 typedef struct resources_stack
74 {
75 struct resources_stack *next;
76 pdf_obj *resources;
77 } resources_stack;
78
79 typedef struct
80 {
81 pdf_processor super;
82 resources_stack *rstack;
83 int extgstate;
84
85 JNIEnv *env;
86 jobject self;
87 } pdf_java_processor;
88
89 #define PROC_BEGIN(OP) \
90 jobject jproc = ((pdf_java_processor*) proc)->self; \
91 jboolean detach = JNI_FALSE; \
92 JNIEnv *env = jni_attach_thread(&detach); \
93 if (env == NULL) \
94 fz_throw(ctx, FZ_ERROR_GENERIC, "cannot attach to JVM in java_proc_%s", OP);
95
96 #define PROC_END(N) \
97 if ((*env)->ExceptionCheck(env)) \
98 fz_throw_java_and_detach_thread(ctx, env, detach); \
99 jni_detach_thread(detach);
100
101 static int java_is_ascii(unsigned char *str, size_t len)
102 {
103 size_t i, is_ascii = 1;
104 for (i = 0; i < len; ++i)
105 if (str[i] == 0 || str[i] > 127)
106 is_ascii = 0;
107 return is_ascii;
108 }
109
110 static jstring java_to_string(JNIEnv *env, fz_context *ctx, unsigned char *str, size_t len)
111 {
112 jstring jstr = (*env)->NewStringUTF(env, (char *) str);
113 if ((*env)->ExceptionCheck(env))
114 return NULL;
115 return jstr;
116 }
117
118 static jobject java_to_byte_array(JNIEnv *env, fz_context *ctx, unsigned char *str, size_t len)
119 {
120 size_t i;
121 jobject jarray = (*env)->NewByteArray(env, len);
122 if ((*env)->ExceptionCheck(env))
123 return NULL;
124 for (i = 0; i < len; ++i)
125 {
126 jbyte v = str[i];
127 (*env)->SetByteArrayRegion(env, jarray, i, 1, &v);
128 }
129 return jarray;
130 }
131
132 static void java_proc_w(fz_context *ctx, pdf_processor *proc, float linewidth)
133 {
134 PROC_BEGIN("w");
135 (*env)->CallVoidMethod(env, jproc, mid_PDFProcessor_op_w, linewidth);
136 PROC_END("w");
137 }
138
139 static void java_proc_j(fz_context *ctx, pdf_processor *proc, int linejoin)
140 {
141 PROC_BEGIN("j");
142 (*env)->CallVoidMethod(env, jproc, mid_PDFProcessor_op_j, linejoin);
143 PROC_END("j");
144 }
145
146 static void java_proc_J(fz_context *ctx, pdf_processor *proc, int linecap)
147 {
148 PROC_BEGIN("J");
149 (*env)->CallVoidMethod(env, jproc, mid_PDFProcessor_op_J, linecap);
150 PROC_END("J");
151 }
152
153 static void java_proc_M(fz_context *ctx, pdf_processor *proc, float miterlimit)
154 {
155 PROC_BEGIN("M");
156 (*env)->CallVoidMethod(env, jproc, mid_PDFProcessor_op_M, miterlimit);
157 PROC_END("M");
158 }
159
160 static void java_proc_d(fz_context *ctx, pdf_processor *proc, pdf_obj *array_, float phase)
161 {
162 jfloatArray jarray;
163 int i, n;
164 PROC_BEGIN("d");
165 n = pdf_array_len(ctx, array_);
166 jarray = (*env)->NewFloatArray(env, n);
167 if ((*env)->ExceptionCheck(env))
168 fz_throw_java_and_detach_thread(ctx, env, detach);
169 if (!jarray)
170 fz_throw(ctx, FZ_ERROR_GENERIC, "cannot allocate float array");
171 for (i = 0; i < n; i++)
172 {
173 float v = pdf_array_get_real(ctx, array_, i);
174 (*env)->SetFloatArrayRegion(env, jarray, i, 1, &v);
175 if ((*env)->ExceptionCheck(env))
176 fz_throw_java_and_detach_thread(ctx, env, detach);
177 }
178 (*env)->CallVoidMethod(env, jproc, mid_PDFProcessor_op_d, jarray, phase);
179 (*env)->DeleteLocalRef(env, jarray);
180 PROC_END("d");
181 }
182
183 static void java_proc_ri(fz_context *ctx, pdf_processor *proc, const char *intent)
184 {
185 PROC_BEGIN("i");
186 jstring jintent = (*env)->NewStringUTF(env, intent);
187 (*env)->CallVoidMethod(env, jproc, mid_PDFProcessor_op_ri, jintent);
188 (*env)->DeleteLocalRef(env, jintent);
189 PROC_END("i");
190 }
191
192 static void java_proc_i(fz_context *ctx, pdf_processor *proc, float flatness)
193 {
194 PROC_BEGIN("i");
195 (*env)->CallVoidMethod(env, jproc, mid_PDFProcessor_op_i, flatness);
196 PROC_END("i");
197 }
198
199 static void java_proc_gs_begin(fz_context *ctx, pdf_processor *proc, const char *name, pdf_obj *extgstate)
200 {
201 PROC_BEGIN("gs");
202 ((pdf_java_processor*)proc)->extgstate = 1;
203 jstring jname = (*env)->NewStringUTF(env, name);
204 jobject jextgstate = to_PDFObject_safe(ctx, env, extgstate);
205 (*env)->CallVoidMethod(env, jproc, mid_PDFProcessor_op_gs, jname, jextgstate);
206 (*env)->DeleteLocalRef(env, jextgstate);
207 (*env)->DeleteLocalRef(env, jname);
208 PROC_END("gs");
209 }
210
211 static void java_proc_gs_end(fz_context *ctx, pdf_processor *proc)
212 {
213 ((pdf_java_processor*)proc)->extgstate = 0;
214 }
215
216 static void java_proc_q(fz_context *ctx, pdf_processor *proc)
217 {
218 PROC_BEGIN("q");
219 (*env)->CallVoidMethod(env, jproc, mid_PDFProcessor_op_q);
220 PROC_END("q");
221 }
222
223 static void java_proc_Q(fz_context *ctx, pdf_processor *proc)
224 {
225 PROC_BEGIN("Q");
226 (*env)->CallVoidMethod(env, jproc, mid_PDFProcessor_op_q);
227 PROC_END("Q");
228 }
229
230 static void java_proc_cm(fz_context *ctx, pdf_processor *proc, float a, float b, float c, float d, float e, float f)
231 {
232 PROC_BEGIN("cm");
233 (*env)->CallVoidMethod(env, jproc, mid_PDFProcessor_op_cm, a, b, c, d, e, f);
234 PROC_END("cm");
235 }
236
237 static void java_proc_m(fz_context *ctx, pdf_processor *proc, float x, float y)
238 {
239 PROC_BEGIN("m");
240 (*env)->CallVoidMethod(env, jproc, mid_PDFProcessor_op_m, x, y);
241 PROC_END("m");
242 }
243
244 static void java_proc_l(fz_context *ctx, pdf_processor *proc, float x, float y)
245 {
246 PROC_BEGIN("l");
247 (*env)->CallVoidMethod(env, jproc, mid_PDFProcessor_op_l, x, y);
248 PROC_END("l");
249 }
250
251 static void java_proc_c(fz_context *ctx, pdf_processor *proc, float x1, float y1, float x2, float y2, float x3, float y3)
252 {
253 PROC_BEGIN("c");
254 (*env)->CallVoidMethod(env, jproc, mid_PDFProcessor_op_c, x1, y1, x2, y2, x3, y3);
255 PROC_END("c");
256 }
257
258 static void java_proc_v(fz_context *ctx, pdf_processor *proc, float x2, float y2, float x3, float y3)
259 {
260 PROC_BEGIN("v");
261 (*env)->CallVoidMethod(env, jproc, mid_PDFProcessor_op_v, x2, y2, x3, y3);
262 PROC_END("v");
263 }
264
265 static void java_proc_y(fz_context *ctx, pdf_processor *proc, float x1, float y1, float x3, float y3)
266 {
267 PROC_BEGIN("y");
268 (*env)->CallVoidMethod(env, jproc, mid_PDFProcessor_op_y, x1, y1, x3, y3);
269 PROC_END("y");
270 }
271
272 static void java_proc_h(fz_context *ctx, pdf_processor *proc)
273 {
274 PROC_BEGIN("h");
275 (*env)->CallVoidMethod(env, jproc, mid_PDFProcessor_op_h);
276 PROC_END("h");
277 }
278
279 static void java_proc_re(fz_context *ctx, pdf_processor *proc, float x, float y, float w, float h)
280 {
281 PROC_BEGIN("re");
282 (*env)->CallVoidMethod(env, jproc, mid_PDFProcessor_op_re, x, y, w, h);
283 PROC_END("re");
284 }
285
286 static void java_proc_S(fz_context *ctx, pdf_processor *proc)
287 {
288 PROC_BEGIN("S");
289 (*env)->CallVoidMethod(env, jproc, mid_PDFProcessor_op_S);
290 PROC_END("S");
291 }
292
293 static void java_proc_s(fz_context *ctx, pdf_processor *proc)
294 {
295 PROC_BEGIN("s");
296 (*env)->CallVoidMethod(env, jproc, mid_PDFProcessor_op_s);
297 PROC_END("s");
298 }
299
300 static void java_proc_F(fz_context *ctx, pdf_processor *proc)
301 {
302 PROC_BEGIN("F");
303 (*env)->CallVoidMethod(env, jproc, mid_PDFProcessor_op_F);
304 PROC_END("F");
305 }
306
307 static void java_proc_f(fz_context *ctx, pdf_processor *proc)
308 {
309 PROC_BEGIN("f");
310 (*env)->CallVoidMethod(env, jproc, mid_PDFProcessor_op_f);
311 PROC_END("f");
312 }
313
314 static void java_proc_fstar(fz_context *ctx, pdf_processor *proc)
315 {
316 PROC_BEGIN("fstar");
317 (*env)->CallVoidMethod(env, jproc, mid_PDFProcessor_op_fstar);
318 PROC_END("fstar");
319 }
320
321 static void java_proc_B(fz_context *ctx, pdf_processor *proc)
322 {
323 PROC_BEGIN("B");
324 (*env)->CallVoidMethod(env, jproc, mid_PDFProcessor_op_B);
325 PROC_END("B");
326 }
327
328 static void java_proc_Bstar(fz_context *ctx, pdf_processor *proc)
329 {
330 PROC_BEGIN("Bstar");
331 (*env)->CallVoidMethod(env, jproc, mid_PDFProcessor_op_Bstar);
332 PROC_END("Bstar");
333 }
334
335 static void java_proc_b(fz_context *ctx, pdf_processor *proc)
336 {
337 PROC_BEGIN("b");
338 (*env)->CallVoidMethod(env, jproc, mid_PDFProcessor_op_b);
339 PROC_END("b");
340 }
341
342 static void java_proc_bstar(fz_context *ctx, pdf_processor *proc)
343 {
344 PROC_BEGIN("bstar");
345 (*env)->CallVoidMethod(env, jproc, mid_PDFProcessor_op_bstar);
346 PROC_END("bstar");
347 }
348
349 static void java_proc_n(fz_context *ctx, pdf_processor *proc)
350 {
351 PROC_BEGIN("n");
352 (*env)->CallVoidMethod(env, jproc, mid_PDFProcessor_op_n);
353 PROC_END("n");
354 }
355
356 static void java_proc_W(fz_context *ctx, pdf_processor *proc)
357 {
358 PROC_BEGIN("W");
359 (*env)->CallVoidMethod(env, jproc, mid_PDFProcessor_op_W);
360 PROC_END("W");
361 }
362
363 static void java_proc_Wstar(fz_context *ctx, pdf_processor *proc)
364 {
365 PROC_BEGIN("Wstar");
366 (*env)->CallVoidMethod(env, jproc, mid_PDFProcessor_op_Wstar);
367 PROC_END("Wstar");
368 }
369
370 static void java_proc_BT(fz_context *ctx, pdf_processor *proc)
371 {
372 PROC_BEGIN("BT");
373 (*env)->CallVoidMethod(env, jproc, mid_PDFProcessor_op_BT);
374 PROC_END("BT");
375 }
376
377 static void java_proc_ET(fz_context *ctx, pdf_processor *proc)
378 {
379 PROC_BEGIN("ET");
380 (*env)->CallVoidMethod(env, jproc, mid_PDFProcessor_op_ET);
381 PROC_END("ET");
382 }
383
384 static void java_proc_Tc(fz_context *ctx, pdf_processor *proc, float charspace)
385 {
386 PROC_BEGIN("Tc");
387 (*env)->CallVoidMethod(env, jproc, mid_PDFProcessor_op_Tc, charspace);
388 PROC_END("Tc");
389 }
390
391 static void java_proc_Tw(fz_context *ctx, pdf_processor *proc, float wordspace)
392 {
393 PROC_BEGIN("Tw");
394 (*env)->CallVoidMethod(env, jproc, mid_PDFProcessor_op_Tw, wordspace);
395 PROC_END("Tw");
396 }
397
398 static void java_proc_Tz(fz_context *ctx, pdf_processor *proc, float scale)
399 {
400 PROC_BEGIN("Tz");
401 (*env)->CallVoidMethod(env, jproc, mid_PDFProcessor_op_Tz, scale);
402 PROC_END("Tz");
403 }
404
405 static void java_proc_TL(fz_context *ctx, pdf_processor *proc, float leading)
406 {
407 PROC_BEGIN("TL");
408 (*env)->CallVoidMethod(env, jproc, mid_PDFProcessor_op_TL, leading);
409 PROC_END("TL");
410 }
411
412 static void java_proc_Tf(fz_context *ctx, pdf_processor *proc, const char *name, pdf_font_desc *font, float size)
413 {
414 if (!((pdf_java_processor*) proc)->extgstate)
415 {
416 jobject jname;
417 PROC_BEGIN("Tf");
418 jname = (*env)->NewStringUTF(env, name);
419 (*env)->CallVoidMethod(env, jproc, mid_PDFProcessor_op_Tf, jname, size);
420 (*env)->DeleteLocalRef(env, jname);
421 PROC_END("Tf");
422 }
423 }
424
425 static void java_proc_Tr(fz_context *ctx, pdf_processor *proc, int render)
426 {
427 PROC_BEGIN("Tr");
428 (*env)->CallVoidMethod(env, jproc, mid_PDFProcessor_op_Tr, render);
429 PROC_END("Tr");
430 }
431
432 static void java_proc_Ts(fz_context *ctx, pdf_processor *proc, float rise)
433 {
434 PROC_BEGIN("Ts");
435 (*env)->CallVoidMethod(env, jproc, mid_PDFProcessor_op_Ts, rise);
436 PROC_END("Ts");
437 }
438
439 static void java_proc_Td(fz_context *ctx, pdf_processor *proc, float tx, float ty)
440 {
441 PROC_BEGIN("Td");
442 (*env)->CallVoidMethod(env, jproc, mid_PDFProcessor_op_Td, tx, ty);
443 PROC_END("Td");
444 }
445
446 static void java_proc_TD(fz_context *ctx, pdf_processor *proc, float tx, float ty)
447 {
448 PROC_BEGIN("TD");
449 (*env)->CallVoidMethod(env, jproc, mid_PDFProcessor_op_TD, tx, ty);
450 PROC_END("TD");
451 }
452
453 static void java_proc_Tm(fz_context *ctx, pdf_processor *proc, float a, float b, float c, float d, float e, float f)
454 {
455 PROC_BEGIN("Tm");
456 (*env)->CallVoidMethod(env, jproc, mid_PDFProcessor_op_Tm, a, b, c, d, e, f);
457 PROC_END("Tm");
458 }
459
460 static void java_proc_Tstar(fz_context *ctx, pdf_processor *proc)
461 {
462 PROC_BEGIN("Tstar");
463 (*env)->CallVoidMethod(env, jproc, mid_PDFProcessor_op_Tstar);
464 PROC_END("Tstar");
465 }
466
467 static void java_proc_TJ(fz_context *ctx, pdf_processor *proc, pdf_obj *array)
468 {
469 PROC_BEGIN("TJ");
470 int i, n = pdf_array_len(ctx, array);
471 pdf_obj *obj;
472 jobject jarray = (*env)->NewObjectArray(env, n, cls_Object, NULL);
473 for (i = 0; i < n; i++)
474 {
475 jobject jelem;
476 obj = pdf_array_get(ctx, array, i);
477 if (pdf_is_number(ctx, obj))
478 jelem = (*env)->NewObject(env, cls_Float, mid_Float_init, pdf_to_real(ctx, obj));
479 else
480 {
481 char *str = pdf_to_str_buf(ctx, obj);
482 size_t len = pdf_to_str_len(ctx, obj);
483 if (java_is_ascii((unsigned char *) str, len))
484 jelem = java_to_string(env, ctx, (unsigned char *) str, len);
485 else
486 jelem = java_to_byte_array(env, ctx, (unsigned char *) str, len);
487 if (!jelem)
488 fz_throw_java_and_detach_thread(ctx, env, detach);
489 }
490 (*env)->SetObjectArrayElement(env, jarray, i, jelem);
491 (*env)->DeleteLocalRef(env, jelem);
492 }
493 (*env)->CallVoidMethod(env, jproc, mid_PDFProcessor_op_TJ, jarray);
494 (*env)->DeleteLocalRef(env, jarray);
495 PROC_END("TJ");
496 }
497
498 static void java_proc_Tj(fz_context *ctx, pdf_processor *proc, char *str, size_t len)
499 {
500 PROC_BEGIN("Tj");
501
502 if (java_is_ascii((unsigned char *) str, len))
503 {
504 jstring jstr = java_to_string(env, ctx, (unsigned char *) str, len);
505 if (!jstr)
506 fz_throw_java_and_detach_thread(ctx, env, detach);
507 (*env)->CallVoidMethod(env, jproc, mid_PDFProcessor_op_Tj_string, jstr);
508 (*env)->DeleteLocalRef(env, jstr);
509 }
510 else
511 {
512 jobject jarr = java_to_byte_array(env, ctx, (unsigned char *) str, len);
513 if (!jarr)
514 fz_throw_java_and_detach_thread(ctx, env, detach);
515 (*env)->CallVoidMethod(env, jproc, mid_PDFProcessor_op_Tj_byte_array, jarr);
516 (*env)->DeleteLocalRef(env, jarr);
517 }
518 PROC_END("Tj");
519 }
520
521 static void java_proc_squote(fz_context *ctx, pdf_processor *proc, char *str, size_t len)
522 {
523 PROC_BEGIN("dquote");
524 if (java_is_ascii((unsigned char *) str, len))
525 {
526 jstring jstr = java_to_string(env, ctx, (unsigned char *) str, len);
527 if (!jstr)
528 fz_throw_java_and_detach_thread(ctx, env, detach);
529 (*env)->CallVoidMethod(env, jproc, mid_PDFProcessor_op_squote_string, jstr);
530 (*env)->DeleteLocalRef(env, jstr);
531 }
532 else
533 {
534 jobject jarr = java_to_byte_array(env, ctx, (unsigned char *) str, len);
535 if (!jarr)
536 fz_throw_java_and_detach_thread(ctx, env, detach);
537 (*env)->CallVoidMethod(env, jproc, mid_PDFProcessor_op_squote_byte_array, jarr);
538 (*env)->DeleteLocalRef(env, jarr);
539 }
540 PROC_END("squote");
541 }
542
543 static void java_proc_dquote(fz_context *ctx, pdf_processor *proc, float aw, float ac, char *str, size_t len)
544 {
545 PROC_BEGIN("dquote");
546 if (java_is_ascii((unsigned char *) str, len))
547 {
548 jstring jstr = java_to_string(env, ctx, (unsigned char *) str, len);
549 if (!jstr)
550 fz_throw_java_and_detach_thread(ctx, env, detach);
551 (*env)->CallVoidMethod(env, jproc, mid_PDFProcessor_op_dquote_string, aw, ac, jstr);
552 (*env)->DeleteLocalRef(env, jstr);
553 }
554 else
555 {
556 jobject jarr = java_to_byte_array(env, ctx, (unsigned char *) str, len);
557 if (!jarr)
558 fz_throw_java_and_detach_thread(ctx, env, detach);
559 (*env)->CallVoidMethod(env, jproc, mid_PDFProcessor_op_dquote_byte_array, aw, ac, jarr);
560 (*env)->DeleteLocalRef(env, jarr);
561 }
562 PROC_END("dquote");
563 }
564
565 static void java_proc_d0(fz_context *ctx, pdf_processor *proc, float wx, float wy)
566 {
567 PROC_BEGIN("d0");
568 (*env)->CallVoidMethod(env, jproc, mid_PDFProcessor_op_d0, wx, wy);
569 PROC_END("d0");
570 }
571
572 static void java_proc_d1(fz_context *ctx, pdf_processor *proc,
573 float wx, float wy, float llx, float lly, float urx, float ury)
574 {
575 PROC_BEGIN("d1");
576 (*env)->CallVoidMethod(env, jproc, mid_PDFProcessor_op_d1, wx, wy, llx, lly, urx, ury);
577 PROC_END("d1");
578 }
579
580 static void java_proc_CS(fz_context *ctx, pdf_processor *proc, const char *name, fz_colorspace *cs)
581 {
582 PROC_BEGIN("CS");
583 jstring jname = (*env)->NewStringUTF(env, name);
584 jobject jcs = to_ColorSpace_safe(ctx, env, cs);
585 (*env)->CallVoidMethod(env, jproc, mid_PDFProcessor_op_CS, jname, jcs);
586 (*env)->DeleteLocalRef(env, jcs);
587 (*env)->DeleteLocalRef(env, jname);
588 PROC_END("CS");
589 }
590
591 static void java_proc_cs(fz_context *ctx, pdf_processor *proc, const char *name, fz_colorspace *cs)
592 {
593 PROC_BEGIN("cs");
594 jstring jname = (*env)->NewStringUTF(env, name);
595 jobject jcs = to_ColorSpace_safe(ctx, env, cs);
596 (*env)->CallVoidMethod(env, jproc, mid_PDFProcessor_op_cs, jname, jcs);
597 (*env)->DeleteLocalRef(env, jcs);
598 (*env)->DeleteLocalRef(env, jname);
599 PROC_END("cs");
600 }
601
602 static void java_proc_SC_pattern(fz_context *ctx, pdf_processor *proc, const char *name, pdf_pattern *pat, int n, float *color)
603 {
604 PROC_BEGIN("SC_pattern");
605 int i;
606 jstring jname = (*env)->NewStringUTF(env, name);
607 jobject jcolor = (*env)->NewFloatArray(env, n);
608 if ((*env)->ExceptionCheck(env))
609 fz_throw_java_and_detach_thread(ctx, env, detach);
610 for (i = 0; i < n; ++i)
611 (*env)->SetFloatArrayRegion(env, jcolor, i, 1, &color[i]);
612 (*env)->CallVoidMethod(env, jproc, mid_PDFProcessor_op_SC_pattern, jname, pat->id, jcolor);
613 (*env)->DeleteLocalRef(env, jcolor);
614 (*env)->DeleteLocalRef(env, jname);
615 PROC_END("SC_pattern");
616 }
617
618 static void java_proc_sc_pattern(fz_context *ctx, pdf_processor *proc, const char *name, pdf_pattern *pat, int n, float *color)
619 {
620 PROC_BEGIN("sc_pattern");
621 int i;
622 jstring jname = (*env)->NewStringUTF(env, name);
623 jobject jcolor = (*env)->NewFloatArray(env, n);
624 if ((*env)->ExceptionCheck(env))
625 fz_throw_java_and_detach_thread(ctx, env, detach);
626 for (i = 0; i < n; ++i)
627 (*env)->SetFloatArrayRegion(env, jcolor, i, 1, &color[i]);
628 (*env)->CallVoidMethod(env, jproc, mid_PDFProcessor_op_sc_pattern, jname, pat->id, jcolor);
629 (*env)->DeleteLocalRef(env, jcolor);
630 (*env)->DeleteLocalRef(env, jname);
631 PROC_END("sc_pattern");
632 }
633
634 static void java_proc_SC_shade(fz_context *ctx, pdf_processor *proc, const char *name, fz_shade *shade)
635 {
636 PROC_BEGIN("SC_shade");
637 jstring jname = (*env)->NewStringUTF(env, name);
638 (*env)->CallVoidMethod(env, jproc, mid_PDFProcessor_op_SC_shade, jname);
639 (*env)->DeleteLocalRef(env, jname);
640 PROC_END("SC_shade");
641 }
642
643 static void java_proc_sc_shade(fz_context *ctx, pdf_processor *proc, const char *name, fz_shade *shade)
644 {
645 PROC_BEGIN("sc_shade");
646 jstring jname = (*env)->NewStringUTF(env, name);
647 (*env)->CallVoidMethod(env, jproc, mid_PDFProcessor_op_sc_shade, jname);
648 (*env)->DeleteLocalRef(env, jname);
649 PROC_END("sc_shade");
650 }
651
652 static void java_proc_SC_color(fz_context *ctx, pdf_processor *proc, int n, float *color)
653 {
654 PROC_BEGIN("SC_color");
655 int i;
656 jobject jcolor = (*env)->NewFloatArray(env, n);
657 if ((*env)->ExceptionCheck(env))
658 fz_throw_java_and_detach_thread(ctx, env, detach);
659 for (i = 0; i < n; ++i)
660 (*env)->SetFloatArrayRegion(env, jcolor, i, 1, &color[i]);
661 (*env)->CallVoidMethod(env, jproc, mid_PDFProcessor_op_SC_color, jcolor);
662 (*env)->DeleteLocalRef(env, jcolor);
663 PROC_END("SC_color");
664 }
665
666 static void java_proc_sc_color(fz_context *ctx, pdf_processor *proc, int n, float *color)
667 {
668 PROC_BEGIN("sc_color");
669 int i;
670 jobject jcolor = (*env)->NewFloatArray(env, n);
671 if ((*env)->ExceptionCheck(env))
672 fz_throw_java_and_detach_thread(ctx, env, detach);
673 for (i = 0; i < n; ++i)
674 (*env)->SetFloatArrayRegion(env, jcolor, i, 1, &color[i]);
675 (*env)->CallVoidMethod(env, jproc, mid_PDFProcessor_op_sc_color, jcolor);
676 (*env)->DeleteLocalRef(env, jcolor);
677 PROC_END("sc_color");
678 }
679
680 static void java_proc_G(fz_context *ctx, pdf_processor *proc, float g)
681 {
682 PROC_BEGIN("g");
683 (*env)->CallVoidMethod(env, jproc, mid_PDFProcessor_op_g, g);
684 PROC_END("g");
685 }
686
687 static void java_proc_g(fz_context *ctx, pdf_processor *proc, float g)
688 {
689 PROC_BEGIN("G");
690 (*env)->CallVoidMethod(env, jproc, mid_PDFProcessor_op_G, g);
691 PROC_END("G");
692 }
693
694 static void java_proc_RG(fz_context *ctx, pdf_processor *proc, float r, float g, float b)
695 {
696 PROC_BEGIN("RG");
697 (*env)->CallVoidMethod(env, jproc, mid_PDFProcessor_op_RG, r, g, b);
698 PROC_END("RG");
699 }
700
701 static void java_proc_rg(fz_context *ctx, pdf_processor *proc, float r, float g, float b)
702 {
703 PROC_BEGIN("rg");
704 (*env)->CallVoidMethod(env, jproc, mid_PDFProcessor_op_rg, r, g, b);
705 PROC_END("rg");
706 }
707
708 static void java_proc_K(fz_context *ctx, pdf_processor *proc, float c, float m, float y, float k)
709 {
710 PROC_BEGIN("K");
711 (*env)->CallVoidMethod(env, jproc, mid_PDFProcessor_op_K, c, m, y, k);
712 PROC_END("K");
713 }
714
715 static void java_proc_k(fz_context *ctx, pdf_processor *proc, float c, float m, float y, float k)
716 {
717 PROC_BEGIN("k");
718 (*env)->CallVoidMethod(env, jproc, mid_PDFProcessor_op_k, c, m, y, k);
719 PROC_END("k");
720 }
721
722 static void java_proc_BI(fz_context *ctx, pdf_processor *proc, fz_image *img, const char *colorspace)
723 {
724 PROC_BEGIN("BI");
725 jobject jimg = to_Image_safe(ctx, env, img);
726 (*env)->CallVoidMethod(env, jproc, mid_PDFProcessor_op_BI, jimg);
727 (*env)->DeleteLocalRef(env, jimg);
728 PROC_END("BI");
729 }
730
731 static void java_proc_sh(fz_context *ctx, pdf_processor *proc, const char *name, fz_shade *shade)
732 {
733 PROC_BEGIN("sh");
734 jstring jname = (*env)->NewStringUTF(env, name);
735 jobject jshade = to_Shade_safe(ctx, env, shade);
736 (*env)->CallVoidMethod(env, jproc, mid_PDFProcessor_op_sh, jname, jshade);
737 (*env)->DeleteLocalRef(env, jshade);
738 (*env)->DeleteLocalRef(env, jname);
739 PROC_END("sh");
740 }
741
742 static void java_proc_Do_image(fz_context *ctx, pdf_processor *proc, const char *name, fz_image *image)
743 {
744 PROC_BEGIN("Do_image");
745 jstring jname = (*env)->NewStringUTF(env, name);
746 jobject jimage = to_Image_safe(ctx, env, image);
747 (*env)->CallVoidMethod(env, jproc, mid_PDFProcessor_op_Do_image, jname, jimage);
748 (*env)->DeleteLocalRef(env, jimage);
749 (*env)->DeleteLocalRef(env, jname);
750 PROC_END("Do_image");
751 }
752
753 static void java_proc_Do_form(fz_context *ctx, pdf_processor *proc, const char *name, pdf_obj *xobj)
754 {
755 PROC_BEGIN("Do_image");
756 jstring jname = (*env)->NewStringUTF(env, name);
757 jobject jform = to_PDFObject_safe(ctx, env, xobj);
758 jobject jres = NULL;
759 if (((pdf_java_processor *) proc)->rstack)
760 jres = to_PDFObject_safe(ctx, env, ((pdf_java_processor *) proc)->rstack->resources);
761 (*env)->CallVoidMethod(env, jproc, mid_PDFProcessor_op_Do_image, jname, jform, jres);
762 (*env)->DeleteLocalRef(env, jres);
763 (*env)->DeleteLocalRef(env, jform);
764 (*env)->DeleteLocalRef(env, jname);
765 PROC_END("Do_image");
766 }
767
768 static void java_proc_MP(fz_context *ctx, pdf_processor *proc, const char *tag)
769 {
770 PROC_BEGIN("MP");
771 jobject jtag = (*env)->NewStringUTF(env, tag);
772 (*env)->CallVoidMethod(env, jproc, mid_PDFProcessor_op_MP, jtag);
773 (*env)->DeleteLocalRef(env, jtag);
774 PROC_END("MP");
775 }
776
777 static void java_proc_DP(fz_context *ctx, pdf_processor *proc, const char *tag, pdf_obj *raw, pdf_obj *cooked)
778 {
779 PROC_BEGIN("DP");
780 jstring jtag = (*env)->NewStringUTF(env, tag);
781 jobject jraw = to_PDFObject_safe(ctx, env, raw);
782 (*env)->CallVoidMethod(env, jproc, mid_PDFProcessor_op_DP, jtag, jraw);
783 (*env)->DeleteLocalRef(env, jraw);
784 (*env)->DeleteLocalRef(env, jtag);
785 PROC_END("DP");
786 }
787
788 static void java_proc_BMC(fz_context *ctx, pdf_processor *proc, const char *tag)
789 {
790 PROC_BEGIN("BMC");
791 jstring jtag = (*env)->NewStringUTF(env, tag);
792 (*env)->CallVoidMethod(env, jproc, mid_PDFProcessor_op_BMC, jtag);
793 (*env)->DeleteLocalRef(env, jtag);
794 PROC_END("BMC");
795 }
796
797 static void java_proc_BDC(fz_context *ctx, pdf_processor *proc, const char *tag, pdf_obj *raw, pdf_obj *cooked)
798 {
799 PROC_BEGIN("BDC");
800 jstring jtag = (*env)->NewStringUTF(env, tag);
801 jobject jraw = to_PDFObject_safe(ctx, env, raw);
802 (*env)->CallVoidMethod(env, jproc, mid_PDFProcessor_op_BDC, jtag, jraw);
803 (*env)->DeleteLocalRef(env, jraw);
804 (*env)->DeleteLocalRef(env, jtag);
805 PROC_END("BDC");
806 }
807
808 static void java_proc_EMC(fz_context *ctx, pdf_processor *proc)
809 {
810 PROC_BEGIN("EMC");
811 (*env)->CallVoidMethod(env, jproc, mid_PDFProcessor_op_EMC);
812 PROC_END("EMC");
813 }
814
815 static void java_proc_BX(fz_context *ctx, pdf_processor *proc)
816 {
817 PROC_BEGIN("BX");
818 (*env)->CallVoidMethod(env, jproc, mid_PDFProcessor_op_BX);
819 PROC_END("BX");
820 }
821
822 static void java_proc_EX(fz_context *ctx, pdf_processor *proc)
823 {
824 PROC_BEGIN("EX");
825 (*env)->CallVoidMethod(env, jproc, mid_PDFProcessor_op_EX);
826 PROC_END("EX");
827 }
828
829 static void java_proc_push_resources(fz_context *ctx, pdf_processor *proc, pdf_obj *res)
830 {
831 PROC_BEGIN("pushResources");
832 jobject jres = to_PDFObject_safe(ctx, env, res);
833 (*env)->CallVoidMethod(env, jproc, mid_PDFProcessor_op_pushResources, jres);
834 (*env)->DeleteLocalRef(env, jres);
835 PROC_END("pushResources");
836 }
837
838 static pdf_obj *java_proc_pop_resources(fz_context *ctx, pdf_processor *proc)
839 {
840 PROC_BEGIN("popResources");
841 (*env)->CallVoidMethod(env, jproc, mid_PDFProcessor_op_popResources);
842 PROC_END("popResources");
843 return NULL;
844 }
845
846 static void java_proc_drop(fz_context *ctx, pdf_processor *proc)
847 {
848 pdf_java_processor *pr = (pdf_java_processor *)proc;
849
850 while (pr->rstack)
851 {
852 resources_stack *stk = pr->rstack;
853 pr->rstack = stk->next;
854 pdf_drop_obj(ctx, stk->resources);
855 fz_free(ctx, stk);
856 }
857 }
858
859 pdf_processor *make_pdf_processor(JNIEnv *env, fz_context *ctx, jobject jproc)
860 {
861 pdf_java_processor *proc = pdf_new_processor(ctx, sizeof *proc);
862 proc->super.close_processor = NULL;
863 proc->super.drop_processor = java_proc_drop;
864
865 proc->super.push_resources = java_proc_push_resources;
866 proc->super.pop_resources = java_proc_pop_resources;
867
868 /* general graphics state */
869 proc->super.op_w = java_proc_w;
870 proc->super.op_j = java_proc_j;
871 proc->super.op_J = java_proc_J;
872 proc->super.op_M = java_proc_M;
873 proc->super.op_d = java_proc_d;
874 proc->super.op_ri = java_proc_ri;
875 proc->super.op_i = java_proc_i;
876 proc->super.op_gs_begin = java_proc_gs_begin;
877 proc->super.op_gs_end = java_proc_gs_end;
878
879 /* transparency graphics state */
880 proc->super.op_gs_BM = NULL;
881 proc->super.op_gs_CA = NULL;
882 proc->super.op_gs_ca = NULL;
883 proc->super.op_gs_SMask = NULL;
884
885 /* special graphics state */
886 proc->super.op_q = java_proc_q;
887 proc->super.op_Q = java_proc_Q;
888 proc->super.op_cm = java_proc_cm;
889
890 /* path construction */
891 proc->super.op_m = java_proc_m;
892 proc->super.op_l = java_proc_l;
893 proc->super.op_c = java_proc_c;
894 proc->super.op_v = java_proc_v;
895 proc->super.op_y = java_proc_y;
896 proc->super.op_h = java_proc_h;
897 proc->super.op_re = java_proc_re;
898
899 /* path painting */
900 proc->super.op_S = java_proc_S;
901 proc->super.op_s = java_proc_s;
902 proc->super.op_F = java_proc_F;
903 proc->super.op_f = java_proc_f;
904 proc->super.op_fstar = java_proc_fstar;
905 proc->super.op_B = java_proc_B;
906 proc->super.op_Bstar = java_proc_Bstar;
907 proc->super.op_b = java_proc_b;
908 proc->super.op_bstar = java_proc_bstar;
909 proc->super.op_n = java_proc_n;
910
911 /* clipping paths */
912 proc->super.op_W = java_proc_W;
913 proc->super.op_Wstar = java_proc_Wstar;
914
915 /* text objects */
916 proc->super.op_BT = java_proc_BT;
917 proc->super.op_ET = java_proc_ET;
918
919 /* text state */
920 proc->super.op_Tc = java_proc_Tc;
921 proc->super.op_Tw = java_proc_Tw;
922 proc->super.op_Tz = java_proc_Tz;
923 proc->super.op_TL = java_proc_TL;
924 proc->super.op_Tf = java_proc_Tf;
925 proc->super.op_Tr = java_proc_Tr;
926 proc->super.op_Ts = java_proc_Ts;
927
928 /* text positioning */
929 proc->super.op_Td = java_proc_Td;
930 proc->super.op_TD = java_proc_TD;
931 proc->super.op_Tm = java_proc_Tm;
932 proc->super.op_Tstar = java_proc_Tstar;
933
934 /* text showing */
935 proc->super.op_TJ = java_proc_TJ;
936 proc->super.op_Tj = java_proc_Tj;
937 proc->super.op_squote = java_proc_squote;
938 proc->super.op_dquote = java_proc_dquote;
939
940 /* type 3 fonts */
941 proc->super.op_d0 = java_proc_d0;
942 proc->super.op_d1 = java_proc_d1;
943
944 /* color */
945 proc->super.op_CS = java_proc_CS;
946 proc->super.op_cs = java_proc_cs;
947 proc->super.op_SC_color = java_proc_SC_color;
948 proc->super.op_sc_color = java_proc_sc_color;
949 proc->super.op_SC_pattern = java_proc_SC_pattern;
950 proc->super.op_sc_pattern = java_proc_sc_pattern;
951 proc->super.op_SC_shade = java_proc_SC_shade;
952 proc->super.op_sc_shade = java_proc_sc_shade;
953
954 proc->super.op_G = java_proc_G;
955 proc->super.op_g = java_proc_g;
956 proc->super.op_RG = java_proc_RG;
957 proc->super.op_rg = java_proc_rg;
958 proc->super.op_K = java_proc_K;
959 proc->super.op_k = java_proc_k;
960
961 /* shadings, images, xobjects */
962 proc->super.op_BI = java_proc_BI;
963 proc->super.op_sh = java_proc_sh;
964 proc->super.op_Do_image = java_proc_Do_image;
965 proc->super.op_Do_form = java_proc_Do_form;
966
967 /* marked content */
968 proc->super.op_MP = java_proc_MP;
969 proc->super.op_DP = java_proc_DP;
970 proc->super.op_BMC = java_proc_BMC;
971 proc->super.op_BDC = java_proc_BDC;
972 proc->super.op_EMC = java_proc_EMC;
973
974 /* compatibility */
975 proc->super.op_BX = java_proc_BX;
976 proc->super.op_EX = java_proc_EX;
977
978 /* extgstate */
979 proc->super.op_gs_OP = NULL;
980 proc->super.op_gs_op = NULL;
981 proc->super.op_gs_OPM = NULL;
982 proc->super.op_gs_UseBlackPtComp = NULL;
983
984 proc->self = jproc;
985 proc->env = env;
986
987 return (pdf_processor*)proc;
988 }