From 9add1e5e9ceb80afad8bda54ac34bfa8dfb59c61 Mon Sep 17 00:00:00 2001 From: Tor Andersson Date: Wed, 24 Feb 2016 13:53:18 +0100 Subject: jni: Add font and image constructors. --- platform/java/TraceDevice.java | 2 +- platform/java/com/artifex/mupdf/fitz/Font.java | 17 +++ platform/java/com/artifex/mupdf/fitz/Image.java | 23 ++- platform/java/com/artifex/mupdf/fitz/Text.java | 11 +- .../java/com/artifex/mupdf/fitz/TextWalker.java | 2 +- platform/java/mupdf_native.c | 170 ++++++++++++++++++++- platform/java/mupdf_native.h | 76 +++++++-- 7 files changed, 277 insertions(+), 24 deletions(-) (limited to 'platform/java') diff --git a/platform/java/TraceDevice.java b/platform/java/TraceDevice.java index 879a453b..ef006d8d 100644 --- a/platform/java/TraceDevice.java +++ b/platform/java/TraceDevice.java @@ -31,7 +31,7 @@ public class TraceDevice extends Device implements PathWalker, TextWalker System.out.println("closepath"); } - public void showGlyph(Font font, boolean vertical, Matrix trm, int glyph, int unicode) { + public void showGlyph(Font font, Matrix trm, int glyph, int unicode, int wmode) { System.out.println("glyph '" + (char)unicode + "' " + glyph + "\t" + font + " " + trm); } diff --git a/platform/java/com/artifex/mupdf/fitz/Font.java b/platform/java/com/artifex/mupdf/fitz/Font.java index 5b9cd8c5..2f17ba0f 100644 --- a/platform/java/com/artifex/mupdf/fitz/Font.java +++ b/platform/java/com/artifex/mupdf/fitz/Font.java @@ -11,12 +11,29 @@ public class Font pointer = 0; } + private native long newNative(String name, int index); + private Font(long p) { pointer = p; } + public Font(String name, int index) { + pointer = newNative(name, index); + } + + public Font(String name) { + pointer = newNative(name, 0); + } + public native String getName(); + public native int encodeCharacter(int unicode); + public native float advanceGlyph(int glyph, int wmode); + + public float advanceGlyph(int glyph) { + return advanceGlyph(glyph, 0); + } + public String toString() { return "Font(" + getName() + ")"; } diff --git a/platform/java/com/artifex/mupdf/fitz/Image.java b/platform/java/com/artifex/mupdf/fitz/Image.java index 4964053e..3876bc1b 100644 --- a/platform/java/com/artifex/mupdf/fitz/Image.java +++ b/platform/java/com/artifex/mupdf/fitz/Image.java @@ -11,20 +11,35 @@ public class Image pointer = 0; } + private native long newNativeFromPixmap(Pixmap pixmap); + private native long newNativeFromFile(String filename); + private Image(long p) { pointer = p; } + public Image(Pixmap pixmap) { + pointer = newNativeFromPixmap(pixmap); + } + + public Image(String filename) { + pointer = newNativeFromFile(filename); + } + public native int getWidth(); public native int getHeight(); - public native int getNumberOfComponents(); - public native int getBitsPerComponent(); public native int getXResolution(); public native int getYResolution(); + + public native int getNumberOfComponents(); + public native int getBitsPerComponent(); public native boolean getImageMask(); public native boolean getInterpolate(); public native Image getMask(); - // FIXME: Get data back? - // FIXME: Create images from data or java streams? + public native Pixmap toPixmap(int w, int h); + + public Pixmap toPixmap() { + return toPixmap(getWidth(), getHeight()); + } } diff --git a/platform/java/com/artifex/mupdf/fitz/Text.java b/platform/java/com/artifex/mupdf/fitz/Text.java index d5d9a836..4f67266e 100644 --- a/platform/java/com/artifex/mupdf/fitz/Text.java +++ b/platform/java/com/artifex/mupdf/fitz/Text.java @@ -26,9 +26,18 @@ public class Text implements TextWalker pointer = newNative(); } - public native void showGlyph(Font font, boolean vertical, Matrix trm, int glyph, int unicode); + public native void showGlyph(Font font, Matrix trm, int glyph, int unicode, int wmode); + public native void showString(Font font, Matrix trm, String string, int wmode); public native Rect getBounds(StrokeState stroke, Matrix ctm); + public void showGlyph(Font font, Matrix trm, int glyph, int unicode) { + showGlyph(font, trm, glyph, unicode, 0); + } + + public void showString(Font font, Matrix trm, String string) { + showString(font, trm, string, 0); + } + public native void walk(TextWalker walker); } diff --git a/platform/java/com/artifex/mupdf/fitz/TextWalker.java b/platform/java/com/artifex/mupdf/fitz/TextWalker.java index 99d3e150..89fe7c86 100644 --- a/platform/java/com/artifex/mupdf/fitz/TextWalker.java +++ b/platform/java/com/artifex/mupdf/fitz/TextWalker.java @@ -2,5 +2,5 @@ package com.artifex.mupdf.fitz; public interface TextWalker { - public void showGlyph(Font font, boolean vertical, Matrix trm, int glyph, int unicode); + public void showGlyph(Font font, Matrix trm, int glyph, int unicode, int wmode); } diff --git a/platform/java/mupdf_native.c b/platform/java/mupdf_native.c index b90868a7..064390e4 100644 --- a/platform/java/mupdf_native.c +++ b/platform/java/mupdf_native.c @@ -395,7 +395,7 @@ static int find_fids(JNIEnv *env) mid_Text_init = get_method(&err, env, "", "(J)V"); cls_TextWalker = get_class(&err, env, PKG"TextWalker"); - mid_TextWalker_showGlyph = get_method(&err, env, "showGlyph", "(L"PKG"Font;ZL"PKG"Matrix;II)V"); + mid_TextWalker_showGlyph = get_method(&err, env, "showGlyph", "(L"PKG"Font;L"PKG"Matrix;III)V"); cls_TryLaterException = get_class(&err, env, PKG"TryLaterException"); @@ -1374,9 +1374,11 @@ JNIEXPORT jlong JNICALL FUN(Device_newNative)(JNIEnv *env, jclass self) { fz_context *ctx = get_context(env); - fz_device *dev = NULL; + if (ctx == NULL) + return 0; + fz_try(ctx) dev = fz_new_java_device(ctx, env, self); fz_catch(ctx) @@ -2244,17 +2246,86 @@ FUN(Font_finalize)(JNIEnv *env, jobject self) fz_drop_font(ctx, font); } +JNIEXPORT jlong JNICALL +FUN(Font_newNative)(JNIEnv *env, jobject self, jstring jname, jint index) +{ + fz_context *ctx = get_context(env); + const char *name = NULL; + fz_font *font = NULL; + + if (ctx == NULL || jname == NULL) + return 0; + + name = (*env)->GetStringUTFChars(env, jname, NULL); + if (name == NULL) + return 0; + + fz_try(ctx) + { + unsigned char *data; + unsigned int size; + data = fz_lookup_base14_font(ctx, name, &size); + if (data) + font = fz_new_font_from_memory(ctx, name, data, size, index, 0); + else + font = fz_new_font_from_file(ctx, name, name, index, 0); + } + fz_always(ctx) + (*env)->ReleaseStringUTFChars(env, jname, name); + fz_catch(ctx) + jni_rethrow(env, ctx); + + return jlong_cast(font); +} + JNIEXPORT jstring JNICALL FUN(Font_getName)(JNIEnv *env, jobject self) { + fz_context *ctx = get_context(env); fz_font *font = from_Font(env, self); - if (font == NULL) + if (ctx == NULL || font == NULL) return NULL; return (*env)->NewStringUTF(env, font->name); } +JNIEXPORT jint JNICALL +FUN(Font_encodeCharacter)(JNIEnv *env, jobject self, jint unicode) +{ + fz_context *ctx = get_context(env); + fz_font *font = from_Font(env, self); + jint glyph = 0; + + if (ctx == NULL || font == NULL) + return 0; + + fz_try(ctx) + glyph = fz_encode_character(ctx, font, unicode); + fz_catch(ctx) + jni_rethrow(env, ctx); + + return glyph; +} + +JNIEXPORT jfloat JNICALL +FUN(Font_advanceGlyph)(JNIEnv *env, jobject self, jint glyph, jint wmode) +{ + fz_context *ctx = get_context(env); + fz_font *font = from_Font(env, self); + float advance = 0; + + if (ctx == NULL || font == NULL) + return 0; + + fz_try(ctx) + advance = fz_advance_glyph(ctx, font, glyph, wmode); + fz_catch(ctx) + jni_rethrow(env, ctx); + + return advance; +} + /* Pixmap Interface */ JNIEXPORT void JNICALL @@ -2956,7 +3027,7 @@ FUN(Text_getBounds)(JNIEnv *env, jobject self, jobject jstroke, jobject jctm) } JNIEXPORT void JNICALL -FUN(Text_showGlyph)(JNIEnv *env, jobject self, jobject font_, jboolean wmode, jobject matrix_, jint glyph, jint unicode) +FUN(Text_showGlyph)(JNIEnv *env, jobject self, jobject font_, jobject matrix_, jint glyph, jint unicode, jint wmode) { fz_context *ctx = get_context(env); fz_text *text = from_Text(env, self); @@ -2967,11 +3038,38 @@ FUN(Text_showGlyph)(JNIEnv *env, jobject self, jobject font_, jboolean wmode, jo return; fz_try(ctx) - fz_show_glyph(ctx, text, font, wmode, &trm, glyph, unicode); + fz_show_glyph(ctx, text, font, &trm, glyph, unicode, wmode); fz_catch(ctx) jni_rethrow(env, ctx); } +JNIEXPORT void JNICALL +FUN(Text_showString)(JNIEnv *env, jobject self, jobject font_, jobject matrix_, jstring string_, jint wmode) +{ + fz_context *ctx = get_context(env); + fz_text *text = from_Text(env, self); + fz_font *font = from_Font(env, font_); + fz_matrix trm = from_Matrix(env, matrix_); + const char *string; + + if (ctx == NULL || text == NULL) + return; + + string = (*env)->GetStringUTFChars(env, string_, NULL); + if (string == NULL) + return; + + fz_try(ctx) + fz_show_string(ctx, text, font, &trm, string, wmode); + fz_always(ctx) + (*env)->ReleaseStringUTFChars(env, string_, string); + fz_catch(ctx) + jni_rethrow(env, ctx); + + (*env)->SetFloatField(env, matrix_, fid_Matrix_e, trm.e); + (*env)->SetFloatField(env, matrix_, fid_Matrix_f, trm.f); +} + JNIEXPORT void JNICALL FUN(Text_walk)(JNIEnv *env, jobject self, jobject walker) { @@ -3012,9 +3110,10 @@ FUN(Text_walk)(JNIEnv *env, jobject self, jobject walker) (*env)->SetFloatField(env, jtrm, fid_Matrix_f, span->items[i].y); (*env)->CallVoidMethod(env, walker, mid_TextWalker_showGlyph, - jfont, (jboolean)span->wmode, jtrm, + jfont, jtrm, (jint)span->items[i].gid, - (jint)span->items[i].ucs); + (jint)span->items[i].ucs, + (jint)span->wmode); if ((*env)->ExceptionCheck(env)) return; @@ -3036,6 +3135,48 @@ FUN(Image_finalize)(JNIEnv *env, jobject self) fz_drop_image(ctx, image); } +JNIEXPORT jlong JNICALL +FUN(Image_newNativeFromPixmap)(JNIEnv *env, jobject self, jobject pixmap_) +{ + fz_context *ctx = get_context(env); + fz_pixmap *pixmap = from_Pixmap(env, pixmap_); + fz_image *image = NULL; + + if (ctx == NULL) + return 0; + + fz_try(ctx) + image = fz_new_image_from_pixmap(ctx, pixmap, NULL); + fz_catch(ctx) + jni_rethrow(env, ctx); + + return jlong_cast(image); +} + +JNIEXPORT jlong JNICALL +FUN(Image_newNativeFromFile)(JNIEnv *env, jobject self, jstring jfilename) +{ + fz_context *ctx = get_context(env); + const char *filename = NULL; + fz_image *image = NULL; + + if (ctx == NULL || jfilename == NULL) + return 0; + + filename = (*env)->GetStringUTFChars(env, jfilename, NULL); + if (filename == NULL) + return 0; + + fz_try(ctx) + image = fz_new_image_from_file(ctx, filename); + fz_always(ctx) + (*env)->ReleaseStringUTFChars(env, jfilename, filename); + fz_catch(ctx) + jni_rethrow(env, ctx); + + return jlong_cast(image); +} + JNIEXPORT jint JNICALL FUN(Image_getWidth)(JNIEnv *env, jobject self) { @@ -3110,6 +3251,21 @@ FUN(Image_getMask)(JNIEnv *env, jobject self) return jmask; } +JNIEXPORT jobject JNICALL +FUN(Image_toPixmap)(JNIEnv *env, jobject self, jint w, jint h) +{ + fz_context *ctx = get_context(env); + fz_image *img = from_Image(env, self); + fz_pixmap *pixmap = NULL; + + fz_try(ctx) + pixmap = fz_get_pixmap_from_image(ctx, img, w, h); + fz_catch(ctx) + jni_rethrow(env, ctx); + + return to_Pixmap_safe(ctx, env, pixmap); +} + /* Outline interface */ JNIEXPORT void JNICALL diff --git a/platform/java/mupdf_native.h b/platform/java/mupdf_native.h index b6a9499d..771412d6 100644 --- a/platform/java/mupdf_native.h +++ b/platform/java/mupdf_native.h @@ -570,6 +570,14 @@ extern "C" { JNIEXPORT void JNICALL Java_com_artifex_mupdf_fitz_Font_finalize (JNIEnv *, jobject); +/* + * Class: com_artifex_mupdf_fitz_Font + * Method: newNative + * Signature: (Ljava/lang/String;I)J + */ +JNIEXPORT jlong JNICALL Java_com_artifex_mupdf_fitz_Font_newNative + (JNIEnv *, jobject, jstring, jint); + /* * Class: com_artifex_mupdf_fitz_Font * Method: getName @@ -578,6 +586,22 @@ JNIEXPORT void JNICALL Java_com_artifex_mupdf_fitz_Font_finalize JNIEXPORT jstring JNICALL Java_com_artifex_mupdf_fitz_Font_getName (JNIEnv *, jobject); +/* + * Class: com_artifex_mupdf_fitz_Font + * Method: encodeCharacter + * Signature: (I)I + */ +JNIEXPORT jint JNICALL Java_com_artifex_mupdf_fitz_Font_encodeCharacter + (JNIEnv *, jobject, jint); + +/* + * Class: com_artifex_mupdf_fitz_Font + * Method: advanceGlyph + * Signature: (II)F + */ +JNIEXPORT jfloat JNICALL Java_com_artifex_mupdf_fitz_Font_advanceGlyph + (JNIEnv *, jobject, jint, jint); + #ifdef __cplusplus } #endif @@ -597,6 +621,22 @@ extern "C" { JNIEXPORT void JNICALL Java_com_artifex_mupdf_fitz_Image_finalize (JNIEnv *, jobject); +/* + * Class: com_artifex_mupdf_fitz_Image + * Method: newNativeFromPixmap + * Signature: (Lcom/artifex/mupdf/fitz/Pixmap;)J + */ +JNIEXPORT jlong JNICALL Java_com_artifex_mupdf_fitz_Image_newNativeFromPixmap + (JNIEnv *, jobject, jobject); + +/* + * Class: com_artifex_mupdf_fitz_Image + * Method: newNativeFromFile + * Signature: (Ljava/lang/String;)J + */ +JNIEXPORT jlong JNICALL Java_com_artifex_mupdf_fitz_Image_newNativeFromFile + (JNIEnv *, jobject, jstring); + /* * Class: com_artifex_mupdf_fitz_Image * Method: getWidth @@ -615,34 +655,34 @@ JNIEXPORT jint JNICALL Java_com_artifex_mupdf_fitz_Image_getHeight /* * Class: com_artifex_mupdf_fitz_Image - * Method: getNumberOfComponents + * Method: getXResolution * Signature: ()I */ -JNIEXPORT jint JNICALL Java_com_artifex_mupdf_fitz_Image_getNumberOfComponents +JNIEXPORT jint JNICALL Java_com_artifex_mupdf_fitz_Image_getXResolution (JNIEnv *, jobject); /* * Class: com_artifex_mupdf_fitz_Image - * Method: getBitsPerComponent + * Method: getYResolution * Signature: ()I */ -JNIEXPORT jint JNICALL Java_com_artifex_mupdf_fitz_Image_getBitsPerComponent +JNIEXPORT jint JNICALL Java_com_artifex_mupdf_fitz_Image_getYResolution (JNIEnv *, jobject); /* * Class: com_artifex_mupdf_fitz_Image - * Method: getXResolution + * Method: getNumberOfComponents * Signature: ()I */ -JNIEXPORT jint JNICALL Java_com_artifex_mupdf_fitz_Image_getXResolution +JNIEXPORT jint JNICALL Java_com_artifex_mupdf_fitz_Image_getNumberOfComponents (JNIEnv *, jobject); /* * Class: com_artifex_mupdf_fitz_Image - * Method: getYResolution + * Method: getBitsPerComponent * Signature: ()I */ -JNIEXPORT jint JNICALL Java_com_artifex_mupdf_fitz_Image_getYResolution +JNIEXPORT jint JNICALL Java_com_artifex_mupdf_fitz_Image_getBitsPerComponent (JNIEnv *, jobject); /* @@ -669,6 +709,14 @@ JNIEXPORT jboolean JNICALL Java_com_artifex_mupdf_fitz_Image_getInterpolate JNIEXPORT jobject JNICALL Java_com_artifex_mupdf_fitz_Image_getMask (JNIEnv *, jobject); +/* + * Class: com_artifex_mupdf_fitz_Image + * Method: toPixmap + * Signature: (II)Lcom/artifex/mupdf/fitz/Pixmap; + */ +JNIEXPORT jobject JNICALL Java_com_artifex_mupdf_fitz_Image_toPixmap + (JNIEnv *, jobject, jint, jint); + #ifdef __cplusplus } #endif @@ -1506,10 +1554,18 @@ JNIEXPORT jlong JNICALL Java_com_artifex_mupdf_fitz_Text_cloneNative /* * Class: com_artifex_mupdf_fitz_Text * Method: showGlyph - * Signature: (Lcom/artifex/mupdf/fitz/Font;ZLcom/artifex/mupdf/fitz/Matrix;II)V + * Signature: (Lcom/artifex/mupdf/fitz/Font;Lcom/artifex/mupdf/fitz/Matrix;III)V */ JNIEXPORT void JNICALL Java_com_artifex_mupdf_fitz_Text_showGlyph - (JNIEnv *, jobject, jobject, jboolean, jobject, jint, jint); + (JNIEnv *, jobject, jobject, jobject, jint, jint, jint); + +/* + * Class: com_artifex_mupdf_fitz_Text + * Method: showString + * Signature: (Lcom/artifex/mupdf/fitz/Font;Lcom/artifex/mupdf/fitz/Matrix;Ljava/lang/String;I)V + */ +JNIEXPORT void JNICALL Java_com_artifex_mupdf_fitz_Text_showString + (JNIEnv *, jobject, jobject, jobject, jstring, jint); /* * Class: com_artifex_mupdf_fitz_Text -- cgit v1.2.3