summaryrefslogtreecommitdiff
path: root/android/jni
diff options
context:
space:
mode:
authorRobin Watts <robin.watts@artifex.com>2010-12-02 18:52:55 +0000
committerRobin Watts <robin.watts@artifex.com>2010-12-02 18:52:55 +0000
commitcd7c8b147ad173f7071d3b1d115e913fc08c5cc3 (patch)
treea99ff136ac5458d54b1d1ee5f8856c8c46a3905e /android/jni
parentb31a16f7bb711764fab3722898e1b459ca79a1e1 (diff)
downloadmupdf-cd7c8b147ad173f7071d3b1d115e913fc08c5cc3.tar.xz
Import Android demo.
Diffstat (limited to 'android/jni')
-rw-r--r--android/jni/Android.mk21
-rw-r--r--android/jni/Application.mk3
-rw-r--r--android/jni/Core.mk110
-rw-r--r--android/jni/ThirdParty.mk150
-rw-r--r--android/jni/mupdf.c239
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(&currentPage, 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);
+}