Files
android_translation_layer/src/api-impl/android/graphics/Bitmap.java

165 lines
4.4 KiB
Java
Raw Normal View History

package android.graphics;
import android.util.DisplayMetrics;
/*
* Bitmap is implemented as GdkTexture or GtkSnapshot. It can only be one of the two at a time.
* The methods getTexture() and getSnapshot() automatically convert between the two as needed.
*/
public final class Bitmap {
public enum Config {
RGB_565,
ARGB_8888,
ARGB_4444,
ALPHA_8,
}
private int width;
private int height;
private long texture;
private long snapshot;
private Config config = Config.ARGB_8888;
Bitmap(long texture) {
this.texture = texture;
this.width = native_get_width(texture);
this.height = native_get_height(texture);
}
private Bitmap(int width, int height, Config config) {
this.config = config;
this.width = width;
this.height = height;
}
public static Bitmap createBitmap(int width, int height, Config config) {
return new Bitmap(width, height, config);
}
public static Bitmap createBitmap(DisplayMetrics metrics, int width, int height, Config config) {
return new Bitmap(width, height, config);
}
public static Bitmap createBitmap(DisplayMetrics metrics, int width, int height, Config config, boolean hasAlpha, ColorSpace colorSpace) {
return new Bitmap(width, height, config);
}
public static Bitmap createBitmap(Bitmap src, int x, int y, int width, int height) {
Bitmap dest = new Bitmap(width, height, src.getConfig());
new Canvas(dest).drawBitmap(src, new Rect(x, y, x + width, y + height), new Rect(0, 0, width, height), null);
return dest;
}
public static Bitmap createBitmap(Bitmap src, int x, int y, int width, int height, Matrix matrix, boolean filter) {
Bitmap dest = new Bitmap(width, height, src.getConfig());
Canvas canvas = new Canvas(dest);
canvas.concat(matrix);
canvas.drawBitmap(src, new Rect(x, y, x + width, y + height), new Rect(0, 0, width, height), null);
return dest;
}
public static Bitmap createBitmap(Bitmap src) {
return new Bitmap(native_ref_texture(src.getTexture()));
}
public static Bitmap createScaledBitmap(Bitmap src, int dstWidth, int dstHeight, boolean filter) {
Bitmap dest = new Bitmap(dstWidth, dstHeight, src.getConfig());
new Canvas(dest).drawBitmap(src, new Rect(0, 0, src.getWidth(), src.getHeight()), new Rect(0, 0, dstWidth, dstHeight), null);
return dest;
}
public int getWidth() {
return width;
}
public int getHeight() {
return height;
}
public Config getConfig() {
return config;
}
public synchronized long getTexture() {
if (texture == 0) {
texture = native_create_texture(snapshot, width, height);
snapshot = 0;
}
return texture;
}
synchronized long getSnapshot() {
if (snapshot == 0) {
snapshot = native_create_snapshot(texture);
texture = 0;
}
return snapshot;
}
public void eraseColor(int color) {
recycle();
snapshot = native_erase_color(color, width, height);
texture = 0;
}
public void recycle() {
native_recycle(texture, snapshot);
texture = 0;
snapshot = 0;
}
public int getAllocationByteCount() {
return width * height * 4;
}
public void prepareToDraw() {
getTexture();
}
public void setDensity(int density) {}
public int getScaledWidth(int density) {
return width;
}
public int getScaledHeight(int density) {
return height;
}
public boolean isRecycled() {
return texture == 0 && snapshot == 0;
}
public void setHasAlpha(boolean hasAlpha) {}
public Bitmap copy(Bitmap.Config config, boolean hasAlpha) {
Bitmap bitmap = new Bitmap(width, height, config);
bitmap.texture = native_ref_texture(getTexture());
return bitmap;
}
public void getPixels(int[] pixels, int offset, int stride, int x, int y, int width, int height) {
native_get_pixels(getTexture(), pixels, offset, stride, x, y, width, height);
}
@SuppressWarnings("deprecation")
@Override
protected void finalize() throws Throwable {
try {
recycle();
} finally {
super.finalize();
}
}
private static native long native_create_snapshot(long texture);
private static native long native_create_texture(long snapshot, int width, int height);
private static native int native_get_width(long texture);
private static native int native_get_height(long texture);
private static native long native_erase_color(int color, int width, int height);
private static native void native_recycle(long texture, long snapshot);
private static native long native_ref_texture(long texture);
private static native void native_get_pixels(long texture, int[] pixels, int offset, int stride, int x, int y, int width, int height);
}