diff options
author | Robin Watts <robin.watts@artifex.com> | 2010-12-02 18:52:55 +0000 |
---|---|---|
committer | Robin Watts <robin.watts@artifex.com> | 2010-12-02 18:52:55 +0000 |
commit | cd7c8b147ad173f7071d3b1d115e913fc08c5cc3 (patch) | |
tree | a99ff136ac5458d54b1d1ee5f8856c8c46a3905e /android/jni | |
parent | b31a16f7bb711764fab3722898e1b459ca79a1e1 (diff) | |
download | mupdf-cd7c8b147ad173f7071d3b1d115e913fc08c5cc3.tar.xz |
Import Android demo.
Diffstat (limited to 'android/jni')
-rw-r--r-- | android/jni/Android.mk | 21 | ||||
-rw-r--r-- | android/jni/Application.mk | 3 | ||||
-rw-r--r-- | android/jni/Core.mk | 110 | ||||
-rw-r--r-- | android/jni/ThirdParty.mk | 150 | ||||
-rw-r--r-- | android/jni/mupdf.c | 239 |
5 files changed, 523 insertions, 0 deletions
diff --git a/android/jni/Android.mk b/android/jni/Android.mk new file mode 100644 index 00000000..66c69c9c --- /dev/null +++ b/android/jni/Android.mk @@ -0,0 +1,21 @@ +TOP_LOCAL_PATH := $(call my-dir) + +MUPDF_ROOT := ../.. + +include $(TOP_LOCAL_PATH)/Core.mk +include $(TOP_LOCAL_PATH)/ThirdParty.mk + +LOCAL_PATH = $(TOP_LOCAL_PATH) +include $(CLEAR_VARS) + +LOCAL_CFLAGS := \ + -I$(LOCAL_PATH)/$(MY_ROOT)/draw \ + -I$(LOCAL_PATH)/$(MY_ROOT)/fitz \ + -I$(LOCAL_PATH)/$(MY_ROOT)/mupdf +LOCAL_MODULE := mupdf +LOCAL_SRC_FILES := mupdf.c +LOCAL_STATIC_LIBRARIES := mupdfcore mupdfthirdparty + +LOCAL_LDLIBS := -lm -llog -ljnigraphics + +include $(BUILD_SHARED_LIBRARY) diff --git a/android/jni/Application.mk b/android/jni/Application.mk new file mode 100644 index 00000000..16de5796 --- /dev/null +++ b/android/jni/Application.mk @@ -0,0 +1,3 @@ +# The ARMv7 is significanly faster due to the use of the hardware FPU +APP_ABI := armeabi armeabi-v7a +APP_OPTIM := debug diff --git a/android/jni/Core.mk b/android/jni/Core.mk new file mode 100644 index 00000000..02ad14c2 --- /dev/null +++ b/android/jni/Core.mk @@ -0,0 +1,110 @@ +LOCAL_PATH := $(call my-dir) + +include $(CLEAR_VARS) + +MY_ROOT := ../.. + +LOCAL_CFLAGS := \ + -I$(LOCAL_PATH)/$(MY_ROOT)/thirdparty/jbig2dec \ + -I$(LOCAL_PATH)/$(MY_ROOT)/thirdparty/openjpeg/libopenjpeg \ + -I$(LOCAL_PATH)/$(MY_ROOT)/thirdparty/jpeg \ + -I$(LOCAL_PATH)/$(MY_ROOT)/thirdparty/zlib \ + -I$(LOCAL_PATH)/$(MY_ROOT)/thirdparty/freetype/include \ + -I$(LOCAL_PATH)/$(MY_ROOT)/draw \ + -I$(LOCAL_PATH)/$(MY_ROOT)/fitz \ + -I$(LOCAL_PATH)/$(MY_ROOT)/mupdf + +LOCAL_MODULE := mupdfcore +LOCAL_SRC_FILES := \ + $(MY_ROOT)/fitz/base_error.c \ + $(MY_ROOT)/fitz/base_geometry.c \ + $(MY_ROOT)/fitz/base_getopt.c \ + $(MY_ROOT)/fitz/base_hash.c \ + $(MY_ROOT)/fitz/base_memory.c \ + $(MY_ROOT)/fitz/base_string.c \ + $(MY_ROOT)/fitz/base_time.c \ + $(MY_ROOT)/fitz/crypt_aes.c \ + $(MY_ROOT)/fitz/crypt_arc4.c \ + $(MY_ROOT)/fitz/crypt_md5.c \ + $(MY_ROOT)/fitz/dev_bbox.c \ + $(MY_ROOT)/fitz/dev_draw.c \ + $(MY_ROOT)/fitz/dev_list.c \ + $(MY_ROOT)/fitz/dev_null.c \ + $(MY_ROOT)/fitz/dev_text.c \ + $(MY_ROOT)/fitz/dev_trace.c \ + $(MY_ROOT)/fitz/filt_basic.c \ + $(MY_ROOT)/fitz/filt_dctd.c \ + $(MY_ROOT)/fitz/filt_faxd.c \ + $(MY_ROOT)/fitz/filt_flate.c \ + $(MY_ROOT)/fitz/filt_jbig2d.c \ + $(MY_ROOT)/fitz/filt_jpxd.c \ + $(MY_ROOT)/fitz/filt_lzwd.c \ + $(MY_ROOT)/fitz/filt_predict.c \ + $(MY_ROOT)/fitz/obj_array.c \ + $(MY_ROOT)/fitz/obj_dict.c \ + $(MY_ROOT)/fitz/obj_print.c \ + $(MY_ROOT)/fitz/obj_simple.c \ + $(MY_ROOT)/fitz/res_colorspace.c \ + $(MY_ROOT)/fitz/res_font.c \ + $(MY_ROOT)/fitz/res_path.c \ + $(MY_ROOT)/fitz/res_pixmap.c \ + $(MY_ROOT)/fitz/res_shade.c \ + $(MY_ROOT)/fitz/res_text.c \ + $(MY_ROOT)/fitz/stm_buffer.c \ + $(MY_ROOT)/fitz/stm_open.c \ + $(MY_ROOT)/fitz/stm_read.c \ + $(MY_ROOT)/draw/archport.c \ + $(MY_ROOT)/draw/blendmodes.c \ + $(MY_ROOT)/draw/glyphcache.c \ + $(MY_ROOT)/draw/imagedraw.c \ + $(MY_ROOT)/draw/imagescale.c \ + $(MY_ROOT)/draw/imagesmooth.c \ + $(MY_ROOT)/draw/imageunpack.c \ + $(MY_ROOT)/draw/meshdraw.c \ + $(MY_ROOT)/draw/pathfill.c \ + $(MY_ROOT)/draw/pathscan.c \ + $(MY_ROOT)/draw/pathstroke.c \ + $(MY_ROOT)/draw/porterduff.c \ + $(MY_ROOT)/mupdf/pdf_annot.c \ + $(MY_ROOT)/mupdf/pdf_build.c \ + $(MY_ROOT)/mupdf/pdf_cmap.c \ + $(MY_ROOT)/mupdf/pdf_cmap_load.c \ + $(MY_ROOT)/mupdf/pdf_cmap_parse.c \ + $(MY_ROOT)/mupdf/pdf_cmap_table.c \ + $(MY_ROOT)/mupdf/pdf_colorspace.c \ + $(MY_ROOT)/mupdf/pdf_crypt.c \ + $(MY_ROOT)/mupdf/pdf_debug.c \ + $(MY_ROOT)/mupdf/pdf_font.c \ + $(MY_ROOT)/mupdf/pdf_fontagl.c \ + $(MY_ROOT)/mupdf/pdf_fontenc.c \ + $(MY_ROOT)/mupdf/pdf_fontfile.c \ + $(MY_ROOT)/mupdf/pdf_fontmtx.c \ + $(MY_ROOT)/mupdf/pdf_function.c \ + $(MY_ROOT)/mupdf/pdf_image.c \ + $(MY_ROOT)/mupdf/pdf_interpret.c \ + $(MY_ROOT)/mupdf/pdf_lex.c \ + $(MY_ROOT)/mupdf/pdf_nametree.c \ + $(MY_ROOT)/mupdf/pdf_outline.c \ + $(MY_ROOT)/mupdf/pdf_page.c \ + $(MY_ROOT)/mupdf/pdf_pagetree.c \ + $(MY_ROOT)/mupdf/pdf_parse.c \ + $(MY_ROOT)/mupdf/pdf_pattern.c \ + $(MY_ROOT)/mupdf/pdf_repair.c \ + $(MY_ROOT)/mupdf/pdf_shade.c \ + $(MY_ROOT)/mupdf/pdf_store.c \ + $(MY_ROOT)/mupdf/pdf_stream.c \ + $(MY_ROOT)/mupdf/pdf_type3.c \ + $(MY_ROOT)/mupdf/pdf_unicode.c \ + $(MY_ROOT)/mupdf/pdf_xobject.c \ + $(MY_ROOT)/mupdf/pdf_xref.c \ + $(MY_ROOT)/pregen/cmap_unicode.c \ + $(MY_ROOT)/pregen/cmap_cns.c \ + $(MY_ROOT)/pregen/cmap_gb.c \ + $(MY_ROOT)/pregen/cmap_japan.c \ + $(MY_ROOT)/pregen/cmap_korea.c \ + $(MY_ROOT)/pregen/font_base14.c \ + $(MY_ROOT)/pregen/font_cjk.c + +LOCAL_LDLIBS := -lm -llog -ljnigraphics + +include $(BUILD_STATIC_LIBRARY) diff --git a/android/jni/ThirdParty.mk b/android/jni/ThirdParty.mk new file mode 100644 index 00000000..6fa7ecf8 --- /dev/null +++ b/android/jni/ThirdParty.mk @@ -0,0 +1,150 @@ +LOCAL_PATH := $(call my-dir) + +include $(CLEAR_VARS) + +MY_ROOT := ../.. + +LOCAL_CFLAGS := \ + -I$(LOCAL_PATH)/$(MY_ROOT)/thirdparty/jbig2dec \ + -I$(LOCAL_PATH)/$(MY_ROOT)/thirdparty/openjpeg/libopenjpeg \ + -I$(LOCAL_PATH)/$(MY_ROOT)/thirdparty/jpeg \ + -I$(LOCAL_PATH)/$(MY_ROOT)/thirdparty/zlib \ + -I$(LOCAL_PATH)/$(MY_ROOT)/thirdparty/freetype/include \ + -DFT2_BUILD_LIBRARY -DDARWIN_NO_CARBON -DHAVE_STDINT_H + +LOCAL_MODULE := mupdfthirdparty +LOCAL_SRC_FILES := \ + $(MY_ROOT)/thirdparty/jbig2dec/jbig2.c \ + $(MY_ROOT)/thirdparty/jbig2dec/jbig2_arith.c \ + $(MY_ROOT)/thirdparty/jbig2dec/jbig2_arith_int.c \ + $(MY_ROOT)/thirdparty/jbig2dec/jbig2_arith_iaid.c \ + $(MY_ROOT)/thirdparty/jbig2dec/jbig2_huffman.c \ + $(MY_ROOT)/thirdparty/jbig2dec/jbig2_segment.c \ + $(MY_ROOT)/thirdparty/jbig2dec/jbig2_page.c \ + $(MY_ROOT)/thirdparty/jbig2dec/jbig2_symbol_dict.c \ + $(MY_ROOT)/thirdparty/jbig2dec/jbig2_text.c \ + $(MY_ROOT)/thirdparty/jbig2dec/jbig2_generic.c \ + $(MY_ROOT)/thirdparty/jbig2dec/jbig2_refinement.c \ + $(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/libopenjpeg/bio.c \ + $(MY_ROOT)/thirdparty/openjpeg/libopenjpeg/cio.c \ + $(MY_ROOT)/thirdparty/openjpeg/libopenjpeg/dwt.c \ + $(MY_ROOT)/thirdparty/openjpeg/libopenjpeg/event.c \ + $(MY_ROOT)/thirdparty/openjpeg/libopenjpeg/image.c \ + $(MY_ROOT)/thirdparty/openjpeg/libopenjpeg/j2k.c \ + $(MY_ROOT)/thirdparty/openjpeg/libopenjpeg/j2k_lib.c \ + $(MY_ROOT)/thirdparty/openjpeg/libopenjpeg/jp2.c \ + $(MY_ROOT)/thirdparty/openjpeg/libopenjpeg/jpt.c \ + $(MY_ROOT)/thirdparty/openjpeg/libopenjpeg/mct.c \ + $(MY_ROOT)/thirdparty/openjpeg/libopenjpeg/mqc.c \ + $(MY_ROOT)/thirdparty/openjpeg/libopenjpeg/openjpeg.c \ + $(MY_ROOT)/thirdparty/openjpeg/libopenjpeg/pi.c \ + $(MY_ROOT)/thirdparty/openjpeg/libopenjpeg/raw.c \ + $(MY_ROOT)/thirdparty/openjpeg/libopenjpeg/t1.c \ + $(MY_ROOT)/thirdparty/openjpeg/libopenjpeg/t2.c \ + $(MY_ROOT)/thirdparty/openjpeg/libopenjpeg/tcd.c \ + $(MY_ROOT)/thirdparty/openjpeg/libopenjpeg/tgt.c \ + $(MY_ROOT)/thirdparty/jpeg/jaricom.c \ + $(MY_ROOT)/thirdparty/jpeg/jcapimin.c \ + $(MY_ROOT)/thirdparty/jpeg/jcapistd.c \ + $(MY_ROOT)/thirdparty/jpeg/jcarith.c \ + $(MY_ROOT)/thirdparty/jpeg/jccoefct.c \ + $(MY_ROOT)/thirdparty/jpeg/jccolor.c \ + $(MY_ROOT)/thirdparty/jpeg/jcdctmgr.c \ + $(MY_ROOT)/thirdparty/jpeg/jchuff.c \ + $(MY_ROOT)/thirdparty/jpeg/jcinit.c \ + $(MY_ROOT)/thirdparty/jpeg/jcmainct.c \ + $(MY_ROOT)/thirdparty/jpeg/jcmarker.c \ + $(MY_ROOT)/thirdparty/jpeg/jcmaster.c \ + $(MY_ROOT)/thirdparty/jpeg/jcomapi.c \ + $(MY_ROOT)/thirdparty/jpeg/jcparam.c \ + $(MY_ROOT)/thirdparty/jpeg/jcprepct.c \ + $(MY_ROOT)/thirdparty/jpeg/jcsample.c \ + $(MY_ROOT)/thirdparty/jpeg/jctrans.c \ + $(MY_ROOT)/thirdparty/jpeg/jdapimin.c \ + $(MY_ROOT)/thirdparty/jpeg/jdapistd.c \ + $(MY_ROOT)/thirdparty/jpeg/jdarith.c \ + $(MY_ROOT)/thirdparty/jpeg/jdatadst.c \ + $(MY_ROOT)/thirdparty/jpeg/jdatasrc.c \ + $(MY_ROOT)/thirdparty/jpeg/jdcoefct.c \ + $(MY_ROOT)/thirdparty/jpeg/jdcolor.c \ + $(MY_ROOT)/thirdparty/jpeg/jddctmgr.c \ + $(MY_ROOT)/thirdparty/jpeg/jdhuff.c \ + $(MY_ROOT)/thirdparty/jpeg/jdinput.c \ + $(MY_ROOT)/thirdparty/jpeg/jdmainct.c \ + $(MY_ROOT)/thirdparty/jpeg/jdmarker.c \ + $(MY_ROOT)/thirdparty/jpeg/jdmaster.c \ + $(MY_ROOT)/thirdparty/jpeg/jdmerge.c \ + $(MY_ROOT)/thirdparty/jpeg/jdpostct.c \ + $(MY_ROOT)/thirdparty/jpeg/jdsample.c \ + $(MY_ROOT)/thirdparty/jpeg/jdtrans.c \ + $(MY_ROOT)/thirdparty/jpeg/jerror.c \ + $(MY_ROOT)/thirdparty/jpeg/jfdctflt.c \ + $(MY_ROOT)/thirdparty/jpeg/jfdctfst.c \ + $(MY_ROOT)/thirdparty/jpeg/jfdctint.c \ + $(MY_ROOT)/thirdparty/jpeg/jidctflt.c \ + $(MY_ROOT)/thirdparty/jpeg/jidctfst.c \ + $(MY_ROOT)/thirdparty/jpeg/jidctint.c \ + $(MY_ROOT)/thirdparty/jpeg/jquant1.c \ + $(MY_ROOT)/thirdparty/jpeg/jquant2.c \ + $(MY_ROOT)/thirdparty/jpeg/jutils.c \ + $(MY_ROOT)/thirdparty/jpeg/jmemmgr.c \ + $(MY_ROOT)/thirdparty/jpeg/jmemansi.c \ + $(MY_ROOT)/thirdparty/zlib/adler32.c \ + $(MY_ROOT)/thirdparty/zlib/compress.c \ + $(MY_ROOT)/thirdparty/zlib/crc32.c \ + $(MY_ROOT)/thirdparty/zlib/deflate.c \ + $(MY_ROOT)/thirdparty/zlib/gzclose.c \ + $(MY_ROOT)/thirdparty/zlib/gzlib.c \ + $(MY_ROOT)/thirdparty/zlib/gzread.c \ + $(MY_ROOT)/thirdparty/zlib/gzwrite.c \ + $(MY_ROOT)/thirdparty/zlib/infback.c \ + $(MY_ROOT)/thirdparty/zlib/inffast.c \ + $(MY_ROOT)/thirdparty/zlib/inflate.c \ + $(MY_ROOT)/thirdparty/zlib/inftrees.c \ + $(MY_ROOT)/thirdparty/zlib/trees.c \ + $(MY_ROOT)/thirdparty/zlib/uncompr.c \ + $(MY_ROOT)/thirdparty/zlib/zutil.c \ + $(MY_ROOT)/thirdparty/freetype/src/autofit/autofit.c \ + $(MY_ROOT)/thirdparty/freetype/src/base/ftbase.c \ + $(MY_ROOT)/thirdparty/freetype/src/base/ftbbox.c \ + $(MY_ROOT)/thirdparty/freetype/src/base/ftbdf.c \ + $(MY_ROOT)/thirdparty/freetype/src/base/ftbitmap.c \ + $(MY_ROOT)/thirdparty/freetype/src/base/ftdebug.c \ + $(MY_ROOT)/thirdparty/freetype/src/base/ftgasp.c \ + $(MY_ROOT)/thirdparty/freetype/src/base/ftglyph.c \ + $(MY_ROOT)/thirdparty/freetype/src/base/ftgxval.c \ + $(MY_ROOT)/thirdparty/freetype/src/base/ftinit.c \ + $(MY_ROOT)/thirdparty/freetype/src/base/ftlcdfil.c \ + $(MY_ROOT)/thirdparty/freetype/src/base/ftmm.c \ + $(MY_ROOT)/thirdparty/freetype/src/base/ftotval.c \ + $(MY_ROOT)/thirdparty/freetype/src/base/ftpfr.c \ + $(MY_ROOT)/thirdparty/freetype/src/base/ftstroke.c \ + $(MY_ROOT)/thirdparty/freetype/src/base/ftsynth.c \ + $(MY_ROOT)/thirdparty/freetype/src/base/ftsystem.c \ + $(MY_ROOT)/thirdparty/freetype/src/base/fttype1.c \ + $(MY_ROOT)/thirdparty/freetype/src/base/ftwinfnt.c \ + $(MY_ROOT)/thirdparty/freetype/src/base/ftxf86.c \ + $(MY_ROOT)/thirdparty/freetype/src/base/ftpatent.c \ + $(MY_ROOT)/thirdparty/freetype/src/bdf/bdf.c \ + $(MY_ROOT)/thirdparty/freetype/src/cache/ftcache.c \ + $(MY_ROOT)/thirdparty/freetype/src/cff/cff.c \ + $(MY_ROOT)/thirdparty/freetype/src/cid/type1cid.c \ + $(MY_ROOT)/thirdparty/freetype/src/gzip/ftgzip.c \ + $(MY_ROOT)/thirdparty/freetype/src/lzw/ftlzw.c \ + $(MY_ROOT)/thirdparty/freetype/src/pcf/pcf.c \ + $(MY_ROOT)/thirdparty/freetype/src/pfr/pfr.c \ + $(MY_ROOT)/thirdparty/freetype/src/psaux/psaux.c \ + $(MY_ROOT)/thirdparty/freetype/src/pshinter/pshinter.c \ + $(MY_ROOT)/thirdparty/freetype/src/psnames/psnames.c \ + $(MY_ROOT)/thirdparty/freetype/src/raster/raster.c \ + $(MY_ROOT)/thirdparty/freetype/src/smooth/smooth.c \ + $(MY_ROOT)/thirdparty/freetype/src/sfnt/sfnt.c \ + $(MY_ROOT)/thirdparty/freetype/src/truetype/truetype.c \ + $(MY_ROOT)/thirdparty/freetype/src/type1/type1.c \ + $(MY_ROOT)/thirdparty/freetype/src/type42/type42.c \ + $(MY_ROOT)/thirdparty/freetype/src/winfonts/winfnt.c + +include $(BUILD_STATIC_LIBRARY) diff --git a/android/jni/mupdf.c b/android/jni/mupdf.c new file mode 100644 index 00000000..ea11be2d --- /dev/null +++ b/android/jni/mupdf.c @@ -0,0 +1,239 @@ +#include <jni.h> +#include <time.h> +#include <android/log.h> +#include <android/bitmap.h> + +#include <stdio.h> +#include <stdlib.h> +#include <math.h> + +#include "fitz.h" +#include "mupdf.h" + +#define LOG_TAG "libmupdf" +#define LOGI(...) __android_log_print(ANDROID_LOG_INFO,LOG_TAG,__VA_ARGS__) +#define LOGE(...) __android_log_print(ANDROID_LOG_ERROR,LOG_TAG,__VA_ARGS__) + +/* Set to 1 to enable debug log traces. */ +#define DEBUG 0 + +/* Globals */ +fz_colorspace *colorspace; +fz_glyphcache *glyphcache; +pdf_xref *xref; +int pagenum = 1; +int resolution = 160; +pdf_page *currentPage; +float pageWidth = 100; +float pageHeight = 100; + +JNIEXPORT int JNICALL Java_com_artifex_mupdf_PixmapView_mupdfOpenFile(JNIEnv * env, jobject thiz, jstring jfilename) +{ + const char *filename; + char *password = ""; + int accelerate = 1; + fz_error error; + + filename = (*env)->GetStringUTFChars(env, jfilename, NULL); + if (filename == NULL) + { + LOGE("Failed to get filename"); + return 0; + } + + if (accelerate) + fz_accelerate(); + glyphcache = fz_newglyphcache(); + colorspace = fz_devicergb; + + LOGE("Opening document..."); + error = pdf_openxref(&xref, filename, password); + if (error) + { + LOGE("Cannot open document: '%s'\n", filename); + return 0; + } + + LOGE("Loading page tree..."); + error = pdf_loadpagetree(xref); + if (error) + { + LOGE("Cannot load page tree: '%s'\n", filename); + return 0; + } + LOGE("Done! %d pages", pdf_getpagecount(xref)); + + return pdf_getpagecount(xref); +} + +JNIEXPORT void JNICALL Java_com_artifex_mupdf_PixmapView_mupdfGotoPage( + JNIEnv *env, + jobject thiz, + int page) +{ + float zoom; + fz_matrix ctm; + fz_obj *pageobj; + fz_bbox bbox; + fz_error error; + + /* In the event of an error, ensure we give a non-empty page */ + pageWidth = 100; + pageHeight = 100; + + /* Free any current page */ + if (currentPage != NULL) + { + pdf_freepage(currentPage); + currentPage = NULL; + } + + LOGE("Goto page %d...", page); + pagenum = page; + pageobj = pdf_getpageobject(xref, pagenum); + if (pageobj == NULL) + return; + error = pdf_loadpage(¤tPage, xref, pageobj); + if (error) + return; + zoom = resolution / 72; + ctm = fz_translate(0, -currentPage->mediabox.y1); + ctm = fz_concat(ctm, fz_scale(zoom, -zoom)); + ctm = fz_concat(ctm, fz_rotate(currentPage->rotate)); + bbox = fz_roundrect(fz_transformrect(ctm, currentPage->mediabox)); + pageWidth = bbox.x1-bbox.x0; + pageHeight = bbox.y1-bbox.y0; + LOGE("Success [w=%g, h=%g]", pageWidth, pageHeight); +} + +JNIEXPORT float JNICALL Java_com_artifex_mupdf_PixmapView_mupdfPageWidth( + JNIEnv *env, + jobject thiz) +{ + LOGE("PageWidth=%g", pageWidth); + return pageWidth; +} + +JNIEXPORT float JNICALL Java_com_artifex_mupdf_PixmapView_mupdfPageHeight( + JNIEnv *env, + jobject thiz) +{ + LOGE("PageHeight=%g", pageHeight); + return pageHeight; +} + + +JNIEXPORT jboolean JNICALL Java_com_artifex_mupdf_PixmapView_mupdfDrawPage( + JNIEnv *env, + jobject thiz, + jobject bitmap, + int pageW, + int pageH, + int patchX, + int patchY, + int patchW, + int patchH) +{ + AndroidBitmapInfo info; + void* pixels; + int ret, i, c; + + LOGI("In native method\n"); + if ((ret = AndroidBitmap_getInfo(env, bitmap, &info)) < 0) { + LOGE("AndroidBitmap_getInfo() failed ! error=%d", ret); + return 0; + } + + LOGI("Checking format\n"); + if (info.format != ANDROID_BITMAP_FORMAT_RGBA_8888) { + LOGE("Bitmap format is not RGBA_8888 !"); + return 0; + } + + LOGI("locking pixels\n"); + if ((ret = AndroidBitmap_lockPixels(env, bitmap, &pixels)) < 0) { + LOGE("AndroidBitmap_lockPixels() failed ! error=%d", ret); + return 0; + } + + LOGI("render page\n"); + /* Call mupdf to render page */ + { + fz_error error; + fz_displaylist *list; + fz_device *dev; + + /* Render to list */ + LOGI("make list\n"); + list = fz_newdisplaylist(); + LOGI("make device\n"); + dev = fz_newlistdevice(list); + LOGI("render to device\n"); + error = pdf_runpage(xref, currentPage, dev, fz_identity); + if (error) + { + LOGE("cannot draw page %d", pagenum); + return 0; + } + LOGI("free device\n"); + fz_freedevice(dev); + + /* Render to screen */ + LOGE("Rendering page=%dx%d patch=[%d,%d,%d,%d]", + pageW, pageH, patchX, patchY, patchW, patchH); + { + float zoom; + fz_matrix ctm; + fz_bbox bbox; + fz_pixmap *pix; + float xscale, yscale; + + zoom = resolution / 72; + ctm = fz_translate(0, -currentPage->mediabox.y1); + ctm = fz_concat(ctm, fz_scale(zoom, -zoom)); + ctm = fz_concat(ctm, fz_rotate(currentPage->rotate)); + bbox = fz_roundrect(fz_transformrect(ctm,currentPage->mediabox)); + + LOGE("mediabox=%g %g %g %g zoom=%g rotate=%d", + currentPage->mediabox.x0, + currentPage->mediabox.y0, + currentPage->mediabox.x1, + currentPage->mediabox.y1, + zoom, + currentPage->rotate); + LOGE("ctm = [%g %g %g %g %g %g] to [%d %d %d %d]", ctm.a, ctm.b, ctm.c, ctm.d, ctm.e, ctm.f, bbox.x0, bbox.y0, bbox.x1, bbox.y1); + /* Now, adjust ctm so that it would give the correct page width + * heights. */ + xscale = (float)pageW/(float)(bbox.x1-bbox.x0); + yscale = (float)pageH/(float)(bbox.y1-bbox.y0); + ctm = fz_concat(ctm, fz_scale(xscale, yscale)); + bbox = fz_roundrect(fz_transformrect(ctm,currentPage->mediabox)); + LOGE("ctm = [%g %g %g %g %g %g] to [%d %d %d %d]", ctm.a, ctm.b, ctm.c, ctm.d, ctm.e, ctm.f, bbox.x0, bbox.y0, bbox.x1, bbox.y1); + + pix = fz_newpixmapwithdata(colorspace, + patchX, + patchY, + patchW, + patchH, + pixels); + LOGE("Clearing"); + fz_clearpixmapwithcolor(pix, 0xff); + LOGE("Cleared"); + dev = fz_newdrawdevice(glyphcache, pix); + fz_executedisplaylist(list, dev, ctm); + fz_freedevice(dev); + fz_droppixmap(pix); + } + LOGE("Rendered"); + fz_freedisplaylist(list); + } + + AndroidBitmap_unlockPixels(env, bitmap); + + return 1; +} + +void android_log(char *err, int n) +{ + LOGE(err, n); +} |