static void pdfapp_searchbackward(pdfapp_t *app, enum panning *panto) { int matchlen; int test; int len; int startpage; wincursor(app, WAIT); startpage = app->pageno; do { len = textlen(app->page_text); if (app->hit >= 0) test = app->hit - 1; else test = len; while (test >= 0) { matchlen = match(app->search, app->page_text, test); if (matchlen) { app->hit = test; app->hitlen = matchlen; wincursor(app, HAND); winrepaint(app); return; } test--; } app->pageno--; if (app->pageno < 1) app->pageno = app->pagecount; pdfapp_showpage(app, 1, 0, 0); *panto = PAN_TO_BOTTOM; } while (app->pageno != startpage); if (app->pageno == startpage) { pdfapp_warn(app, "String '%s' not found.", app->search); winrepaintsearch(app); } else winrepaint(app); wincursor(app, HAND); }
static void pdfapp_searchforward(pdfapp_t *app, enum panning *panto) { int matchlen; int test; int len; int startpage; wincursor(app, WAIT); startpage = app->pageno; do { len = textlen(app->page_text); if (app->hit >= 0) test = app->hit + strlen(app->search); else test = 0; while (test < len) { matchlen = match(app->search, app->page_text, test); if (matchlen) { app->hit = test; app->hitlen = matchlen; wincursor(app, HAND); winrepaint(app); return; } test++; } app->pageno++; if (app->pageno > app->pagecount) app->pageno = 1; pdfapp_showpage(app, 1, 0, 0); *panto = PAN_TO_TOP; } while (app->pageno != startpage); if (app->pageno == startpage) { pdfapp_warn(app, "String '%s' not found.", app->search); winrepaintsearch(app); } else winrepaint(app); wincursor(app, HAND); }
static void pdfapp_searchbackward(pdfapp_t *app) { int matchlen; int test; int len; int startpage; wincursor(app, WAIT); startpage = app->pageno; do { len = textlen(app->page_text); if (app->hit >= 0) test = app->hit - 1; else test = len; while (test >= 0) { matchlen = match(app->search, app->page_text, test); if (matchlen) { app->hit = test; app->hitlen = matchlen; wincursor(app, HAND); return; } test--; } app->pageno--; if (app->pageno < 1) app->pageno = app->pagecount; pdfapp_showpage(app, 1, 0, 0); app->pany = -2000; } while (app->pageno != startpage); if (app->pageno == startpage) printf("hit not found\n"); wincursor(app, HAND); }
static void pdfapp_searchforward(pdfapp_t *app) { int matchlen; int test; int len; int startpage; wincursor(app, WAIT); startpage = app->pageno; do { len = textlen(app->page_text); if (app->hit >= 0) test = app->hit + strlen(app->search); else test = 0; while (test < len) { matchlen = match(app->search, app->page_text, test); if (matchlen) { app->hit = test; app->hitlen = matchlen; wincursor(app, HAND); return; } test++; } app->pageno++; if (app->pageno > app->pagecount) app->pageno = 1; pdfapp_showpage(app, 1, 0, 0); app->pany = 0; } while (app->pageno != startpage); if (app->pageno == startpage) printf("hit not found\n"); wincursor(app, HAND); }
int fz_search_text_page(fz_context *ctx, fz_text_page *text, char *needle, fz_rect *hit_bbox, int hit_max) { int pos, len, i, n, hit_count; if (strlen(needle) == 0) return 0; hit_count = 0; len = textlen(text); for (pos = 0; pos < len; pos++) { n = match(text, needle, pos); if (n) { fz_rect linebox = fz_empty_rect; for (i = 0; i < n; i++) { fz_rect charbox; bboxat(text, pos + i, &charbox); if (!fz_is_empty_rect(&charbox)) { if (charbox.y0 != linebox.y0 || fz_abs(charbox.x0 - linebox.x1) > 5) { if (!fz_is_empty_rect(&linebox) && hit_count < hit_max) hit_bbox[hit_count++] = linebox; linebox = charbox; } else { fz_union_rect(&linebox, &charbox); } } } if (!fz_is_empty_rect(&linebox) && hit_count < hit_max) hit_bbox[hit_count++] = linebox; } } return hit_count; }
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_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; page_cache *pc = &pages[current]; rectClass = (*env)->FindClass(env, "android/graphics/RectF"); if (rectClass == NULL) return NULL; ctor = (*env)->GetMethodID(env, rectClass, "<init>", "(FFFF)V"); if (ctor == NULL) return NULL; 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)); zoom = resolution / 72; ctm = fz_scale(zoom, zoom); rect = fz_transform_rect(ctm, pc->media_box); 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, pc->page, dev, ctm, NULL); fz_free_device(dev); dev = NULL; len = textlen(text); for (pos = 0; pos < len; pos++) { fz_bbox rr = fz_empty_bbox; n = match(text, str, pos); for (i = 0; i < n; 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_always(ctx) { fz_free_text_page(ctx, text); fz_free_text_sheet(ctx, sheet); fz_free_device(dev); } fz_catch(ctx) { jclass cls; (*env)->ReleaseStringUTFChars(env, jtext, str); cls = (*env)->FindClass(env, "java/lang/OutOfMemoryError"); if (cls != NULL) (*env)->ThrowNew(env, cls, "Out of memory in MuPDFCore_searchPage"); (*env)->DeleteLocalRef(env, cls); return NULL; } (*env)->ReleaseStringUTFChars(env, jtext, str); arr = (*env)->NewObjectArray(env, hit_count, rectClass, NULL); if (arr == NULL) return NULL; for (i = 0; i < hit_count; i++) { rect = (*env)->NewObject(env, rectClass, ctor, (float) (hit_bbox[i].x0), (float) (hit_bbox[i].y0), (float) (hit_bbox[i].x1), (float) (hit_bbox[i].y1)); if (rect == NULL) return NULL; (*env)->SetObjectArrayElement(env, arr, i, rect); (*env)->DeleteLocalRef(env, rect); } return arr; }