1dcdd57faf02fb4fd23bb8265392b9c22e068907edjsollen@google.com
2dcdd57faf02fb4fd23bb8265392b9c22e068907edjsollen@google.com/*
3dcdd57faf02fb4fd23bb8265392b9c22e068907edjsollen@google.com * Copyright 2011 Skia
4dcdd57faf02fb4fd23bb8265392b9c22e068907edjsollen@google.com *
5dcdd57faf02fb4fd23bb8265392b9c22e068907edjsollen@google.com * Use of this source code is governed by a BSD-style license that can be
6dcdd57faf02fb4fd23bb8265392b9c22e068907edjsollen@google.com * found in the LICENSE file.
7dcdd57faf02fb4fd23bb8265392b9c22e068907edjsollen@google.com */
8dcdd57faf02fb4fd23bb8265392b9c22e068907edjsollen@google.com#include "com_skia_SkiaSampleRenderer.h"
9dcdd57faf02fb4fd23bb8265392b9c22e068907edjsollen@google.com
10dcdd57faf02fb4fd23bb8265392b9c22e068907edjsollen@google.com#include "SampleApp.h"
11dcdd57faf02fb4fd23bb8265392b9c22e068907edjsollen@google.com#include "SkApplication.h"
12dcdd57faf02fb4fd23bb8265392b9c22e068907edjsollen@google.com#include "SkCanvas.h"
13dcdd57faf02fb4fd23bb8265392b9c22e068907edjsollen@google.com#include "SkDevice.h"
14dcdd57faf02fb4fd23bb8265392b9c22e068907edjsollen@google.com#include "SkEvent.h"
15dcdd57faf02fb4fd23bb8265392b9c22e068907edjsollen@google.com#include "SkWindow.h"
16dcdd57faf02fb4fd23bb8265392b9c22e068907edjsollen@google.com
17dcdd57faf02fb4fd23bb8265392b9c22e068907edjsollen@google.com#include <jni.h>
180b17d6cb343cb71a3f548a02f0952c3592fc8c87djsollen#include "AndroidKeyToSkKey.h"
19dcdd57faf02fb4fd23bb8265392b9c22e068907edjsollen@google.com
20dcdd57faf02fb4fd23bb8265392b9c22e068907edjsollen@google.com
21dcdd57faf02fb4fd23bb8265392b9c22e068907edjsollen@google.com///////////////////////////////////////////
22dcdd57faf02fb4fd23bb8265392b9c22e068907edjsollen@google.com///////////////// Globals /////////////////
23dcdd57faf02fb4fd23bb8265392b9c22e068907edjsollen@google.com///////////////////////////////////////////
24dcdd57faf02fb4fd23bb8265392b9c22e068907edjsollen@google.com
25dcdd57faf02fb4fd23bb8265392b9c22e068907edjsollen@google.comstruct ActivityGlue {
26dcdd57faf02fb4fd23bb8265392b9c22e068907edjsollen@google.com    JNIEnv* m_env;
27dcdd57faf02fb4fd23bb8265392b9c22e068907edjsollen@google.com    jweak m_obj;
28dcdd57faf02fb4fd23bb8265392b9c22e068907edjsollen@google.com    jmethodID m_setTitle;
29dcdd57faf02fb4fd23bb8265392b9c22e068907edjsollen@google.com    jmethodID m_setSlideList;
30dcdd57faf02fb4fd23bb8265392b9c22e068907edjsollen@google.com    ActivityGlue() {
3196fcdcc219d2a0d3579719b84b28bede76efba64halcanary        m_env = nullptr;
3296fcdcc219d2a0d3579719b84b28bede76efba64halcanary        m_obj = nullptr;
3396fcdcc219d2a0d3579719b84b28bede76efba64halcanary        m_setTitle = nullptr;
3496fcdcc219d2a0d3579719b84b28bede76efba64halcanary        m_setSlideList = nullptr;
35dcdd57faf02fb4fd23bb8265392b9c22e068907edjsollen@google.com    }
36dcdd57faf02fb4fd23bb8265392b9c22e068907edjsollen@google.com} gActivityGlue;
37dcdd57faf02fb4fd23bb8265392b9c22e068907edjsollen@google.com
38dcdd57faf02fb4fd23bb8265392b9c22e068907edjsollen@google.comstruct WindowGlue {
39dcdd57faf02fb4fd23bb8265392b9c22e068907edjsollen@google.com    jweak m_obj;
40dcdd57faf02fb4fd23bb8265392b9c22e068907edjsollen@google.com    jmethodID m_inval;
41dcdd57faf02fb4fd23bb8265392b9c22e068907edjsollen@google.com    jmethodID m_queueSkEvent;
42dcdd57faf02fb4fd23bb8265392b9c22e068907edjsollen@google.com    jmethodID m_startTimer;
43a3b84d41efbbc5ab1e050a33d66dca4d1c44c9e3commit-bot@chromium.org    jmethodID m_getMSAASampleCount;
44dcdd57faf02fb4fd23bb8265392b9c22e068907edjsollen@google.com    WindowGlue() {
4596fcdcc219d2a0d3579719b84b28bede76efba64halcanary        m_obj = nullptr;
4696fcdcc219d2a0d3579719b84b28bede76efba64halcanary        m_inval = nullptr;
4796fcdcc219d2a0d3579719b84b28bede76efba64halcanary        m_queueSkEvent = nullptr;
4896fcdcc219d2a0d3579719b84b28bede76efba64halcanary        m_startTimer = nullptr;
4996fcdcc219d2a0d3579719b84b28bede76efba64halcanary        m_getMSAASampleCount = nullptr;
50dcdd57faf02fb4fd23bb8265392b9c22e068907edjsollen@google.com    }
51dcdd57faf02fb4fd23bb8265392b9c22e068907edjsollen@google.com} gWindowGlue;
52dcdd57faf02fb4fd23bb8265392b9c22e068907edjsollen@google.com
53dcdd57faf02fb4fd23bb8265392b9c22e068907edjsollen@google.comSampleWindow* gWindow;
54dcdd57faf02fb4fd23bb8265392b9c22e068907edjsollen@google.com
55dcdd57faf02fb4fd23bb8265392b9c22e068907edjsollen@google.com///////////////////////////////////////////
56dcdd57faf02fb4fd23bb8265392b9c22e068907edjsollen@google.com///////////// SkOSWindow impl /////////////
57dcdd57faf02fb4fd23bb8265392b9c22e068907edjsollen@google.com///////////////////////////////////////////
58dcdd57faf02fb4fd23bb8265392b9c22e068907edjsollen@google.com
59030dc847dc497b011c417dc6694e8b6de290895fjoshualittSkOSWindow::SkOSWindow(void*) : fDestroyRequested(false) {
60030dc847dc497b011c417dc6694e8b6de290895fjoshualitt}
61030dc847dc497b011c417dc6694e8b6de290895fjoshualitt
62030dc847dc497b011c417dc6694e8b6de290895fjoshualittSkOSWindow::~SkOSWindow() {
63030dc847dc497b011c417dc6694e8b6de290895fjoshualitt}
64030dc847dc497b011c417dc6694e8b6de290895fjoshualitt
65a3b84d41efbbc5ab1e050a33d66dca4d1c44c9e3commit-bot@chromium.orgbool SkOSWindow::attach(SkBackEndTypes /* attachType */, int /*msaaSampleCount*/, AttachmentInfo* info)
66a3b84d41efbbc5ab1e050a33d66dca4d1c44c9e3commit-bot@chromium.org{
67a3b84d41efbbc5ab1e050a33d66dca4d1c44c9e3commit-bot@chromium.org    JNIEnv* env = gActivityGlue.m_env;
68a3b84d41efbbc5ab1e050a33d66dca4d1c44c9e3commit-bot@chromium.org    if (!env || !gWindowGlue.m_getMSAASampleCount || !gWindowGlue.m_obj) {
69a3b84d41efbbc5ab1e050a33d66dca4d1c44c9e3commit-bot@chromium.org        return false;
70a3b84d41efbbc5ab1e050a33d66dca4d1c44c9e3commit-bot@chromium.org    }
7196fcdcc219d2a0d3579719b84b28bede76efba64halcanary    if (env->IsSameObject(gWindowGlue.m_obj, nullptr)) {
72a3b84d41efbbc5ab1e050a33d66dca4d1c44c9e3commit-bot@chromium.org        SkDebugf("ERROR: The JNI WeakRef to the Window is invalid");
73a3b84d41efbbc5ab1e050a33d66dca4d1c44c9e3commit-bot@chromium.org        return false;
74a3b84d41efbbc5ab1e050a33d66dca4d1c44c9e3commit-bot@chromium.org    }
75a3b84d41efbbc5ab1e050a33d66dca4d1c44c9e3commit-bot@chromium.org    info->fSampleCount = env->CallIntMethod(gWindowGlue.m_obj, gWindowGlue.m_getMSAASampleCount);
76a3b84d41efbbc5ab1e050a33d66dca4d1c44c9e3commit-bot@chromium.org
77a3b84d41efbbc5ab1e050a33d66dca4d1c44c9e3commit-bot@chromium.org    // This is the value requested in SkiaSampleView.java.
78a3b84d41efbbc5ab1e050a33d66dca4d1c44c9e3commit-bot@chromium.org    info->fStencilBits = 8;
79a3b84d41efbbc5ab1e050a33d66dca4d1c44c9e3commit-bot@chromium.org    return true;
80a3b84d41efbbc5ab1e050a33d66dca4d1c44c9e3commit-bot@chromium.org}
81a3b84d41efbbc5ab1e050a33d66dca4d1c44c9e3commit-bot@chromium.org
82030dc847dc497b011c417dc6694e8b6de290895fjoshualittvoid SkOSWindow::detach() {
83030dc847dc497b011c417dc6694e8b6de290895fjoshualitt}
84030dc847dc497b011c417dc6694e8b6de290895fjoshualitt
85030dc847dc497b011c417dc6694e8b6de290895fjoshualittvoid SkOSWindow::present() {
86030dc847dc497b011c417dc6694e8b6de290895fjoshualitt}
87030dc847dc497b011c417dc6694e8b6de290895fjoshualitt
88030dc847dc497b011c417dc6694e8b6de290895fjoshualittvoid SkOSWindow::closeWindow() {
89030dc847dc497b011c417dc6694e8b6de290895fjoshualitt}
90030dc847dc497b011c417dc6694e8b6de290895fjoshualitt
91030dc847dc497b011c417dc6694e8b6de290895fjoshualittvoid SkOSWindow::setVsync(bool) {
92030dc847dc497b011c417dc6694e8b6de290895fjoshualitt}
93030dc847dc497b011c417dc6694e8b6de290895fjoshualitt
94dcdd57faf02fb4fd23bb8265392b9c22e068907edjsollen@google.comvoid SkOSWindow::onSetTitle(const char title[])
95dcdd57faf02fb4fd23bb8265392b9c22e068907edjsollen@google.com{
96dcdd57faf02fb4fd23bb8265392b9c22e068907edjsollen@google.com    JNIEnv* env = gActivityGlue.m_env;
97dcdd57faf02fb4fd23bb8265392b9c22e068907edjsollen@google.com    if (!env) {
98dcdd57faf02fb4fd23bb8265392b9c22e068907edjsollen@google.com        return;
99dcdd57faf02fb4fd23bb8265392b9c22e068907edjsollen@google.com    }
10096fcdcc219d2a0d3579719b84b28bede76efba64halcanary    if (env->IsSameObject(gActivityGlue.m_obj, nullptr)) {
101dcdd57faf02fb4fd23bb8265392b9c22e068907edjsollen@google.com        SkDebugf("ERROR: The JNI WeakRef to the Activity is invalid");
102dcdd57faf02fb4fd23bb8265392b9c22e068907edjsollen@google.com        return;
103dcdd57faf02fb4fd23bb8265392b9c22e068907edjsollen@google.com    }
104dcdd57faf02fb4fd23bb8265392b9c22e068907edjsollen@google.com
105dcdd57faf02fb4fd23bb8265392b9c22e068907edjsollen@google.com    jstring string = env->NewStringUTF(title);
106dcdd57faf02fb4fd23bb8265392b9c22e068907edjsollen@google.com    env->CallVoidMethod(gActivityGlue.m_obj, gActivityGlue.m_setTitle, string);
107dcdd57faf02fb4fd23bb8265392b9c22e068907edjsollen@google.com    env->DeleteLocalRef(string);
108dcdd57faf02fb4fd23bb8265392b9c22e068907edjsollen@google.com}
109dcdd57faf02fb4fd23bb8265392b9c22e068907edjsollen@google.com
110dcdd57faf02fb4fd23bb8265392b9c22e068907edjsollen@google.comvoid SkOSWindow::onHandleInval(const SkIRect& rect)
111dcdd57faf02fb4fd23bb8265392b9c22e068907edjsollen@google.com{
112dcdd57faf02fb4fd23bb8265392b9c22e068907edjsollen@google.com    JNIEnv* env = gActivityGlue.m_env;
113dcdd57faf02fb4fd23bb8265392b9c22e068907edjsollen@google.com    if (!env || !gWindowGlue.m_inval || !gWindowGlue.m_obj) {
114dcdd57faf02fb4fd23bb8265392b9c22e068907edjsollen@google.com        return;
115dcdd57faf02fb4fd23bb8265392b9c22e068907edjsollen@google.com    }
11696fcdcc219d2a0d3579719b84b28bede76efba64halcanary    if (env->IsSameObject(gWindowGlue.m_obj, nullptr)) {
117dcdd57faf02fb4fd23bb8265392b9c22e068907edjsollen@google.com        SkDebugf("ERROR: The JNI WeakRef to the Window is invalid");
118dcdd57faf02fb4fd23bb8265392b9c22e068907edjsollen@google.com        return;
119dcdd57faf02fb4fd23bb8265392b9c22e068907edjsollen@google.com    }
120dcdd57faf02fb4fd23bb8265392b9c22e068907edjsollen@google.com    env->CallVoidMethod(gWindowGlue.m_obj, gWindowGlue.m_inval);
121dcdd57faf02fb4fd23bb8265392b9c22e068907edjsollen@google.com}
122dcdd57faf02fb4fd23bb8265392b9c22e068907edjsollen@google.com
123dcdd57faf02fb4fd23bb8265392b9c22e068907edjsollen@google.com///////////////////////////////////////////
124dcdd57faf02fb4fd23bb8265392b9c22e068907edjsollen@google.com/////////////// SkEvent impl //////////////
125dcdd57faf02fb4fd23bb8265392b9c22e068907edjsollen@google.com///////////////////////////////////////////
126dcdd57faf02fb4fd23bb8265392b9c22e068907edjsollen@google.com
127dcdd57faf02fb4fd23bb8265392b9c22e068907edjsollen@google.comvoid SkEvent::SignalQueueTimer(SkMSec ms)
128dcdd57faf02fb4fd23bb8265392b9c22e068907edjsollen@google.com{
129dcdd57faf02fb4fd23bb8265392b9c22e068907edjsollen@google.com    JNIEnv* env = gActivityGlue.m_env;
130dcdd57faf02fb4fd23bb8265392b9c22e068907edjsollen@google.com    if (!env || !gWindowGlue.m_startTimer || !gWindowGlue.m_obj || !ms) {
131dcdd57faf02fb4fd23bb8265392b9c22e068907edjsollen@google.com        return;
132dcdd57faf02fb4fd23bb8265392b9c22e068907edjsollen@google.com    }
13396fcdcc219d2a0d3579719b84b28bede76efba64halcanary    if (env->IsSameObject(gWindowGlue.m_obj, nullptr)) {
134dcdd57faf02fb4fd23bb8265392b9c22e068907edjsollen@google.com        SkDebugf("ERROR: The JNI WeakRef to the Window is invalid");
135dcdd57faf02fb4fd23bb8265392b9c22e068907edjsollen@google.com        return;
136dcdd57faf02fb4fd23bb8265392b9c22e068907edjsollen@google.com    }
137dcdd57faf02fb4fd23bb8265392b9c22e068907edjsollen@google.com    env->CallVoidMethod(gWindowGlue.m_obj,
138815211307368b82a8df503432221b80ab0a804c3skia.committer@gmail.com            gWindowGlue.m_startTimer, ms);
139dcdd57faf02fb4fd23bb8265392b9c22e068907edjsollen@google.com}
140dcdd57faf02fb4fd23bb8265392b9c22e068907edjsollen@google.com
141dcdd57faf02fb4fd23bb8265392b9c22e068907edjsollen@google.comvoid SkEvent::SignalNonEmptyQueue()
142dcdd57faf02fb4fd23bb8265392b9c22e068907edjsollen@google.com{
143dcdd57faf02fb4fd23bb8265392b9c22e068907edjsollen@google.com    JNIEnv* env = gActivityGlue.m_env;
144dcdd57faf02fb4fd23bb8265392b9c22e068907edjsollen@google.com    if (!env || !gWindowGlue.m_queueSkEvent || !gWindowGlue.m_obj) {
145dcdd57faf02fb4fd23bb8265392b9c22e068907edjsollen@google.com        return;
146dcdd57faf02fb4fd23bb8265392b9c22e068907edjsollen@google.com    }
14796fcdcc219d2a0d3579719b84b28bede76efba64halcanary    if (env->IsSameObject(gWindowGlue.m_obj, nullptr)) {
148dcdd57faf02fb4fd23bb8265392b9c22e068907edjsollen@google.com        SkDebugf("ERROR: The JNI WeakRef to the Window is invalid");
149dcdd57faf02fb4fd23bb8265392b9c22e068907edjsollen@google.com        return;
150dcdd57faf02fb4fd23bb8265392b9c22e068907edjsollen@google.com    }
151dcdd57faf02fb4fd23bb8265392b9c22e068907edjsollen@google.com    env->CallVoidMethod(gWindowGlue.m_obj, gWindowGlue.m_queueSkEvent);
152dcdd57faf02fb4fd23bb8265392b9c22e068907edjsollen@google.com}
153dcdd57faf02fb4fd23bb8265392b9c22e068907edjsollen@google.com
154dcdd57faf02fb4fd23bb8265392b9c22e068907edjsollen@google.com///////////////////////////////////////////
155dcdd57faf02fb4fd23bb8265392b9c22e068907edjsollen@google.com////////////////// JNI ////////////////////
156dcdd57faf02fb4fd23bb8265392b9c22e068907edjsollen@google.com///////////////////////////////////////////
157dcdd57faf02fb4fd23bb8265392b9c22e068907edjsollen@google.com
158dcdd57faf02fb4fd23bb8265392b9c22e068907edjsollen@google.comstatic jmethodID GetJMethod(JNIEnv* env, jclass clazz, const char name[],
159dcdd57faf02fb4fd23bb8265392b9c22e068907edjsollen@google.com        const char signature[])
160dcdd57faf02fb4fd23bb8265392b9c22e068907edjsollen@google.com{
161dcdd57faf02fb4fd23bb8265392b9c22e068907edjsollen@google.com    jmethodID m = env->GetMethodID(clazz, name, signature);
162dcdd57faf02fb4fd23bb8265392b9c22e068907edjsollen@google.com    if (!m) SkDebugf("Could not find Java method %s\n", name);
163dcdd57faf02fb4fd23bb8265392b9c22e068907edjsollen@google.com    return m;
164dcdd57faf02fb4fd23bb8265392b9c22e068907edjsollen@google.com}
165dcdd57faf02fb4fd23bb8265392b9c22e068907edjsollen@google.com
166dcdd57faf02fb4fd23bb8265392b9c22e068907edjsollen@google.comJNIEXPORT void JNICALL Java_com_skia_SkiaSampleRenderer_init(JNIEnv* env,
1677c722197b3e48d28cb063df0b67a0718d8899e58Derek Sollenberger        jobject thiz, jobject jsampleActivity, jstring cmdLineFlags, jint msaaSampleCount)
168dcdd57faf02fb4fd23bb8265392b9c22e068907edjsollen@google.com{
169815211307368b82a8df503432221b80ab0a804c3skia.committer@gmail.com    // setup jni hooks to the java activity
170dcdd57faf02fb4fd23bb8265392b9c22e068907edjsollen@google.com    gActivityGlue.m_env = env;
171dcdd57faf02fb4fd23bb8265392b9c22e068907edjsollen@google.com    jclass clazz = env->FindClass("com/skia/SkiaSampleActivity");
172dcdd57faf02fb4fd23bb8265392b9c22e068907edjsollen@google.com    gActivityGlue.m_obj = env->NewWeakGlobalRef(jsampleActivity);
173dcdd57faf02fb4fd23bb8265392b9c22e068907edjsollen@google.com    gActivityGlue.m_setTitle = GetJMethod(env, clazz, "setTitle", "(Ljava/lang/CharSequence;)V");
174dcdd57faf02fb4fd23bb8265392b9c22e068907edjsollen@google.com    gActivityGlue.m_setSlideList = GetJMethod(env, clazz, "setSlideList", "([Ljava/lang/String;)V");
175dcdd57faf02fb4fd23bb8265392b9c22e068907edjsollen@google.com    env->DeleteLocalRef(clazz);
176dcdd57faf02fb4fd23bb8265392b9c22e068907edjsollen@google.com
177dcdd57faf02fb4fd23bb8265392b9c22e068907edjsollen@google.com    // setup jni hooks to the java renderer
178dcdd57faf02fb4fd23bb8265392b9c22e068907edjsollen@google.com    clazz = env->FindClass("com/skia/SkiaSampleRenderer");
179dcdd57faf02fb4fd23bb8265392b9c22e068907edjsollen@google.com    gWindowGlue.m_obj = env->NewWeakGlobalRef(thiz);
180dcdd57faf02fb4fd23bb8265392b9c22e068907edjsollen@google.com    gWindowGlue.m_inval = GetJMethod(env, clazz, "requestRender", "()V");
181dcdd57faf02fb4fd23bb8265392b9c22e068907edjsollen@google.com    gWindowGlue.m_queueSkEvent = GetJMethod(env, clazz, "queueSkEvent", "()V");
182dcdd57faf02fb4fd23bb8265392b9c22e068907edjsollen@google.com    gWindowGlue.m_startTimer = GetJMethod(env, clazz, "startTimer", "(I)V");
183a3b84d41efbbc5ab1e050a33d66dca4d1c44c9e3commit-bot@chromium.org    gWindowGlue.m_getMSAASampleCount = GetJMethod(env, clazz, "getMSAASampleCount", "()I");
184dcdd57faf02fb4fd23bb8265392b9c22e068907edjsollen@google.com    env->DeleteLocalRef(clazz);
185dcdd57faf02fb4fd23bb8265392b9c22e068907edjsollen@google.com
186dcdd57faf02fb4fd23bb8265392b9c22e068907edjsollen@google.com    application_init();
187a3b84d41efbbc5ab1e050a33d66dca4d1c44c9e3commit-bot@chromium.org
1887c722197b3e48d28cb063df0b67a0718d8899e58Derek Sollenberger    const char* flags = env->GetStringUTFChars(cmdLineFlags, JNI_FALSE);
1897c722197b3e48d28cb063df0b67a0718d8899e58Derek Sollenberger    SkTArray<SkString> flagEntries;
1907c722197b3e48d28cb063df0b67a0718d8899e58Derek Sollenberger    SkStrSplit(flags, " ", &flagEntries);
191a3b84d41efbbc5ab1e050a33d66dca4d1c44c9e3commit-bot@chromium.org
1927c722197b3e48d28cb063df0b67a0718d8899e58Derek Sollenberger    SkTArray<const char*> args;
1937c722197b3e48d28cb063df0b67a0718d8899e58Derek Sollenberger    args.push_back("SampleApp");
1947c722197b3e48d28cb063df0b67a0718d8899e58Derek Sollenberger    for (int i = 0; i < flagEntries.count(); i++) {
1957c722197b3e48d28cb063df0b67a0718d8899e58Derek Sollenberger        SkDebugf(flagEntries[i].c_str());
1967c722197b3e48d28cb063df0b67a0718d8899e58Derek Sollenberger        args.push_back(flagEntries[i].c_str());
1977c722197b3e48d28cb063df0b67a0718d8899e58Derek Sollenberger    }
1984a8d622e1d40df1e9959fcb6169d579c5ecff7d8bungeman
199a3b84d41efbbc5ab1e050a33d66dca4d1c44c9e3commit-bot@chromium.org    SkString msaaSampleCountString;
200a3b84d41efbbc5ab1e050a33d66dca4d1c44c9e3commit-bot@chromium.org    if (msaaSampleCount > 0) {
201a3b84d41efbbc5ab1e050a33d66dca4d1c44c9e3commit-bot@chromium.org        args.push_back("--msaa");
202a3b84d41efbbc5ab1e050a33d66dca4d1c44c9e3commit-bot@chromium.org        msaaSampleCountString.appendS32(static_cast<uint32_t>(msaaSampleCount));
203a3b84d41efbbc5ab1e050a33d66dca4d1c44c9e3commit-bot@chromium.org        args.push_back(msaaSampleCountString.c_str());
204a3b84d41efbbc5ab1e050a33d66dca4d1c44c9e3commit-bot@chromium.org    }
205a3b84d41efbbc5ab1e050a33d66dca4d1c44c9e3commit-bot@chromium.org
2067c722197b3e48d28cb063df0b67a0718d8899e58Derek Sollenberger    if (gWindow) {
2077c722197b3e48d28cb063df0b67a0718d8899e58Derek Sollenberger        SkDebugf("The sample window already exists.");
2087c722197b3e48d28cb063df0b67a0718d8899e58Derek Sollenberger    } else {
20996fcdcc219d2a0d3579719b84b28bede76efba64halcanary        gWindow = new SampleWindow(nullptr, args.count(), const_cast<char**>(args.begin()), nullptr);
2107c722197b3e48d28cb063df0b67a0718d8899e58Derek Sollenberger    }
2117c722197b3e48d28cb063df0b67a0718d8899e58Derek Sollenberger
2127c722197b3e48d28cb063df0b67a0718d8899e58Derek Sollenberger    // cleanup the command line flags
2137c722197b3e48d28cb063df0b67a0718d8899e58Derek Sollenberger    env->ReleaseStringUTFChars(cmdLineFlags, flags);
214dcdd57faf02fb4fd23bb8265392b9c22e068907edjsollen@google.com
215dcdd57faf02fb4fd23bb8265392b9c22e068907edjsollen@google.com    // send the list of slides up to the activity
216dcdd57faf02fb4fd23bb8265392b9c22e068907edjsollen@google.com    const int slideCount = gWindow->sampleCount();
217dcdd57faf02fb4fd23bb8265392b9c22e068907edjsollen@google.com    jobjectArray slideList = env->NewObjectArray(slideCount, env->FindClass("java/lang/String"), env->NewStringUTF(""));
218dcdd57faf02fb4fd23bb8265392b9c22e068907edjsollen@google.com    for (int i = 0; i < slideCount; i++) {
219dcdd57faf02fb4fd23bb8265392b9c22e068907edjsollen@google.com        jstring slideTitle = env->NewStringUTF(gWindow->getSampleTitle(i).c_str());
220dcdd57faf02fb4fd23bb8265392b9c22e068907edjsollen@google.com        env->SetObjectArrayElement(slideList, i, slideTitle);
221dcdd57faf02fb4fd23bb8265392b9c22e068907edjsollen@google.com        env->DeleteLocalRef(slideTitle);
222dcdd57faf02fb4fd23bb8265392b9c22e068907edjsollen@google.com    }
223dcdd57faf02fb4fd23bb8265392b9c22e068907edjsollen@google.com    env->CallVoidMethod(gActivityGlue.m_obj, gActivityGlue.m_setSlideList, slideList);
224dcdd57faf02fb4fd23bb8265392b9c22e068907edjsollen@google.com    env->DeleteLocalRef(slideList);
225dcdd57faf02fb4fd23bb8265392b9c22e068907edjsollen@google.com}
226dcdd57faf02fb4fd23bb8265392b9c22e068907edjsollen@google.com
227dcdd57faf02fb4fd23bb8265392b9c22e068907edjsollen@google.comJNIEXPORT void JNICALL Java_com_skia_SkiaSampleRenderer_term(JNIEnv* env,
228dcdd57faf02fb4fd23bb8265392b9c22e068907edjsollen@google.com        jobject thiz)
229dcdd57faf02fb4fd23bb8265392b9c22e068907edjsollen@google.com{
230dcdd57faf02fb4fd23bb8265392b9c22e068907edjsollen@google.com    delete gWindow;
23196fcdcc219d2a0d3579719b84b28bede76efba64halcanary    gWindow = nullptr;
232dcdd57faf02fb4fd23bb8265392b9c22e068907edjsollen@google.com    application_term();
233dcdd57faf02fb4fd23bb8265392b9c22e068907edjsollen@google.com    if (gWindowGlue.m_obj) {
234dcdd57faf02fb4fd23bb8265392b9c22e068907edjsollen@google.com        env->DeleteWeakGlobalRef(gWindowGlue.m_obj);
23596fcdcc219d2a0d3579719b84b28bede76efba64halcanary        gWindowGlue.m_obj = nullptr;
236dcdd57faf02fb4fd23bb8265392b9c22e068907edjsollen@google.com    }
237dcdd57faf02fb4fd23bb8265392b9c22e068907edjsollen@google.com    if (gActivityGlue.m_obj) {
238dcdd57faf02fb4fd23bb8265392b9c22e068907edjsollen@google.com        env->DeleteWeakGlobalRef(gActivityGlue.m_obj);
23996fcdcc219d2a0d3579719b84b28bede76efba64halcanary        gActivityGlue.m_obj = nullptr;
240dcdd57faf02fb4fd23bb8265392b9c22e068907edjsollen@google.com    }
241dcdd57faf02fb4fd23bb8265392b9c22e068907edjsollen@google.com}
242dcdd57faf02fb4fd23bb8265392b9c22e068907edjsollen@google.com
243dcdd57faf02fb4fd23bb8265392b9c22e068907edjsollen@google.comJNIEXPORT void JNICALL Java_com_skia_SkiaSampleRenderer_draw(
244dcdd57faf02fb4fd23bb8265392b9c22e068907edjsollen@google.com        JNIEnv* env, jobject thiz)
245dcdd57faf02fb4fd23bb8265392b9c22e068907edjsollen@google.com{
246dcdd57faf02fb4fd23bb8265392b9c22e068907edjsollen@google.com    if (!gWindow) return;
24796fcdcc219d2a0d3579719b84b28bede76efba64halcanary    gWindow->update(nullptr);
248dcdd57faf02fb4fd23bb8265392b9c22e068907edjsollen@google.com}
249dcdd57faf02fb4fd23bb8265392b9c22e068907edjsollen@google.com
250dcdd57faf02fb4fd23bb8265392b9c22e068907edjsollen@google.comJNIEXPORT void JNICALL Java_com_skia_SkiaSampleRenderer_updateSize(JNIEnv* env,
251dcdd57faf02fb4fd23bb8265392b9c22e068907edjsollen@google.com        jobject thiz, jint w, jint h)
252dcdd57faf02fb4fd23bb8265392b9c22e068907edjsollen@google.com{
253dcdd57faf02fb4fd23bb8265392b9c22e068907edjsollen@google.com    gWindow->resize(w, h);
254dcdd57faf02fb4fd23bb8265392b9c22e068907edjsollen@google.com}
255dcdd57faf02fb4fd23bb8265392b9c22e068907edjsollen@google.com
256dcdd57faf02fb4fd23bb8265392b9c22e068907edjsollen@google.comJNIEXPORT void JNICALL Java_com_skia_SkiaSampleRenderer_handleClick(JNIEnv* env,
257dcdd57faf02fb4fd23bb8265392b9c22e068907edjsollen@google.com        jobject thiz, jint owner, jfloat x, jfloat y, jint jstate)
258dcdd57faf02fb4fd23bb8265392b9c22e068907edjsollen@google.com{
259dcdd57faf02fb4fd23bb8265392b9c22e068907edjsollen@google.com    SkView::Click::State state;
260dcdd57faf02fb4fd23bb8265392b9c22e068907edjsollen@google.com    switch(jstate) {
261dcdd57faf02fb4fd23bb8265392b9c22e068907edjsollen@google.com        case 0:     // MotionEvent.ACTION_DOWN
262dcdd57faf02fb4fd23bb8265392b9c22e068907edjsollen@google.com            state = SkView::Click::kDown_State;
263dcdd57faf02fb4fd23bb8265392b9c22e068907edjsollen@google.com            break;
264dcdd57faf02fb4fd23bb8265392b9c22e068907edjsollen@google.com        case 1:     // MotionEvent.ACTION_UP
265dcdd57faf02fb4fd23bb8265392b9c22e068907edjsollen@google.com        case 3:     // MotionEvent.ACTION_CANCEL
266dcdd57faf02fb4fd23bb8265392b9c22e068907edjsollen@google.com            state = SkView::Click::kUp_State;
267dcdd57faf02fb4fd23bb8265392b9c22e068907edjsollen@google.com            break;
268dcdd57faf02fb4fd23bb8265392b9c22e068907edjsollen@google.com        case 2:     // MotionEvent.ACTION_MOVE
269dcdd57faf02fb4fd23bb8265392b9c22e068907edjsollen@google.com            state = SkView::Click::kMoved_State;
270dcdd57faf02fb4fd23bb8265392b9c22e068907edjsollen@google.com            break;
271dcdd57faf02fb4fd23bb8265392b9c22e068907edjsollen@google.com        default:
272dcdd57faf02fb4fd23bb8265392b9c22e068907edjsollen@google.com            SkDebugf("motion event ignored\n");
273dcdd57faf02fb4fd23bb8265392b9c22e068907edjsollen@google.com            return;
274dcdd57faf02fb4fd23bb8265392b9c22e068907edjsollen@google.com    }
275d202528f488a87ccff28732e0bea54dfd73bc854commit-bot@chromium.org    gWindow->handleClick(x, y, state, reinterpret_cast<void*>(owner));
276dcdd57faf02fb4fd23bb8265392b9c22e068907edjsollen@google.com}
277dcdd57faf02fb4fd23bb8265392b9c22e068907edjsollen@google.com
278dcdd57faf02fb4fd23bb8265392b9c22e068907edjsollen@google.comJNIEXPORT void JNICALL Java_com_skia_SkiaSampleRenderer_nextSample(
279dcdd57faf02fb4fd23bb8265392b9c22e068907edjsollen@google.com        JNIEnv* env, jobject thiz)
280dcdd57faf02fb4fd23bb8265392b9c22e068907edjsollen@google.com{
281815211307368b82a8df503432221b80ab0a804c3skia.committer@gmail.com    gWindow->nextSample();
282dcdd57faf02fb4fd23bb8265392b9c22e068907edjsollen@google.com}
283dcdd57faf02fb4fd23bb8265392b9c22e068907edjsollen@google.com
284dcdd57faf02fb4fd23bb8265392b9c22e068907edjsollen@google.comJNIEXPORT void JNICALL Java_com_skia_SkiaSampleRenderer_previousSample(
285dcdd57faf02fb4fd23bb8265392b9c22e068907edjsollen@google.com        JNIEnv* env, jobject thiz)
286dcdd57faf02fb4fd23bb8265392b9c22e068907edjsollen@google.com{
287815211307368b82a8df503432221b80ab0a804c3skia.committer@gmail.com    gWindow->previousSample();
288dcdd57faf02fb4fd23bb8265392b9c22e068907edjsollen@google.com}
289dcdd57faf02fb4fd23bb8265392b9c22e068907edjsollen@google.com
290dcdd57faf02fb4fd23bb8265392b9c22e068907edjsollen@google.comJNIEXPORT void JNICALL Java_com_skia_SkiaSampleRenderer_goToSample(
291dcdd57faf02fb4fd23bb8265392b9c22e068907edjsollen@google.com        JNIEnv* env, jobject thiz, jint position)
292dcdd57faf02fb4fd23bb8265392b9c22e068907edjsollen@google.com{
293815211307368b82a8df503432221b80ab0a804c3skia.committer@gmail.com    gWindow->goToSample(position);
294dcdd57faf02fb4fd23bb8265392b9c22e068907edjsollen@google.com}
295dcdd57faf02fb4fd23bb8265392b9c22e068907edjsollen@google.com
296dcdd57faf02fb4fd23bb8265392b9c22e068907edjsollen@google.comJNIEXPORT void JNICALL Java_com_skia_SkiaSampleRenderer_toggleRenderingMode(
297dcdd57faf02fb4fd23bb8265392b9c22e068907edjsollen@google.com        JNIEnv* env, jobject thiz)
298dcdd57faf02fb4fd23bb8265392b9c22e068907edjsollen@google.com{
299dcdd57faf02fb4fd23bb8265392b9c22e068907edjsollen@google.com    gWindow->toggleRendering();
300dcdd57faf02fb4fd23bb8265392b9c22e068907edjsollen@google.com}
301dcdd57faf02fb4fd23bb8265392b9c22e068907edjsollen@google.com
302dcdd57faf02fb4fd23bb8265392b9c22e068907edjsollen@google.comJNIEXPORT void JNICALL Java_com_skia_SkiaSampleRenderer_showOverview(
303dcdd57faf02fb4fd23bb8265392b9c22e068907edjsollen@google.com        JNIEnv* env, jobject thiz)
304dcdd57faf02fb4fd23bb8265392b9c22e068907edjsollen@google.com{
305dcdd57faf02fb4fd23bb8265392b9c22e068907edjsollen@google.com    gWindow->showOverview();
306dcdd57faf02fb4fd23bb8265392b9c22e068907edjsollen@google.com}
307dcdd57faf02fb4fd23bb8265392b9c22e068907edjsollen@google.com
308dcdd57faf02fb4fd23bb8265392b9c22e068907edjsollen@google.comJNIEXPORT void JNICALL Java_com_skia_SkiaSampleRenderer_toggleSlideshow(
309dcdd57faf02fb4fd23bb8265392b9c22e068907edjsollen@google.com        JNIEnv* env, jobject thiz)
310dcdd57faf02fb4fd23bb8265392b9c22e068907edjsollen@google.com{
311dcdd57faf02fb4fd23bb8265392b9c22e068907edjsollen@google.com    gWindow->toggleSlideshow();
312dcdd57faf02fb4fd23bb8265392b9c22e068907edjsollen@google.com}
313dcdd57faf02fb4fd23bb8265392b9c22e068907edjsollen@google.com
314dcdd57faf02fb4fd23bb8265392b9c22e068907edjsollen@google.comJNIEXPORT void JNICALL Java_com_skia_SkiaSampleRenderer_toggleFPS(
315dcdd57faf02fb4fd23bb8265392b9c22e068907edjsollen@google.com        JNIEnv* env, jobject thiz)
316dcdd57faf02fb4fd23bb8265392b9c22e068907edjsollen@google.com{
317dcdd57faf02fb4fd23bb8265392b9c22e068907edjsollen@google.com    gWindow->toggleFPS();
318dcdd57faf02fb4fd23bb8265392b9c22e068907edjsollen@google.com}
319dcdd57faf02fb4fd23bb8265392b9c22e068907edjsollen@google.com
320dcdd57faf02fb4fd23bb8265392b9c22e068907edjsollen@google.comJNIEXPORT void JNICALL Java_com_skia_SkiaSampleRenderer_toggleTiling(
321dcdd57faf02fb4fd23bb8265392b9c22e068907edjsollen@google.com        JNIEnv* env, jobject thiz)
322dcdd57faf02fb4fd23bb8265392b9c22e068907edjsollen@google.com{
323dcdd57faf02fb4fd23bb8265392b9c22e068907edjsollen@google.com    gWindow->handleChar('t');
324dcdd57faf02fb4fd23bb8265392b9c22e068907edjsollen@google.com}
325dcdd57faf02fb4fd23bb8265392b9c22e068907edjsollen@google.com
326dcdd57faf02fb4fd23bb8265392b9c22e068907edjsollen@google.comJNIEXPORT void JNICALL Java_com_skia_SkiaSampleRenderer_toggleBBox(
327dcdd57faf02fb4fd23bb8265392b9c22e068907edjsollen@google.com        JNIEnv* env, jobject thiz)
328dcdd57faf02fb4fd23bb8265392b9c22e068907edjsollen@google.com{
329dcdd57faf02fb4fd23bb8265392b9c22e068907edjsollen@google.com    gWindow->handleChar('b');
330dcdd57faf02fb4fd23bb8265392b9c22e068907edjsollen@google.com}
331dcdd57faf02fb4fd23bb8265392b9c22e068907edjsollen@google.com
332dcdd57faf02fb4fd23bb8265392b9c22e068907edjsollen@google.comJNIEXPORT void JNICALL Java_com_skia_SkiaSampleRenderer_processSkEvent(
333dcdd57faf02fb4fd23bb8265392b9c22e068907edjsollen@google.com        JNIEnv* env, jobject thiz)
334dcdd57faf02fb4fd23bb8265392b9c22e068907edjsollen@google.com{
335dcdd57faf02fb4fd23bb8265392b9c22e068907edjsollen@google.com    if (SkEvent::ProcessEvent()) {
336dcdd57faf02fb4fd23bb8265392b9c22e068907edjsollen@google.com        SkEvent::SignalNonEmptyQueue();
337dcdd57faf02fb4fd23bb8265392b9c22e068907edjsollen@google.com    }
338dcdd57faf02fb4fd23bb8265392b9c22e068907edjsollen@google.com}
339dcdd57faf02fb4fd23bb8265392b9c22e068907edjsollen@google.com
340dcdd57faf02fb4fd23bb8265392b9c22e068907edjsollen@google.comJNIEXPORT void JNICALL Java_com_skia_SkiaSampleRenderer_serviceQueueTimer(
341dcdd57faf02fb4fd23bb8265392b9c22e068907edjsollen@google.com        JNIEnv* env, jobject thiz)
342dcdd57faf02fb4fd23bb8265392b9c22e068907edjsollen@google.com{
343dcdd57faf02fb4fd23bb8265392b9c22e068907edjsollen@google.com    SkEvent::ServiceQueueTimer();
344dcdd57faf02fb4fd23bb8265392b9c22e068907edjsollen@google.com}
345dcdd57faf02fb4fd23bb8265392b9c22e068907edjsollen@google.com
346dcdd57faf02fb4fd23bb8265392b9c22e068907edjsollen@google.comJNIEXPORT void JNICALL Java_com_skia_SkiaSampleRenderer_saveToPDF(
347dcdd57faf02fb4fd23bb8265392b9c22e068907edjsollen@google.com        JNIEnv* env, jobject thiz)
348dcdd57faf02fb4fd23bb8265392b9c22e068907edjsollen@google.com{
349dcdd57faf02fb4fd23bb8265392b9c22e068907edjsollen@google.com    gWindow->saveToPdf();
350dcdd57faf02fb4fd23bb8265392b9c22e068907edjsollen@google.com}
351dcdd57faf02fb4fd23bb8265392b9c22e068907edjsollen@google.com
352dcdd57faf02fb4fd23bb8265392b9c22e068907edjsollen@google.comJNIEXPORT void JNICALL Java_com_skia_SkiaSampleRenderer_postInval(
353dcdd57faf02fb4fd23bb8265392b9c22e068907edjsollen@google.com        JNIEnv* env, jobject thiz)
354dcdd57faf02fb4fd23bb8265392b9c22e068907edjsollen@google.com{
355815211307368b82a8df503432221b80ab0a804c3skia.committer@gmail.com    gWindow->postInvalDelay();
356dcdd57faf02fb4fd23bb8265392b9c22e068907edjsollen@google.com}
357