1dcdd57faf02fb4fd23bb8265392b9c22e068907edjsollen@google.com/*
2dcdd57faf02fb4fd23bb8265392b9c22e068907edjsollen@google.com * Copyright 2012 Google Inc.
3dcdd57faf02fb4fd23bb8265392b9c22e068907edjsollen@google.com *
4dcdd57faf02fb4fd23bb8265392b9c22e068907edjsollen@google.com * Use of this source code is governed by a BSD-style license that can be
5dcdd57faf02fb4fd23bb8265392b9c22e068907edjsollen@google.com * found in the LICENSE file.
6dcdd57faf02fb4fd23bb8265392b9c22e068907edjsollen@google.com */
7dcdd57faf02fb4fd23bb8265392b9c22e068907edjsollen@google.com
8dcdd57faf02fb4fd23bb8265392b9c22e068907edjsollen@google.compackage com.skia;
9dcdd57faf02fb4fd23bb8265392b9c22e068907edjsollen@google.com
10dcdd57faf02fb4fd23bb8265392b9c22e068907edjsollen@google.comimport android.opengl.GLSurfaceView;
11dcdd57faf02fb4fd23bb8265392b9c22e068907edjsollen@google.comimport android.os.Handler;
12a3b84d41efbbc5ab1e050a33d66dca4d1c44c9e3commit-bot@chromium.orgimport android.util.Log;
13dcdd57faf02fb4fd23bb8265392b9c22e068907edjsollen@google.com
14dcdd57faf02fb4fd23bb8265392b9c22e068907edjsollen@google.comimport javax.microedition.khronos.egl.EGLConfig;
15dcdd57faf02fb4fd23bb8265392b9c22e068907edjsollen@google.comimport javax.microedition.khronos.opengles.GL10;
16a3b84d41efbbc5ab1e050a33d66dca4d1c44c9e3commit-bot@chromium.orgimport javax.microedition.khronos.opengles.GL11;
17dcdd57faf02fb4fd23bb8265392b9c22e068907edjsollen@google.com
18dcdd57faf02fb4fd23bb8265392b9c22e068907edjsollen@google.compublic class SkiaSampleRenderer implements GLSurfaceView.Renderer {
19dcdd57faf02fb4fd23bb8265392b9c22e068907edjsollen@google.com
20dcdd57faf02fb4fd23bb8265392b9c22e068907edjsollen@google.com    private final SkiaSampleView mSampleView;
21dcdd57faf02fb4fd23bb8265392b9c22e068907edjsollen@google.com    private Handler mHandler = new Handler();
22a3b84d41efbbc5ab1e050a33d66dca4d1c44c9e3commit-bot@chromium.org    private int mMSAASampleCount;
23dcdd57faf02fb4fd23bb8265392b9c22e068907edjsollen@google.com
24dcdd57faf02fb4fd23bb8265392b9c22e068907edjsollen@google.com    SkiaSampleRenderer(SkiaSampleView view) {
25dcdd57faf02fb4fd23bb8265392b9c22e068907edjsollen@google.com        mSampleView = view;
26dcdd57faf02fb4fd23bb8265392b9c22e068907edjsollen@google.com    }
27dcdd57faf02fb4fd23bb8265392b9c22e068907edjsollen@google.com
28dcdd57faf02fb4fd23bb8265392b9c22e068907edjsollen@google.com    @Override
29dcdd57faf02fb4fd23bb8265392b9c22e068907edjsollen@google.com    public void onDrawFrame(GL10 gl) {
30dcdd57faf02fb4fd23bb8265392b9c22e068907edjsollen@google.com        draw();
31dcdd57faf02fb4fd23bb8265392b9c22e068907edjsollen@google.com    }
32dcdd57faf02fb4fd23bb8265392b9c22e068907edjsollen@google.com
33dcdd57faf02fb4fd23bb8265392b9c22e068907edjsollen@google.com    @Override
34dcdd57faf02fb4fd23bb8265392b9c22e068907edjsollen@google.com    public void onSurfaceChanged(GL10 gl, int width, int height) {
35dcdd57faf02fb4fd23bb8265392b9c22e068907edjsollen@google.com        updateSize(width, height);
36dcdd57faf02fb4fd23bb8265392b9c22e068907edjsollen@google.com    }
37dcdd57faf02fb4fd23bb8265392b9c22e068907edjsollen@google.com
38dcdd57faf02fb4fd23bb8265392b9c22e068907edjsollen@google.com    @Override
39dcdd57faf02fb4fd23bb8265392b9c22e068907edjsollen@google.com    public void onSurfaceCreated(GL10 gl, EGLConfig config) {
40a3b84d41efbbc5ab1e050a33d66dca4d1c44c9e3commit-bot@chromium.org        if (gl instanceof GL11) {
41a3b84d41efbbc5ab1e050a33d66dca4d1c44c9e3commit-bot@chromium.org            int value[] = new int[1];
42a3b84d41efbbc5ab1e050a33d66dca4d1c44c9e3commit-bot@chromium.org            ((GL11) gl).glGetIntegerv(GL11.GL_SAMPLES, value, 0);
43a3b84d41efbbc5ab1e050a33d66dca4d1c44c9e3commit-bot@chromium.org            if (value[0] == 1) {
44a3b84d41efbbc5ab1e050a33d66dca4d1c44c9e3commit-bot@chromium.org                mMSAASampleCount = 0;
45a3b84d41efbbc5ab1e050a33d66dca4d1c44c9e3commit-bot@chromium.org            } else {
46a3b84d41efbbc5ab1e050a33d66dca4d1c44c9e3commit-bot@chromium.org                mMSAASampleCount = value[0];
47a3b84d41efbbc5ab1e050a33d66dca4d1c44c9e3commit-bot@chromium.org            }
48a3b84d41efbbc5ab1e050a33d66dca4d1c44c9e3commit-bot@chromium.org        }
49a3b84d41efbbc5ab1e050a33d66dca4d1c44c9e3commit-bot@chromium.org
50dcdd57faf02fb4fd23bb8265392b9c22e068907edjsollen@google.com        gl.glClearStencil(0);
51dcdd57faf02fb4fd23bb8265392b9c22e068907edjsollen@google.com        gl.glClear(GL10.GL_STENCIL_BUFFER_BIT);
52a3b84d41efbbc5ab1e050a33d66dca4d1c44c9e3commit-bot@chromium.org        init((SkiaSampleActivity)mSampleView.getContext(), mMSAASampleCount);
53a3b84d41efbbc5ab1e050a33d66dca4d1c44c9e3commit-bot@chromium.org    }
54a3b84d41efbbc5ab1e050a33d66dca4d1c44c9e3commit-bot@chromium.org
55a3b84d41efbbc5ab1e050a33d66dca4d1c44c9e3commit-bot@chromium.org    // Called by JNI and the view.
56a3b84d41efbbc5ab1e050a33d66dca4d1c44c9e3commit-bot@chromium.org    synchronized public int getMSAASampleCount() {
57a3b84d41efbbc5ab1e050a33d66dca4d1c44c9e3commit-bot@chromium.org        return mMSAASampleCount;
58dcdd57faf02fb4fd23bb8265392b9c22e068907edjsollen@google.com    }
59dcdd57faf02fb4fd23bb8265392b9c22e068907edjsollen@google.com
60dcdd57faf02fb4fd23bb8265392b9c22e068907edjsollen@google.com    // Called by JNI
61dcdd57faf02fb4fd23bb8265392b9c22e068907edjsollen@google.com    private void startTimer(int ms) {
62dcdd57faf02fb4fd23bb8265392b9c22e068907edjsollen@google.com        // After the delay, queue an event to the Renderer's thread
63dcdd57faf02fb4fd23bb8265392b9c22e068907edjsollen@google.com        // to handle the event on the timer queue
64dcdd57faf02fb4fd23bb8265392b9c22e068907edjsollen@google.com        mHandler.postDelayed(new Runnable() {
65dcdd57faf02fb4fd23bb8265392b9c22e068907edjsollen@google.com            @Override
66dcdd57faf02fb4fd23bb8265392b9c22e068907edjsollen@google.com            public void run() {
67dcdd57faf02fb4fd23bb8265392b9c22e068907edjsollen@google.com                mSampleView.queueEvent(new Runnable() {
68dcdd57faf02fb4fd23bb8265392b9c22e068907edjsollen@google.com                    @Override
69dcdd57faf02fb4fd23bb8265392b9c22e068907edjsollen@google.com                    public void run() {
70dcdd57faf02fb4fd23bb8265392b9c22e068907edjsollen@google.com                        serviceQueueTimer();
71dcdd57faf02fb4fd23bb8265392b9c22e068907edjsollen@google.com                    }
72dcdd57faf02fb4fd23bb8265392b9c22e068907edjsollen@google.com                });
73dcdd57faf02fb4fd23bb8265392b9c22e068907edjsollen@google.com            }
74dcdd57faf02fb4fd23bb8265392b9c22e068907edjsollen@google.com        }, ms);
75dcdd57faf02fb4fd23bb8265392b9c22e068907edjsollen@google.com    }
76dcdd57faf02fb4fd23bb8265392b9c22e068907edjsollen@google.com
77dcdd57faf02fb4fd23bb8265392b9c22e068907edjsollen@google.com    // Called by JNI
78dcdd57faf02fb4fd23bb8265392b9c22e068907edjsollen@google.com    private void queueSkEvent() {
79dcdd57faf02fb4fd23bb8265392b9c22e068907edjsollen@google.com        mSampleView.queueEvent(new Runnable() {
80dcdd57faf02fb4fd23bb8265392b9c22e068907edjsollen@google.com            @Override
81dcdd57faf02fb4fd23bb8265392b9c22e068907edjsollen@google.com            public void run() {
82dcdd57faf02fb4fd23bb8265392b9c22e068907edjsollen@google.com                processSkEvent();
83dcdd57faf02fb4fd23bb8265392b9c22e068907edjsollen@google.com            }
84dcdd57faf02fb4fd23bb8265392b9c22e068907edjsollen@google.com        });
85dcdd57faf02fb4fd23bb8265392b9c22e068907edjsollen@google.com    }
86dcdd57faf02fb4fd23bb8265392b9c22e068907edjsollen@google.com
87dcdd57faf02fb4fd23bb8265392b9c22e068907edjsollen@google.com    // Called by JNI
88dcdd57faf02fb4fd23bb8265392b9c22e068907edjsollen@google.com    private void requestRender() {
89dcdd57faf02fb4fd23bb8265392b9c22e068907edjsollen@google.com        mSampleView.requestRender();
90dcdd57faf02fb4fd23bb8265392b9c22e068907edjsollen@google.com    }
91dcdd57faf02fb4fd23bb8265392b9c22e068907edjsollen@google.com
92a3b84d41efbbc5ab1e050a33d66dca4d1c44c9e3commit-bot@chromium.org    native void init(SkiaSampleActivity activity, int msaaSampleCount);
93dcdd57faf02fb4fd23bb8265392b9c22e068907edjsollen@google.com    native void term();
94dcdd57faf02fb4fd23bb8265392b9c22e068907edjsollen@google.com    native void draw();
95dcdd57faf02fb4fd23bb8265392b9c22e068907edjsollen@google.com    native void updateSize(int w, int h);
96dcdd57faf02fb4fd23bb8265392b9c22e068907edjsollen@google.com    native void handleClick(int owner, float x, float y, int state);
97dcdd57faf02fb4fd23bb8265392b9c22e068907edjsollen@google.com    native void showOverview();
98dcdd57faf02fb4fd23bb8265392b9c22e068907edjsollen@google.com    native void nextSample();
99dcdd57faf02fb4fd23bb8265392b9c22e068907edjsollen@google.com    native void previousSample();
100dcdd57faf02fb4fd23bb8265392b9c22e068907edjsollen@google.com    native void goToSample(int position);
101dcdd57faf02fb4fd23bb8265392b9c22e068907edjsollen@google.com    native void toggleRenderingMode();
102dcdd57faf02fb4fd23bb8265392b9c22e068907edjsollen@google.com    native void toggleSlideshow();
103dcdd57faf02fb4fd23bb8265392b9c22e068907edjsollen@google.com    native void toggleFPS();
104dcdd57faf02fb4fd23bb8265392b9c22e068907edjsollen@google.com    native void toggleTiling();
105dcdd57faf02fb4fd23bb8265392b9c22e068907edjsollen@google.com    native void toggleBBox();
106dcdd57faf02fb4fd23bb8265392b9c22e068907edjsollen@google.com    native void processSkEvent();
107dcdd57faf02fb4fd23bb8265392b9c22e068907edjsollen@google.com    native void serviceQueueTimer();
108dcdd57faf02fb4fd23bb8265392b9c22e068907edjsollen@google.com    native void saveToPDF();
109dcdd57faf02fb4fd23bb8265392b9c22e068907edjsollen@google.com    native void postInval();
110dcdd57faf02fb4fd23bb8265392b9c22e068907edjsollen@google.com}