summaryrefslogtreecommitdiff
path: root/platform/java/src/com/artifex/mupdf
diff options
context:
space:
mode:
authorfred ross-perry <fredross-perry@Fred-Ross-Perrys-Computer.local>2016-07-14 16:05:15 -0700
committerfred ross-perry <fred.ross-perry@artifex.com>2016-07-15 09:36:56 -0700
commitcb78b5c6782f14a699f90bd5621cd3656a1e02ea (patch)
tree47b83072ff5fb133f8d4ac9ff32992e464234f86 /platform/java/src/com/artifex/mupdf
parente47769cf2bc9feb30c074c965883f9662540ab3b (diff)
downloadmupdf-cb78b5c6782f14a699f90bd5621cd3656a1e02ea.tar.xz
java - move fitz sources into a 'src' subfolder.
Diffstat (limited to 'platform/java/src/com/artifex/mupdf')
-rw-r--r--platform/java/src/com/artifex/mupdf/fitz/Annotation.java24
-rw-r--r--platform/java/src/com/artifex/mupdf/fitz/Buffer.java39
-rw-r--r--platform/java/src/com/artifex/mupdf/fitz/ColorSpace.java45
-rw-r--r--platform/java/src/com/artifex/mupdf/fitz/Context.java28
-rw-r--r--platform/java/src/com/artifex/mupdf/fitz/Cookie.java21
-rw-r--r--platform/java/src/com/artifex/mupdf/fitz/Device.java104
-rw-r--r--platform/java/src/com/artifex/mupdf/fitz/DisplayList.java32
-rw-r--r--platform/java/src/com/artifex/mupdf/fitz/DisplayListDevice.java10
-rw-r--r--platform/java/src/com/artifex/mupdf/fitz/Document.java52
-rw-r--r--platform/java/src/com/artifex/mupdf/fitz/DocumentWriter.java27
-rw-r--r--platform/java/src/com/artifex/mupdf/fitz/DrawDevice.java10
-rw-r--r--platform/java/src/com/artifex/mupdf/fitz/Font.java40
-rw-r--r--platform/java/src/com/artifex/mupdf/fitz/Image.java42
-rw-r--r--platform/java/src/com/artifex/mupdf/fitz/Link.java19
-rw-r--r--platform/java/src/com/artifex/mupdf/fitz/Matrix.java163
-rw-r--r--platform/java/src/com/artifex/mupdf/fitz/NativeDevice.java47
-rw-r--r--platform/java/src/com/artifex/mupdf/fitz/Outline.java17
-rw-r--r--platform/java/src/com/artifex/mupdf/fitz/PDFDocument.java57
-rw-r--r--platform/java/src/com/artifex/mupdf/fitz/PDFObject.java155
-rw-r--r--platform/java/src/com/artifex/mupdf/fitz/Page.java43
-rw-r--r--platform/java/src/com/artifex/mupdf/fitz/Path.java64
-rw-r--r--platform/java/src/com/artifex/mupdf/fitz/PathWalker.java9
-rw-r--r--platform/java/src/com/artifex/mupdf/fitz/Pixmap.java83
-rw-r--r--platform/java/src/com/artifex/mupdf/fitz/Point.java30
-rw-r--r--platform/java/src/com/artifex/mupdf/fitz/Rect.java77
-rw-r--r--platform/java/src/com/artifex/mupdf/fitz/RectI.java80
-rw-r--r--platform/java/src/com/artifex/mupdf/fitz/Shade.java17
-rw-r--r--platform/java/src/com/artifex/mupdf/fitz/StrokeState.java55
-rw-r--r--platform/java/src/com/artifex/mupdf/fitz/StructuredText.java21
-rw-r--r--platform/java/src/com/artifex/mupdf/fitz/Text.java43
-rw-r--r--platform/java/src/com/artifex/mupdf/fitz/TextWalker.java6
-rw-r--r--platform/java/src/com/artifex/mupdf/fitz/TryLaterException.java8
-rw-r--r--platform/java/src/com/artifex/mupdf/fitz/android/AndroidDrawDevice.java25
33 files changed, 1493 insertions, 0 deletions
diff --git a/platform/java/src/com/artifex/mupdf/fitz/Annotation.java b/platform/java/src/com/artifex/mupdf/fitz/Annotation.java
new file mode 100644
index 00000000..855ff5a1
--- /dev/null
+++ b/platform/java/src/com/artifex/mupdf/fitz/Annotation.java
@@ -0,0 +1,24 @@
+package com.artifex.mupdf.fitz;
+
+public class Annotation
+{
+ private long pointer;
+
+ protected native void finalize();
+
+ public void destroy() {
+ finalize();
+ pointer = 0;
+ }
+
+ private Annotation(long p) {
+ pointer = p;
+ }
+
+ public native void run(Device dev, Matrix ctm, Cookie cookie);
+ public native Pixmap toPixmap(Matrix ctm, ColorSpace colorspace, boolean alpha);
+ public native Rect getBounds();
+ public native DisplayList toDisplayList();
+
+ private native long advance();
+}
diff --git a/platform/java/src/com/artifex/mupdf/fitz/Buffer.java b/platform/java/src/com/artifex/mupdf/fitz/Buffer.java
new file mode 100644
index 00000000..7f23b062
--- /dev/null
+++ b/platform/java/src/com/artifex/mupdf/fitz/Buffer.java
@@ -0,0 +1,39 @@
+package com.artifex.mupdf.fitz;
+
+public class Buffer
+{
+ static {
+ Context.init();
+ }
+
+ public static final int DEFAULT_BUFFER_SIZE = 1024;
+
+ private long pointer;
+
+ protected native void finalize();
+
+ public void destroy() {
+ finalize();
+ pointer = 0;
+ }
+
+ private native long newNativeBuffer(int n);
+
+ public Buffer(int n) {
+ pointer = newNativeBuffer(n);
+ }
+
+ public Buffer() {
+ pointer = newNativeBuffer(DEFAULT_BUFFER_SIZE);
+ }
+
+ public native int getLength();
+ public native void writeByte(byte b);
+ public native void writeBytes(byte[] bs);
+ public native void writeBuffer(Buffer buf);
+ public native void writeRune(int rune);
+ public native void writeLine(String line);
+ public native void writeLines(String... lines);
+
+ public native void save(String filename);
+}
diff --git a/platform/java/src/com/artifex/mupdf/fitz/ColorSpace.java b/platform/java/src/com/artifex/mupdf/fitz/ColorSpace.java
new file mode 100644
index 00000000..b7822161
--- /dev/null
+++ b/platform/java/src/com/artifex/mupdf/fitz/ColorSpace.java
@@ -0,0 +1,45 @@
+package com.artifex.mupdf.fitz;
+
+public class ColorSpace
+{
+ private long pointer;
+
+ protected native void finalize();
+
+ public void destroy() {
+ finalize();
+ pointer = 0;
+ }
+
+ private ColorSpace(long p) {
+ pointer = p;
+ }
+
+ private static native long nativeDeviceGray();
+ private static native long nativeDeviceRGB();
+ private static native long nativeDeviceBGR();
+ private static native long nativeDeviceCMYK();
+
+ protected static ColorSpace fromPointer(long p) {
+ if (p == DeviceGray.pointer) return DeviceGray;
+ if (p == DeviceRGB.pointer) return DeviceRGB;
+ if (p == DeviceBGR.pointer) return DeviceBGR;
+ if (p == DeviceCMYK.pointer) return DeviceCMYK;
+ return new ColorSpace(p);
+ }
+
+ public static ColorSpace DeviceGray = new ColorSpace(nativeDeviceGray());
+ public static ColorSpace DeviceRGB = new ColorSpace(nativeDeviceRGB());
+ public static ColorSpace DeviceBGR = new ColorSpace(nativeDeviceBGR());
+ public static ColorSpace DeviceCMYK = new ColorSpace(nativeDeviceCMYK());
+
+ public native int getNumberOfComponents();
+
+ public String toString() {
+ if (this == DeviceGray) return "DeviceGray";
+ if (this == DeviceRGB) return "DeviceRGB";
+ if (this == DeviceBGR) return "DeviceBGR";
+ if (this == DeviceCMYK) return "DeviceCMYK";
+ return "ColorSpace(" + getNumberOfComponents() + ")";
+ }
+}
diff --git a/platform/java/src/com/artifex/mupdf/fitz/Context.java b/platform/java/src/com/artifex/mupdf/fitz/Context.java
new file mode 100644
index 00000000..3614e65f
--- /dev/null
+++ b/platform/java/src/com/artifex/mupdf/fitz/Context.java
@@ -0,0 +1,28 @@
+package com.artifex.mupdf.fitz;
+
+// This class handles the loading of the MuPDF shared library, together
+// with the ThreadLocal magic to get the required context.
+//
+// The only publicly accessible method here is Context.setStoreSize, which
+// sets the store size to use. This must be called before any other MuPDF
+// function.
+public class Context
+{
+ private static boolean inited = false;
+ private static native int initNative();
+
+ public static void init() {
+ if (!inited) {
+ inited = true;
+ System.loadLibrary("mupdf_java");
+ if (initNative() < 0)
+ throw new RuntimeException("cannot initialize mupdf library");
+ }
+ }
+
+ static { init(); }
+
+ // FIXME: We should support the store size being changed dynamically.
+ // This requires changes within the MuPDF core.
+ //public native static void setStoreSize(long newSize);
+}
diff --git a/platform/java/src/com/artifex/mupdf/fitz/Cookie.java b/platform/java/src/com/artifex/mupdf/fitz/Cookie.java
new file mode 100644
index 00000000..f866f99e
--- /dev/null
+++ b/platform/java/src/com/artifex/mupdf/fitz/Cookie.java
@@ -0,0 +1,21 @@
+package com.artifex.mupdf.fitz;
+
+public class Cookie
+{
+ private long pointer;
+
+ protected native void finalize();
+
+ public void destroy() {
+ finalize();
+ pointer = 0;
+ }
+
+ private native long newNative();
+
+ public Cookie() {
+ pointer = newNative();
+ }
+
+ public native void abort();
+}
diff --git a/platform/java/src/com/artifex/mupdf/fitz/Device.java b/platform/java/src/com/artifex/mupdf/fitz/Device.java
new file mode 100644
index 00000000..295226fe
--- /dev/null
+++ b/platform/java/src/com/artifex/mupdf/fitz/Device.java
@@ -0,0 +1,104 @@
+package com.artifex.mupdf.fitz;
+
+public class Device
+{
+ protected long pointer;
+
+ protected native void finalize();
+
+ public void destroy() {
+ finalize();
+ pointer = 0;
+ }
+
+ private native long newNative();
+
+ protected Device() {
+ pointer = newNative();
+ }
+
+ protected Device(long p) {
+ pointer = p;
+ }
+
+ /* An accessor for device hints */
+ public native int getHints();
+ public native void enableDeviceHints(int hints);
+ public native void disableDeviceHints(int hints);
+
+ /* To implement your own device in Java, you should define your own
+ * class that extends Device, and override as many of the following
+ * functions as is appropriate. For example:
+ *
+ * class ImageTraceDevice extends Device
+ * {
+ * void fillImage(Image img, Matrix ctx, float alpha) {
+ * System.out.println("Image!");
+ * }
+ * };
+ */
+
+ public void close() {}
+ public void fillPath(Path path, boolean evenOdd, Matrix ctm, ColorSpace cs, float color[], float alpha) {}
+ public void strokePath(Path path, StrokeState stroke, Matrix ctm, ColorSpace cs, float color[], float alpha) {}
+ public void clipPath(Path path, boolean evenOdd, Matrix ctm) {}
+ public void clipStrokePath(Path path, StrokeState stroke, Matrix ctm) {}
+ public void fillText(Text text, Matrix ctm, ColorSpace cs, float color[], float alpha) {}
+ public void strokeText(Text text, StrokeState stroke, Matrix ctm, ColorSpace cs, float color[], float alpha) {}
+ public void clipText(Text text, Matrix ctm) {}
+ public void clipStrokeText(Text text, StrokeState stroke, Matrix ctm) {}
+ public void ignoreText(Text text, Matrix ctm) {}
+ public void fillShade(Shade shd, Matrix ctm, float alpha) {}
+ public void fillImage(Image img, Matrix ctm, float alpha) {}
+ public void fillImageMask(Image img, Matrix ctm, ColorSpace cs, float color[], float alpha) {}
+ public void clipImageMask(Image img, Matrix ctm) {}
+ public void popClip() {}
+ public void beginMask(Rect area, boolean luminosity, ColorSpace cs, float bc[]) {}
+ public void endMask() {}
+ public void beginGroup(Rect area, boolean isolated, boolean knockout, int blendmode, float alpha) {}
+ public void endGroup() {}
+ public int beginTile(Rect area, Rect view, float xstep, float ystep, Matrix ctm, int id) { return 0; }
+ public void endTile() {}
+
+ /* Flags */
+ public static final int FZ_DEVFLAG_MASK = 1;
+ public static final int FZ_DEVFLAG_COLOR = 2;
+ public static final int FZ_DEVFLAG_UNCACHEABLE = 4;
+ public static final int FZ_DEVFLAG_FILLCOLOR_UNDEFINED = 8;
+ public static final int FZ_DEVFLAG_STROKECOLOR_UNDEFINED = 16;
+ public static final int FZ_DEVFLAG_STARTCAP_UNDEFINED = 32;
+ public static final int FZ_DEVFLAG_DASHCAP_UNDEFINED = 64;
+ public static final int FZ_DEVFLAG_ENDCAP_UNDEFINED = 128;
+ public static final int FZ_DEVFLAG_LINEJOIN_UNDEFINED = 256;
+ public static final int FZ_DEVFLAG_MITERLIMIT_UNDEFINED = 512;
+ public static final int FZ_DEVFLAG_LINEWIDTH_UNDEFINED = 1024;
+
+ /* PDF 1.4 -- standard separable */
+ public static final int FZ_BLEND_NORMAL = 0;
+ public static final int FZ_BLEND_MULTIPLY = 1;
+ public static final int FZ_BLEND_SCREEN = 2;
+ public static final int FZ_BLEND_OVERLAY = 3;
+ public static final int FZ_BLEND_DARKEN = 4;
+ public static final int FZ_BLEND_LIGHTEN = 5;
+ public static final int FZ_BLEND_COLOR_DODGE = 6;
+ public static final int FZ_BLEND_COLOR_BURN = 7;
+ public static final int FZ_BLEND_HARD_LIGHT = 8;
+ public static final int FZ_BLEND_SOFT_LIGHT = 9;
+ public static final int FZ_BLEND_DIFFERENCE = 10;
+ public static final int FZ_BLEND_EXCLUSION = 11;
+
+ /* PDF 1.4 -- standard non-separable */
+ public static final int FZ_BLEND_HUE = 12;
+ public static final int FZ_BLEND_SATURATION = 13;
+ public static final int FZ_BLEND_COLOR = 14;
+ public static final int FZ_BLEND_LUMINOSITY = 15;
+
+ /* For packing purposes */
+ public static final int FZ_BLEND_MODEMASK = 15;
+ public static final int FZ_BLEND_ISOLATED = 16;
+ public static final int FZ_BLEND_KNOCKOUT = 32;
+
+ /* Device hints */
+ public static final int FZ_IGNORE_IMAGE = 1;
+ public static final int FZ_IGNORE_SHADE = 2;
+}
diff --git a/platform/java/src/com/artifex/mupdf/fitz/DisplayList.java b/platform/java/src/com/artifex/mupdf/fitz/DisplayList.java
new file mode 100644
index 00000000..3e822eea
--- /dev/null
+++ b/platform/java/src/com/artifex/mupdf/fitz/DisplayList.java
@@ -0,0 +1,32 @@
+package com.artifex.mupdf.fitz;
+
+public class DisplayList
+{
+ private long pointer;
+
+ protected native void finalize();
+
+ public void destroy() {
+ finalize();
+ pointer = 0;
+ }
+
+ private native long newNative();
+
+ public DisplayList() {
+ pointer = newNative();
+ }
+
+ private DisplayList(long p) {
+ pointer = p;
+ }
+
+ public native Pixmap toPixmap(Matrix ctm, ColorSpace colorspace, boolean alpha);
+ public native Rect[] search(String needle);
+
+ public native void run(Device dev, Matrix ctm, Rect scissor, Cookie cookie);
+
+ public void run(Device dev, Matrix ctm, Cookie cookie) {
+ run(dev, ctm, null, cookie);
+ }
+}
diff --git a/platform/java/src/com/artifex/mupdf/fitz/DisplayListDevice.java b/platform/java/src/com/artifex/mupdf/fitz/DisplayListDevice.java
new file mode 100644
index 00000000..c7f7c935
--- /dev/null
+++ b/platform/java/src/com/artifex/mupdf/fitz/DisplayListDevice.java
@@ -0,0 +1,10 @@
+package com.artifex.mupdf.fitz;
+
+public final class DisplayListDevice extends NativeDevice
+{
+ private static native long newNative(DisplayList list);
+
+ public DisplayListDevice(DisplayList list) {
+ super(newNative(list));
+ }
+}
diff --git a/platform/java/src/com/artifex/mupdf/fitz/Document.java b/platform/java/src/com/artifex/mupdf/fitz/Document.java
new file mode 100644
index 00000000..89e3013b
--- /dev/null
+++ b/platform/java/src/com/artifex/mupdf/fitz/Document.java
@@ -0,0 +1,52 @@
+package com.artifex.mupdf.fitz;
+
+public class Document
+{
+ static {
+ Context.init();
+ }
+
+ public static final String META_FORMAT = "format";
+ public static final String META_ENCRYPTION = "encryption";
+ public static final String META_INFO_AUTHOR = "info:Author";
+ public static final String META_INFO_TITLE = "info:Title";
+
+ private long pointer;
+
+ protected native void finalize();
+
+ public void destroy() {
+ finalize();
+ pointer = 0;
+ }
+
+ private native long newNativeWithPath(String filename);
+ private native long newNativeWithBuffer(byte buffer[], String magic);
+ // private native long newNativeWithRandomAccessFile(RandomAccessFile file, String magic);
+
+ public Document(String filename) {
+ pointer = newNativeWithPath(filename);
+ }
+
+ public Document(byte buffer[], String magic) {
+ pointer = newNativeWithBuffer(buffer, magic);
+ }
+
+ private Document(long p) {
+ pointer = p;
+ }
+
+ public native boolean needsPassword();
+ public native boolean authenticatePassword(String password);
+
+ public native int countPages();
+ public native Page loadPage(int number);
+ public native Outline loadOutline();
+ public native String getMetaData(String key);
+ public native boolean isReflowable();
+ public native void layout(float width, float height, float em);
+
+ public native boolean isUnencryptedPDF();
+
+ public native PDFDocument toPDFDocument();
+}
diff --git a/platform/java/src/com/artifex/mupdf/fitz/DocumentWriter.java b/platform/java/src/com/artifex/mupdf/fitz/DocumentWriter.java
new file mode 100644
index 00000000..dce9d73d
--- /dev/null
+++ b/platform/java/src/com/artifex/mupdf/fitz/DocumentWriter.java
@@ -0,0 +1,27 @@
+package com.artifex.mupdf.fitz;
+
+public class DocumentWriter
+{
+ static {
+ Context.init();
+ }
+
+ private long pointer;
+
+ protected native void finalize();
+
+ public void destroy() {
+ finalize();
+ pointer = 0;
+ }
+
+ private native long newNativeDocumentWriter(String filename, String format, String options);
+
+ public DocumentWriter(String filename, String format, String options) {
+ pointer = newNativeDocumentWriter(filename, format, options);
+ }
+
+ public native Device beingPage(Rect mediabox);
+ public native void endPage(Device device);
+ public native void close();
+}
diff --git a/platform/java/src/com/artifex/mupdf/fitz/DrawDevice.java b/platform/java/src/com/artifex/mupdf/fitz/DrawDevice.java
new file mode 100644
index 00000000..e022be10
--- /dev/null
+++ b/platform/java/src/com/artifex/mupdf/fitz/DrawDevice.java
@@ -0,0 +1,10 @@
+package com.artifex.mupdf.fitz;
+
+public final class DrawDevice extends NativeDevice
+{
+ private static native long newNative(Pixmap pixmap);
+
+ public DrawDevice(Pixmap pixmap) {
+ super(newNative(pixmap));
+ }
+}
diff --git a/platform/java/src/com/artifex/mupdf/fitz/Font.java b/platform/java/src/com/artifex/mupdf/fitz/Font.java
new file mode 100644
index 00000000..5101a6ac
--- /dev/null
+++ b/platform/java/src/com/artifex/mupdf/fitz/Font.java
@@ -0,0 +1,40 @@
+package com.artifex.mupdf.fitz;
+
+public class Font
+{
+ private long pointer;
+
+ protected native void finalize();
+
+ public void destroy() {
+ finalize();
+ pointer = 0;
+ }
+
+ private native long newNative(String name, int index);
+
+ private Font(long p) {
+ pointer = p;
+ }
+
+ public Font(String name, int index) {
+ pointer = newNative(name, index);
+ }
+
+ public Font(String name) {
+ pointer = newNative(name, 0);
+ }
+
+ public native String getName();
+
+ public native int encodeCharacter(int unicode);
+ public native float advanceGlyph(int glyph, boolean wmode);
+
+ public float advanceGlyph(int glyph) {
+ return advanceGlyph(glyph, false);
+ }
+
+ public String toString() {
+ return "Font(" + getName() + ")";
+ }
+}
diff --git a/platform/java/src/com/artifex/mupdf/fitz/Image.java b/platform/java/src/com/artifex/mupdf/fitz/Image.java
new file mode 100644
index 00000000..4d2f7eb5
--- /dev/null
+++ b/platform/java/src/com/artifex/mupdf/fitz/Image.java
@@ -0,0 +1,42 @@
+package com.artifex.mupdf.fitz;
+
+public class Image
+{
+ private long pointer;
+
+ protected native void finalize();
+
+ public void destroy() {
+ finalize();
+ pointer = 0;
+ }
+
+ private native long newNativeFromPixmap(Pixmap pixmap);
+ private native long newNativeFromFile(String filename);
+
+ private Image(long p) {
+ pointer = p;
+ }
+
+ public Image(Pixmap pixmap) {
+ pointer = newNativeFromPixmap(pixmap);
+ }
+
+ public Image(String filename) {
+ pointer = newNativeFromFile(filename);
+ }
+
+ public native int getWidth();
+ public native int getHeight();
+ public native int getXResolution();
+ public native int getYResolution();
+
+ public native ColorSpace getColorSpace();
+ public native int getNumberOfComponents();
+ public native int getBitsPerComponent();
+ public native boolean getImageMask();
+ public native boolean getInterpolate();
+ public native Image getMask();
+
+ public native Pixmap toPixmap();
+}
diff --git a/platform/java/src/com/artifex/mupdf/fitz/Link.java b/platform/java/src/com/artifex/mupdf/fitz/Link.java
new file mode 100644
index 00000000..0ecd8307
--- /dev/null
+++ b/platform/java/src/com/artifex/mupdf/fitz/Link.java
@@ -0,0 +1,19 @@
+package com.artifex.mupdf.fitz;
+
+public class Link
+{
+ private long pointer;
+
+ protected native void finalize();
+
+ public void destroy() {
+ finalize();
+ pointer = 0;
+ }
+
+ private Link(long p) {
+ pointer = p;
+ }
+
+ public native Link getNext();
+}
diff --git a/platform/java/src/com/artifex/mupdf/fitz/Matrix.java b/platform/java/src/com/artifex/mupdf/fitz/Matrix.java
new file mode 100644
index 00000000..80da84fc
--- /dev/null
+++ b/platform/java/src/com/artifex/mupdf/fitz/Matrix.java
@@ -0,0 +1,163 @@
+package com.artifex.mupdf.fitz;
+
+public class Matrix
+{
+ public float a, b, c, d, e, f;
+
+ public Matrix(float a, float b, float c, float d, float e, float f) {
+ this.a = a;
+ this.b = b;
+ this.c = c;
+ this.d = d;
+ this.e = e;
+ this.f = f;
+ }
+
+ public Matrix(float a, float b, float c, float d) {
+ this(a, b, c, d, 0, 0);
+ }
+
+ public Matrix(float a, float d) {
+ this(a, 0, 0, d, 0, 0);
+ }
+
+ public Matrix(float a) {
+ this(a, 0, 0, a, 0, 0);
+ }
+
+ public Matrix() {
+ this(1, 0, 0, 1, 0, 0);
+ }
+
+ public Matrix(Matrix one, Matrix two) {
+ a = one.a * two.a + one.b * two.c;
+ b = one.a * two.b + one.b * two.d;
+ c = one.c * two.a + one.d * two.c;
+ d = one.c * two.b + one.d * two.d;
+ e = one.e * two.a + one.f * two.c + two.e;
+ f = one.e * two.b + one.f * two.d + two.f;
+ }
+
+ public Matrix concat(Matrix m) {
+ float a = this.a * m.a + this.b * m.c;
+ float b = this.a * m.b + this.b * m.d;
+ float c = this.c * m.a + this.d * m.c;
+ float d = this.c * m.b + this.d * m.d;
+ float e = this.e * m.a + this.f * m.c + m.e;
+ this.f = this.e * m.b + this.f * m.d + m.f;
+
+ this.a = a;
+ this.b = b;
+ this.c = c;
+ this.d = d;
+ this.e = e;
+
+ return this;
+ }
+
+ public Matrix scale(float sx, float sy) {
+ a *= sx;
+ b *= sx;
+ c *= sy;
+ d *= sy;
+ return this;
+ }
+
+ public Matrix scale(float s) {
+ return scale(s, s);
+ }
+
+ public Matrix translate(float tx, float ty) {
+ e += tx * a + ty * c;
+ f += tx * b + ty * d;
+ return this;
+ }
+
+ public Matrix rotate(float degrees) {
+ while (degrees < 0)
+ degrees += 360;
+ while (degrees >= 360)
+ degrees -= 360;
+
+ if (Math.abs(0 - degrees) < 0.0001) {
+ // Nothing to do
+ } else if (Math.abs(90 - degrees) < 0.0001) {
+ float save_a = a;
+ float save_b = b;
+ a = c;
+ b = d;
+ c = -save_a;
+ d = -save_b;
+ } else if (Math.abs(180 - degrees) < 0.0001) {
+ a = -a;
+ b = -b;
+ c = -c;
+ d = -d;
+ } else if (Math.abs(270 - degrees) < 0.0001) {
+ float save_a = a;
+ float save_b = b;
+ a = -c;
+ b = -d;
+ c = save_a;
+ d = save_b;
+ } else {
+ float sin = (float)Math.sin(degrees * Math.PI / 180.0);
+ float cos = (float)Math.cos(degrees * Math.PI / 180.0);
+ float save_a = a;
+ float save_b = b;
+ a = cos * save_a + sin * c;
+ b = cos * save_b + sin * d;
+ c = -sin * save_a + cos * c;
+ d = -sin * save_b + cos * d;
+ }
+ return this;
+ }
+
+ public String toString() {
+ return "[" + a + " " + b + " " + c + " " + d + " " + e + " " + f + "]";
+ }
+
+ public static Matrix Identity() {
+ return new Matrix(1, 0, 0, 1, 0, 0);
+ }
+
+ public static Matrix Scale(float x) {
+ return new Matrix(x, 0, 0, x, 0, 0);
+ }
+
+ public static Matrix Scale(float x, float y) {
+ return new Matrix(x, 0, 0, y, 0, 0);
+ }
+
+ public static Matrix Translate(float x, float y) {
+ return new Matrix(1, 0, 0, 1, x, y);
+ }
+
+ public static Matrix Rotate(float degrees) {
+ float sin, cos;
+
+ while (degrees < 0)
+ degrees += 360;
+ while (degrees >= 360)
+ degrees -= 360;
+
+ if (Math.abs(0 - degrees) < 0.0001) {
+ sin = 0;
+ cos = 1;
+ } else if (Math.abs(90 - degrees) < 0.0001) {
+ sin = 1;
+ cos = 0;
+ } else if (Math.abs(180 - degrees) < 0.0001) {
+ sin = 0;
+ cos = -1;
+ } else if (Math.abs(270 - degrees) < 0.0001) {
+ sin = -1;
+ cos = 0;
+ } else {
+ sin = (float)Math.sin(degrees * Math.PI / 180.0);
+ cos = (float)Math.cos(degrees * Math.PI / 180.0);
+ }
+
+ return new Matrix(cos, sin, -sin, cos, 0, 0);
+ }
+}
diff --git a/platform/java/src/com/artifex/mupdf/fitz/NativeDevice.java b/platform/java/src/com/artifex/mupdf/fitz/NativeDevice.java
new file mode 100644
index 00000000..0d2b9159
--- /dev/null
+++ b/platform/java/src/com/artifex/mupdf/fitz/NativeDevice.java
@@ -0,0 +1,47 @@
+package com.artifex.mupdf.fitz;
+
+public class NativeDevice extends Device
+{
+ private long nativeInfo;
+ private Object nativeResource;
+
+ protected native void finalize();
+
+ public void destroy() {
+ super.destroy();
+ nativeInfo = 0;
+ nativeResource = null;
+ }
+
+ protected NativeDevice(long p) {
+ super(p);
+ }
+
+ public native final void close();
+
+ public native final void fillPath(Path path, boolean evenOdd, Matrix ctm, ColorSpace cs, float color[], float alpha);
+ public native final void strokePath(Path path, StrokeState stroke, Matrix ctm, ColorSpace cs, float color[], float alpha);
+ public native final void clipPath(Path path, boolean evenOdd, Matrix ctm);
+ public native final void clipStrokePath(Path path, StrokeState stroke, Matrix ctm);
+
+ public native final void fillText(Text text, Matrix ctm, ColorSpace cs, float color[], float alpha);
+ public native final void strokeText(Text text, StrokeState stroke, Matrix ctm, ColorSpace cs, float color[], float alpha);
+ public native final void clipText(Text text, Matrix ctm);
+ public native final void clipStrokeText(Text text, StrokeState stroke, Matrix ctm);
+ public native final void ignoreText(Text text, Matrix ctm);
+
+ public native final void fillShade(Shade shd, Matrix ctm, float alpha);
+ public native final void fillImage(Image img, Matrix ctm, float alpha);
+ public native final void fillImageMask(Image img, Matrix ctm, ColorSpace cs, float color[], float alpha);
+ public native final void clipImageMask(Image img, Matrix ctm);
+
+ public native final void popClip();
+
+ public native final void beginMask(Rect rect, boolean luminosity, ColorSpace cs, float bc[]);
+ public native final void endMask();
+ public native final void beginGroup(Rect rect, boolean isolated, boolean knockout, int blendmode, float alpha);
+ public native final void endGroup();
+
+ public native final int beginTile(Rect area, Rect view, float xstep, float ystep, Matrix ctm, int id);
+ public native final void endTile();
+}
diff --git a/platform/java/src/com/artifex/mupdf/fitz/Outline.java b/platform/java/src/com/artifex/mupdf/fitz/Outline.java
new file mode 100644
index 00000000..98a11b79
--- /dev/null
+++ b/platform/java/src/com/artifex/mupdf/fitz/Outline.java
@@ -0,0 +1,17 @@
+package com.artifex.mupdf.fitz;
+
+public class Outline
+{
+ private long pointer;
+
+ protected native void finalize();
+
+ public void destroy() {
+ finalize();
+ pointer = 0;
+ }
+
+ private Outline(long p) {
+ pointer = p;
+ }
+}
diff --git a/platform/java/src/com/artifex/mupdf/fitz/PDFDocument.java b/platform/java/src/com/artifex/mupdf/fitz/PDFDocument.java
new file mode 100644
index 00000000..58a3e3a6
--- /dev/null
+++ b/platform/java/src/com/artifex/mupdf/fitz/PDFDocument.java
@@ -0,0 +1,57 @@
+package com.artifex.mupdf.fitz;
+
+public class PDFDocument
+{
+ static {
+ Context.init();
+ }
+
+ private long pointer;
+
+ protected native void finalize();
+
+ public void destroy() {
+ finalize();
+ pointer = 0;
+ }
+
+ private PDFDocument(long p) {
+ pointer = p;
+ }
+
+ public native Document toDocument();
+
+ public native int countPages();
+ public native PDFObject findPage(int at);
+
+ public native PDFObject getTrailer();
+ public native int countObjects();
+
+ public native PDFObject newNull();
+ public native PDFObject newBoolean(boolean b);
+ public native PDFObject newInteger(int i);
+ public native PDFObject newReal(float f);
+ public native PDFObject newString(String s);
+ public native PDFObject newName(String name);
+ public native PDFObject newIndirect(int num, int gen);
+ public native PDFObject newArray();
+ public native PDFObject newDictionary();
+
+ public native PDFObject addObject(PDFObject obj);
+ public native PDFObject createObject();
+ public native void deleteObject(int i);
+
+ public native PDFObject addStream(Buffer buf);
+
+ public native PDFObject addPage(Rect mediabox, int rotate, PDFObject resources, Buffer contents);
+ public native void insertPage(int at, PDFObject page);
+ public native void deletePage(int at);
+ public native PDFObject addImage(Image image);
+ public native PDFObject addSimpleFont(Font font);
+ public native PDFObject addFont(Font font);
+ public native void save(String filename, String options);
+
+ public void deleteObject(PDFObject obj) {
+ deleteObject(obj.toIndirect());
+ }
+}
diff --git a/platform/java/src/com/artifex/mupdf/fitz/PDFObject.java b/platform/java/src/com/artifex/mupdf/fitz/PDFObject.java
new file mode 100644
index 00000000..f2e926f2
--- /dev/null
+++ b/platform/java/src/com/artifex/mupdf/fitz/PDFObject.java
@@ -0,0 +1,155 @@
+package com.artifex.mupdf.fitz;
+
+public class PDFObject
+{
+ static {
+ Context.init();
+ }
+
+ private long pointer;
+
+ protected native void finalize();
+
+ public void destroy() {
+ finalize();
+ pointer = 0;
+ }
+
+ private PDFObject(long p) {
+ pointer = p;
+ }
+
+ public native boolean isIndirect();
+ public native boolean isNull();
+ public native boolean isBoolean();
+ public native boolean isInteger();
+ public native boolean isReal();
+ public native boolean isNumber();
+ public native boolean isString();
+ public native boolean isName();
+ public native boolean isArray();
+ public native boolean isDictionary();
+ public native boolean isStream();
+
+ public native boolean toBoolean();
+ public native int toInteger();
+ public native float toFloat();
+ public native byte[] toByteString();
+ public native int toIndirect();
+ public native String toString(boolean tight);
+
+ public String toString() {
+ return toString(false);
+ }
+
+ public native PDFObject resolve();
+
+ public native byte[] readStream();
+ public native byte[] readRawStream();
+
+ public native PDFObject getArray(int index);
+ public native PDFObject getDictionary(String name);
+
+ public PDFObject get(int index) {
+ return getArray(index);
+ }
+
+ public PDFObject get(String name) {
+ return getDictionary(name);
+ }
+
+ public native void putArrayBoolean(int index, boolean b);
+ public native void putArrayInteger(int index, int i);
+ public native void putArrayFloat(int index, float f);
+ public native void putArrayString(int index, String str);
+ public native void putArrayPDFObject(int index, PDFObject obj);
+
+ public native void putDictionaryStringBoolean(String name, boolean b);
+ public native void putDictionaryStringInteger(String name, int i);
+ public native void putDictionaryStringFloat(String name, float f);
+ public native void putDictionaryStringString(String name, String str);
+ public native void putDictionaryStringPDFObject(String name, PDFObject obj);
+
+ public native void putDictionaryPDFObjectBoolean(PDFObject name, boolean b);
+ public native void putDictionaryPDFObjectInteger(PDFObject name, int i);
+ public native void putDictionaryPDFObjectFloat(PDFObject name, float f);
+ public native void putDictionaryPDFObjectString(PDFObject name, String str);
+ public native void putDictionaryPDFObjectPDFObject(PDFObject name, PDFObject obj);
+
+
+ public void put(int index, boolean b) {
+ putArrayBoolean(index, b);
+ }
+
+ public void put(int index, int i) {
+ putArrayInteger(index, i);
+ }
+
+ public void put(int index, float f) {
+ putArrayFloat(index, f);
+ }
+
+ public void put(int index, String s) {
+ putArrayString(index, s);
+ }
+
+ public void put(int index, PDFObject obj) {
+ putArrayPDFObject(index, obj);
+ }
+
+ public void put(String name, boolean b) {
+ putDictionaryStringBoolean(name, b);
+ }
+
+ public void put(String name, int i) {
+ putDictionaryStringInteger(name, i);
+ }
+
+ public void put(String name, float f) {
+ putDictionaryStringFloat(name, f);
+ }
+
+ public void put(String name, String str) {
+ putDictionaryStringString(name, str);
+ }
+
+ public void put(String name, PDFObject obj) {
+ putDictionaryStringPDFObject(name, obj);
+ }
+
+ public void put(PDFObject name, boolean b) {
+ putDictionaryPDFObjectBoolean(name, b);
+ }
+
+ public void put(PDFObject name, int i) {
+ putDictionaryPDFObjectInteger(name, i);
+ }
+
+ public void put(PDFObject name, float f) {
+ putDictionaryPDFObjectFloat(name, f);
+ }
+
+ public void put(PDFObject name, String str) {
+ putDictionaryPDFObjectString(name, str);
+ }
+
+ public void put(PDFObject name, PDFObject obj) {
+ putDictionaryPDFObjectPDFObject(name, obj);
+ }
+
+ public native void deleteArray(int index);
+ public native void deleteDictionaryString(String name);
+ public native void deleteDictionaryPDFObject(PDFObject name);
+
+ public void delete(int index) {
+ deleteArray(index);
+ }
+
+ public void delete(String name) {
+ deleteDictionaryString(name);
+ }
+
+ public void delete(PDFObject name) {
+ deleteDictionaryPDFObject(name);
+ }
+}
diff --git a/platform/java/src/com/artifex/mupdf/fitz/Page.java b/platform/java/src/com/artifex/mupdf/fitz/Page.java
new file mode 100644
index 00000000..64fe4030
--- /dev/null
+++ b/platform/java/src/com/artifex/mupdf/fitz/Page.java
@@ -0,0 +1,43 @@
+package com.artifex.mupdf.fitz;
+
+public class Page
+{
+ private long pointer;
+ private Annotation nativeAnnots[];
+
+ protected native void finalize();
+
+ public void destroy() {
+ finalize();
+ pointer = 0;
+ nativeAnnots = null;
+ }
+
+ private Page(long p) {
+ pointer = p;
+ nativeAnnots = null;
+ }
+
+ public native Rect getBounds();
+
+ public native Pixmap toPixmap(Matrix ctm, ColorSpace cs, boolean alpha);
+
+ public native void run(Device dev, Matrix ctm, Cookie cookie);
+ public native void runPageContents(Device dev, Matrix ctm, Cookie cookie);
+ public native Annotation[] getAnnotations();
+
+ public void run(Device dev, Matrix ctm) {
+ run(dev, ctm, null);
+ }
+
+ // FIXME: Later
+ public native Link[] getLinks();
+
+ // FIXME: Later. Much later.
+ //fz_transition *fz_page_presentation(fz_document *doc, fz_page *page, float *duration);
+
+ public native DisplayList toDisplayList(boolean no_annotations);
+ public native StructuredText toStructuredText();
+
+ public native Rect[] search(String needle);
+}
diff --git a/platform/java/src/com/artifex/mupdf/fitz/Path.java b/platform/java/src/com/artifex/mupdf/fitz/Path.java
new file mode 100644
index 00000000..455dce69
--- /dev/null
+++ b/platform/java/src/com/artifex/mupdf/fitz/Path.java
@@ -0,0 +1,64 @@
+package com.artifex.mupdf.fitz;
+
+public class Path implements PathWalker
+{
+ private long pointer;
+
+ protected native void finalize();
+
+ public void destroy() {
+ finalize();
+ pointer = 0;
+ }
+
+ private native long newNative();
+ private native long cloneNative();
+
+ public Path() {
+ pointer = newNative();
+ }
+
+ private Path(long p) {
+ pointer = p;
+ }
+
+ public Path(Path old) {
+ pointer = old.cloneNative();
+ }
+
+ public native Point currentPoint();
+
+ public native void moveTo(float x, float y);
+ public native void lineTo(float x, float y);
+ public native void curveTo(float cx1, float cy1, float cx2, float cy2, float ex, float ey);
+ public native void curveToV(float cx, float cy, float ex, float ey);
+ public native void curveToY(float cx, float cy, float ex, float ey);
+ public native void rect(int x1, int y1, int x2, int y2);
+ public native void closePath();
+
+ public void moveTo(Point xy) {
+ moveTo(xy.x, xy.y);
+ }
+
+ public void lineTo(Point xy) {
+ lineTo(xy.x, xy.y);
+ }
+
+ public void curveTo(Point c1, Point c2, Point e) {
+ curveTo(c1.x, c1.y, c2.x, c2.y, e.x, e.y);
+ }
+
+ public void curveToV(Point c, Point e) {
+ curveToV(c.x, c.y, e.x, e.y);
+ }
+
+ public void curveToY(Point c, Point e) {
+ curveToY(c.x, c.y, e.x, e.y);
+ }
+
+ public native void transform(Matrix mat);
+
+ public native Rect getBounds(StrokeState stroke, Matrix ctm);
+
+ public native void walk(PathWalker walker);
+}
diff --git a/platform/java/src/com/artifex/mupdf/fitz/PathWalker.java b/platform/java/src/com/artifex/mupdf/fitz/PathWalker.java
new file mode 100644
index 00000000..66d1b49b
--- /dev/null
+++ b/platform/java/src/com/artifex/mupdf/fitz/PathWalker.java
@@ -0,0 +1,9 @@
+package com.artifex.mupdf.fitz;
+
+public interface PathWalker
+{
+ public void moveTo(float x, float y);
+ public void lineTo(float x, float y);
+ public void curveTo(float cx1, float cy1, float cx2, float cy2, float ex, float ey);
+ public void closePath();
+}
diff --git a/platform/java/src/com/artifex/mupdf/fitz/Pixmap.java b/platform/java/src/com/artifex/mupdf/fitz/Pixmap.java
new file mode 100644
index 00000000..52432fea
--- /dev/null
+++ b/platform/java/src/com/artifex/mupdf/fitz/Pixmap.java
@@ -0,0 +1,83 @@
+package com.artifex.mupdf.fitz;
+
+public class Pixmap
+{
+ private long pointer;
+
+ protected native void finalize();
+
+ public void destroy() {
+ finalize();
+ pointer = 0;
+ }
+
+ private native long newNative(ColorSpace cs, int x, int y, int w, int h, boolean alpha);
+
+ private Pixmap(long p) {
+ pointer = p;
+ }
+
+ public Pixmap(ColorSpace cs, int x, int y, int w, int h, boolean alpha) {
+ pointer = newNative(cs, x, y, w, h, alpha);
+ }
+
+ public Pixmap(ColorSpace cs, int x, int y, int w, int h) {
+ this(cs, x, y, w, h, false);
+ }
+
+ public Pixmap(ColorSpace cs, int w, int h, boolean alpha) {
+ this(cs, 0, 0, w, h, alpha);
+ }
+
+ public Pixmap(ColorSpace cs, int w, int h) {
+ this(cs, 0, 0, w, h, false);
+ }
+
+ public Pixmap(ColorSpace cs, Rect rect, boolean alpha) {
+ this(cs, (int)rect.x0, (int)rect.y0, (int)(rect.x1 - rect.x0), (int)(rect.y1 - rect.y0), alpha);
+ }
+
+ public Pixmap(ColorSpace cs, Rect rect) {
+ this(cs, rect, false);
+ }
+
+ public native void clear();
+ public native void clearWithValue(int value);
+
+ public native void saveAsPNG(String filename);
+
+ public native int getX();
+ public native int getY();
+ public native int getWidth();
+ public native int getHeight();
+ public native int getStride();
+ public native int getNumberOfComponents();
+ public native boolean getAlpha();
+ public native ColorSpace getColorSpace();
+ public native byte[] getSamples();
+ public native byte getSamples(int x, int y, int n);
+ public native int[] getPixels(); /* only valid for RGBA or BGRA pixmaps */
+ public native int getXResolution();
+ public native int getYResolution();
+
+ public void clear(int value) {
+ clearWithValue(value);
+ }
+
+ public Rect getBounds() {
+ int x = getX();
+ int y = getY();
+ return new Rect(x, y, x + getWidth(), y+ getHeight());
+ }
+
+ public String toString() {
+ return "Pixmap(w=" + getWidth() +
+ " h=" + getHeight() +
+ " x=" + getX() +
+ " y=" + getY() +
+ " n=" + getNumberOfComponents() +
+ " alpha=" + getAlpha() +
+ " cs=" + getColorSpace() +
+ ")";
+ }
+}
diff --git a/platform/java/src/com/artifex/mupdf/fitz/Point.java b/platform/java/src/com/artifex/mupdf/fitz/Point.java
new file mode 100644
index 00000000..b32198bc
--- /dev/null
+++ b/platform/java/src/com/artifex/mupdf/fitz/Point.java
@@ -0,0 +1,30 @@
+package com.artifex.mupdf.fitz;
+
+public class Point
+{
+ public float x;
+ public float y;
+
+ public Point(float x, float y) {
+ this.x = x;
+ this.y = y;
+ }
+
+ public Point(Point p) {
+ this.x = p.x;
+ this.y = p.y;
+ }
+
+ public String toString() {
+ return "[" + x + " " + y + "]";
+ }
+
+ public Point transform(Matrix tm) {
+ float old_x = this.x;
+
+ this.x = old_x * tm.a + y * tm.c + tm.e;
+ this.y = old_x * tm.b + y * tm.d + tm.f;
+
+ return this;
+ }
+}
diff --git a/platform/java/src/com/artifex/mupdf/fitz/Rect.java b/platform/java/src/com/artifex/mupdf/fitz/Rect.java
new file mode 100644
index 00000000..819646e8
--- /dev/null
+++ b/platform/java/src/com/artifex/mupdf/fitz/Rect.java
@@ -0,0 +1,77 @@
+package com.artifex.mupdf.fitz;
+
+public class Rect
+{
+ public float x0;
+ public float y0;
+ public float x1;
+ public float y1;
+
+ public Rect(float x0, float y0, float x1, float y1) {
+ this.x0 = x0;
+ this.y0 = y0;
+ this.x1 = x1;
+ this.y1 = y1;
+ }
+
+ public Rect(Rect r) {
+ this(r.x0, r.y0, r.x1, r.y1);
+ }
+
+ public Rect(RectI r) {
+ this(r.x0, r.y0, r.x1, r.y1);
+ }
+
+ public String toString() {
+ return "[" + x0 + " " + y0 + " " + x1 + " " + y1 + "]";
+ }
+
+ public Rect transform(Matrix tm) {
+ float ax0 = x0 * tm.a;
+ float ax1 = x1 * tm.a;
+
+ if (ax0 > ax1) {
+ float t = ax0;
+ ax0 = ax1;
+ ax1 = t;
+ }
+
+ float cy0 = y0 * tm.c;
+ float cy1 = y1 * tm.c;
+
+ if (cy0 > cy1) {
+ float t = cy0;
+ cy0 = cy1;
+ cy1 = t;
+ }
+ ax0 += cy0 + tm.e;
+ ax1 += cy1 + tm.e;
+
+ float bx0 = x0 * tm.b;
+ float bx1 = x1 * tm.b;
+
+ if (bx0 > bx1) {
+ float t = bx0;
+ bx0 = bx1;
+ bx1 = t;
+ }
+
+ float dy0 = y0 * tm.d;
+ float dy1 = y1 * tm.d;
+
+ if (dy0 > dy1) {
+ float t = dy0;
+ dy0 = dy1;
+ dy1 = t;
+ }
+ bx0 += dy0 + tm.f;
+ bx1 += dy1 + tm.f;
+
+ x0 = ax0;
+ x1 = ax1;
+ y0 = bx0;
+ y1 = bx1;
+
+ return this;
+ }
+}
diff --git a/platform/java/src/com/artifex/mupdf/fitz/RectI.java b/platform/java/src/com/artifex/mupdf/fitz/RectI.java
new file mode 100644
index 00000000..8e46a3f2
--- /dev/null
+++ b/platform/java/src/com/artifex/mupdf/fitz/RectI.java
@@ -0,0 +1,80 @@
+package com.artifex.mupdf.fitz;
+
+public class RectI
+{
+ public int x0;
+ public int y0;
+ public int x1;
+ public int y1;
+
+ public RectI(int x0, int y0, int x1, int y1) {
+ this.x0 = x0;
+ this.y0 = y0;
+ this.x1 = x1;
+ this.y1 = y1;
+ }
+
+ public RectI(RectI r) {
+ this(r.x0, r.y0, r.x1, r.y1);
+ }
+
+ public RectI(Rect r) {
+ this.x0 = (int)Math.floor(r.x0);
+ this.y0 = (int)Math.ceil(r.y0);
+ this.x1 = (int)Math.floor(r.x1);
+ this.y1 = (int)Math.ceil(r.y1);
+ }
+
+ public String toString() {
+ return "[" + x0 + " " + y0 + " " + x1 + " " + y1 + "]";
+ }
+
+ public RectI transform(Matrix tm) {
+ float ax0 = x0 * tm.a;
+ float ax1 = x1 * tm.a;
+
+ if (ax0 > ax1) {
+ float t = ax0;
+ ax0 = ax1;
+ ax1 = t;
+ }
+
+ float cy0 = y0 * tm.c;
+ float cy1 = y1 * tm.c;
+
+ if (cy0 > cy1) {
+ float t = cy0;
+ cy0 = cy1;
+ cy1 = t;
+ }
+ ax0 += cy0 + tm.e;
+ ax1 += cy1 + tm.e;
+
+ float bx0 = x0 * tm.b;
+ float bx1 = x1 * tm.b;
+
+ if (bx0 > bx1) {
+ float t = bx0;
+ bx0 = bx1;
+ bx1 = t;
+ }
+
+ float dy0 = y0 * tm.d;
+ float dy1 = y1 * tm.d;
+
+ if (dy0 > dy1) {
+ float t = dy0;
+ dy0 = dy1;
+ dy1 = t;
+ }
+ bx0 += dy0 + tm.f;
+ bx1 += dy1 + tm.f;
+
+ x0 = (int)Math.floor(ax0);
+ x1 = (int)Math.ceil(ax1);
+ y0 = (int)Math.floor(bx0);
+ y1 = (int)Math.ceil(bx1);
+
+ return this;
+ }
+}
diff --git a/platform/java/src/com/artifex/mupdf/fitz/Shade.java b/platform/java/src/com/artifex/mupdf/fitz/Shade.java
new file mode 100644
index 00000000..35182cb8
--- /dev/null
+++ b/platform/java/src/com/artifex/mupdf/fitz/Shade.java
@@ -0,0 +1,17 @@
+package com.artifex.mupdf.fitz;
+
+public class Shade
+{
+ private long pointer;
+
+ protected native void finalize();
+
+ public void destroy() {
+ finalize();
+ pointer = 0;
+ }
+
+ private Shade(long p) {
+ pointer = p;
+ }
+}
diff --git a/platform/java/src/com/artifex/mupdf/fitz/StrokeState.java b/platform/java/src/com/artifex/mupdf/fitz/StrokeState.java
new file mode 100644
index 00000000..7f333f76
--- /dev/null
+++ b/platform/java/src/com/artifex/mupdf/fitz/StrokeState.java
@@ -0,0 +1,55 @@
+package com.artifex.mupdf.fitz;
+
+public class StrokeState
+{
+ public static final int FZ_LINECAP_BUTT = 0;
+ public static final int FZ_LINECAP_ROUND = 1;
+ public static final int FZ_LINECAP_SQUARE = 2;
+ public static final int FZ_LINECAP_TRIANGLE = 3;
+
+ public static final int FZ_LINEJOIN_MITER = 0;
+ public static final int FZ_LINEJOIN_ROUND = 1;
+ public static final int FZ_LINEJOIN_BEVEL = 2;
+ public static final int FZ_LINEJOIN_MITER_XPS = 3;
+
+ private long pointer;
+
+ protected native void finalize();
+
+ public void destroy() {
+ finalize();
+ pointer = 0;
+ }
+
+ private native long newNative(int startCap, int dashCap, int endCap, int lineJoin, float lineWidth, float miterLimit,
+ float dashPhase, float dash[]);
+
+ // Private constructor for the C to use. Any objects created by the
+ // C are done for purposes of calling back to a java device, and
+ // should therefore be considered const. This is fine as we don't
+ // currently provide mechanisms for changing individual elements
+ // of the StrokeState.
+ private StrokeState(long p) {
+ pointer = p;
+ }
+
+ public StrokeState(int startCap, int endCap, int lineJoin, float lineWidth, float miterLimit) {
+ pointer = newNative(startCap, 0, endCap, lineJoin, lineWidth, miterLimit, 0, null);
+ }
+
+ public StrokeState(int startCap, int dashCap, int endCap, int lineJoin, float lineWidth, float miterLimit,
+ float dashPhase, float dash[]) {
+ pointer = newNative(startCap, dashCap, endCap, lineJoin, lineWidth, miterLimit, dashPhase, dash);
+ }
+
+ public native void adjustRectForStroke(Rect rect, Matrix ctm);
+
+ public native int getStartCap();
+ public native int getDashCap();
+ public native int getEndCap();
+ public native int getLineJoin();
+ public native float getLineWidth();
+ public native float getMiterLimit();
+ public native float getDashPhase();
+ public native float[] getDashes();
+}
diff --git a/platform/java/src/com/artifex/mupdf/fitz/StructuredText.java b/platform/java/src/com/artifex/mupdf/fitz/StructuredText.java
new file mode 100644
index 00000000..0f3549d5
--- /dev/null
+++ b/platform/java/src/com/artifex/mupdf/fitz/StructuredText.java
@@ -0,0 +1,21 @@
+package com.artifex.mupdf.fitz;
+
+public class StructuredText
+{
+ private long pointer;
+
+ protected native void finalize();
+
+ public void destroy() {
+ finalize();
+ pointer = 0;
+ }
+
+ private StructuredText(long p) {
+ pointer = p;
+ }
+
+ public native Rect[] search(String needle);
+ public native Rect[] highlight(Rect rect);
+ public native String copy(Rect rect);
+}
diff --git a/platform/java/src/com/artifex/mupdf/fitz/Text.java b/platform/java/src/com/artifex/mupdf/fitz/Text.java
new file mode 100644
index 00000000..5bbe8abe
--- /dev/null
+++ b/platform/java/src/com/artifex/mupdf/fitz/Text.java
@@ -0,0 +1,43 @@
+package com.artifex.mupdf.fitz;
+
+public class Text implements TextWalker
+{
+ private long pointer;
+
+ protected native void finalize();
+
+ public void destroy() {
+ finalize();
+ pointer = 0;
+ }
+
+ private native long newNative();
+ private native long cloneNative(Text old);
+
+ private Text(long p) {
+ pointer = p;
+ }
+
+ public Text(Text old) {
+ pointer = cloneNative(old);
+ }
+
+ public Text() {
+ pointer = newNative();
+ }
+
+ public native void showGlyph(Font font, Matrix trm, int glyph, int unicode, boolean wmode);
+ public native void showString(Font font, Matrix trm, String str, boolean wmode);
+
+ public native Rect getBounds(StrokeState stroke, Matrix ctm);
+
+ public void showGlyph(Font font, Matrix trm, int glyph, int unicode) {
+ showGlyph(font, trm, glyph, unicode, false);
+ }
+
+ public void showString(Font font, Matrix trm, String str) {
+ showString(font, trm, str, false);
+ }
+
+ public native void walk(TextWalker walker);
+}
diff --git a/platform/java/src/com/artifex/mupdf/fitz/TextWalker.java b/platform/java/src/com/artifex/mupdf/fitz/TextWalker.java
new file mode 100644
index 00000000..911c19bc
--- /dev/null
+++ b/platform/java/src/com/artifex/mupdf/fitz/TextWalker.java
@@ -0,0 +1,6 @@
+package com.artifex.mupdf.fitz;
+
+public interface TextWalker
+{
+ public void showGlyph(Font font, Matrix trm, int glyph, int unicode, boolean wmode);
+}
diff --git a/platform/java/src/com/artifex/mupdf/fitz/TryLaterException.java b/platform/java/src/com/artifex/mupdf/fitz/TryLaterException.java
new file mode 100644
index 00000000..e2d1b88e
--- /dev/null
+++ b/platform/java/src/com/artifex/mupdf/fitz/TryLaterException.java
@@ -0,0 +1,8 @@
+package com.artifex.mupdf.fitz;
+
+public class TryLaterException extends Exception
+{
+ TryLaterException(String message) {
+ super(message);
+ }
+}
diff --git a/platform/java/src/com/artifex/mupdf/fitz/android/AndroidDrawDevice.java b/platform/java/src/com/artifex/mupdf/fitz/android/AndroidDrawDevice.java
new file mode 100644
index 00000000..2be2ae59
--- /dev/null
+++ b/platform/java/src/com/artifex/mupdf/fitz/android/AndroidDrawDevice.java
@@ -0,0 +1,25 @@
+package com.artifex.mupdf.fitz.android;
+
+import android.graphics.Bitmap;
+
+import com.artifex.mupdf.fitz.NativeDevice;
+import com.artifex.mupdf.fitz.RectI;
+
+public final class AndroidDrawDevice extends NativeDevice
+{
+ // NOT static.
+ private native long newNative(Bitmap bitmap, int pageX0, int pageY0, int pageX1, int pageY1, int patchX0, int patchY0, int patchX1, int patchY1);
+
+ // Construction
+ public AndroidDrawDevice(Bitmap bitmap, int pageX0, int pageY0, int pageX1, int pageY1, int patchX0, int patchY0, int patchX1, int patchY1)
+ {
+ super(0);
+ pointer = newNative(bitmap, pageX0, pageY0, pageX1, pageY1, patchX0, patchY0, patchX1, patchY1);
+ }
+
+ public AndroidDrawDevice(Bitmap bitmap, RectI page, RectI patch)
+ {
+ super(0);
+ pointer = newNative(bitmap, page.x0, page.y0, page.x1, page.y1, patch.x0, patch.y0, patch.x1, patch.y1);
+ }
+}