Index: platform_tools/android/apps/sample_app/src/main/java/com/skia/SkiaSampleView.java |
diff --git a/platform_tools/android/apps/sample_app/src/main/java/com/skia/SkiaSampleView.java b/platform_tools/android/apps/sample_app/src/main/java/com/skia/SkiaSampleView.java |
new file mode 100644 |
index 0000000000000000000000000000000000000000..6213a6f35be2b06a6fef620d81a99f90537643a7 |
--- /dev/null |
+++ b/platform_tools/android/apps/sample_app/src/main/java/com/skia/SkiaSampleView.java |
@@ -0,0 +1,310 @@ |
+/* |
+ * Copyright 2012 Google Inc. |
+ * |
+ * Use of this source code is governed by a BSD-style license that can be |
+ * found in the LICENSE file. |
+ */ |
+ |
+package com.skia; |
+ |
+import javax.microedition.khronos.egl.EGL10; |
+import javax.microedition.khronos.egl.EGLConfig; |
+import javax.microedition.khronos.egl.EGLDisplay; |
+import javax.microedition.khronos.opengles.GL10; |
+ |
+import android.content.Context; |
+import android.opengl.EGL14; |
+import android.opengl.GLSurfaceView; |
+import android.os.Build; |
+import android.util.Log; |
+import android.view.MotionEvent; |
+import android.widget.Toast; |
+ |
+public class SkiaSampleView extends GLSurfaceView { |
+ |
+ private final SkiaSampleRenderer mSampleRenderer; |
+ private boolean mRequestedOpenGLAPI; // true == use (desktop) OpenGL. false == use OpenGL ES. |
+ private int mRequestedMSAASampleCount; |
+ |
+ public SkiaSampleView(Context ctx, String cmdLineFlags, boolean useOpenGL, int msaaSampleCount) { |
+ super(ctx); |
+ |
+ mSampleRenderer = new SkiaSampleRenderer(this, cmdLineFlags); |
+ mRequestedMSAASampleCount = msaaSampleCount; |
+ |
+ setEGLContextClientVersion(2); |
+ if (Build.VERSION.SDK_INT < Build.VERSION_CODES.JELLY_BEAN_MR1) { |
+ setEGLConfigChooser(8, 8, 8, 8, 0, 8); |
+ } else { |
+ mRequestedOpenGLAPI = useOpenGL; |
+ setEGLConfigChooser(new SampleViewEGLConfigChooser()); |
+ } |
+ setRenderer(mSampleRenderer); |
+ setRenderMode(GLSurfaceView.RENDERMODE_WHEN_DIRTY); |
+ } |
+ |
+ @Override |
+ public boolean onTouchEvent(MotionEvent event) { |
+ int count = event.getPointerCount(); |
+ for (int i = 0; i < count; i++) { |
+ final float x = event.getX(i); |
+ final float y = event.getY(i); |
+ final int owner = event.getPointerId(i); |
+ int action = event.getAction() & MotionEvent.ACTION_MASK; |
+ switch (action) { |
+ case MotionEvent.ACTION_POINTER_UP: |
+ action = MotionEvent.ACTION_UP; |
+ break; |
+ case MotionEvent.ACTION_POINTER_DOWN: |
+ action = MotionEvent.ACTION_DOWN; |
+ break; |
+ default: |
+ break; |
+ } |
+ final int finalAction = action; |
+ queueEvent(new Runnable() { |
+ @Override |
+ public void run() { |
+ mSampleRenderer.handleClick(owner, x, y, finalAction); |
+ } |
+ }); |
+ } |
+ return true; |
+ } |
+ |
+ public void inval() { |
+ queueEvent(new Runnable() { |
+ @Override |
+ public void run() { |
+ mSampleRenderer.postInval(); |
+ } |
+ }); |
+ } |
+ |
+ public void terminate() { |
+ queueEvent(new Runnable() { |
+ @Override |
+ public void run() { |
+ mSampleRenderer.term(); |
+ } |
+ }); |
+ } |
+ |
+ public void showOverview() { |
+ queueEvent(new Runnable() { |
+ @Override |
+ public void run() { |
+ mSampleRenderer.showOverview(); |
+ } |
+ }); |
+ } |
+ |
+ public void nextSample() { |
+ queueEvent(new Runnable() { |
+ @Override |
+ public void run() { |
+ mSampleRenderer.nextSample(); |
+ } |
+ }); |
+ } |
+ |
+ public void previousSample() { |
+ queueEvent(new Runnable() { |
+ @Override |
+ public void run() { |
+ mSampleRenderer.previousSample(); |
+ } |
+ }); |
+ } |
+ |
+ public void goToSample(final int position) { |
+ queueEvent(new Runnable() { |
+ @Override |
+ public void run() { |
+ mSampleRenderer.goToSample(position); |
+ } |
+ }); |
+ } |
+ |
+ public void toggleRenderingMode() { |
+ queueEvent(new Runnable() { |
+ @Override |
+ public void run() { |
+ mSampleRenderer.toggleRenderingMode(); |
+ } |
+ }); |
+ } |
+ |
+ public void toggleSlideshow() { |
+ queueEvent(new Runnable() { |
+ @Override |
+ public void run() { |
+ mSampleRenderer.toggleSlideshow(); |
+ } |
+ }); |
+ } |
+ |
+ public void toggleFPS() { |
+ queueEvent(new Runnable() { |
+ @Override |
+ public void run() { |
+ mSampleRenderer.toggleFPS(); |
+ } |
+ }); |
+ } |
+ |
+ public void toggleTiling() { |
+ queueEvent(new Runnable() { |
+ @Override |
+ public void run() { |
+ mSampleRenderer.toggleTiling(); |
+ } |
+ }); |
+ } |
+ |
+ public void toggleBBox() { |
+ queueEvent(new Runnable() { |
+ @Override |
+ public void run() { |
+ mSampleRenderer.toggleBBox(); |
+ } |
+ }); |
+ } |
+ |
+ public void saveToPDF() { |
+ queueEvent(new Runnable() { |
+ @Override |
+ public void run() { |
+ mSampleRenderer.saveToPDF(); |
+ } |
+ }); |
+ |
+ String msg = getContext().getString(R.string.pdf_save_info); |
+ Toast.makeText(getContext(), msg, Toast.LENGTH_SHORT).show(); |
+ } |
+ |
+ public boolean getUsesOpenGLAPI() { |
+ return mRequestedOpenGLAPI; |
+ } |
+ |
+ public int getMSAASampleCount() { |
+ return mSampleRenderer.getMSAASampleCount(); |
+ } |
+ |
+ private class SampleViewEGLConfigChooser implements GLSurfaceView.EGLConfigChooser { |
+ |
+ @Override |
+ public EGLConfig chooseConfig(EGL10 egl, EGLDisplay display) { |
+ int numConfigs = 0; |
+ int[] configSpec = null; |
+ int[] value = new int[1]; |
+ |
+ int[] validAPIs = new int[] { |
+ EGL14.EGL_OPENGL_API, |
+ EGL14.EGL_OPENGL_ES_API |
+ }; |
+ int initialAPI = mRequestedOpenGLAPI ? 0 : 1; |
+ |
+ for (int i = initialAPI; i < validAPIs.length && numConfigs == 0; i++) { |
+ int currentAPI = validAPIs[i]; |
+ EGL14.eglBindAPI(currentAPI); |
+ |
+ // setup the renderableType which will only be included in the |
+ // spec if we are attempting to get access to the OpenGL APIs. |
+ int renderableType = EGL14.EGL_OPENGL_BIT; |
+ if (currentAPI == EGL14.EGL_OPENGL_API) { |
+ renderableType = EGL14.EGL_OPENGL_ES2_BIT; |
+ } |
+ |
+ if (mRequestedMSAASampleCount > 0) { |
+ configSpec = new int[] { |
+ EGL10.EGL_RED_SIZE, 8, |
+ EGL10.EGL_GREEN_SIZE, 8, |
+ EGL10.EGL_BLUE_SIZE, 8, |
+ EGL10.EGL_ALPHA_SIZE, 8, |
+ EGL10.EGL_DEPTH_SIZE, 0, |
+ EGL10.EGL_STENCIL_SIZE, 8, |
+ EGL10.EGL_SAMPLE_BUFFERS, 1, |
+ EGL10.EGL_SAMPLES, mRequestedMSAASampleCount, |
+ EGL10.EGL_RENDERABLE_TYPE, renderableType, |
+ EGL10.EGL_NONE |
+ }; |
+ |
+ // EGL_RENDERABLE_TYPE is only needed when attempting to use |
+ // the OpenGL API (not ES) and causes many EGL drivers to fail |
+ // with a BAD_ATTRIBUTE error. |
+ if (!mRequestedOpenGLAPI) { |
+ configSpec[16] = EGL10.EGL_NONE; |
+ Log.i("Skia", "spec: " + configSpec); |
+ } |
+ |
+ if (!egl.eglChooseConfig(display, configSpec, null, 0, value)) { |
+ Log.i("Skia", "Could not get MSAA context count: " + mRequestedMSAASampleCount); |
+ } |
+ |
+ numConfigs = value[0]; |
+ } |
+ |
+ if (numConfigs <= 0) { |
+ // Try without multisampling. |
+ configSpec = new int[] { |
+ EGL10.EGL_RED_SIZE, 8, |
+ EGL10.EGL_GREEN_SIZE, 8, |
+ EGL10.EGL_BLUE_SIZE, 8, |
+ EGL10.EGL_ALPHA_SIZE, 8, |
+ EGL10.EGL_DEPTH_SIZE, 0, |
+ EGL10.EGL_STENCIL_SIZE, 8, |
+ EGL10.EGL_RENDERABLE_TYPE, renderableType, |
+ EGL10.EGL_NONE |
+ }; |
+ |
+ // EGL_RENDERABLE_TYPE is only needed when attempting to use |
+ // the OpenGL API (not ES) and causes many EGL drivers to fail |
+ // with a BAD_ATTRIBUTE error. |
+ if (!mRequestedOpenGLAPI) { |
+ configSpec[12] = EGL10.EGL_NONE; |
+ Log.i("Skia", "spec: " + configSpec); |
+ } |
+ |
+ if (!egl.eglChooseConfig(display, configSpec, null, 0, value)) { |
+ Log.i("Skia", "Could not get non-MSAA context count"); |
+ } |
+ numConfigs = value[0]; |
+ } |
+ } |
+ |
+ if (numConfigs <= 0) { |
+ throw new IllegalArgumentException("No configs match configSpec"); |
+ } |
+ |
+ // Get all matching configurations. |
+ EGLConfig[] configs = new EGLConfig[numConfigs]; |
+ if (!egl.eglChooseConfig(display, configSpec, configs, numConfigs, value)) { |
+ throw new IllegalArgumentException("Could not get config data"); |
+ } |
+ |
+ for (int i = 0; i < configs.length; ++i) { |
+ EGLConfig config = configs[i]; |
+ if (findConfigAttrib(egl, display, config , EGL10.EGL_RED_SIZE, 0) == 8 && |
+ findConfigAttrib(egl, display, config, EGL10.EGL_BLUE_SIZE, 0) == 8 && |
+ findConfigAttrib(egl, display, config, EGL10.EGL_GREEN_SIZE, 0) == 8 && |
+ findConfigAttrib(egl, display, config, EGL10.EGL_ALPHA_SIZE, 0) == 8 && |
+ findConfigAttrib(egl, display, config, EGL10.EGL_STENCIL_SIZE, 0) == 8) { |
+ return config; |
+ } |
+ } |
+ |
+ throw new IllegalArgumentException("Could not find suitable EGL config"); |
+ } |
+ |
+ private int findConfigAttrib(EGL10 egl, EGLDisplay display, |
+ EGLConfig config, int attribute, int defaultValue) { |
+ int[] value = new int[1]; |
+ if (egl.eglGetConfigAttrib(display, config, attribute, value)) { |
+ return value[0]; |
+ } |
+ return defaultValue; |
+ } |
+ |
+ } |
+} |