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