summaryrefslogtreecommitdiff
path: root/platform/java
diff options
context:
space:
mode:
authorTor Andersson <tor.andersson@artifex.com>2016-02-24 13:53:18 +0100
committerTor Andersson <tor.andersson@artifex.com>2016-02-29 16:03:34 +0100
commit9add1e5e9ceb80afad8bda54ac34bfa8dfb59c61 (patch)
tree572b68f2fb0621895a561738c63902388a02697d /platform/java
parentdba81b84129c4ef2870274c771bef5c05a7b3343 (diff)
downloadmupdf-9add1e5e9ceb80afad8bda54ac34bfa8dfb59c61.tar.xz
jni: Add font and image constructors.
Diffstat (limited to 'platform/java')
-rw-r--r--platform/java/TraceDevice.java2
-rw-r--r--platform/java/com/artifex/mupdf/fitz/Font.java17
-rw-r--r--platform/java/com/artifex/mupdf/fitz/Image.java23
-rw-r--r--platform/java/com/artifex/mupdf/fitz/Text.java11
-rw-r--r--platform/java/com/artifex/mupdf/fitz/TextWalker.java2
-rw-r--r--platform/java/mupdf_native.c170
-rw-r--r--platform/java/mupdf_native.h76
7 files changed, 277 insertions, 24 deletions
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, "<init>", "(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,12 +3038,39 @@ 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)
{
fz_context *ctx = get_context(env);
@@ -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
@@ -572,12 +572,36 @@ JNIEXPORT void JNICALL Java_com_artifex_mupdf_fitz_Font_finalize
/*
* 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
* Signature: ()Ljava/lang/String;
*/
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
@@ -599,6 +623,22 @@ JNIEXPORT void JNICALL Java_com_artifex_mupdf_fitz_Image_finalize
/*
* 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
* Signature: ()I
*/
@@ -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