package com.basic.security.utils;
import android.graphics.Bitmap;
import android.util.Log;
import java.nio.ByteBuffer;
public class BitmapHolder {
static {
//System.loadLibrary("JniBitmapOperationsLibrary");
}
ByteBuffer _handler = null;
public BitmapHolder() {
}
public BitmapHolder(final Bitmap bitmap) {
storeBitmap(bitmap);
}
private native ByteBuffer jniStoreBitmapData(Bitmap bitmap);
private native Bitmap jniGetBitmapFromStoredBitmapData(ByteBuffer handler);
private native void jniFreeBitmapData(ByteBuffer handler);
private native void jniRotateBitmapCcw90(ByteBuffer handler);
private native void jniRotateBitmapCw90(ByteBuffer handler);
private native void jniRotateBitmap180(ByteBuffer handler);
private native void jniCropBitmap(ByteBuffer handler, final int left, final int top, final int right, final int bottom);
private native void jniScaleNNBitmap(ByteBuffer handler, final int newWidth, final int newHeight);
private native void jniScaleBIBitmap(ByteBuffer handler, final int newWidth, final int newHeight);
private native void jniFlipBitmapHorizontal(ByteBuffer handler);
private native void jniFlipBitmapVertical(ByteBuffer handler);
public void storeBitmap(final Bitmap bitmap) {
if (_handler != null)
freeBitmap();
_handler = jniStoreBitmapData(bitmap);
}
public void rotateBitmapCcw90() {
if (_handler == null)
return;
jniRotateBitmapCcw90(_handler);
}
public void rotateBitmapCw90() {
if (_handler == null)
return;
jniRotateBitmapCw90(_handler);
}
public void rotateBitmap180() {
if (_handler == null)
return;
jniRotateBitmap180(_handler);
}
public void cropBitmap(final int left, final int top, final int right, final int bottom) {
if (_handler == null)
return;
jniCropBitmap(_handler, left, top, right, bottom);
}
public Bitmap getBitmap() {
if (_handler == null)
return null;
return jniGetBitmapFromStoredBitmapData(_handler);
}
public Bitmap getBitmapAndFree() {
final Bitmap bitmap = getBitmap();
freeBitmap();
return bitmap;
}
public void scaleBitmap(final int newWidth, final int newHeight, final ScaleMethod scaleMethod) {
if (_handler == null)
return;
switch (scaleMethod) {
case BilinearInterpolation:
jniScaleBIBitmap(_handler, newWidth, newHeight);
break;
case NearestNeighbour:
jniScaleNNBitmap(_handler, newWidth, newHeight);
break;
}
}
/**
* flips a bitmap horizontally, as such:
*
*
* 123 321 * 456 => 654 * 789 987 **/ // public void flipBitmapHorizontal() { if (_handler == null) return; jniFlipBitmapHorizontal(_handler); } /** * Flips the bitmap on the vertically, as such:
*
* 123 789 * 456 => 456 * 789 123 **/ public void flipBitmapVertical() { if (_handler == null) return; jniFlipBitmapVertical(_handler); } public void freeBitmap() { if (_handler == null) return; jniFreeBitmapData(_handler); _handler = null; } @Override protected void finalize() throws Throwable { super.finalize(); if (_handler == null) return; Log.w("DEBUG", "JNI bitmap wasn't freed nicely.please remember to free the bitmap as soon as you can"); freeBitmap(); } public enum ScaleMethod { NearestNeighbour, BilinearInterpolation } }