shared/java/Data.java (93 lines of code) (raw):
package org.jetbrains.skija;
import java.nio.ByteBuffer;
import java.lang.ref.*;
import org.jetbrains.annotations.*;
import org.jetbrains.skija.impl.*;
/**
* Data holds an immutable data buffer.
*/
public class Data extends Managed {
static { Library.staticLoad(); }
public long getSize() {
try {
Stats.onNativeCall();
return _nSize(_ptr);
} finally {
Reference.reachabilityFence(this);
}
}
public byte[] getBytes() {
return getBytes(0, getSize());
}
public byte[] getBytes(long offset, long length) {
try {
Stats.onNativeCall();
return _nBytes(_ptr, offset, length);
} finally {
Reference.reachabilityFence(this);
}
}
/**
* Returns true if these two objects have the same length and contents,
* effectively returning 0 == memcmp(...)
*/
@ApiStatus.Internal @Override
public boolean _nativeEquals(Native other) {
try {
Stats.onNativeCall();
return _nEquals(_ptr, Native.getPtr(other));
} finally {
Reference.reachabilityFence(this);
Reference.reachabilityFence(other);
}
}
public static Data makeFromBytes(byte[] bytes) {
return makeFromBytes(bytes, 0, bytes.length);
}
public static Data makeFromBytes(byte[] bytes, long offset, long length) {
Stats.onNativeCall();
return new Data(_nMakeFromBytes(bytes, offset, length));
}
/**
* Create a new dataref the file with the specified path.
* If the file cannot be opened, this returns null.
*/
public static Data makeFromFileName(String path) {
Stats.onNativeCall();
return new Data(_nMakeFromFileName(path));
}
/**
* Create a new dataref using a subset of the data in the specified
* src dataref.
*/
public Data makeSubset(long offset, long length) {
try {
Stats.onNativeCall();
return new Data(_nMakeSubset(_ptr, offset, length));
} finally {
Reference.reachabilityFence(this);
}
}
public Data makeCopy() {
try {
Stats.onNativeCall();
return new Data(_nMakeSubset(_ptr, 0, getSize()));
} finally {
Reference.reachabilityFence(this);
}
}
public ByteBuffer toByteBuffer() {
try {
Stats.onNativeCall();
return _nToByteBuffer(_ptr);
} finally {
Reference.reachabilityFence(this);
}
}
/**
* Returns a new empty dataref (or a reference to a shared empty dataref).
* New or shared, the caller must see that {@link #close()} is eventually called.
*/
public static Data makeEmpty() {
Stats.onNativeCall();
return new Data(_nMakeEmpty());
}
@ApiStatus.Internal
public Data(long ptr) {
super(ptr, _FinalizerHolder.PTR);
}
@ApiStatus.Internal
public static class _FinalizerHolder {
public static final long PTR = _nGetFinalizer();
}
public static native long _nGetFinalizer();
public static native long _nSize(long ptr);
public static native byte[] _nBytes(long ptr, long offset, long length);
public static native boolean _nEquals(long ptr, long otherPtr);
public static native ByteBuffer _nToByteBuffer(long ptr);
public static native long _nMakeFromBytes(byte[] bytes, long offset, long length);
public static native long _nMakeFromFileName(String path);
public static native long _nMakeSubset(long ptr, long offset, long length);
public static native long _nMakeEmpty();
}