summaryrefslogtreecommitdiff
path: root/android
diff options
context:
space:
mode:
authorRobin Watts <robin.watts@artifex.com>2012-03-13 20:25:38 +0000
committerRobin Watts <robin.watts@artifex.com>2012-03-13 20:59:19 +0000
commit3212863288c4ad6396482b8fdb14db2af27c123f (patch)
tree9d7c7efe3a585c538f6e8d0edd5e3a77b5b8b6b5 /android
parentb6e9b2f8fe172d7175cea3d14d89f986688639af (diff)
parent33dc06b61c0816854193f006c35a9e797f098a22 (diff)
downloadmupdf-3212863288c4ad6396482b8fdb14db2af27c123f.tar.xz
Merge master and pg_android branches
Bring up to date with current APIs, including text device changes.
Diffstat (limited to 'android')
-rw-r--r--android/jni/Core.mk5
-rw-r--r--android/jni/ThirdParty.mk43
-rw-r--r--android/jni/mupdf.c140
-rw-r--r--android/local.properties2
4 files changed, 109 insertions, 81 deletions
diff --git a/android/jni/Core.mk b/android/jni/Core.mk
index 51908298..a4127c67 100644
--- a/android/jni/Core.mk
+++ b/android/jni/Core.mk
@@ -8,7 +8,7 @@ LOCAL_CFLAGS += -DARCH_ARM -DARCH_THUMB -DARCH_ARM_CAN_LOAD_UNALIGNED
LOCAL_C_INCLUDES := \
../thirdparty/jbig2dec \
- ../thirdparty/openjpeg-1.4/libopenjpeg \
+ ../thirdparty/openjpeg-1.5.0/libopenjpeg \
../thirdparty/jpeg-8d \
../thirdparty/zlib-1.2.5 \
../thirdparty/freetype-2.4.8/include \
@@ -28,7 +28,6 @@ LOCAL_SRC_FILES := \
$(MY_ROOT)/fitz/base_getopt.c \
$(MY_ROOT)/fitz/base_hash.c \
$(MY_ROOT)/fitz/base_memory.c \
- $(MY_ROOT)/fitz/base_object.c \
$(MY_ROOT)/fitz/base_string.c \
$(MY_ROOT)/fitz/base_time.c \
$(MY_ROOT)/fitz/crypt_aes.c \
@@ -74,6 +73,7 @@ LOCAL_SRC_FILES := \
$(MY_ROOT)/draw/draw_path.c \
$(MY_ROOT)/draw/draw_simple_scale.c \
$(MY_ROOT)/draw/draw_unpack.c \
+ $(MY_ROOT)/pdf/base_object.c \
$(MY_ROOT)/pdf/pdf_annot.c \
$(MY_ROOT)/pdf/pdf_cmap.c \
$(MY_ROOT)/pdf/pdf_cmap_load.c \
@@ -97,6 +97,7 @@ LOCAL_SRC_FILES := \
$(MY_ROOT)/pdf/pdf_repair.c \
$(MY_ROOT)/pdf/pdf_shade.c \
$(MY_ROOT)/pdf/pdf_stream.c \
+ $(MY_ROOT)/pdf/pdf_store.c \
$(MY_ROOT)/pdf/pdf_type3.c \
$(MY_ROOT)/pdf/pdf_unicode.c \
$(MY_ROOT)/pdf/pdf_xobject.c \
diff --git a/android/jni/ThirdParty.mk b/android/jni/ThirdParty.mk
index dcb7da2a..20e16cee 100644
--- a/android/jni/ThirdParty.mk
+++ b/android/jni/ThirdParty.mk
@@ -6,7 +6,7 @@ MY_ROOT := ../..
LOCAL_C_INCLUDES := \
../thirdparty/jbig2dec \
- ../thirdparty/openjpeg-1.4/libopenjpeg \
+ ../thirdparty/openjpeg-1.5.0/libopenjpeg \
../thirdparty/jpeg-8d \
../thirdparty/zlib-1.2.5 \
../thirdparty/freetype-2.4.8/include \
@@ -32,24 +32,29 @@ LOCAL_SRC_FILES := \
$(MY_ROOT)/thirdparty/jbig2dec/jbig2_mmr.c \
$(MY_ROOT)/thirdparty/jbig2dec/jbig2_image.c \
$(MY_ROOT)/thirdparty/jbig2dec/jbig2_metadata.c \
- $(MY_ROOT)/thirdparty/openjpeg-1.4/libopenjpeg/bio.c \
- $(MY_ROOT)/thirdparty/openjpeg-1.4/libopenjpeg/cio.c \
- $(MY_ROOT)/thirdparty/openjpeg-1.4/libopenjpeg/dwt.c \
- $(MY_ROOT)/thirdparty/openjpeg-1.4/libopenjpeg/event.c \
- $(MY_ROOT)/thirdparty/openjpeg-1.4/libopenjpeg/image.c \
- $(MY_ROOT)/thirdparty/openjpeg-1.4/libopenjpeg/j2k.c \
- $(MY_ROOT)/thirdparty/openjpeg-1.4/libopenjpeg/j2k_lib.c \
- $(MY_ROOT)/thirdparty/openjpeg-1.4/libopenjpeg/jp2.c \
- $(MY_ROOT)/thirdparty/openjpeg-1.4/libopenjpeg/jpt.c \
- $(MY_ROOT)/thirdparty/openjpeg-1.4/libopenjpeg/mct.c \
- $(MY_ROOT)/thirdparty/openjpeg-1.4/libopenjpeg/mqc.c \
- $(MY_ROOT)/thirdparty/openjpeg-1.4/libopenjpeg/openjpeg.c \
- $(MY_ROOT)/thirdparty/openjpeg-1.4/libopenjpeg/pi.c \
- $(MY_ROOT)/thirdparty/openjpeg-1.4/libopenjpeg/raw.c \
- $(MY_ROOT)/thirdparty/openjpeg-1.4/libopenjpeg/t1.c \
- $(MY_ROOT)/thirdparty/openjpeg-1.4/libopenjpeg/t2.c \
- $(MY_ROOT)/thirdparty/openjpeg-1.4/libopenjpeg/tcd.c \
- $(MY_ROOT)/thirdparty/openjpeg-1.4/libopenjpeg/tgt.c \
+ $(MY_ROOT)/thirdparty/openjpeg-1.5.0/libopenjpeg/bio.c \
+ $(MY_ROOT)/thirdparty/openjpeg-1.5.0/libopenjpeg/cidx_manager.c \
+ $(MY_ROOT)/thirdparty/openjpeg-1.5.0/libopenjpeg/cio.c \
+ $(MY_ROOT)/thirdparty/openjpeg-1.5.0/libopenjpeg/dwt.c \
+ $(MY_ROOT)/thirdparty/openjpeg-1.5.0/libopenjpeg/event.c \
+ $(MY_ROOT)/thirdparty/openjpeg-1.5.0/libopenjpeg/image.c \
+ $(MY_ROOT)/thirdparty/openjpeg-1.5.0/libopenjpeg/j2k.c \
+ $(MY_ROOT)/thirdparty/openjpeg-1.5.0/libopenjpeg/j2k_lib.c \
+ $(MY_ROOT)/thirdparty/openjpeg-1.5.0/libopenjpeg/jp2.c \
+ $(MY_ROOT)/thirdparty/openjpeg-1.5.0/libopenjpeg/jpt.c \
+ $(MY_ROOT)/thirdparty/openjpeg-1.5.0/libopenjpeg/mct.c \
+ $(MY_ROOT)/thirdparty/openjpeg-1.5.0/libopenjpeg/mqc.c \
+ $(MY_ROOT)/thirdparty/openjpeg-1.5.0/libopenjpeg/openjpeg.c \
+ $(MY_ROOT)/thirdparty/openjpeg-1.5.0/libopenjpeg/phix_manager.c \
+ $(MY_ROOT)/thirdparty/openjpeg-1.5.0/libopenjpeg/pi.c \
+ $(MY_ROOT)/thirdparty/openjpeg-1.5.0/libopenjpeg/ppix_manager.c \
+ $(MY_ROOT)/thirdparty/openjpeg-1.5.0/libopenjpeg/raw.c \
+ $(MY_ROOT)/thirdparty/openjpeg-1.5.0/libopenjpeg/t1.c \
+ $(MY_ROOT)/thirdparty/openjpeg-1.5.0/libopenjpeg/t2.c \
+ $(MY_ROOT)/thirdparty/openjpeg-1.5.0/libopenjpeg/tcd.c \
+ $(MY_ROOT)/thirdparty/openjpeg-1.5.0/libopenjpeg/tgt.c \
+ $(MY_ROOT)/thirdparty/openjpeg-1.5.0/libopenjpeg/thix_manager.c \
+ $(MY_ROOT)/thirdparty/openjpeg-1.5.0/libopenjpeg/tpix_manager.c \
$(MY_ROOT)/thirdparty/jpeg-8d/jaricom.c \
$(MY_ROOT)/thirdparty/jpeg-8d/jcapimin.c \
$(MY_ROOT)/thirdparty/jpeg-8d/jcapistd.c \
diff --git a/android/jni/mupdf.c b/android/jni/mupdf.c
index ccd10065..822095ec 100644
--- a/android/jni/mupdf.c
+++ b/android/jni/mupdf.c
@@ -209,7 +209,7 @@ Java_com_artifex_mupdf_MuPDFCore_drawPage(JNIEnv *env, jobject thiz, jobject bit
rect.y0 = patchY;
rect.x1 = patchX + patchW;
rect.y1 = patchY + patchH;
- pix = fz_new_pixmap_with_rect_and_data(ctx, colorspace, rect, pixels);
+ pix = fz_new_pixmap_with_bbox_and_data(ctx, colorspace, rect, pixels);
if (currentPageList == NULL)
{
fz_clear_pixmap_with_value(ctx, pix, 0xd0);
@@ -259,71 +259,83 @@ Java_com_artifex_mupdf_MuPDFCore_drawPage(JNIEnv *env, jobject thiz, jobject bit
return 1;
}
-static int
-charat(fz_text_span *span, int idx)
+static fz_text_char textcharat(fz_text_page *page, int idx)
{
+ static fz_text_char emptychar = { {0,0,0,0}, ' ' };
+ fz_text_block *block;
+ fz_text_line *line;
+ fz_text_span *span;
int ofs = 0;
- while (span) {
- if (idx < ofs + span->len)
- return span->text[idx - ofs].c;
- if (span->eol) {
- if (idx == ofs + span->len)
- return ' ';
- ofs ++;
+ for (block = page->blocks; block < page->blocks + page->len; block++)
+ {
+ for (line = block->lines; line < block->lines + block->len; line++)
+ {
+ for (span = line->spans; span < line->spans + line->len; span++)
+ {
+ if (idx < ofs + span->len)
+ return span->text[idx - ofs];
+ /* pseudo-newline */
+ if (span + 1 == line->spans + line->len)
+ {
+ if (idx == ofs + span->len)
+ return emptychar;
+ ofs++;
+ }
+ ofs += span->len;
+ }
}
- ofs += span->len;
- span = span->next;
}
- return 0;
+ return emptychar;
+}
+
+static int
+charat(fz_text_page *page, int idx)
+{
+ return textcharat(page, idx).c;
}
static fz_bbox
-bboxat(fz_text_span *span, int idx)
+bboxcharat(fz_text_page *page, int idx)
{
- int ofs = 0;
- while (span) {
- if (idx < ofs + span->len)
- return span->text[idx - ofs].bbox;
- if (span->eol) {
- if (idx == ofs + span->len)
- return fz_empty_bbox;
- ofs ++;
- }
- ofs += span->len;
- span = span->next;
- }
- return fz_empty_bbox;
+ return fz_round_rect(textcharat(page, idx).bbox);
}
static int
-textlen(fz_text_span *span)
+textlen(fz_text_page *page)
{
+ fz_text_block *block;
+ fz_text_line *line;
+ fz_text_span *span;
int len = 0;
- while (span) {
- len += span->len;
- if (span->eol)
- len ++;
- span = span->next;
+ for (block = page->blocks; block < page->blocks + page->len; block++)
+ {
+ for (line = block->lines; line < block->lines + block->len; line++)
+ {
+ for (span = line->spans; span < line->spans + line->len; span++)
+ len += span->len;
+ len++; /* pseudo-newline */
+ }
}
return len;
}
static int
-match(fz_text_span *span, const char *s, int n)
+match(fz_text_page *page, const char *s, int n)
{
- int start = n, c;
+ int orig = n;
+ int c;
while (*s) {
- s += chartorune(&c, (char *)s);
- if (c == ' ' && charat(span, n) == ' ') {
- while (charat(span, n) == ' ')
+ s += fz_chartorune(&c, (char *)s);
+ if (c == ' ' && charat(page, n) == ' ') {
+ while (charat(page, n) == ' ')
n++;
} else {
- if (tolower(c) != tolower(charat(span, n)))
+ if (tolower(c) != tolower(charat(page, n)))
return 0;
n++;
}
}
- return n - start;
+ return n - orig;
}
static int
@@ -433,19 +445,20 @@ Java_com_artifex_mupdf_MuPDFCore_getOutlineInternal(JNIEnv * env, jobject thiz)
JNIEXPORT jobjectArray JNICALL
Java_com_artifex_mupdf_MuPDFCore_searchPage(JNIEnv * env, jobject thiz, jstring jtext)
{
- jclass rectClass;
- jmethodID ctor;
- jobjectArray arr;
- jobject rect;
- fz_text_span *text = NULL;
- fz_device *dev = NULL;
- float zoom;
- fz_matrix ctm;
- int pos;
- int len;
- int i, n;
- int hit_count = 0;
- const char *str;
+ jclass rectClass;
+ jmethodID ctor;
+ jobjectArray arr;
+ jobject rect;
+ fz_text_sheet *sheet = NULL;
+ fz_text_page *text = NULL;
+ fz_device *dev = NULL;
+ float zoom;
+ fz_matrix ctm;
+ int pos;
+ int len;
+ int i, n;
+ int hit_count = 0;
+ const char *str;
rectClass = (*env)->FindClass(env, "android/graphics/RectF");
if (rectClass == NULL) return NULL;
@@ -454,18 +467,23 @@ Java_com_artifex_mupdf_MuPDFCore_searchPage(JNIEnv * env, jobject thiz, jstring
str = (*env)->GetStringUTFChars(env, jtext, NULL);
if (str == NULL) return NULL;
+ fz_var(sheet);
fz_var(text);
fz_var(dev);
fz_try(ctx)
{
+ fz_rect rect;
+
if (hit_bbox == NULL)
hit_bbox = fz_malloc_array(ctx, MAX_SEARCH_HITS, sizeof(*hit_bbox));
- text = fz_new_text_span(ctx);
- dev = fz_new_text_device(ctx, text);
zoom = resolution / 72;
ctm = fz_scale(zoom, zoom);
+ rect = fz_transform_rect(ctm, currentMediabox);
+ sheet = fz_new_text_sheet(ctx);
+ text = fz_new_text_page(ctx, rect);
+ dev = fz_new_text_device(ctx, sheet, text);
fz_run_page(doc, currentPage, dev, ctm, NULL);
fz_free_device(dev);
dev = NULL;
@@ -476,19 +494,21 @@ Java_com_artifex_mupdf_MuPDFCore_searchPage(JNIEnv * env, jobject thiz, jstring
fz_bbox rr = fz_empty_bbox;
n = match(text, str, pos);
for (i = 0; i < n; i++)
- rr = fz_union_bbox(rr, bboxat(text, pos + i));
+ rr = fz_union_bbox(rr, bboxcharat(text, pos + i));
if (!fz_is_empty_bbox(rr) && hit_count < MAX_SEARCH_HITS)
hit_bbox[hit_count++] = rr;
}
- fz_free_text_span(ctx, text);
- text = NULL;
+ }
+ fz_always(ctx)
+ {
+ fz_free_text_page(ctx, text);
+ fz_free_text_sheet(ctx, sheet);
+ fz_free_device(dev);
}
fz_catch(ctx)
{
jclass cls;
- fz_free_device(dev);
- fz_free_text_span(ctx, text);
(*env)->ReleaseStringUTFChars(env, jtext, str);
cls = (*env)->FindClass(env, "java/lang/OutOfMemoryError");
if (cls != NULL)
diff --git a/android/local.properties b/android/local.properties
new file mode 100644
index 00000000..d0e1f0e6
--- /dev/null
+++ b/android/local.properties
@@ -0,0 +1,2 @@
+#sdk.dir=/Library/android-sdk-mac_x86
+sdk.dir=C:\\Program Files (x86)\\Android\\android-sdk