diff options
author | Tor Andersson <tor.andersson@artifex.com> | 2016-02-22 15:00:29 +0100 |
---|---|---|
committer | Tor Andersson <tor.andersson@artifex.com> | 2016-02-29 16:03:34 +0100 |
commit | 7609158e702ece6e182b19cec8b0192b1af598e8 (patch) | |
tree | d6611bc8243a457b2fe90bfebd72454e93601288 /platform/java/com/artifex | |
parent | e1716629fd92f4580e6b213dc7be54b4935f09f9 (diff) | |
download | mupdf-7609158e702ece6e182b19cec8b0192b1af598e8.tar.xz |
jni: Various cleanups.
jni: Various cleanups.
Fix gcc and clang warnings.
Android specific functions are guarded by HAVE_ANDROID define.
The java guts of the android stuff is removed for now, to be added back in later.
Set up a makefile and simple tests to build for desktop java.
Rerig device classes to: Device, NativeDevice, JavaDevice and DrawDevice.
Add Pixmap class.
Regularize naming.
General cleanups and abbreviate naming.
Use to_JavaClass and from_JavaClass rather than
fz_mupdf_struct_from_JavaClass and JavaClass_from_fz_mupdf_struct.
Check for exceptions thrown by java devices and path processor.
Tweak constructors and finalizers to remove the JavaDevice subclass.
Use toString when rethrowing java exceptions as fitz exceptions.
Diffstat (limited to 'platform/java/com/artifex')
28 files changed, 570 insertions, 582 deletions
diff --git a/platform/java/com/artifex/mupdf/fitz/Annotation.java b/platform/java/com/artifex/mupdf/fitz/Annotation.java index 6e6dd1c1..5f652246 100644 --- a/platform/java/com/artifex/mupdf/fitz/Annotation.java +++ b/platform/java/com/artifex/mupdf/fitz/Annotation.java @@ -2,26 +2,20 @@ package com.artifex.mupdf.fitz; public class Annotation { - // Private data - private long nativeAnnot = 0; + private long pointer; - // Construction - private Annotation(long ptr) - { - nativeAnnot = ptr; - } - - // Operation - public native void run(Device dev, Matrix ctm, Cookie cookie); - - // FIXME: Write accessors + protected native void finalize(); - // Destruction - public void destroy() - { + public void destroy() { finalize(); - nativeAnnot = 0; + pointer = 0; } - protected native void finalize(); + private Annotation(long p) { + pointer = p; + } + + public native void run(Device dev, Matrix ctm, Cookie cookie); + + private native long advance(); } diff --git a/platform/java/com/artifex/mupdf/fitz/AwtDrawDevice.java b/platform/java/com/artifex/mupdf/fitz/AwtDrawDevice.java deleted file mode 100644 index 4e6fb33d..00000000 --- a/platform/java/com/artifex/mupdf/fitz/AwtDrawDevice.java +++ /dev/null @@ -1,12 +0,0 @@ -package com.artifex.mupdf.fitz; - -public final class AwtDrawDevice extends CDevice -{ - // Construction - public AwtDrawDevice(int rgba[], int width, int height) - { - nativeDevice = newNative(rgba, width, height); - } - - private native long newNative(int rgba[], int width, int height); -} diff --git a/platform/java/com/artifex/mupdf/fitz/ColorSpace.java b/platform/java/com/artifex/mupdf/fitz/ColorSpace.java index cad952c0..b7822161 100644 --- a/platform/java/com/artifex/mupdf/fitz/ColorSpace.java +++ b/platform/java/com/artifex/mupdf/fitz/ColorSpace.java @@ -2,33 +2,44 @@ package com.artifex.mupdf.fitz; public class ColorSpace { - // Private data - private long nativeColorSpace; - - // Statics - public static ColorSpace DeviceGray = new ColorSpace(newDeviceGray()); - public static ColorSpace DeviceRGB = new ColorSpace(newDeviceRGB()); - public static ColorSpace DeviceCMYK = new ColorSpace(newDeviceCMYK()); - - private static native long newDeviceGray(); - private static native long newDeviceRGB(); - private static native long newDeviceCMYK(); - - // Construction - private ColorSpace(long l) - { - nativeColorSpace = l; - } + private long pointer; - // Accessors - public native int getNumComponents(); + protected native void finalize(); - // Destruction - public final void destroy() - { + public void destroy() { finalize(); - nativeColorSpace = 0; + pointer = 0; + } + + private ColorSpace(long p) { + pointer = p; } - protected final native void finalize(); + 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/com/artifex/mupdf/fitz/Context.java b/platform/java/com/artifex/mupdf/fitz/Context.java index 1baafb01..3614e65f 100644 --- a/platform/java/com/artifex/mupdf/fitz/Context.java +++ b/platform/java/com/artifex/mupdf/fitz/Context.java @@ -8,12 +8,20 @@ package com.artifex.mupdf.fitz; // function. public class Context { - // Load our native library - static - { - System.loadLibrary("mupdf"); + 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/com/artifex/mupdf/fitz/Cookie.java b/platform/java/com/artifex/mupdf/fitz/Cookie.java index b6761b42..f866f99e 100644 --- a/platform/java/com/artifex/mupdf/fitz/Cookie.java +++ b/platform/java/com/artifex/mupdf/fitz/Cookie.java @@ -2,29 +2,20 @@ package com.artifex.mupdf.fitz; public class Cookie { - // Private data - private long nativeCookie = 0; + private long pointer; - // Construction - public Cookie() - { - nativeCookie = newNative(); + protected native void finalize(); + + public void destroy() { + finalize(); + pointer = 0; } private native long newNative(); - // Operation - public native void abort(); - - //FIXME: Cookie accessors - - // Destruction - protected native void finalize(); - - public void destroy() - { - finalize(); - nativeCookie = 0; + public Cookie() { + pointer = newNative(); } + public native void abort(); } diff --git a/platform/java/com/artifex/mupdf/fitz/Device.java b/platform/java/com/artifex/mupdf/fitz/Device.java index 366022e9..c8bf23d4 100644 --- a/platform/java/com/artifex/mupdf/fitz/Device.java +++ b/platform/java/com/artifex/mupdf/fitz/Device.java @@ -1,7 +1,66 @@ package com.artifex.mupdf.fitz; -public abstract class Device +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 beginPage(Rect rect, Matrix ctm) {} + public void endPage() {} + 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, Rect rect, boolean evenOdd, Matrix ctm) {} + public void clipStrokePath(Path path, Rect rect, 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 shade, 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, Rect rect, Matrix ctm) {} + public void popClip() {} + public void beginMask(Rect rect, boolean luminosity, ColorSpace cs, float bc[]) {} + public void endMask() {} + public void beginGroup(Rect rect, 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; @@ -40,133 +99,7 @@ public abstract class Device public static final int FZ_BLEND_ISOLATED = 16; public static final int FZ_BLEND_KNOCKOUT = 32; - /* To implement your own device in Java, you should define your own - * class that extends this one, 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) { - * Debug.Log("Image!"); - * } - * }; - * - * There is no constructor here, as no one will ever construct a - * Device without subclassing. - */ - - /* Everything under here is private implementation details. - * Ideally we'd like to hide these from prying eyes, but Java doesn't - * allow that. - */ - + /* Device hints */ public static final int FZ_IGNORE_IMAGE = 1; public static final int FZ_IGNORE_SHADE = 2; - - /* None of our device functions do anything. Anyone interested will - * override them in a subclass either in Java, or (as a subclass of - * CDevice) in C. - */ - public void beginPage(Rect rect, Matrix ctm) - { - } - - public void endPage() - { - } - - public void fillPath(Path path, int even_odd, Matrix ctm, ColorSpace cs, float color[], float alpha) - { - } - - public void strokePath(long ctx, Path path, StrokeState stroke, Matrix ctm, ColorSpace cs, float color[], float alpha) - { - } - - public void clipPath(Path path, Rect rect, int even_odd, Matrix ctm) - { - } - - public void clipStrokePath(Path path, Rect rect, 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 shade, 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, Rect rect, Matrix ctm) - { - } - - public void popClip() - { - } - - public void beginMask(Rect rect, int luminosity, ColorSpace cs, float bc[]) - { - } - - public void endMask() - { - } - - public void beginGroup(Rect rect, int isolated, int 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() - { - } - - /* An accessor for device hints */ - final native int getHints(); - final native void enableDeviceHints(int hints); - final native void disableDeviceHints(int hints); - - // Destruction - public void destroy() - { - } - - // Private data. - // All java devices MUST leave this as 0. - protected long nativeDevice; } diff --git a/platform/java/com/artifex/mupdf/fitz/DisplayList.java b/platform/java/com/artifex/mupdf/fitz/DisplayList.java index 8a2515e4..3f36fa3d 100644 --- a/platform/java/com/artifex/mupdf/fitz/DisplayList.java +++ b/platform/java/com/artifex/mupdf/fitz/DisplayList.java @@ -2,31 +2,24 @@ package com.artifex.mupdf.fitz; public class DisplayList { - // Private data - protected long nativeDisplayList; + protected long pointer; - // Constructions - public DisplayList() - { - nativeDisplayList = newNative(); + protected native void finalize(); + + public void destroy() { + finalize(); + pointer = 0; } private native long newNative(); - // Operation + public DisplayList() { + pointer = newNative(); + } + public native void run(Device device, Matrix ctm, Rect scissor, Cookie cookie); - public void run(Device device, Matrix ctm, Cookie cookie) - { + public void run(Device device, Matrix ctm, Cookie cookie) { run(device, ctm, null, cookie); } - - // Destruction - public void destroy() - { - finalize(); - nativeDisplayList = 0; - } - - protected native void finalize(); } diff --git a/platform/java/com/artifex/mupdf/fitz/DisplayListDevice.java b/platform/java/com/artifex/mupdf/fitz/DisplayListDevice.java index de3142dc..c7f7c935 100644 --- a/platform/java/com/artifex/mupdf/fitz/DisplayListDevice.java +++ b/platform/java/com/artifex/mupdf/fitz/DisplayListDevice.java @@ -1,14 +1,10 @@ package com.artifex.mupdf.fitz; -import android.graphics.Bitmap; - -public final class DisplayListDevice extends CDevice +public final class DisplayListDevice extends NativeDevice { - // Construction - public DisplayListDevice(DisplayList list) - { - nativeDevice = newNative(list); - } + private static native long newNative(DisplayList list); - private native long newNative(DisplayList list); + public DisplayListDevice(DisplayList list) { + super(newNative(list)); + } } diff --git a/platform/java/com/artifex/mupdf/fitz/Document.java b/platform/java/com/artifex/mupdf/fitz/Document.java index 8c3136df..efa2a425 100644 --- a/platform/java/com/artifex/mupdf/fitz/Document.java +++ b/platform/java/com/artifex/mupdf/fitz/Document.java @@ -1,60 +1,44 @@ package com.artifex.mupdf.fitz; -import java.lang.ref.WeakReference; - public class Document { - // Private data - private long nativeDocument = 0; - - // Construction - public Document(String filename) throws Exception - { - nativeDocument = newNative(filename); - if (nativeDocument == 0) - throw(new Exception("Failed to load Document")); - } - private native final long newNative(String filename); - - // FIXME: Should support opening java streams and from byte buffers etc. - // Streams would need to be seekable. - public Document(byte buffer[], String magic) throws Exception - { - nativeDocument = 0;//newFromBufferNative(buffer, magic); - if (nativeDocument == 0) - throw(new Exception("Failed to load Document")); + static { + Context.init(); } - //private native final long newFromBufferNative(byte buffer[], String magic); - //public Document(SeekableStream stream, String magic) throws Exception - //{ - // nativeDocument = newFromStreamNative(stream, magic); - // if (nativeDocument == 0) - // throw(new Exception("Failed to load Document")); - //} - //private native final long newFromBufferNative(SeekableStream stream, String magic); + 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"; - // Operation - public native boolean needsPassword(); + protected long pointer; - public native boolean authenticatePassword(String password); + protected native void finalize(); - public native int countPages(); + public void destroy() { + finalize(); + pointer = 0; + } - public native Page getPage(int n); + private native long newNativeWithPath(String filename); + private native long newNativeWithBuffer(byte buffer[], String magic); + // private native long newNativeWithRandomAccessFile(RandomAccessFile file, String magic); - public native String getFileFormat(); + public Document(String filename) { + pointer = newNativeWithPath(filename); + } - public native boolean isUnencryptedPDF(); + public Document(byte buffer[], String magic) { + pointer = newNativeWithBuffer(buffer, magic); + } - public native Outline getOutline(); + public native boolean needsPassword(); + public native boolean authenticatePassword(String password); - // Destruction - public void destroy() - { - finalize(); - nativeDocument = 0; - } + public native int countPages(); + public native Page loadPage(int number); + public native Outline loadOutline(); + public native String getMetaData(String key); - protected native void finalize(); + public native boolean isUnencryptedPDF(); } diff --git a/platform/java/com/artifex/mupdf/fitz/DrawDevice.java b/platform/java/com/artifex/mupdf/fitz/DrawDevice.java new file mode 100644 index 00000000..e022be10 --- /dev/null +++ b/platform/java/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/com/artifex/mupdf/fitz/Font.java b/platform/java/com/artifex/mupdf/fitz/Font.java index 7630dfa5..5b9cd8c5 100644 --- a/platform/java/com/artifex/mupdf/fitz/Font.java +++ b/platform/java/com/artifex/mupdf/fitz/Font.java @@ -2,21 +2,22 @@ package com.artifex.mupdf.fitz; public class Font { - // Private data - private long nativeFont; + private long pointer; - // Construction - private Font(long font) - { - nativeFont = font; - } + protected native void finalize(); - // Destruction - public void destroy() - { + public void destroy() { finalize(); - nativeFont = 0; + pointer = 0; } - protected native void finalize(); + private Font(long p) { + pointer = p; + } + + public native String getName(); + + public String toString() { + return "Font(" + getName() + ")"; + } } diff --git a/platform/java/com/artifex/mupdf/fitz/Image.java b/platform/java/com/artifex/mupdf/fitz/Image.java index a736ce5f..4964053e 100644 --- a/platform/java/com/artifex/mupdf/fitz/Image.java +++ b/platform/java/com/artifex/mupdf/fitz/Image.java @@ -1,40 +1,23 @@ package com.artifex.mupdf.fitz; -import android.graphics.Bitmap; public class Image { - // Private data - private long nativeImage = 0; + private long pointer; - // Construction - Image(Bitmap bm) throws Exception - { - if (bm == null) - throw new Exception("null Bitmap passed to Image"); - nativeImage = newFromBitmapNative(bm, null); - } + protected native void finalize(); - Image(Bitmap bm, Image mask) throws Exception - { - if (bm == null) - throw new Exception("null Bitmap passed to Image"); - nativeImage = newFromBitmapNative(bm, mask); + public void destroy() { + finalize(); + pointer = 0; } - private native final long newFromBitmapNative(Bitmap bm, Image mask); - - // 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. - private Image(long l) - { - nativeImage = l; + private Image(long p) { + pointer = p; } - // Accessors public native int getWidth(); public native int getHeight(); - public native int getNumComponents(); + public native int getNumberOfComponents(); public native int getBitsPerComponent(); public native int getXResolution(); public native int getYResolution(); @@ -44,13 +27,4 @@ public class Image // FIXME: Get data back? // FIXME: Create images from data or java streams? - - // Destruction - public void destroy() - { - finalize(); - nativeImage = 0; - } - - protected native void finalize(); } diff --git a/platform/java/com/artifex/mupdf/fitz/Link.java b/platform/java/com/artifex/mupdf/fitz/Link.java index 7c63fcf9..0ecd8307 100644 --- a/platform/java/com/artifex/mupdf/fitz/Link.java +++ b/platform/java/com/artifex/mupdf/fitz/Link.java @@ -2,26 +2,18 @@ package com.artifex.mupdf.fitz; public class Link { - // Private data - private long nativeLink = 0; + private long pointer; - // Construction - private Link(long l) - { - nativeLink = l; - } - - // Operation - public native Link getNext(); - - //FIXME: Accessors + protected native void finalize(); - // Destruction - public void destroy() - { + public void destroy() { finalize(); - nativeLink = 0; + pointer = 0; } - protected native void finalize(); + private Link(long p) { + pointer = p; + } + + public native Link getNext(); } diff --git a/platform/java/com/artifex/mupdf/fitz/Matrix.java b/platform/java/com/artifex/mupdf/fitz/Matrix.java index ede57ccc..80da84fc 100644 --- a/platform/java/com/artifex/mupdf/fitz/Matrix.java +++ b/platform/java/com/artifex/mupdf/fitz/Matrix.java @@ -2,15 +2,9 @@ package com.artifex.mupdf.fitz; public class Matrix { - public float a; - public float b; - public float c; - public float d; - public float e; - public float f; - - public Matrix(float a, float b, float c, float d, float e, float f) - { + 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; @@ -19,28 +13,32 @@ public class Matrix this.f = f; } - public Matrix(float a, float d) - { - this.a = a; - this.b = 0; - this.c = 0; - this.d = d; - this.e = 0; - this.f = 0; + public Matrix(float a, float b, float c, float d) { + this(a, b, c, d, 0, 0); } - public Matrix(float a) - { - this.a = a; - this.b = 0; - this.c = 0; - this.d = a; - this.e = 0; - this.f = 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) - { + 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; @@ -56,4 +54,110 @@ public class Matrix 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/com/artifex/mupdf/fitz/CDevice.java b/platform/java/com/artifex/mupdf/fitz/NativeDevice.java index 3bfe9c70..6786688f 100644 --- a/platform/java/com/artifex/mupdf/fitz/CDevice.java +++ b/platform/java/com/artifex/mupdf/fitz/NativeDevice.java @@ -1,23 +1,33 @@ package com.artifex.mupdf.fitz; -public abstract class CDevice extends Device +public class NativeDevice extends Device { - // Private data - private Object nativeResource = null; - protected long nativeInfo = 0; + 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); + } - // Operation public native final void beginPage(Rect rect, Matrix ctm); public native final void endPage(); - public native final void fillPath(Path path, int even_odd, Matrix ctm, ColorSpace cs, float color[], float alpha); + 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, Rect rect, int even_odd, Matrix ctm); + public native final void clipPath(Path path, Rect rect, boolean evenOdd, Matrix ctm); public native final void clipStrokePath(Path path, Rect rect, 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, int accumulate); + 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); @@ -28,22 +38,11 @@ public abstract class CDevice extends Device public native final void popClip(); - public native final void beginMask(Rect rect, int luminosity, ColorSpace cs, float bc[]); + 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, int isolated, int knockout, int blendmode, float alpha); + 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(); - - // Destruction - public final void destroy() - { - finalize(); - nativeDevice = 0; - nativeResource = null; - nativeInfo = 0; - } - - protected native final void finalize(); } diff --git a/platform/java/com/artifex/mupdf/fitz/Outline.java b/platform/java/com/artifex/mupdf/fitz/Outline.java index 1b808d7f..98a11b79 100644 --- a/platform/java/com/artifex/mupdf/fitz/Outline.java +++ b/platform/java/com/artifex/mupdf/fitz/Outline.java @@ -2,21 +2,16 @@ package com.artifex.mupdf.fitz; public class Outline { - // Private data - private long nativeOutline = 0; + private long pointer; - // Construction - private Outline(long out) - { - nativeOutline = out; - } + protected native void finalize(); - // Destruction - public void destroy() - { + public void destroy() { finalize(); - nativeOutline = 0; + pointer = 0; } - protected native void finalize(); + private Outline(long p) { + pointer = p; + } } diff --git a/platform/java/com/artifex/mupdf/fitz/Page.java b/platform/java/com/artifex/mupdf/fitz/Page.java index 46d598ee..befbe1c7 100644 --- a/platform/java/com/artifex/mupdf/fitz/Page.java +++ b/platform/java/com/artifex/mupdf/fitz/Page.java @@ -2,36 +2,37 @@ package com.artifex.mupdf.fitz; public class Page { - // Private data - private long nativePage = 0; + private long pointer; private Annotation nativeAnnots[]; - // Construction - private Page(long page) - { - nativePage = page; + protected native void finalize(); + + public void destroy() { + finalize(); + pointer = 0; + nativeAnnots = null; + } + + private Page(long p) { + pointer = p; nativeAnnots = null; } - // Operation - public native Rect bound(); + public native Rect getBounds(); + + public native Pixmap toPixmap(Matrix ctm, ColorSpace colorspace); + 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); - - // Destruction - public void destroy() - { - finalize(); - nativePage = 0; - nativeAnnots = null; - } - - protected native void finalize(); } diff --git a/platform/java/com/artifex/mupdf/fitz/Path.java b/platform/java/com/artifex/mupdf/fitz/Path.java index 17257f10..fa925bab 100644 --- a/platform/java/com/artifex/mupdf/fitz/Path.java +++ b/platform/java/com/artifex/mupdf/fitz/Path.java @@ -1,82 +1,63 @@ package com.artifex.mupdf.fitz; -public class Path implements PathProcessor +public class Path implements PathWalker { - // Private data - private long nativePath = 0; + private long pointer; - // Construction - public Path() - { - nativePath = newNative(); + protected native void finalize(); + + public void destroy() { + finalize(); + pointer = 0; } private native long newNative(); + private native long cloneNative(); - private Path(long path) - { - nativePath = path; + public Path() { + pointer = newNative(); } - public Path(Path old) - { - nativePath = clone(old); + private Path(long p) { + pointer = p; } - private native long clone(Path old); + public Path(Path old) { + pointer = old.cloneNative(); + } - // Operation public native Point currentPoint(); - public void moveTo(Point xy) - { + 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 closePath(); + + public void moveTo(Point xy) { moveTo(xy.x, xy.y); } - public native void moveTo(float x, float y); - - public void lineTo(Point xy) - { + public void lineTo(Point xy) { lineTo(xy.x, xy.y); } - public native void lineTo(float x, float y); - - public void curveTo(Point c1, Point c2, Point e) - { + public void curveTo(Point c1, Point c2, Point e) { curveTo(c1.x, c1.y, c2.x, c2.y, e.x, e.y); } - public native void curveTo(float cx1, float cy1, float cx2, float cy2, float ex, float ey); - - public void curveToV(Point c, Point e) - { + public void curveToV(Point c, Point e) { curveToV(c.x, c.y, e.x, e.y); } - public native void curveToV(float cx, float cy, float ex, float ey); - - public void curveToY(Point c, Point e) - { + public void curveToY(Point c, Point e) { curveToY(c.x, c.y, e.x, e.y); } - public native void curveToY(float cx, float cy, float ex, float ey); - - public native void close(); - public native void transform(Matrix mat); - public native Rect bound(StrokeState stroke, Matrix ctm); - - public native void process(PathProcessor proc); - - // Destruction - public void destroy() - { - finalize(); - nativePath = 0; - } + public native Rect getBounds(StrokeState stroke, Matrix ctm); - protected native void finalize(); + public native void walk(PathWalker walker); } diff --git a/platform/java/com/artifex/mupdf/fitz/PathProcessor.java b/platform/java/com/artifex/mupdf/fitz/PathWalker.java index 71d03c50..66d1b49b 100644 --- a/platform/java/com/artifex/mupdf/fitz/PathProcessor.java +++ b/platform/java/com/artifex/mupdf/fitz/PathWalker.java @@ -1,9 +1,9 @@ package com.artifex.mupdf.fitz; -public interface PathProcessor +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 close(); + public void closePath(); } diff --git a/platform/java/com/artifex/mupdf/fitz/Pixmap.java b/platform/java/com/artifex/mupdf/fitz/Pixmap.java new file mode 100644 index 00000000..61c833ff --- /dev/null +++ b/platform/java/com/artifex/mupdf/fitz/Pixmap.java @@ -0,0 +1,60 @@ +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); + + private Pixmap(long p) { + pointer = p; + } + + public Pixmap(ColorSpace colorspace, int x, int y, int w, int h) { + pointer = newNative(colorspace, x, y, w, h); + } + + public Pixmap(ColorSpace colorspace, int w, int h) { + this(colorspace, 0, 0, w, h); + } + + public Pixmap(ColorSpace colorspace, Rect rect) { + this(colorspace, (int)rect.x0, (int)rect.y0, (int)(rect.x1 - rect.x0), (int)(rect.y1 - rect.y0)); + } + + public native void clear(); + public native void clearWithValue(int value); + + public native void saveAsPNG(String filename, boolean saveAlpha); + + 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 ColorSpace getColorSpace(); + public native byte[] getSamples(); + public native int[] getPixels(); /* only valid for RGB or BGR pixmaps */ + + public void clear(int value) { + clearWithValue(value); + } + + public String toString() { + return "Pixmap(w=" + getWidth() + + " h=" + getHeight() + + " x=" + getX() + + " y=" + getY() + + " n=" + getNumberOfComponents() + + " cs=" + getColorSpace() + + ")"; + } +} diff --git a/platform/java/com/artifex/mupdf/fitz/Point.java b/platform/java/com/artifex/mupdf/fitz/Point.java index 08989dd7..b32198bc 100644 --- a/platform/java/com/artifex/mupdf/fitz/Point.java +++ b/platform/java/com/artifex/mupdf/fitz/Point.java @@ -5,20 +5,21 @@ public class Point public float x; public float y; - public Point(float x, float y) - { + public Point(float x, float y) { this.x = x; this.y = y; } - public Point(Point p) - { + public Point(Point p) { this.x = p.x; this.y = p.y; } - public Point transform(Matrix tm) - { + 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; diff --git a/platform/java/com/artifex/mupdf/fitz/Rect.java b/platform/java/com/artifex/mupdf/fitz/Rect.java index eb9138cf..819646e8 100644 --- a/platform/java/com/artifex/mupdf/fitz/Rect.java +++ b/platform/java/com/artifex/mupdf/fitz/Rect.java @@ -7,29 +7,30 @@ public class Rect public float x1; public float y1; - public Rect(float x0, float y0, float x1, 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.x0 = r.x0; - this.y0 = r.y0; - this.x1 = r.x1; - this.y1 = r.y1; + public Rect(Rect r) { + this(r.x0, r.y0, r.x1, r.y1); } - public Rect transform(Matrix tm) - { + 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) - { + if (ax0 > ax1) { float t = ax0; ax0 = ax1; ax1 = t; @@ -38,8 +39,7 @@ public class Rect float cy0 = y0 * tm.c; float cy1 = y1 * tm.c; - if (cy0 > cy1) - { + if (cy0 > cy1) { float t = cy0; cy0 = cy1; cy1 = t; @@ -50,8 +50,7 @@ public class Rect float bx0 = x0 * tm.b; float bx1 = x1 * tm.b; - if (bx0 > bx1) - { + if (bx0 > bx1) { float t = bx0; bx0 = bx1; bx1 = t; @@ -60,8 +59,7 @@ public class Rect float dy0 = y0 * tm.d; float dy1 = y1 * tm.d; - if (dy0 > dy1) - { + if (dy0 > dy1) { float t = dy0; dy0 = dy1; dy1 = t; diff --git a/platform/java/com/artifex/mupdf/fitz/RectI.java b/platform/java/com/artifex/mupdf/fitz/RectI.java index 1f91c778..8e46a3f2 100644 --- a/platform/java/com/artifex/mupdf/fitz/RectI.java +++ b/platform/java/com/artifex/mupdf/fitz/RectI.java @@ -7,29 +7,33 @@ public class RectI public int x1; public int y1; - public RectI(int x0, int y0, int x1, 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(Rect r) - { + 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 RectI transform(Matrix tm) - { + 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) - { + if (ax0 > ax1) { float t = ax0; ax0 = ax1; ax1 = t; @@ -38,8 +42,7 @@ public class RectI float cy0 = y0 * tm.c; float cy1 = y1 * tm.c; - if (cy0 > cy1) - { + if (cy0 > cy1) { float t = cy0; cy0 = cy1; cy1 = t; @@ -50,8 +53,7 @@ public class RectI float bx0 = x0 * tm.b; float bx1 = x1 * tm.b; - if (bx0 > bx1) - { + if (bx0 > bx1) { float t = bx0; bx0 = bx1; bx1 = t; @@ -60,8 +62,7 @@ public class RectI float dy0 = y0 * tm.d; float dy1 = y1 * tm.d; - if (dy0 > dy1) - { + if (dy0 > dy1) { float t = dy0; dy0 = dy1; dy1 = t; diff --git a/platform/java/com/artifex/mupdf/fitz/Shade.java b/platform/java/com/artifex/mupdf/fitz/Shade.java index bfadebc7..35182cb8 100644 --- a/platform/java/com/artifex/mupdf/fitz/Shade.java +++ b/platform/java/com/artifex/mupdf/fitz/Shade.java @@ -2,27 +2,16 @@ package com.artifex.mupdf.fitz; public class Shade { - // Private data - private long nativeShade = 0; + private long pointer; - // Construction - // 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. - private Shade(long l) - { - nativeShade = l; - } - - // FIXME: Constructors for the different types of shade - // FIXME: Accessors for shade data + protected native void finalize(); - // Destruction - public void destroy() - { + public void destroy() { finalize(); - nativeShade = 0; + pointer = 0; } - protected native void finalize(); + private Shade(long p) { + pointer = p; + } } diff --git a/platform/java/com/artifex/mupdf/fitz/StrokeState.java b/platform/java/com/artifex/mupdf/fitz/StrokeState.java index 2f2fcf96..7f333f76 100644 --- a/platform/java/com/artifex/mupdf/fitz/StrokeState.java +++ b/platform/java/com/artifex/mupdf/fitz/StrokeState.java @@ -1,7 +1,5 @@ package com.artifex.mupdf.fitz; -import android.graphics.Rect; - public class StrokeState { public static final int FZ_LINECAP_BUTT = 0; @@ -14,36 +12,38 @@ public class StrokeState public static final int FZ_LINEJOIN_BEVEL = 2; public static final int FZ_LINEJOIN_MITER_XPS = 3; - // Private data - private long nativeStroke; + private long pointer; - // Construction - StrokeState(int startCap, int endCap, int lineJoin, float lineWidth, float miterLimit) - { - nativeStroke = newNative(startCap, 0, endCap, lineJoin, lineWidth, miterLimit, 0, null); - } + protected native void finalize(); - StrokeState(int startCap, int dashCap, int endCap, int lineJoin, float lineWidth, float miterLimit, float dashPhase, float dash[]) - { - nativeStroke = newNative(startCap, dashCap, endCap, lineJoin, lineWidth, miterLimit, dashPhase, dash); + 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 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 l) - { - nativeStroke = l; + 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); } - // Operation public native void adjustRectForStroke(Rect rect, Matrix ctm); - // Accessors public native int getStartCap(); public native int getDashCap(); public native int getEndCap(); @@ -52,13 +52,4 @@ public class StrokeState public native float getMiterLimit(); public native float getDashPhase(); public native float[] getDashes(); - - // Destruction - public void destroy() - { - finalize(); - nativeStroke = 0; - } - - protected native void finalize(); } diff --git a/platform/java/com/artifex/mupdf/fitz/Text.java b/platform/java/com/artifex/mupdf/fitz/Text.java index eada4635..d5d9a836 100644 --- a/platform/java/com/artifex/mupdf/fitz/Text.java +++ b/platform/java/com/artifex/mupdf/fitz/Text.java @@ -1,46 +1,34 @@ package com.artifex.mupdf.fitz; -public class Text +public class Text implements TextWalker { - // Private data - private long nativeText = 0; - private boolean isConst = false; - - // Cloning - public Text(Text old) - { - nativeText = cloneNative(old); + private long pointer; + + protected native void finalize(); + + public void destroy() { + finalize(); + pointer = 0; } + private native long newNative(); private native long cloneNative(Text old); - //public Text(Font font, Matrix trm, int wmode) - //{ - // nativeText = newNative(font, trm, wmode); - //} - - // Private method used for creating Text entries for a - // device implemented in java. These entries should be - // immutable. - private Text(long ptr) - { - nativeText = ptr; - isConst = true; + private Text(long p) { + pointer = p; } - // Operation - public native Rect bound(StrokeState stroke, Matrix ctm); + public Text(Text old) { + pointer = cloneNative(old); + } - //public native void add(int gid, int ucs, float x, float y); + public Text() { + pointer = newNative(); + } - // FIXME: Write accessors + public native void showGlyph(Font font, boolean vertical, Matrix trm, int glyph, int unicode); - // Destruction - public void destroy() - { - finalize(); - nativeText = 0; - } + public native Rect getBounds(StrokeState stroke, Matrix ctm); - protected native void finalize(); + public native void walk(TextWalker walker); } diff --git a/platform/java/com/artifex/mupdf/fitz/TextWalker.java b/platform/java/com/artifex/mupdf/fitz/TextWalker.java new file mode 100644 index 00000000..99d3e150 --- /dev/null +++ b/platform/java/com/artifex/mupdf/fitz/TextWalker.java @@ -0,0 +1,6 @@ +package com.artifex.mupdf.fitz; + +public interface TextWalker +{ + public void showGlyph(Font font, boolean vertical, Matrix trm, int glyph, int unicode); +} diff --git a/platform/java/com/artifex/mupdf/fitz/TryLaterException.java b/platform/java/com/artifex/mupdf/fitz/TryLaterException.java index 644c6af1..e2d1b88e 100644 --- a/platform/java/com/artifex/mupdf/fitz/TryLaterException.java +++ b/platform/java/com/artifex/mupdf/fitz/TryLaterException.java @@ -2,8 +2,7 @@ package com.artifex.mupdf.fitz; public class TryLaterException extends Exception { - TryLaterException(String message) - { + TryLaterException(String message) { super(message); } } |