| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988 |
- // Copyright (C) 2025 Artifex Software, Inc.
- //
- // This file is part of MuPDF.
- //
- // MuPDF is free software: you can redistribute it and/or modify it under the
- // terms of the GNU Affero General Public License as published by the Free
- // Software Foundation, either version 3 of the License, or (at your option)
- // any later version.
- //
- // MuPDF is distributed in the hope that it will be useful, but WITHOUT ANY
- // WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
- // FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for more
- // details.
- //
- // You should have received a copy of the GNU Affero General Public License
- // along with MuPDF. If not, see <https://www.gnu.org/licenses/agpl-3.0.en.html>
- //
- // Alternative licensing terms are available from the licensor.
- // For commercial licensing, see <https://www.artifex.com/> or contact
- // Artifex Software, Inc., 39 Mesa Street, Suite 108A, San Francisco,
- // CA 94129, USA, for further information.
- typedef struct {
- JNIEnv *env;
- jobject hits;
- int error;
- } search_state;
- static int hit_callback(fz_context *ctx, void *opaque, int quads, fz_quad *quad)
- {
- search_state *state = (search_state *) opaque;
- JNIEnv *env = state->env;
- jobjectArray arr;
- int i;
- jboolean changed = JNI_FALSE;
- arr = (*env)->NewObjectArray(env, quads, cls_Quad, NULL);
- if (!arr || (*env)->ExceptionCheck(env))
- {
- state->error = 1;
- return 1;
- }
- changed = (*env)->CallBooleanMethod(env, state->hits, mid_ArrayList_add, arr);
- if (!changed || (*env)->ExceptionCheck(env))
- {
- state->error = 1;
- return 1;
- }
- for (i = 0; i < quads; i++)
- {
- jobject jquad = to_Quad_safe(ctx, env, quad[i]);
- if (!jquad || (*env)->ExceptionCheck(env))
- {
- state->error = 1;
- return 1;
- }
- (*env)->SetObjectArrayElement(env, arr, i, jquad);
- if ((*env)->ExceptionCheck(env))
- {
- state->error = 1;
- return 1;
- }
- (*env)->DeleteLocalRef(env, jquad);
- }
- (*env)->DeleteLocalRef(env, arr);
- return 0;
- }
- typedef struct resources_stack
- {
- struct resources_stack *next;
- pdf_obj *resources;
- } resources_stack;
- typedef struct
- {
- pdf_processor super;
- resources_stack *rstack;
- int extgstate;
- JNIEnv *env;
- jobject self;
- } pdf_java_processor;
- #define PROC_BEGIN(OP) \
- jobject jproc = ((pdf_java_processor*) proc)->self; \
- jboolean detach = JNI_FALSE; \
- JNIEnv *env = jni_attach_thread(&detach); \
- if (env == NULL) \
- fz_throw(ctx, FZ_ERROR_GENERIC, "cannot attach to JVM in java_proc_%s", OP);
- #define PROC_END(N) \
- if ((*env)->ExceptionCheck(env)) \
- fz_throw_java_and_detach_thread(ctx, env, detach); \
- jni_detach_thread(detach);
- static int java_is_ascii(unsigned char *str, size_t len)
- {
- size_t i, is_ascii = 1;
- for (i = 0; i < len; ++i)
- if (str[i] == 0 || str[i] > 127)
- is_ascii = 0;
- return is_ascii;
- }
- static jstring java_to_string(JNIEnv *env, fz_context *ctx, unsigned char *str, size_t len)
- {
- jstring jstr = (*env)->NewStringUTF(env, (char *) str);
- if ((*env)->ExceptionCheck(env))
- return NULL;
- return jstr;
- }
- static jobject java_to_byte_array(JNIEnv *env, fz_context *ctx, unsigned char *str, size_t len)
- {
- size_t i;
- jobject jarray = (*env)->NewByteArray(env, len);
- if ((*env)->ExceptionCheck(env))
- return NULL;
- for (i = 0; i < len; ++i)
- {
- jbyte v = str[i];
- (*env)->SetByteArrayRegion(env, jarray, i, 1, &v);
- }
- return jarray;
- }
- static void java_proc_w(fz_context *ctx, pdf_processor *proc, float linewidth)
- {
- PROC_BEGIN("w");
- (*env)->CallVoidMethod(env, jproc, mid_PDFProcessor_op_w, linewidth);
- PROC_END("w");
- }
- static void java_proc_j(fz_context *ctx, pdf_processor *proc, int linejoin)
- {
- PROC_BEGIN("j");
- (*env)->CallVoidMethod(env, jproc, mid_PDFProcessor_op_j, linejoin);
- PROC_END("j");
- }
- static void java_proc_J(fz_context *ctx, pdf_processor *proc, int linecap)
- {
- PROC_BEGIN("J");
- (*env)->CallVoidMethod(env, jproc, mid_PDFProcessor_op_J, linecap);
- PROC_END("J");
- }
- static void java_proc_M(fz_context *ctx, pdf_processor *proc, float miterlimit)
- {
- PROC_BEGIN("M");
- (*env)->CallVoidMethod(env, jproc, mid_PDFProcessor_op_M, miterlimit);
- PROC_END("M");
- }
- static void java_proc_d(fz_context *ctx, pdf_processor *proc, pdf_obj *array_, float phase)
- {
- jfloatArray jarray;
- int i, n;
- PROC_BEGIN("d");
- n = pdf_array_len(ctx, array_);
- jarray = (*env)->NewFloatArray(env, n);
- if ((*env)->ExceptionCheck(env))
- fz_throw_java_and_detach_thread(ctx, env, detach);
- if (!jarray)
- fz_throw(ctx, FZ_ERROR_GENERIC, "cannot allocate float array");
- for (i = 0; i < n; i++)
- {
- float v = pdf_array_get_real(ctx, array_, i);
- (*env)->SetFloatArrayRegion(env, jarray, i, 1, &v);
- if ((*env)->ExceptionCheck(env))
- fz_throw_java_and_detach_thread(ctx, env, detach);
- }
- (*env)->CallVoidMethod(env, jproc, mid_PDFProcessor_op_d, jarray, phase);
- (*env)->DeleteLocalRef(env, jarray);
- PROC_END("d");
- }
- static void java_proc_ri(fz_context *ctx, pdf_processor *proc, const char *intent)
- {
- PROC_BEGIN("i");
- jstring jintent = (*env)->NewStringUTF(env, intent);
- (*env)->CallVoidMethod(env, jproc, mid_PDFProcessor_op_ri, jintent);
- (*env)->DeleteLocalRef(env, jintent);
- PROC_END("i");
- }
- static void java_proc_i(fz_context *ctx, pdf_processor *proc, float flatness)
- {
- PROC_BEGIN("i");
- (*env)->CallVoidMethod(env, jproc, mid_PDFProcessor_op_i, flatness);
- PROC_END("i");
- }
- static void java_proc_gs_begin(fz_context *ctx, pdf_processor *proc, const char *name, pdf_obj *extgstate)
- {
- PROC_BEGIN("gs");
- ((pdf_java_processor*)proc)->extgstate = 1;
- jstring jname = (*env)->NewStringUTF(env, name);
- jobject jextgstate = to_PDFObject_safe(ctx, env, extgstate);
- (*env)->CallVoidMethod(env, jproc, mid_PDFProcessor_op_gs, jname, jextgstate);
- (*env)->DeleteLocalRef(env, jextgstate);
- (*env)->DeleteLocalRef(env, jname);
- PROC_END("gs");
- }
- static void java_proc_gs_end(fz_context *ctx, pdf_processor *proc)
- {
- ((pdf_java_processor*)proc)->extgstate = 0;
- }
- static void java_proc_q(fz_context *ctx, pdf_processor *proc)
- {
- PROC_BEGIN("q");
- (*env)->CallVoidMethod(env, jproc, mid_PDFProcessor_op_q);
- PROC_END("q");
- }
- static void java_proc_Q(fz_context *ctx, pdf_processor *proc)
- {
- PROC_BEGIN("Q");
- (*env)->CallVoidMethod(env, jproc, mid_PDFProcessor_op_q);
- PROC_END("Q");
- }
- static void java_proc_cm(fz_context *ctx, pdf_processor *proc, float a, float b, float c, float d, float e, float f)
- {
- PROC_BEGIN("cm");
- (*env)->CallVoidMethod(env, jproc, mid_PDFProcessor_op_cm, a, b, c, d, e, f);
- PROC_END("cm");
- }
- static void java_proc_m(fz_context *ctx, pdf_processor *proc, float x, float y)
- {
- PROC_BEGIN("m");
- (*env)->CallVoidMethod(env, jproc, mid_PDFProcessor_op_m, x, y);
- PROC_END("m");
- }
- static void java_proc_l(fz_context *ctx, pdf_processor *proc, float x, float y)
- {
- PROC_BEGIN("l");
- (*env)->CallVoidMethod(env, jproc, mid_PDFProcessor_op_l, x, y);
- PROC_END("l");
- }
- static void java_proc_c(fz_context *ctx, pdf_processor *proc, float x1, float y1, float x2, float y2, float x3, float y3)
- {
- PROC_BEGIN("c");
- (*env)->CallVoidMethod(env, jproc, mid_PDFProcessor_op_c, x1, y1, x2, y2, x3, y3);
- PROC_END("c");
- }
- static void java_proc_v(fz_context *ctx, pdf_processor *proc, float x2, float y2, float x3, float y3)
- {
- PROC_BEGIN("v");
- (*env)->CallVoidMethod(env, jproc, mid_PDFProcessor_op_v, x2, y2, x3, y3);
- PROC_END("v");
- }
- static void java_proc_y(fz_context *ctx, pdf_processor *proc, float x1, float y1, float x3, float y3)
- {
- PROC_BEGIN("y");
- (*env)->CallVoidMethod(env, jproc, mid_PDFProcessor_op_y, x1, y1, x3, y3);
- PROC_END("y");
- }
- static void java_proc_h(fz_context *ctx, pdf_processor *proc)
- {
- PROC_BEGIN("h");
- (*env)->CallVoidMethod(env, jproc, mid_PDFProcessor_op_h);
- PROC_END("h");
- }
- static void java_proc_re(fz_context *ctx, pdf_processor *proc, float x, float y, float w, float h)
- {
- PROC_BEGIN("re");
- (*env)->CallVoidMethod(env, jproc, mid_PDFProcessor_op_re, x, y, w, h);
- PROC_END("re");
- }
- static void java_proc_S(fz_context *ctx, pdf_processor *proc)
- {
- PROC_BEGIN("S");
- (*env)->CallVoidMethod(env, jproc, mid_PDFProcessor_op_S);
- PROC_END("S");
- }
- static void java_proc_s(fz_context *ctx, pdf_processor *proc)
- {
- PROC_BEGIN("s");
- (*env)->CallVoidMethod(env, jproc, mid_PDFProcessor_op_s);
- PROC_END("s");
- }
- static void java_proc_F(fz_context *ctx, pdf_processor *proc)
- {
- PROC_BEGIN("F");
- (*env)->CallVoidMethod(env, jproc, mid_PDFProcessor_op_F);
- PROC_END("F");
- }
- static void java_proc_f(fz_context *ctx, pdf_processor *proc)
- {
- PROC_BEGIN("f");
- (*env)->CallVoidMethod(env, jproc, mid_PDFProcessor_op_f);
- PROC_END("f");
- }
- static void java_proc_fstar(fz_context *ctx, pdf_processor *proc)
- {
- PROC_BEGIN("fstar");
- (*env)->CallVoidMethod(env, jproc, mid_PDFProcessor_op_fstar);
- PROC_END("fstar");
- }
- static void java_proc_B(fz_context *ctx, pdf_processor *proc)
- {
- PROC_BEGIN("B");
- (*env)->CallVoidMethod(env, jproc, mid_PDFProcessor_op_B);
- PROC_END("B");
- }
- static void java_proc_Bstar(fz_context *ctx, pdf_processor *proc)
- {
- PROC_BEGIN("Bstar");
- (*env)->CallVoidMethod(env, jproc, mid_PDFProcessor_op_Bstar);
- PROC_END("Bstar");
- }
- static void java_proc_b(fz_context *ctx, pdf_processor *proc)
- {
- PROC_BEGIN("b");
- (*env)->CallVoidMethod(env, jproc, mid_PDFProcessor_op_b);
- PROC_END("b");
- }
- static void java_proc_bstar(fz_context *ctx, pdf_processor *proc)
- {
- PROC_BEGIN("bstar");
- (*env)->CallVoidMethod(env, jproc, mid_PDFProcessor_op_bstar);
- PROC_END("bstar");
- }
- static void java_proc_n(fz_context *ctx, pdf_processor *proc)
- {
- PROC_BEGIN("n");
- (*env)->CallVoidMethod(env, jproc, mid_PDFProcessor_op_n);
- PROC_END("n");
- }
- static void java_proc_W(fz_context *ctx, pdf_processor *proc)
- {
- PROC_BEGIN("W");
- (*env)->CallVoidMethod(env, jproc, mid_PDFProcessor_op_W);
- PROC_END("W");
- }
- static void java_proc_Wstar(fz_context *ctx, pdf_processor *proc)
- {
- PROC_BEGIN("Wstar");
- (*env)->CallVoidMethod(env, jproc, mid_PDFProcessor_op_Wstar);
- PROC_END("Wstar");
- }
- static void java_proc_BT(fz_context *ctx, pdf_processor *proc)
- {
- PROC_BEGIN("BT");
- (*env)->CallVoidMethod(env, jproc, mid_PDFProcessor_op_BT);
- PROC_END("BT");
- }
- static void java_proc_ET(fz_context *ctx, pdf_processor *proc)
- {
- PROC_BEGIN("ET");
- (*env)->CallVoidMethod(env, jproc, mid_PDFProcessor_op_ET);
- PROC_END("ET");
- }
- static void java_proc_Tc(fz_context *ctx, pdf_processor *proc, float charspace)
- {
- PROC_BEGIN("Tc");
- (*env)->CallVoidMethod(env, jproc, mid_PDFProcessor_op_Tc, charspace);
- PROC_END("Tc");
- }
- static void java_proc_Tw(fz_context *ctx, pdf_processor *proc, float wordspace)
- {
- PROC_BEGIN("Tw");
- (*env)->CallVoidMethod(env, jproc, mid_PDFProcessor_op_Tw, wordspace);
- PROC_END("Tw");
- }
- static void java_proc_Tz(fz_context *ctx, pdf_processor *proc, float scale)
- {
- PROC_BEGIN("Tz");
- (*env)->CallVoidMethod(env, jproc, mid_PDFProcessor_op_Tz, scale);
- PROC_END("Tz");
- }
- static void java_proc_TL(fz_context *ctx, pdf_processor *proc, float leading)
- {
- PROC_BEGIN("TL");
- (*env)->CallVoidMethod(env, jproc, mid_PDFProcessor_op_TL, leading);
- PROC_END("TL");
- }
- static void java_proc_Tf(fz_context *ctx, pdf_processor *proc, const char *name, pdf_font_desc *font, float size)
- {
- if (!((pdf_java_processor*) proc)->extgstate)
- {
- jobject jname;
- PROC_BEGIN("Tf");
- jname = (*env)->NewStringUTF(env, name);
- (*env)->CallVoidMethod(env, jproc, mid_PDFProcessor_op_Tf, jname, size);
- (*env)->DeleteLocalRef(env, jname);
- PROC_END("Tf");
- }
- }
- static void java_proc_Tr(fz_context *ctx, pdf_processor *proc, int render)
- {
- PROC_BEGIN("Tr");
- (*env)->CallVoidMethod(env, jproc, mid_PDFProcessor_op_Tr, render);
- PROC_END("Tr");
- }
- static void java_proc_Ts(fz_context *ctx, pdf_processor *proc, float rise)
- {
- PROC_BEGIN("Ts");
- (*env)->CallVoidMethod(env, jproc, mid_PDFProcessor_op_Ts, rise);
- PROC_END("Ts");
- }
- static void java_proc_Td(fz_context *ctx, pdf_processor *proc, float tx, float ty)
- {
- PROC_BEGIN("Td");
- (*env)->CallVoidMethod(env, jproc, mid_PDFProcessor_op_Td, tx, ty);
- PROC_END("Td");
- }
- static void java_proc_TD(fz_context *ctx, pdf_processor *proc, float tx, float ty)
- {
- PROC_BEGIN("TD");
- (*env)->CallVoidMethod(env, jproc, mid_PDFProcessor_op_TD, tx, ty);
- PROC_END("TD");
- }
- static void java_proc_Tm(fz_context *ctx, pdf_processor *proc, float a, float b, float c, float d, float e, float f)
- {
- PROC_BEGIN("Tm");
- (*env)->CallVoidMethod(env, jproc, mid_PDFProcessor_op_Tm, a, b, c, d, e, f);
- PROC_END("Tm");
- }
- static void java_proc_Tstar(fz_context *ctx, pdf_processor *proc)
- {
- PROC_BEGIN("Tstar");
- (*env)->CallVoidMethod(env, jproc, mid_PDFProcessor_op_Tstar);
- PROC_END("Tstar");
- }
- static void java_proc_TJ(fz_context *ctx, pdf_processor *proc, pdf_obj *array)
- {
- PROC_BEGIN("TJ");
- int i, n = pdf_array_len(ctx, array);
- pdf_obj *obj;
- jobject jarray = (*env)->NewObjectArray(env, n, cls_Object, NULL);
- for (i = 0; i < n; i++)
- {
- jobject jelem;
- obj = pdf_array_get(ctx, array, i);
- if (pdf_is_number(ctx, obj))
- jelem = (*env)->NewObject(env, cls_Float, mid_Float_init, pdf_to_real(ctx, obj));
- else
- {
- char *str = pdf_to_str_buf(ctx, obj);
- size_t len = pdf_to_str_len(ctx, obj);
- if (java_is_ascii((unsigned char *) str, len))
- jelem = java_to_string(env, ctx, (unsigned char *) str, len);
- else
- jelem = java_to_byte_array(env, ctx, (unsigned char *) str, len);
- if (!jelem)
- fz_throw_java_and_detach_thread(ctx, env, detach);
- }
- (*env)->SetObjectArrayElement(env, jarray, i, jelem);
- (*env)->DeleteLocalRef(env, jelem);
- }
- (*env)->CallVoidMethod(env, jproc, mid_PDFProcessor_op_TJ, jarray);
- (*env)->DeleteLocalRef(env, jarray);
- PROC_END("TJ");
- }
- static void java_proc_Tj(fz_context *ctx, pdf_processor *proc, char *str, size_t len)
- {
- PROC_BEGIN("Tj");
- if (java_is_ascii((unsigned char *) str, len))
- {
- jstring jstr = java_to_string(env, ctx, (unsigned char *) str, len);
- if (!jstr)
- fz_throw_java_and_detach_thread(ctx, env, detach);
- (*env)->CallVoidMethod(env, jproc, mid_PDFProcessor_op_Tj_string, jstr);
- (*env)->DeleteLocalRef(env, jstr);
- }
- else
- {
- jobject jarr = java_to_byte_array(env, ctx, (unsigned char *) str, len);
- if (!jarr)
- fz_throw_java_and_detach_thread(ctx, env, detach);
- (*env)->CallVoidMethod(env, jproc, mid_PDFProcessor_op_Tj_byte_array, jarr);
- (*env)->DeleteLocalRef(env, jarr);
- }
- PROC_END("Tj");
- }
- static void java_proc_squote(fz_context *ctx, pdf_processor *proc, char *str, size_t len)
- {
- PROC_BEGIN("dquote");
- if (java_is_ascii((unsigned char *) str, len))
- {
- jstring jstr = java_to_string(env, ctx, (unsigned char *) str, len);
- if (!jstr)
- fz_throw_java_and_detach_thread(ctx, env, detach);
- (*env)->CallVoidMethod(env, jproc, mid_PDFProcessor_op_squote_string, jstr);
- (*env)->DeleteLocalRef(env, jstr);
- }
- else
- {
- jobject jarr = java_to_byte_array(env, ctx, (unsigned char *) str, len);
- if (!jarr)
- fz_throw_java_and_detach_thread(ctx, env, detach);
- (*env)->CallVoidMethod(env, jproc, mid_PDFProcessor_op_squote_byte_array, jarr);
- (*env)->DeleteLocalRef(env, jarr);
- }
- PROC_END("squote");
- }
- static void java_proc_dquote(fz_context *ctx, pdf_processor *proc, float aw, float ac, char *str, size_t len)
- {
- PROC_BEGIN("dquote");
- if (java_is_ascii((unsigned char *) str, len))
- {
- jstring jstr = java_to_string(env, ctx, (unsigned char *) str, len);
- if (!jstr)
- fz_throw_java_and_detach_thread(ctx, env, detach);
- (*env)->CallVoidMethod(env, jproc, mid_PDFProcessor_op_dquote_string, aw, ac, jstr);
- (*env)->DeleteLocalRef(env, jstr);
- }
- else
- {
- jobject jarr = java_to_byte_array(env, ctx, (unsigned char *) str, len);
- if (!jarr)
- fz_throw_java_and_detach_thread(ctx, env, detach);
- (*env)->CallVoidMethod(env, jproc, mid_PDFProcessor_op_dquote_byte_array, aw, ac, jarr);
- (*env)->DeleteLocalRef(env, jarr);
- }
- PROC_END("dquote");
- }
- static void java_proc_d0(fz_context *ctx, pdf_processor *proc, float wx, float wy)
- {
- PROC_BEGIN("d0");
- (*env)->CallVoidMethod(env, jproc, mid_PDFProcessor_op_d0, wx, wy);
- PROC_END("d0");
- }
- static void java_proc_d1(fz_context *ctx, pdf_processor *proc,
- float wx, float wy, float llx, float lly, float urx, float ury)
- {
- PROC_BEGIN("d1");
- (*env)->CallVoidMethod(env, jproc, mid_PDFProcessor_op_d1, wx, wy, llx, lly, urx, ury);
- PROC_END("d1");
- }
- static void java_proc_CS(fz_context *ctx, pdf_processor *proc, const char *name, fz_colorspace *cs)
- {
- PROC_BEGIN("CS");
- jstring jname = (*env)->NewStringUTF(env, name);
- jobject jcs = to_ColorSpace_safe(ctx, env, cs);
- (*env)->CallVoidMethod(env, jproc, mid_PDFProcessor_op_CS, jname, jcs);
- (*env)->DeleteLocalRef(env, jcs);
- (*env)->DeleteLocalRef(env, jname);
- PROC_END("CS");
- }
- static void java_proc_cs(fz_context *ctx, pdf_processor *proc, const char *name, fz_colorspace *cs)
- {
- PROC_BEGIN("cs");
- jstring jname = (*env)->NewStringUTF(env, name);
- jobject jcs = to_ColorSpace_safe(ctx, env, cs);
- (*env)->CallVoidMethod(env, jproc, mid_PDFProcessor_op_cs, jname, jcs);
- (*env)->DeleteLocalRef(env, jcs);
- (*env)->DeleteLocalRef(env, jname);
- PROC_END("cs");
- }
- static void java_proc_SC_pattern(fz_context *ctx, pdf_processor *proc, const char *name, pdf_pattern *pat, int n, float *color)
- {
- PROC_BEGIN("SC_pattern");
- int i;
- jstring jname = (*env)->NewStringUTF(env, name);
- jobject jcolor = (*env)->NewFloatArray(env, n);
- if ((*env)->ExceptionCheck(env))
- fz_throw_java_and_detach_thread(ctx, env, detach);
- for (i = 0; i < n; ++i)
- (*env)->SetFloatArrayRegion(env, jcolor, i, 1, &color[i]);
- (*env)->CallVoidMethod(env, jproc, mid_PDFProcessor_op_SC_pattern, jname, pat->id, jcolor);
- (*env)->DeleteLocalRef(env, jcolor);
- (*env)->DeleteLocalRef(env, jname);
- PROC_END("SC_pattern");
- }
- static void java_proc_sc_pattern(fz_context *ctx, pdf_processor *proc, const char *name, pdf_pattern *pat, int n, float *color)
- {
- PROC_BEGIN("sc_pattern");
- int i;
- jstring jname = (*env)->NewStringUTF(env, name);
- jobject jcolor = (*env)->NewFloatArray(env, n);
- if ((*env)->ExceptionCheck(env))
- fz_throw_java_and_detach_thread(ctx, env, detach);
- for (i = 0; i < n; ++i)
- (*env)->SetFloatArrayRegion(env, jcolor, i, 1, &color[i]);
- (*env)->CallVoidMethod(env, jproc, mid_PDFProcessor_op_sc_pattern, jname, pat->id, jcolor);
- (*env)->DeleteLocalRef(env, jcolor);
- (*env)->DeleteLocalRef(env, jname);
- PROC_END("sc_pattern");
- }
- static void java_proc_SC_shade(fz_context *ctx, pdf_processor *proc, const char *name, fz_shade *shade)
- {
- PROC_BEGIN("SC_shade");
- jstring jname = (*env)->NewStringUTF(env, name);
- (*env)->CallVoidMethod(env, jproc, mid_PDFProcessor_op_SC_shade, jname);
- (*env)->DeleteLocalRef(env, jname);
- PROC_END("SC_shade");
- }
- static void java_proc_sc_shade(fz_context *ctx, pdf_processor *proc, const char *name, fz_shade *shade)
- {
- PROC_BEGIN("sc_shade");
- jstring jname = (*env)->NewStringUTF(env, name);
- (*env)->CallVoidMethod(env, jproc, mid_PDFProcessor_op_sc_shade, jname);
- (*env)->DeleteLocalRef(env, jname);
- PROC_END("sc_shade");
- }
- static void java_proc_SC_color(fz_context *ctx, pdf_processor *proc, int n, float *color)
- {
- PROC_BEGIN("SC_color");
- int i;
- jobject jcolor = (*env)->NewFloatArray(env, n);
- if ((*env)->ExceptionCheck(env))
- fz_throw_java_and_detach_thread(ctx, env, detach);
- for (i = 0; i < n; ++i)
- (*env)->SetFloatArrayRegion(env, jcolor, i, 1, &color[i]);
- (*env)->CallVoidMethod(env, jproc, mid_PDFProcessor_op_SC_color, jcolor);
- (*env)->DeleteLocalRef(env, jcolor);
- PROC_END("SC_color");
- }
- static void java_proc_sc_color(fz_context *ctx, pdf_processor *proc, int n, float *color)
- {
- PROC_BEGIN("sc_color");
- int i;
- jobject jcolor = (*env)->NewFloatArray(env, n);
- if ((*env)->ExceptionCheck(env))
- fz_throw_java_and_detach_thread(ctx, env, detach);
- for (i = 0; i < n; ++i)
- (*env)->SetFloatArrayRegion(env, jcolor, i, 1, &color[i]);
- (*env)->CallVoidMethod(env, jproc, mid_PDFProcessor_op_sc_color, jcolor);
- (*env)->DeleteLocalRef(env, jcolor);
- PROC_END("sc_color");
- }
- static void java_proc_G(fz_context *ctx, pdf_processor *proc, float g)
- {
- PROC_BEGIN("g");
- (*env)->CallVoidMethod(env, jproc, mid_PDFProcessor_op_g, g);
- PROC_END("g");
- }
- static void java_proc_g(fz_context *ctx, pdf_processor *proc, float g)
- {
- PROC_BEGIN("G");
- (*env)->CallVoidMethod(env, jproc, mid_PDFProcessor_op_G, g);
- PROC_END("G");
- }
- static void java_proc_RG(fz_context *ctx, pdf_processor *proc, float r, float g, float b)
- {
- PROC_BEGIN("RG");
- (*env)->CallVoidMethod(env, jproc, mid_PDFProcessor_op_RG, r, g, b);
- PROC_END("RG");
- }
- static void java_proc_rg(fz_context *ctx, pdf_processor *proc, float r, float g, float b)
- {
- PROC_BEGIN("rg");
- (*env)->CallVoidMethod(env, jproc, mid_PDFProcessor_op_rg, r, g, b);
- PROC_END("rg");
- }
- static void java_proc_K(fz_context *ctx, pdf_processor *proc, float c, float m, float y, float k)
- {
- PROC_BEGIN("K");
- (*env)->CallVoidMethod(env, jproc, mid_PDFProcessor_op_K, c, m, y, k);
- PROC_END("K");
- }
- static void java_proc_k(fz_context *ctx, pdf_processor *proc, float c, float m, float y, float k)
- {
- PROC_BEGIN("k");
- (*env)->CallVoidMethod(env, jproc, mid_PDFProcessor_op_k, c, m, y, k);
- PROC_END("k");
- }
- static void java_proc_BI(fz_context *ctx, pdf_processor *proc, fz_image *img, const char *colorspace)
- {
- PROC_BEGIN("BI");
- jobject jimg = to_Image_safe(ctx, env, img);
- (*env)->CallVoidMethod(env, jproc, mid_PDFProcessor_op_BI, jimg);
- (*env)->DeleteLocalRef(env, jimg);
- PROC_END("BI");
- }
- static void java_proc_sh(fz_context *ctx, pdf_processor *proc, const char *name, fz_shade *shade)
- {
- PROC_BEGIN("sh");
- jstring jname = (*env)->NewStringUTF(env, name);
- jobject jshade = to_Shade_safe(ctx, env, shade);
- (*env)->CallVoidMethod(env, jproc, mid_PDFProcessor_op_sh, jname, jshade);
- (*env)->DeleteLocalRef(env, jshade);
- (*env)->DeleteLocalRef(env, jname);
- PROC_END("sh");
- }
- static void java_proc_Do_image(fz_context *ctx, pdf_processor *proc, const char *name, fz_image *image)
- {
- PROC_BEGIN("Do_image");
- jstring jname = (*env)->NewStringUTF(env, name);
- jobject jimage = to_Image_safe(ctx, env, image);
- (*env)->CallVoidMethod(env, jproc, mid_PDFProcessor_op_Do_image, jname, jimage);
- (*env)->DeleteLocalRef(env, jimage);
- (*env)->DeleteLocalRef(env, jname);
- PROC_END("Do_image");
- }
- static void java_proc_Do_form(fz_context *ctx, pdf_processor *proc, const char *name, pdf_obj *xobj)
- {
- PROC_BEGIN("Do_image");
- jstring jname = (*env)->NewStringUTF(env, name);
- jobject jform = to_PDFObject_safe(ctx, env, xobj);
- jobject jres = NULL;
- if (((pdf_java_processor *) proc)->rstack)
- jres = to_PDFObject_safe(ctx, env, ((pdf_java_processor *) proc)->rstack->resources);
- (*env)->CallVoidMethod(env, jproc, mid_PDFProcessor_op_Do_image, jname, jform, jres);
- (*env)->DeleteLocalRef(env, jres);
- (*env)->DeleteLocalRef(env, jform);
- (*env)->DeleteLocalRef(env, jname);
- PROC_END("Do_image");
- }
- static void java_proc_MP(fz_context *ctx, pdf_processor *proc, const char *tag)
- {
- PROC_BEGIN("MP");
- jobject jtag = (*env)->NewStringUTF(env, tag);
- (*env)->CallVoidMethod(env, jproc, mid_PDFProcessor_op_MP, jtag);
- (*env)->DeleteLocalRef(env, jtag);
- PROC_END("MP");
- }
- static void java_proc_DP(fz_context *ctx, pdf_processor *proc, const char *tag, pdf_obj *raw, pdf_obj *cooked)
- {
- PROC_BEGIN("DP");
- jstring jtag = (*env)->NewStringUTF(env, tag);
- jobject jraw = to_PDFObject_safe(ctx, env, raw);
- (*env)->CallVoidMethod(env, jproc, mid_PDFProcessor_op_DP, jtag, jraw);
- (*env)->DeleteLocalRef(env, jraw);
- (*env)->DeleteLocalRef(env, jtag);
- PROC_END("DP");
- }
- static void java_proc_BMC(fz_context *ctx, pdf_processor *proc, const char *tag)
- {
- PROC_BEGIN("BMC");
- jstring jtag = (*env)->NewStringUTF(env, tag);
- (*env)->CallVoidMethod(env, jproc, mid_PDFProcessor_op_BMC, jtag);
- (*env)->DeleteLocalRef(env, jtag);
- PROC_END("BMC");
- }
- static void java_proc_BDC(fz_context *ctx, pdf_processor *proc, const char *tag, pdf_obj *raw, pdf_obj *cooked)
- {
- PROC_BEGIN("BDC");
- jstring jtag = (*env)->NewStringUTF(env, tag);
- jobject jraw = to_PDFObject_safe(ctx, env, raw);
- (*env)->CallVoidMethod(env, jproc, mid_PDFProcessor_op_BDC, jtag, jraw);
- (*env)->DeleteLocalRef(env, jraw);
- (*env)->DeleteLocalRef(env, jtag);
- PROC_END("BDC");
- }
- static void java_proc_EMC(fz_context *ctx, pdf_processor *proc)
- {
- PROC_BEGIN("EMC");
- (*env)->CallVoidMethod(env, jproc, mid_PDFProcessor_op_EMC);
- PROC_END("EMC");
- }
- static void java_proc_BX(fz_context *ctx, pdf_processor *proc)
- {
- PROC_BEGIN("BX");
- (*env)->CallVoidMethod(env, jproc, mid_PDFProcessor_op_BX);
- PROC_END("BX");
- }
- static void java_proc_EX(fz_context *ctx, pdf_processor *proc)
- {
- PROC_BEGIN("EX");
- (*env)->CallVoidMethod(env, jproc, mid_PDFProcessor_op_EX);
- PROC_END("EX");
- }
- static void java_proc_push_resources(fz_context *ctx, pdf_processor *proc, pdf_obj *res)
- {
- PROC_BEGIN("pushResources");
- jobject jres = to_PDFObject_safe(ctx, env, res);
- (*env)->CallVoidMethod(env, jproc, mid_PDFProcessor_op_pushResources, jres);
- (*env)->DeleteLocalRef(env, jres);
- PROC_END("pushResources");
- }
- static pdf_obj *java_proc_pop_resources(fz_context *ctx, pdf_processor *proc)
- {
- PROC_BEGIN("popResources");
- (*env)->CallVoidMethod(env, jproc, mid_PDFProcessor_op_popResources);
- PROC_END("popResources");
- return NULL;
- }
- static void java_proc_drop(fz_context *ctx, pdf_processor *proc)
- {
- pdf_java_processor *pr = (pdf_java_processor *)proc;
- while (pr->rstack)
- {
- resources_stack *stk = pr->rstack;
- pr->rstack = stk->next;
- pdf_drop_obj(ctx, stk->resources);
- fz_free(ctx, stk);
- }
- }
- pdf_processor *make_pdf_processor(JNIEnv *env, fz_context *ctx, jobject jproc)
- {
- pdf_java_processor *proc = pdf_new_processor(ctx, sizeof *proc);
- proc->super.close_processor = NULL;
- proc->super.drop_processor = java_proc_drop;
- proc->super.push_resources = java_proc_push_resources;
- proc->super.pop_resources = java_proc_pop_resources;
- /* general graphics state */
- proc->super.op_w = java_proc_w;
- proc->super.op_j = java_proc_j;
- proc->super.op_J = java_proc_J;
- proc->super.op_M = java_proc_M;
- proc->super.op_d = java_proc_d;
- proc->super.op_ri = java_proc_ri;
- proc->super.op_i = java_proc_i;
- proc->super.op_gs_begin = java_proc_gs_begin;
- proc->super.op_gs_end = java_proc_gs_end;
- /* transparency graphics state */
- proc->super.op_gs_BM = NULL;
- proc->super.op_gs_CA = NULL;
- proc->super.op_gs_ca = NULL;
- proc->super.op_gs_SMask = NULL;
- /* special graphics state */
- proc->super.op_q = java_proc_q;
- proc->super.op_Q = java_proc_Q;
- proc->super.op_cm = java_proc_cm;
- /* path construction */
- proc->super.op_m = java_proc_m;
- proc->super.op_l = java_proc_l;
- proc->super.op_c = java_proc_c;
- proc->super.op_v = java_proc_v;
- proc->super.op_y = java_proc_y;
- proc->super.op_h = java_proc_h;
- proc->super.op_re = java_proc_re;
- /* path painting */
- proc->super.op_S = java_proc_S;
- proc->super.op_s = java_proc_s;
- proc->super.op_F = java_proc_F;
- proc->super.op_f = java_proc_f;
- proc->super.op_fstar = java_proc_fstar;
- proc->super.op_B = java_proc_B;
- proc->super.op_Bstar = java_proc_Bstar;
- proc->super.op_b = java_proc_b;
- proc->super.op_bstar = java_proc_bstar;
- proc->super.op_n = java_proc_n;
- /* clipping paths */
- proc->super.op_W = java_proc_W;
- proc->super.op_Wstar = java_proc_Wstar;
- /* text objects */
- proc->super.op_BT = java_proc_BT;
- proc->super.op_ET = java_proc_ET;
- /* text state */
- proc->super.op_Tc = java_proc_Tc;
- proc->super.op_Tw = java_proc_Tw;
- proc->super.op_Tz = java_proc_Tz;
- proc->super.op_TL = java_proc_TL;
- proc->super.op_Tf = java_proc_Tf;
- proc->super.op_Tr = java_proc_Tr;
- proc->super.op_Ts = java_proc_Ts;
- /* text positioning */
- proc->super.op_Td = java_proc_Td;
- proc->super.op_TD = java_proc_TD;
- proc->super.op_Tm = java_proc_Tm;
- proc->super.op_Tstar = java_proc_Tstar;
- /* text showing */
- proc->super.op_TJ = java_proc_TJ;
- proc->super.op_Tj = java_proc_Tj;
- proc->super.op_squote = java_proc_squote;
- proc->super.op_dquote = java_proc_dquote;
- /* type 3 fonts */
- proc->super.op_d0 = java_proc_d0;
- proc->super.op_d1 = java_proc_d1;
- /* color */
- proc->super.op_CS = java_proc_CS;
- proc->super.op_cs = java_proc_cs;
- proc->super.op_SC_color = java_proc_SC_color;
- proc->super.op_sc_color = java_proc_sc_color;
- proc->super.op_SC_pattern = java_proc_SC_pattern;
- proc->super.op_sc_pattern = java_proc_sc_pattern;
- proc->super.op_SC_shade = java_proc_SC_shade;
- proc->super.op_sc_shade = java_proc_sc_shade;
- proc->super.op_G = java_proc_G;
- proc->super.op_g = java_proc_g;
- proc->super.op_RG = java_proc_RG;
- proc->super.op_rg = java_proc_rg;
- proc->super.op_K = java_proc_K;
- proc->super.op_k = java_proc_k;
- /* shadings, images, xobjects */
- proc->super.op_BI = java_proc_BI;
- proc->super.op_sh = java_proc_sh;
- proc->super.op_Do_image = java_proc_Do_image;
- proc->super.op_Do_form = java_proc_Do_form;
- /* marked content */
- proc->super.op_MP = java_proc_MP;
- proc->super.op_DP = java_proc_DP;
- proc->super.op_BMC = java_proc_BMC;
- proc->super.op_BDC = java_proc_BDC;
- proc->super.op_EMC = java_proc_EMC;
- /* compatibility */
- proc->super.op_BX = java_proc_BX;
- proc->super.op_EX = java_proc_EX;
- /* extgstate */
- proc->super.op_gs_OP = NULL;
- proc->super.op_gs_op = NULL;
- proc->super.op_gs_OPM = NULL;
- proc->super.op_gs_UseBlackPtComp = NULL;
- proc->self = jproc;
- proc->env = env;
- return (pdf_processor*)proc;
- }
|