blob: 01c6dc3f25b151dd64a5d3adb50be3e719b156bd [file] [log] [blame]
/*
* Copyright 2015 Google Inc.
*
* Use of this source code is governed by a BSD-style license that can be
* found in the LICENSE file.
*/
// AJAR=$ANDROID_SDK_ROOT/platforms/android-19/android.jar
// SRC=platform_tools/android/apps/canvasproof/src/main
// javac -classpath $AJAR $SRC/java/org/skia/canvasproof/GaneshPictureRenderer.java
// javah -classpath $AJAR:$SRC/java -d $SRC/jni org.skia.canvasproof.GaneshPictureRenderer
package org.skia.canvasproof;
import android.app.Activity;
import android.graphics.Rect;
import android.opengl.GLSurfaceView;
import android.util.Log;
import javax.microedition.khronos.egl.EGLConfig;
import javax.microedition.khronos.opengles.GL10;
public class GaneshPictureRenderer implements GLSurfaceView.Renderer {
private static final String TAG = "GaneshPictureRenderer";
private long picturePtr;
private long contextPtr;
private float scale;
private int width;
private int height;
private GLSurfaceView view;
GaneshPictureRenderer() {
try {
System.loadLibrary("skia_android");
System.loadLibrary("canvasproof");
} catch (java.lang.Error e) {
Log.e(TAG, "System.loadLibrary error", e);
return;
}
this.scale = 1;
}
public GLSurfaceView makeView(Activity activity) {
this.view = new GLSurfaceView(activity);
this.view.setEGLConfigChooser(8, 8, 8, 8, 0, 8);
this.view.setEGLContextClientVersion(2);
this.view.setRenderer(this);
this.view.setRenderMode(GLSurfaceView.RENDERMODE_WHEN_DIRTY);
return this.view;
}
static public Rect cullRect(long picturePtr) {
Rect rect = new Rect();
try {
GaneshPictureRenderer.GetCullRect(rect, picturePtr);
} catch (UnsatisfiedLinkError e) {
Log.e(TAG, "GetCullRect failed", e);
}
return rect;
}
public void setPicture(long picturePtr) {
this.picturePtr = picturePtr;
this.view.requestRender();
}
public void setScale(float s) { this.scale = s; }
public void releaseResources() {
if (this.contextPtr != 0) {
try {
GaneshPictureRenderer.CleanUp(this.contextPtr);
} catch (UnsatisfiedLinkError e) {
Log.e(TAG, "CleanUp failed", e);
}
}
this.contextPtr = 0;
}
private void createContext() {
try {
this.contextPtr = GaneshPictureRenderer.Ctor();
} catch (UnsatisfiedLinkError e) {
Log.e(TAG, "Ctor failed", e);
}
}
@Override
public void onSurfaceCreated(GL10 gl, EGLConfig c) {
this.releaseResources();
this.createContext();
}
@Override
public void onDrawFrame(GL10 gl) {
if (this.contextPtr == 0) {
this.createContext();
}
if (this.width > 0 && this.height > 0 &&
this.contextPtr != 0 && this.picturePtr != 0) {
try {
GaneshPictureRenderer.DrawThisFrame(
this.width, this.height, this.scale,
this.contextPtr, this.picturePtr);
} catch (UnsatisfiedLinkError e) {
Log.e(TAG, "DrawThisFrame failed", e);
}
}
}
@Override
public void onSurfaceChanged(GL10 gl, int w, int h) {
this.width = w;
this.height = h;
}
@Override
public void finalize() throws Throwable {
super.finalize();
this.releaseResources();
}
// Make the native functions static to simplify JNI interaction.
private static native void DrawThisFrame(int w, int h, float s, long pr, long pc);
private static native long Ctor();
private static native void CleanUp(long p);
private static native void GetCullRect(Rect r, long picture);
}