diff options
author | Robin Watts <robin.watts@artifex.com> | 2012-03-13 20:25:38 +0000 |
---|---|---|
committer | Robin Watts <robin.watts@artifex.com> | 2012-03-13 20:59:19 +0000 |
commit | 3212863288c4ad6396482b8fdb14db2af27c123f (patch) | |
tree | 9d7c7efe3a585c538f6e8d0edd5e3a77b5b8b6b5 /android | |
parent | b6e9b2f8fe172d7175cea3d14d89f986688639af (diff) | |
parent | 33dc06b61c0816854193f006c35a9e797f098a22 (diff) | |
download | mupdf-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.mk | 5 | ||||
-rw-r--r-- | android/jni/ThirdParty.mk | 43 | ||||
-rw-r--r-- | android/jni/mupdf.c | 140 | ||||
-rw-r--r-- | android/local.properties | 2 |
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 |