summaryrefslogtreecommitdiff
path: root/platform/java
diff options
context:
space:
mode:
authorTor Andersson <tor.andersson@artifex.com>2018-06-18 16:55:30 +0200
committerRobin Watts <robin.watts@artifex.com>2018-06-22 16:48:50 +0100
commit66a23e616670fe19e966c833ac4c0db5edf57c7c (patch)
treeb682ae17bbc253c13a36b70100d4c548d1f7ac61 /platform/java
parenta69f71e89bc9c325bc91fc0ec69f3ca231c83efe (diff)
downloadmupdf-66a23e616670fe19e966c833ac4c0db5edf57c7c.tar.xz
Use fz_quad type in structured text and selection/highlighting.
Diffstat (limited to 'platform/java')
-rw-r--r--platform/java/mupdf_native.c76
-rw-r--r--platform/java/mupdf_native.h15
-rw-r--r--platform/java/src/com/artifex/mupdf/fitz/Quad.java74
-rw-r--r--platform/java/src/com/artifex/mupdf/fitz/StructuredText.java6
4 files changed, 145 insertions, 26 deletions
diff --git a/platform/java/mupdf_native.c b/platform/java/mupdf_native.c
index 8e9e9f3f..5a1b0cb7 100644
--- a/platform/java/mupdf_native.c
+++ b/platform/java/mupdf_native.c
@@ -86,6 +86,7 @@ static jclass cls_Path;
static jclass cls_PathWalker;
static jclass cls_Pixmap;
static jclass cls_Point;
+static jclass cls_Quad;
static jclass cls_Rect;
static jclass cls_RuntimeException;
static jclass cls_SeekableInputStream;
@@ -133,6 +134,14 @@ static jfieldID fid_Path_pointer;
static jfieldID fid_Pixmap_pointer;
static jfieldID fid_Point_x;
static jfieldID fid_Point_y;
+static jfieldID fid_Quad_ul_x;
+static jfieldID fid_Quad_ul_y;
+static jfieldID fid_Quad_ur_x;
+static jfieldID fid_Quad_ur_y;
+static jfieldID fid_Quad_ll_x;
+static jfieldID fid_Quad_ll_y;
+static jfieldID fid_Quad_lr_x;
+static jfieldID fid_Quad_lr_y;
static jfieldID fid_Rect_x0;
static jfieldID fid_Rect_x1;
static jfieldID fid_Rect_y0;
@@ -142,7 +151,7 @@ static jfieldID fid_StrokeState_pointer;
static jfieldID fid_StructuredText_pointer;
static jfieldID fid_TextBlock_bbox;
static jfieldID fid_TextBlock_lines;
-static jfieldID fid_TextChar_bbox;
+static jfieldID fid_TextChar_quad;
static jfieldID fid_TextChar_c;
static jfieldID fid_TextLine_bbox;
static jfieldID fid_TextLine_chars;
@@ -195,6 +204,7 @@ static jmethodID mid_PathWalker_moveTo;
static jmethodID mid_Path_init;
static jmethodID mid_Pixmap_init;
static jmethodID mid_Point_init;
+static jmethodID mid_Quad_init;
static jmethodID mid_Rect_init;
static jmethodID mid_SeekableInputStream_read;
static jmethodID mid_SeekableOutputStream_write;
@@ -556,6 +566,17 @@ static int find_fids(JNIEnv *env)
fid_Point_x = get_field(&err, env, "x", "F");
fid_Point_y = get_field(&err, env, "y", "F");
+ cls_Quad = get_class(&err, env, PKG"Quad");
+ fid_Quad_ul_x = get_field(&err, env, "ul_x", "F");
+ fid_Quad_ul_y = get_field(&err, env, "ul_y", "F");
+ fid_Quad_ur_x = get_field(&err, env, "ur_x", "F");
+ fid_Quad_ur_y = get_field(&err, env, "ur_y", "F");
+ fid_Quad_ll_x = get_field(&err, env, "ll_x", "F");
+ fid_Quad_ll_y = get_field(&err, env, "ll_y", "F");
+ fid_Quad_lr_x = get_field(&err, env, "lr_x", "F");
+ fid_Quad_lr_y = get_field(&err, env, "lr_y", "F");
+ mid_Quad_init = get_method(&err, env, "<init>", "(FFFFFFFF)V");
+
cls_Rect = get_class(&err, env, PKG"Rect");
fid_Rect_x0 = get_field(&err, env, "x0", "F");
fid_Rect_x1 = get_field(&err, env, "x1", "F");
@@ -596,7 +617,7 @@ static int find_fids(JNIEnv *env)
cls_TextChar = get_class(&err, env, PKG"StructuredText$TextChar");
mid_TextChar_init = get_method(&err, env, "<init>", "(L"PKG"StructuredText;)V");
- fid_TextChar_bbox = get_field(&err, env, "bbox", "L"PKG"Rect;");
+ fid_TextChar_quad = get_field(&err, env, "bbox", "L"PKG"Quad;");
fid_TextChar_c = get_field(&err, env, "c", "I");
cls_TextLine = get_class(&err, env, PKG"StructuredText$TextLine");
@@ -702,6 +723,7 @@ static void lose_fids(JNIEnv *env)
(*env)->DeleteGlobalRef(env, cls_PDFObject);
(*env)->DeleteGlobalRef(env, cls_Pixmap);
(*env)->DeleteGlobalRef(env, cls_Point);
+ (*env)->DeleteGlobalRef(env, cls_Quad);
(*env)->DeleteGlobalRef(env, cls_Rect);
(*env)->DeleteGlobalRef(env, cls_RuntimeException);
(*env)->DeleteGlobalRef(env, cls_SeekableStream);
@@ -1447,25 +1469,36 @@ static inline jobject to_Rect_safe(fz_context *ctx, JNIEnv *env, const fz_rect *
return (*env)->NewObject(env, cls_Rect, mid_Rect_init, rect->x0, rect->y0, rect->x1, rect->y1);
}
-static inline jobjectArray to_jRectArray_safe(fz_context *ctx, JNIEnv *env, const fz_rect *rects, jint n)
+static inline jobject to_Quad_safe(fz_context *ctx, JNIEnv *env, const fz_quad *quad)
+{
+ if (!ctx || !quad) return NULL;
+
+ return (*env)->NewObject(env, cls_Quad, mid_Quad_init,
+ quad->ul.x, quad->ul.y,
+ quad->ur.x, quad->ur.y,
+ quad->ll.x, quad->ll.y,
+ quad->lr.x, quad->lr.y);
+}
+
+static inline jobjectArray to_jQuadArray_safe(fz_context *ctx, JNIEnv *env, const fz_quad *quads, jint n)
{
jobjectArray arr;
int i;
- if (!ctx || !rects) return NULL;
+ if (!ctx || !quads) return NULL;
- arr = (*env)->NewObjectArray(env, n, cls_Rect, NULL);
+ arr = (*env)->NewObjectArray(env, n, cls_Quad, NULL);
if (!arr) return NULL;
for (i = 0; i < n; i++)
{
- jobject jrect = to_Rect_safe(ctx, env, &rects[i]);
- if (!jrect) return NULL;
+ jobject jquad = to_Quad_safe(ctx, env, &quads[i]);
+ if (!jquad) return NULL;
- (*env)->SetObjectArrayElement(env, arr, i, jrect);
+ (*env)->SetObjectArrayElement(env, arr, i, jquad);
if ((*env)->ExceptionCheck(env)) return NULL;
- (*env)->DeleteLocalRef(env, jrect);
+ (*env)->DeleteLocalRef(env, jquad);
}
return arr;
@@ -5554,7 +5587,7 @@ FUN(Page_search)(JNIEnv *env, jobject self, jstring jneedle)
{
fz_context *ctx = get_context(env);
fz_page *page = from_Page(env, self);
- fz_rect hits[256];
+ fz_quad hits[256];
const char *needle = NULL;
int n = 0;
@@ -5574,7 +5607,7 @@ FUN(Page_search)(JNIEnv *env, jobject self, jstring jneedle)
return NULL;
}
- return to_jRectArray_safe(ctx, env, hits, n);
+ return to_jQuadArray_safe(ctx, env, hits, n);
}
JNIEXPORT jobject JNICALL
@@ -5872,7 +5905,7 @@ FUN(DisplayList_search)(JNIEnv *env, jobject self, jstring jneedle)
{
fz_context *ctx = get_context(env);
fz_display_list *list = from_DisplayList(env, self);
- fz_rect hits[256];
+ fz_quad hits[256];
const char *needle = NULL;
int n = 0;
@@ -5892,7 +5925,7 @@ FUN(DisplayList_search)(JNIEnv *env, jobject self, jstring jneedle)
return NULL;
}
- return to_jRectArray_safe(ctx, env, hits, n);
+ return to_jQuadArray_safe(ctx, env, hits, n);
}
/* Buffer interface */
@@ -6359,7 +6392,7 @@ FUN(StructuredText_search)(JNIEnv *env, jobject self, jstring jneedle)
{
fz_context *ctx = get_context(env);
fz_stext_page *text = from_StructuredText(env, self);
- fz_rect hits[256];
+ fz_quad hits[256];
const char *needle = NULL;
int n = 0;
@@ -6379,7 +6412,7 @@ FUN(StructuredText_search)(JNIEnv *env, jobject self, jstring jneedle)
return NULL;
}
- return to_jRectArray_safe(ctx, env, hits, n);
+ return to_jQuadArray_safe(ctx, env, hits, n);
}
JNIEXPORT jobject JNICALL
@@ -6389,7 +6422,7 @@ FUN(StructuredText_highlight)(JNIEnv *env, jobject self, jobject jpt1, jobject j
fz_stext_page *text = from_StructuredText(env, self);
fz_point pt1 = from_Point(env, jpt1);
fz_point pt2 = from_Point(env, jpt2);
- fz_rect hits[1000];
+ fz_quad hits[1000];
int n = 0;
if (!ctx || !text) return NULL;
@@ -6402,7 +6435,7 @@ FUN(StructuredText_highlight)(JNIEnv *env, jobject self, jobject jpt1, jobject j
return NULL;
}
- return to_jRectArray_safe(ctx, env, hits, n);
+ return to_jQuadArray_safe(ctx, env, hits, n);
}
JNIEXPORT jobject JNICALL
@@ -6443,6 +6476,7 @@ FUN(StructuredText_getBlocks)(JNIEnv *env, jobject self)
jobject larr = NULL;
jobject carr = NULL;
jobject jrect = NULL;
+ jobject jquad = NULL;
int len;
int b;
@@ -6522,11 +6556,11 @@ FUN(StructuredText_getBlocks)(JNIEnv *env, jobject self)
if (!jchar) return NULL;
/* set the char's bbox */
- jrect = to_Rect_safe(ctx, env, &(ch->bbox));
- if (!jrect) return NULL;
+ jquad = to_Quad_safe(ctx, env, &ch->quad);
+ if (!jquad) return NULL;
- (*env)->SetObjectField(env, jchar, fid_TextChar_bbox, jrect);
- (*env)->DeleteLocalRef(env, jrect);
+ (*env)->SetObjectField(env, jchar, fid_TextChar_quad, jquad);
+ (*env)->DeleteLocalRef(env, jquad);
/* set the char's value */
(*env)->SetIntField(env, jchar, fid_TextChar_c, ch->c);
diff --git a/platform/java/mupdf_native.h b/platform/java/mupdf_native.h
index 1813aa18..3f223a13 100644
--- a/platform/java/mupdf_native.h
+++ b/platform/java/mupdf_native.h
@@ -2896,6 +2896,17 @@ extern "C" {
}
#endif
#endif
+/* Header for class com_artifex_mupdf_fitz_Quad */
+
+#ifndef _Included_com_artifex_mupdf_fitz_Quad
+#define _Included_com_artifex_mupdf_fitz_Quad
+#ifdef __cplusplus
+extern "C" {
+#endif
+#ifdef __cplusplus
+}
+#endif
+#endif
/* Header for class com_artifex_mupdf_fitz_Rect */
#ifndef _Included_com_artifex_mupdf_fitz_Rect
@@ -3185,7 +3196,7 @@ JNIEXPORT void JNICALL Java_com_artifex_mupdf_fitz_StructuredText_finalize
/*
* Class: com_artifex_mupdf_fitz_StructuredText
* Method: search
- * Signature: (Ljava/lang/String;)[Lcom/artifex/mupdf/fitz/Rect;
+ * Signature: (Ljava/lang/String;)[Lcom/artifex/mupdf/fitz/Quad;
*/
JNIEXPORT jobjectArray JNICALL Java_com_artifex_mupdf_fitz_StructuredText_search
(JNIEnv *, jobject, jstring);
@@ -3193,7 +3204,7 @@ JNIEXPORT jobjectArray JNICALL Java_com_artifex_mupdf_fitz_StructuredText_search
/*
* Class: com_artifex_mupdf_fitz_StructuredText
* Method: highlight
- * Signature: (Lcom/artifex/mupdf/fitz/Point;Lcom/artifex/mupdf/fitz/Point;)[Lcom/artifex/mupdf/fitz/Rect;
+ * Signature: (Lcom/artifex/mupdf/fitz/Point;Lcom/artifex/mupdf/fitz/Point;)[Lcom/artifex/mupdf/fitz/Quad;
*/
JNIEXPORT jobjectArray JNICALL Java_com_artifex_mupdf_fitz_StructuredText_highlight
(JNIEnv *, jobject, jobject, jobject);
diff --git a/platform/java/src/com/artifex/mupdf/fitz/Quad.java b/platform/java/src/com/artifex/mupdf/fitz/Quad.java
new file mode 100644
index 00000000..6e69a7b1
--- /dev/null
+++ b/platform/java/src/com/artifex/mupdf/fitz/Quad.java
@@ -0,0 +1,74 @@
+package com.artifex.mupdf.fitz;
+
+public class Quad
+{
+ public float ul_x, ul_y;
+ public float ur_x, ur_y;
+ public float ll_x, ll_y;
+ public float lr_x, lr_y;
+
+ public Quad(float ul_x, float ul_y, float ur_x, float ur_y, float ll_x, float ll_y, float lr_x, float lr_y) {
+ this.ul_x = ul_x;
+ this.ul_y = ul_y;
+ this.ur_x = ur_x;
+ this.ur_y = ur_y;
+ this.ll_x = ll_x;
+ this.ll_y = ll_y;
+ this.lr_x = lr_x;
+ this.lr_y = lr_y;
+ }
+
+ public Rect toRect() {
+ float x0 = Math.min(Math.min(ul_x, ur_x), Math.min(ll_x, lr_x));
+ float y0 = Math.min(Math.min(ul_y, ur_y), Math.min(ll_y, lr_y));
+ float x1 = Math.max(Math.max(ul_x, ur_x), Math.max(ll_x, lr_x));
+ float y1 = Math.max(Math.max(ul_y, ur_y), Math.max(ll_y, lr_y));
+ return new Rect(x0, y0, x1, y1);
+ }
+
+ public Quad transformed(Matrix m) {
+ float t_ul_x = ul_x * m.a + ul_y * m.c + m.e;
+ float t_ul_y = ul_x * m.b + ul_y * m.d + m.f;
+ float t_ur_x = ur_x * m.a + ur_y * m.c + m.e;
+ float t_ur_y = ur_x * m.b + ur_y * m.d + m.f;
+ float t_ll_x = ll_x * m.a + ll_y * m.c + m.e;
+ float t_ll_y = ll_x * m.b + ll_y * m.d + m.f;
+ float t_lr_x = lr_x * m.a + lr_y * m.c + m.e;
+ float t_lr_y = lr_x * m.b + lr_y * m.d + m.f;
+ return new Quad(
+ t_ul_x, t_ul_y,
+ t_ur_x, t_ur_y,
+ t_ll_x, t_ll_y,
+ t_lr_x, t_lr_y
+ );
+ }
+
+ public Quad transform(Matrix m) {
+ float t_ul_x = ul_x * m.a + ul_y * m.c + m.e;
+ float t_ul_y = ul_x * m.b + ul_y * m.d + m.f;
+ float t_ur_x = ur_x * m.a + ur_y * m.c + m.e;
+ float t_ur_y = ur_x * m.b + ur_y * m.d + m.f;
+ float t_ll_x = ll_x * m.a + ll_y * m.c + m.e;
+ float t_ll_y = ll_x * m.b + ll_y * m.d + m.f;
+ float t_lr_x = lr_x * m.a + lr_y * m.c + m.e;
+ float t_lr_y = lr_x * m.b + lr_y * m.d + m.f;
+ ul_x = t_ul_x;
+ ul_y = t_ul_y;
+ ur_x = t_ur_x;
+ ur_y = t_ur_y;
+ ll_x = t_ll_x;
+ ll_y = t_ll_y;
+ lr_x = t_lr_x;
+ lr_y = t_lr_y;
+ return this;
+ }
+
+ public String toString() {
+ return "["
+ + ul_x + " " + ul_y + " "
+ + ur_x + " " + ur_y + " "
+ + ll_x + " " + ll_y + " "
+ + lr_x + " " + lr_y
+ + "]";
+ }
+}
diff --git a/platform/java/src/com/artifex/mupdf/fitz/StructuredText.java b/platform/java/src/com/artifex/mupdf/fitz/StructuredText.java
index 12ec5be3..82aa55ea 100644
--- a/platform/java/src/com/artifex/mupdf/fitz/StructuredText.java
+++ b/platform/java/src/com/artifex/mupdf/fitz/StructuredText.java
@@ -19,8 +19,8 @@ public class StructuredText
pointer = p;
}
- public native Rect[] search(String needle);
- public native Rect[] highlight(Point a, Point b);
+ public native Quad[] search(String needle);
+ public native Quad[] highlight(Point a, Point b);
public native String copy(Point a, Point b);
public native TextBlock[] getBlocks();
@@ -37,7 +37,7 @@ public class StructuredText
public class TextChar {
public int c;
- public Rect bbox;
+ public Quad quad;
public boolean isWhitespace() {
return Character.isWhitespace(c);
}