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 "Window.h"
9
10 #include "SkSurface.h"
11 #include "SkCanvas.h"
12 #include "WindowContext.h"
13
14 namespace sk_app {
15
default_backend_created_func(void * userData)16 static void default_backend_created_func(void* userData) {}
17
default_char_func(SkUnichar c,uint32_t modifiers,void * userData)18 static bool default_char_func(SkUnichar c, uint32_t modifiers, void* userData) {
19 return false;
20 }
21
default_key_func(Window::Key key,Window::InputState state,uint32_t modifiers,void * userData)22 static bool default_key_func(Window::Key key, Window::InputState state, uint32_t modifiers,
23 void* userData) {
24 return false;
25 }
26
default_mouse_func(int x,int y,Window::InputState state,uint32_t modifiers,void * userData)27 static bool default_mouse_func(int x, int y, Window::InputState state, uint32_t modifiers,
28 void* userData) {
29 return false;
30 }
31
default_mouse_wheel_func(float delta,uint32_t modifiers,void * userData)32 static bool default_mouse_wheel_func(float delta, uint32_t modifiers, void* userData) {
33 return false;
34 }
35
default_touch_func(intptr_t owner,Window::InputState state,float x,float y,void * userData)36 static bool default_touch_func(intptr_t owner, Window::InputState state, float x, float y,
37 void* userData) {
38 return false;
39 }
40
default_ui_state_changed_func(const SkString & stateName,const SkString & stateValue,void * userData)41 static void default_ui_state_changed_func(
42 const SkString& stateName, const SkString& stateValue, void* userData) {}
43
default_paint_func(SkCanvas *,void * userData)44 static void default_paint_func(SkCanvas*, void* userData) {}
45
Window()46 Window::Window() : fBackendCreatedFunc(default_backend_created_func)
47 , fCharFunc(default_char_func)
48 , fKeyFunc(default_key_func)
49 , fMouseFunc(default_mouse_func)
50 , fMouseWheelFunc(default_mouse_wheel_func)
51 , fTouchFunc(default_touch_func)
52 , fUIStateChangedFunc(default_ui_state_changed_func)
53 , fPaintFunc(default_paint_func) {
54 }
55
detach()56 void Window::detach() {
57 delete fWindowContext;
58 fWindowContext = nullptr;
59 }
60
onBackendCreated()61 void Window::onBackendCreated() {
62 fBackendCreatedFunc(fBackendCreatedUserData);
63 }
64
onChar(SkUnichar c,uint32_t modifiers)65 bool Window::onChar(SkUnichar c, uint32_t modifiers) {
66 return fCharFunc(c, modifiers, fCharUserData);
67 }
68
onKey(Key key,InputState state,uint32_t modifiers)69 bool Window::onKey(Key key, InputState state, uint32_t modifiers) {
70 return fKeyFunc(key, state, modifiers, fKeyUserData);
71 }
72
onMouse(int x,int y,InputState state,uint32_t modifiers)73 bool Window::onMouse(int x, int y, InputState state, uint32_t modifiers) {
74 return fMouseFunc(x, y, state, modifiers, fMouseUserData);
75 }
76
onMouseWheel(float delta,uint32_t modifiers)77 bool Window::onMouseWheel(float delta, uint32_t modifiers) {
78 return fMouseWheelFunc(delta, modifiers, fMouseWheelUserData);
79 }
80
onTouch(intptr_t owner,InputState state,float x,float y)81 bool Window::onTouch(intptr_t owner, InputState state, float x, float y) {
82 return fTouchFunc(owner, state, x, y, fTouchUserData);
83 }
84
onUIStateChanged(const SkString & stateName,const SkString & stateValue)85 void Window::onUIStateChanged(const SkString& stateName, const SkString& stateValue) {
86 return fUIStateChangedFunc(stateName, stateValue, fUIStateChangedUserData);
87 }
88
onPaint()89 void Window::onPaint() {
90 if (!fWindowContext) {
91 return;
92 }
93 markInvalProcessed();
94 sk_sp<SkSurface> backbuffer = fWindowContext->getBackbufferSurface();
95 if (backbuffer) {
96 // draw into the canvas of this surface
97 SkCanvas* canvas = backbuffer->getCanvas();
98
99 fPaintFunc(canvas, fPaintUserData);
100
101 canvas->flush();
102
103 fWindowContext->swapBuffers();
104 } else {
105 printf("no backbuffer!?\n");
106 // try recreating testcontext
107 }
108 }
109
onResize(int w,int h)110 void Window::onResize(int w, int h) {
111 if (!fWindowContext) {
112 return;
113 }
114 fWindowContext->resize(w, h);
115 }
116
width()117 int Window::width() {
118 if (!fWindowContext) {
119 return 0;
120 }
121 return fWindowContext->width();
122 }
123
height()124 int Window::height() {
125 if (!fWindowContext) {
126 return 0;
127 }
128 return fWindowContext->height();
129 }
130
setRequestedDisplayParams(const DisplayParams & params,bool)131 void Window::setRequestedDisplayParams(const DisplayParams& params, bool /* allowReattach */) {
132 fRequestedDisplayParams = params;
133 if (fWindowContext) {
134 fWindowContext->setDisplayParams(fRequestedDisplayParams);
135 }
136 }
137
sampleCount() const138 int Window::sampleCount() const {
139 if (!fWindowContext) {
140 return -1;
141 }
142 return fWindowContext->sampleCount();
143 }
144
stencilBits() const145 int Window::stencilBits() const {
146 if (!fWindowContext) {
147 return -1;
148 }
149 return fWindowContext->stencilBits();
150 }
151
getGrContext() const152 const GrContext* Window::getGrContext() const {
153 if (!fWindowContext) {
154 return nullptr;
155 }
156 return fWindowContext->getGrContext();
157 }
158
inval()159 void Window::inval() {
160 if (!fWindowContext) {
161 return;
162 }
163 if (!fIsContentInvalidated) {
164 fIsContentInvalidated = true;
165 onInval();
166 }
167 }
168
markInvalProcessed()169 void Window::markInvalProcessed() {
170 fIsContentInvalidated = false;
171 }
172
173 } // namespace sk_app
174