Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(22)

Side by Side Diff: tools/viewer/sk_app/android/surface_glue_android.cpp

Issue 2031383002: Allow animation in Android viewer (Closed) Base URL: https://skia.googlesource.com/skia.git@master
Patch Set: Revision Created 4 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « no previous file | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 /* 1 /*
2 * Copyright 2016 Google Inc. 2 * Copyright 2016 Google Inc.
3 * 3 *
4 * Use of this source code is governed by a BSD-style license that can be 4 * Use of this source code is governed by a BSD-style license that can be
5 * found in the LICENSE file. 5 * found in the LICENSE file.
6 */ 6 */
7 7
8 #include "surface_glue_android.h" 8 #include "surface_glue_android.h"
9 9
10 #include <jni.h> 10 #include <jni.h>
11 #include <pthread.h> 11 #include <pthread.h>
12 #include <stdio.h> 12 #include <stdio.h>
13 #include <unistd.h> 13 #include <unistd.h>
14 #include <unordered_map> 14 #include <unordered_map>
15 15
16 #include <android/input.h> 16 #include <android/input.h>
17 #include <android/keycodes.h> 17 #include <android/keycodes.h>
18 #include <android/looper.h> 18 #include <android/looper.h>
19 #include <android/native_window_jni.h> 19 #include <android/native_window_jni.h>
20 20
21 #include "../Application.h" 21 #include "../Application.h"
22 #include "SkTypes.h" 22 #include "SkTypes.h"
23 #include "SkUtils.h" 23 #include "SkUtils.h"
24 #include "Window_android.h" 24 #include "Window_android.h"
25 #include "SkTime.h"
25 26
26 namespace sk_app { 27 namespace sk_app {
27 28
28 static const int LOOPER_ID_MESSAGEPIPE = 1; 29 static const int LOOPER_ID_MESSAGEPIPE = 1;
29 30
30 static const std::unordered_map<int, Window::Key> ANDROID_TO_WINDOW_KEYMAP({ 31 static const std::unordered_map<int, Window::Key> ANDROID_TO_WINDOW_KEYMAP({
31 {AKEYCODE_SOFT_LEFT, Window::Key::kLeft}, 32 {AKEYCODE_SOFT_LEFT, Window::Key::kLeft},
32 {AKEYCODE_SOFT_RIGHT, Window::Key::kRight} 33 {AKEYCODE_SOFT_RIGHT, Window::Key::kRight}
33 }); 34 });
34 35
(...skipping 118 matching lines...) Expand 10 before | Expand all | Expand 10 after
153 break; 154 break;
154 } 155 }
155 default: { 156 default: {
156 // do nothing 157 // do nothing
157 } 158 }
158 } 159 }
159 160
160 return 1; // continue receiving callbacks 161 return 1; // continue receiving callbacks
161 } 162 }
162 163
164 static double now_ms() { return SkTime::GetMSecs(); }
165
163 void* SkiaAndroidApp::pthread_main(void* arg) { 166 void* SkiaAndroidApp::pthread_main(void* arg) {
164 SkDebugf("pthread_main begins"); 167 SkDebugf("pthread_main begins");
165 168
166 auto skiaAndroidApp = (SkiaAndroidApp*)arg; 169 auto skiaAndroidApp = (SkiaAndroidApp*)arg;
167 170
168 // Because JNIEnv is thread sensitive, we need AttachCurrentThread to set ou r fPThreadEnv 171 // Because JNIEnv is thread sensitive, we need AttachCurrentThread to set ou r fPThreadEnv
169 skiaAndroidApp->fJavaVM->AttachCurrentThread(&(skiaAndroidApp->fPThreadEnv), nullptr); 172 skiaAndroidApp->fJavaVM->AttachCurrentThread(&(skiaAndroidApp->fPThreadEnv), nullptr);
170 173
171 ALooper* looper = ALooper_prepare(ALOOPER_PREPARE_ALLOW_NON_CALLBACKS); 174 ALooper* looper = ALooper_prepare(ALOOPER_PREPARE_ALLOW_NON_CALLBACKS);
172 pipe(skiaAndroidApp->fPipes); 175 pipe(skiaAndroidApp->fPipes);
173 ALooper_addFd(looper, skiaAndroidApp->fPipes[0], LOOPER_ID_MESSAGEPIPE, ALOO PER_EVENT_INPUT, 176 ALooper_addFd(looper, skiaAndroidApp->fPipes[0], LOOPER_ID_MESSAGEPIPE, ALOO PER_EVENT_INPUT,
174 message_callback, skiaAndroidApp); 177 message_callback, skiaAndroidApp);
175 178
176 int ident;
177 int events;
178 struct android_poll_source* source;
179
180 skiaAndroidApp->fApp = Application::Create(0, nullptr, skiaAndroidApp); 179 skiaAndroidApp->fApp = Application::Create(0, nullptr, skiaAndroidApp);
181 180
182 while ((ident = ALooper_pollAll(-1, nullptr, &events, (void**)&source)) >= 0 ) { 181 double currentTime = 0.0;
183 SkDebugf("ALooper_pollAll ident=%d", ident); 182 double previousTime = 0.0;
183 while (true) {
184 const int ident = ALooper_pollAll(0, nullptr, nullptr, nullptr);
jvanverth1 2016/06/06 14:18:11 I'm surprised a timeout of 0 doesn't cause a busy
liyuqian 2016/06/06 14:30:46 I checked the CPU usage on Android and it indeed d
185
186 if (ident >= 0) {
187 SkDebugf("Unhandled ALooper_pollAll ident=%d !", ident);
188 } else {
189 previousTime = currentTime;
190 currentTime = now_ms();
191 skiaAndroidApp->fApp->onIdle(currentTime - previousTime);
192 }
184 } 193 }
185 194
195 SkDebugf("pthread_main ends");
196
186 return nullptr; 197 return nullptr;
187 } 198 }
188 199
189 extern "C" // extern "C" is needed for JNI (although the method itself is in C+ +) 200 extern "C" // extern "C" is needed for JNI (although the method itself is in C+ +)
190 JNIEXPORT jlong JNICALL 201 JNIEXPORT jlong JNICALL
191 Java_org_skia_viewer_ViewerApplication_createNativeApp(JNIEnv* env, jobject application) { 202 Java_org_skia_viewer_ViewerApplication_createNativeApp(JNIEnv* env, jobject application) {
192 SkiaAndroidApp* skiaAndroidApp = new SkiaAndroidApp(env, application); 203 SkiaAndroidApp* skiaAndroidApp = new SkiaAndroidApp(env, application);
193 return (jlong)((size_t)skiaAndroidApp); 204 return (jlong)((size_t)skiaAndroidApp);
194 } 205 }
195 206
(...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after
249 const char* nameChars = env->GetStringUTFChars(stateName, nullptr); 260 const char* nameChars = env->GetStringUTFChars(stateName, nullptr);
250 const char* valueChars = env->GetStringUTFChars(stateValue, nullptr); 261 const char* valueChars = env->GetStringUTFChars(stateValue, nullptr);
251 message.stateName = new SkString(nameChars); 262 message.stateName = new SkString(nameChars);
252 message.stateValue = new SkString(valueChars); 263 message.stateValue = new SkString(valueChars);
253 skiaAndroidApp->postMessage(message); 264 skiaAndroidApp->postMessage(message);
254 env->ReleaseStringUTFChars(stateName, nameChars); 265 env->ReleaseStringUTFChars(stateName, nameChars);
255 env->ReleaseStringUTFChars(stateValue, valueChars); 266 env->ReleaseStringUTFChars(stateValue, valueChars);
256 } 267 }
257 268
258 } // namespace sk_app 269 } // namespace sk_app
OLDNEW
« no previous file with comments | « no previous file | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698