xref: /aosp_15_r20/external/skia/tools/sk_app/android/Window_android.cpp (revision c8dee2aa9b3f27cf6c858bd81872bdeb2c07ed17)
1 /*
2 * Copyright 2016 Google Inc.
3 *
4 * Use of this source code is governed by a BSD-style license that can be
5 * found in the LICENSE file.
6 */
7 
8 #include "tools/sk_app/android/Window_android.h"
9 
10 #include "tools/window/DisplayParams.h"
11 #include "tools/window/WindowContext.h"
12 #include "tools/window/android/WindowContextFactory_android.h"
13 
14 using skwindow::DisplayParams;
15 
16 namespace sk_app {
17 
CreateNativeWindow(void * platformData)18 Window* Windows::CreateNativeWindow(void* platformData) {
19     Window_android* window = new Window_android();
20     if (!window->init((SkiaAndroidApp*)platformData)) {
21         delete window;
22         return nullptr;
23     }
24     return window;
25 }
26 
init(SkiaAndroidApp * skiaAndroidApp)27 bool Window_android::init(SkiaAndroidApp* skiaAndroidApp) {
28     SkASSERT(skiaAndroidApp);
29     fSkiaAndroidApp = skiaAndroidApp;
30     fSkiaAndroidApp->fWindow = this;
31     return true;
32 }
33 
setTitle(const char * title)34 void Window_android::setTitle(const char* title) {
35     fSkiaAndroidApp->setTitle(title);
36 }
37 
setUIState(const char * state)38 void Window_android::setUIState(const char* state) {
39     fSkiaAndroidApp->setUIState(state);
40 }
41 
attach(BackendType attachType)42 bool Window_android::attach(BackendType attachType) {
43     fBackendType = attachType;
44 
45     // We delay the creation of fWindowContext until Android informs us that
46     // the native window is ready to use.
47     // The creation will be done in initDisplay, which is initiated by kSurfaceCreated event.
48     return true;
49 }
50 
initDisplay(ANativeWindow * window)51 void Window_android::initDisplay(ANativeWindow* window) {
52     SkASSERT(window);
53     switch (fBackendType) {
54 #ifdef SK_GL
55         case kNativeGL_BackendType:
56         default:
57             fWindowContext = skwindow::MakeGLForAndroid(window, fRequestedDisplayParams->clone());
58             break;
59 #else
60         default:
61 #endif
62         case kRaster_BackendType:
63             fWindowContext =
64                     skwindow::MakeRasterForAndroid(window, fRequestedDisplayParams->clone());
65             break;
66 #ifdef SK_VULKAN
67         case kVulkan_BackendType:
68             fWindowContext =
69                     skwindow::MakeVulkanForAndroid(window, fRequestedDisplayParams->clone());
70             break;
71 #if defined(SK_GRAPHITE)
72         case kGraphiteVulkan_BackendType:
73             fWindowContext = skwindow::MakeGraphiteVulkanForAndroid(
74                     window, fRequestedDisplayParams->clone());
75             break;
76 #endif
77 #endif
78     }
79     this->onBackendCreated();
80 }
81 
onDisplayDestroyed()82 void Window_android::onDisplayDestroyed() {
83     detach();
84 }
85 
onInval()86 void Window_android::onInval() {
87     fSkiaAndroidApp->postMessage(Message(kContentInvalidated));
88 }
89 
paintIfNeeded()90 void Window_android::paintIfNeeded() {
91     if (fWindowContext) { // Check if initDisplay has already been called
92         onPaint();
93     } else {
94         markInvalProcessed();
95     }
96 }
97 
98 }   // namespace sk_app
99