static void close_doc(globals *glo) { int i; fz_free(glo->ctx, glo->hit_bbox); glo->hit_bbox = NULL; for (i = 0; i < NUM_CACHE; i++) drop_page_cache(glo, &glo->pages[i]); fz_close_document(glo->doc); glo->doc = NULL; }
JNIEXPORT void JNICALL Java_com_artifex_mupdf_MuPDFCore_destroying(JNIEnv * env, jobject thiz) { int i; fz_free(ctx, hit_bbox); hit_bbox = NULL; for (i = 0; i < NUM_CACHE; i++) drop_page_cache(&pages[i]); fz_close_document(doc); doc = NULL; }
int main(int argc, char **argv) { unsigned long st, end, j; char *fname; unsigned long num_file_blks = FILE_SIZE / BLK_SIZE; char cmd[100]; int fid, r, rnds = 100; char buf[BLK_SIZE]; if (argc >= 2) { keep_time = atoi(argv[1]); fname = argv[2]; if (argc == 4) { rnds = atoi(argv[3]); } } drop_page_cache(fname); fid = open(fname, O_RDONLY | O_DIRECT); if (fid == -1) { printf("error opening file %s\n", fname); perror("open"); return 1; } if (keep_time) { st = rdtsc(); } for (r = 0; r < rnds; r++) { for (j = 0; j < num_file_blks; j++) { unsigned long off = j * BLK_SIZE; pread(fid, buf, BLK_SIZE, off); } } if (keep_time) { end = rdtsc(); sprintf(cmd, "echo %lu >> res.time", end - st); system(cmd); } return 0; }
JNIEXPORT void JNICALL JNI_FN(MuPDF_gotoPageInternal)(JNIEnv *env, jobject thiz, int page) { int i; int furthest; int furthest_dist = -1; float zoom; fz_matrix ctm; fz_irect bbox; page_cache *pc; globals *glo = get_globals(env, thiz); fz_context *ctx = glo->ctx; for (i = 0; i < NUM_CACHE; i++) { if (glo->pages[i].page != NULL && glo->pages[i].number == page) { /* The page is already cached */ glo->current = i; return; } if (glo->pages[i].page == NULL) { /* cache record unused, and so a good one to use */ furthest = i; furthest_dist = INT_MAX; } else { int dist = abs(glo->pages[i].number - page); /* Further away - less likely to be needed again */ if (dist > furthest_dist) { furthest_dist = dist; furthest = i; } } } glo->current = furthest; pc = &glo->pages[glo->current]; drop_page_cache(glo, pc); /* In the event of an error, ensure we give a non-empty page */ pc->width = 100; pc->height = 100; pc->number = page; LOGE("Goto page %d...", page); fz_try(ctx) { fz_rect rect; LOGI("Load page %d", pc->number); pc->page = fz_load_page(glo->doc, pc->number); zoom = glo->resolution / 72; fz_bound_page(glo->doc, pc->page, &pc->media_box); fz_scale(&ctm, zoom, zoom); rect = pc->media_box; fz_round_rect(&bbox, fz_transform_rect(&rect, &ctm)); pc->width = bbox.x1-bbox.x0; pc->height = bbox.y1-bbox.y0; } fz_catch(ctx) { LOGE("cannot make displaylist from page %d", pc->number); } }
JNIEXPORT void JNICALL Java_com_artifex_mupdf_MuPDFCore_gotoPageInternal(JNIEnv *env, jobject thiz, int page) { int i; int furthest; int furthest_dist = -1; float zoom; fz_matrix ctm; fz_bbox bbox; page_cache *pc; for (i = 0; i < NUM_CACHE; i++) { if (pages[i].page != NULL && pages[i].number == page) { /* The page is already cached */ current = i; return; } if (pages[i].page == NULL) { /* cache record unused, and so a good one to use */ furthest = i; furthest_dist = INT_MAX; } else { int dist = abs(pages[i].number - page); /* Further away - less likely to be needed again */ if (dist > furthest_dist) { furthest_dist = dist; furthest = i; } } } current = furthest; pc = &pages[current]; drop_page_cache(pc); /* In the event of an error, ensure we give a non-empty page */ pc->width = 100; pc->height = 100; pc->number = page; LOGE("Goto page %d...", page); fz_try(ctx) { LOGI("Load page %d", pc->number); pc->page = fz_load_page(doc, pc->number); zoom = resolution / 72; pc->media_box = fz_bound_page(doc, pc->page); ctm = fz_scale(zoom, zoom); bbox = fz_round_rect(fz_transform_rect(ctm, pc->media_box)); pc->width = bbox.x1-bbox.x0; pc->height = bbox.y1-bbox.y0; } fz_catch(ctx) { LOGE("cannot make displaylist from page %d", pc->number); } }