blob: d528c12dc581309c46043705087e9d5b83ffecb9 [file] [log] [blame]
Ben Wagnerb2c4ea62018-08-08 11:36:17 -04001/*
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
Mike Kleinc0bd9f92019-04-23 12:05:21 -05008#include "include/core/SkCanvas.h"
9#include "include/core/SkString.h"
10#include "samplecode/Sample.h"
Ben Wagnerb2c4ea62018-08-08 11:36:17 -040011
12#if SK_SUPPORT_GPU
Mike Kleinc0bd9f92019-04-23 12:05:21 -050013# include "include/gpu/GrContext.h"
Ben Wagnerb2c4ea62018-08-08 11:36:17 -040014#else
15class GrContext;
16#endif
17
18//////////////////////////////////////////////////////////////////////////////
19
20Sample::Event::Event() : Event("") {}
21
22Sample::Event::Event(const Event& that) {
23 *this = that;
24}
25
26Sample::Event::Event(const char type[]) : fType(type), f32(0) {
27 SkASSERT(type);
28}
29
30Sample::Event::~Event() {}
31
32bool Sample::Event::isType(const char type[]) const {
33 return fType.equals(type);
34}
35
36const char* Sample::kCharEvtName = "SampleCode_Char_Event";
Ben Wagnerb2c4ea62018-08-08 11:36:17 -040037
38bool Sample::CharQ(const Event& evt, SkUnichar* outUni) {
39 if (evt.isType(kCharEvtName)) {
40 if (outUni) {
41 *outUni = evt.getFast32();
42 }
43 return true;
44 }
45 return false;
46}
47
Ben Wagnerb2c4ea62018-08-08 11:36:17 -040048///////////////////////////////////////////////////////////////////////////////
49
50bool Sample::doEvent(const Event& evt) {
51 return this->onEvent(evt);
52}
53
54bool Sample::onEvent(const Event&) {
55 return false;
56}
57
58bool Sample::doQuery(Event* evt) {
59 SkASSERT(evt);
60 return this->onQuery(evt);
61}
62
63bool Sample::onQuery(Sample::Event* evt) {
64 return false;
65}
66
67////////////////////////////////////////////////////////////////////////
68
69
70void Sample::setSize(SkScalar width, SkScalar height) {
71 width = SkMaxScalar(0, width);
72 height = SkMaxScalar(0, height);
73
74 if (fWidth != width || fHeight != height)
75 {
76 fWidth = width;
77 fHeight = height;
78 this->onSizeChange();
79 }
80}
81
82void Sample::draw(SkCanvas* canvas) {
83 if (fWidth && fHeight) {
84 SkRect r;
85 r.set(0, 0, fWidth, fHeight);
86 if (canvas->quickReject(r)) {
87 return;
88 }
89
90 SkAutoCanvasRestore as(canvas, true);
91 int sc = canvas->save();
92
93 if (!fHaveCalledOnceBeforeDraw) {
94 fHaveCalledOnceBeforeDraw = true;
95 this->onOnceBeforeDraw();
96 }
97 this->onDrawBackground(canvas);
98
99 SkAutoCanvasRestore acr(canvas, true);
100 this->onDrawContent(canvas);
101#if SK_SUPPORT_GPU
102 // Ensure the GrContext doesn't combine GrDrawOps across draw loops.
103 if (GrContext* context = canvas->getGrContext()) {
104 context->flush();
105 }
106#endif
107
108 canvas->restoreToCount(sc);
109 }
110}
111
112////////////////////////////////////////////////////////////////////////////
113
114Sample::Click::Click(Sample* target) {
115 SkASSERT(target);
116 fTarget = sk_ref_sp(target);
117}
118
119Sample::Click::~Click() {}
120
121Sample::Click* Sample::findClickHandler(SkScalar x, SkScalar y, unsigned modi) {
122 if (x < 0 || y < 0 || x >= fWidth || y >= fHeight) {
123 return nullptr;
124 }
125
126 return this->onFindClickHandler(x, y, modi);
127}
128
129void Sample::DoClickDown(Click* click, int x, int y, unsigned modi) {
130 SkASSERT(click);
131
132 Sample* target = click->fTarget.get();
133 if (nullptr == target) {
134 return;
135 }
136
137 click->fIOrig.set(x, y);
138 click->fICurr = click->fIPrev = click->fIOrig;
139
140 click->fOrig.iset(x, y);
141 click->fPrev = click->fCurr = click->fOrig;
142
143 click->fState = Click::kDown_State;
144 click->fModifierKeys = modi;
145 target->onClick(click);
146}
147
148void Sample::DoClickMoved(Click* click, int x, int y, unsigned modi) {
149 SkASSERT(click);
150
151 Sample* target = click->fTarget.get();
152 if (nullptr == target) {
153 return;
154 }
155
156 click->fIPrev = click->fICurr;
157 click->fICurr.set(x, y);
158
159 click->fPrev = click->fCurr;
160 click->fCurr.iset(x, y);
161
162 click->fState = Click::kMoved_State;
163 click->fModifierKeys = modi;
164 target->onClick(click);
165}
166
167void Sample::DoClickUp(Click* click, int x, int y, unsigned modi) {
168 SkASSERT(click);
169
170 Sample* target = click->fTarget.get();
171 if (nullptr == target) {
172 return;
173 }
174
175 click->fIPrev = click->fICurr;
176 click->fICurr.set(x, y);
177
178 click->fPrev = click->fCurr;
179 click->fCurr.iset(x, y);
180
181 click->fState = Click::kUp_State;
182 click->fModifierKeys = modi;
183 target->onClick(click);
184}
185
186//////////////////////////////////////////////////////////////////////
187
188void Sample::onSizeChange() {}
189
190Sample::Click* Sample::onFindClickHandler(SkScalar x, SkScalar y, unsigned modi) {
191 return nullptr;
192}
193
194bool Sample::onClick(Click*) {
195 return false;
196}
197
198void Sample::onDrawBackground(SkCanvas* canvas) {
199 canvas->drawColor(fBGColor);
200}
201
202// need to explicitly declare this, or we get some weird infinite loop llist
203template SampleRegistry* SampleRegistry::gHead;