1cb93a386Sopenharmony_ci/* 2cb93a386Sopenharmony_ci * Copyright 2016 Google Inc. 3cb93a386Sopenharmony_ci * 4cb93a386Sopenharmony_ci * Use of this source code is governed by a BSD-style license that can be 5cb93a386Sopenharmony_ci * found in the LICENSE file. 6cb93a386Sopenharmony_ci */ 7cb93a386Sopenharmony_ci 8cb93a386Sopenharmony_ci#include "include/core/SkCanvas.h" 9cb93a386Sopenharmony_ci#include "include/core/SkString.h" 10cb93a386Sopenharmony_ci#include "samplecode/Sample.h" 11cb93a386Sopenharmony_ci 12cb93a386Sopenharmony_ci#if SK_SUPPORT_GPU 13cb93a386Sopenharmony_ci# include "include/gpu/GrDirectContext.h" 14cb93a386Sopenharmony_ci#else 15cb93a386Sopenharmony_ciclass GrDirectContext; 16cb93a386Sopenharmony_ci#endif 17cb93a386Sopenharmony_ci 18cb93a386Sopenharmony_ci////////////////////////////////////////////////////////////////////////////// 19cb93a386Sopenharmony_ci 20cb93a386Sopenharmony_civoid Sample::setSize(SkScalar width, SkScalar height) { 21cb93a386Sopenharmony_ci width = std::max(0.0f, width); 22cb93a386Sopenharmony_ci height = std::max(0.0f, height); 23cb93a386Sopenharmony_ci 24cb93a386Sopenharmony_ci if (fWidth != width || fHeight != height) 25cb93a386Sopenharmony_ci { 26cb93a386Sopenharmony_ci fWidth = width; 27cb93a386Sopenharmony_ci fHeight = height; 28cb93a386Sopenharmony_ci this->onSizeChange(); 29cb93a386Sopenharmony_ci } 30cb93a386Sopenharmony_ci} 31cb93a386Sopenharmony_ci 32cb93a386Sopenharmony_civoid Sample::draw(SkCanvas* canvas) { 33cb93a386Sopenharmony_ci if (fWidth && fHeight) { 34cb93a386Sopenharmony_ci SkRect r; 35cb93a386Sopenharmony_ci r.setLTRB(0, 0, fWidth, fHeight); 36cb93a386Sopenharmony_ci if (canvas->quickReject(r)) { 37cb93a386Sopenharmony_ci return; 38cb93a386Sopenharmony_ci } 39cb93a386Sopenharmony_ci 40cb93a386Sopenharmony_ci SkAutoCanvasRestore as(canvas, true); 41cb93a386Sopenharmony_ci int sc = canvas->save(); 42cb93a386Sopenharmony_ci 43cb93a386Sopenharmony_ci if (!fHaveCalledOnceBeforeDraw) { 44cb93a386Sopenharmony_ci fHaveCalledOnceBeforeDraw = true; 45cb93a386Sopenharmony_ci this->onOnceBeforeDraw(); 46cb93a386Sopenharmony_ci } 47cb93a386Sopenharmony_ci this->onDrawBackground(canvas); 48cb93a386Sopenharmony_ci 49cb93a386Sopenharmony_ci SkAutoCanvasRestore acr(canvas, true); 50cb93a386Sopenharmony_ci this->onDrawContent(canvas); 51cb93a386Sopenharmony_ci#if SK_SUPPORT_GPU 52cb93a386Sopenharmony_ci // Ensure the context doesn't combine GrDrawOps across draw loops. 53cb93a386Sopenharmony_ci if (auto direct = GrAsDirectContext(canvas->recordingContext())) { 54cb93a386Sopenharmony_ci direct->flushAndSubmit(); 55cb93a386Sopenharmony_ci } 56cb93a386Sopenharmony_ci#endif 57cb93a386Sopenharmony_ci 58cb93a386Sopenharmony_ci canvas->restoreToCount(sc); 59cb93a386Sopenharmony_ci } 60cb93a386Sopenharmony_ci} 61cb93a386Sopenharmony_ci 62cb93a386Sopenharmony_ci//////////////////////////////////////////////////////////////////////////// 63cb93a386Sopenharmony_ci 64cb93a386Sopenharmony_cibool Sample::mouse(SkPoint point, skui::InputState clickState, skui::ModifierKey modifierKeys) { 65cb93a386Sopenharmony_ci auto dispatch = [this](Click* c) { 66cb93a386Sopenharmony_ci return c->fHasFunc ? c->fFunc(c) : this->onClick(c); 67cb93a386Sopenharmony_ci }; 68cb93a386Sopenharmony_ci 69cb93a386Sopenharmony_ci switch (clickState) { 70cb93a386Sopenharmony_ci case skui::InputState::kDown: 71cb93a386Sopenharmony_ci fClick = nullptr; 72cb93a386Sopenharmony_ci fClick.reset(this->onFindClickHandler(point.x(), point.y(), modifierKeys)); 73cb93a386Sopenharmony_ci if (!fClick) { 74cb93a386Sopenharmony_ci return false; 75cb93a386Sopenharmony_ci } 76cb93a386Sopenharmony_ci fClick->fPrev = fClick->fCurr = fClick->fOrig = point; 77cb93a386Sopenharmony_ci fClick->fState = skui::InputState::kDown; 78cb93a386Sopenharmony_ci fClick->fModifierKeys = modifierKeys; 79cb93a386Sopenharmony_ci dispatch(fClick.get()); 80cb93a386Sopenharmony_ci return true; 81cb93a386Sopenharmony_ci case skui::InputState::kMove: 82cb93a386Sopenharmony_ci if (fClick) { 83cb93a386Sopenharmony_ci fClick->fPrev = fClick->fCurr; 84cb93a386Sopenharmony_ci fClick->fCurr = point; 85cb93a386Sopenharmony_ci fClick->fState = skui::InputState::kMove; 86cb93a386Sopenharmony_ci fClick->fModifierKeys = modifierKeys; 87cb93a386Sopenharmony_ci return dispatch(fClick.get()); 88cb93a386Sopenharmony_ci } 89cb93a386Sopenharmony_ci return false; 90cb93a386Sopenharmony_ci case skui::InputState::kUp: 91cb93a386Sopenharmony_ci if (fClick) { 92cb93a386Sopenharmony_ci fClick->fPrev = fClick->fCurr; 93cb93a386Sopenharmony_ci fClick->fCurr = point; 94cb93a386Sopenharmony_ci fClick->fState = skui::InputState::kUp; 95cb93a386Sopenharmony_ci fClick->fModifierKeys = modifierKeys; 96cb93a386Sopenharmony_ci bool result = dispatch(fClick.get()); 97cb93a386Sopenharmony_ci fClick = nullptr; 98cb93a386Sopenharmony_ci return result; 99cb93a386Sopenharmony_ci } 100cb93a386Sopenharmony_ci return false; 101cb93a386Sopenharmony_ci default: 102cb93a386Sopenharmony_ci // Ignore other cases 103cb93a386Sopenharmony_ci SkASSERT(false); 104cb93a386Sopenharmony_ci break; 105cb93a386Sopenharmony_ci } 106cb93a386Sopenharmony_ci SkASSERT(false); 107cb93a386Sopenharmony_ci return false; 108cb93a386Sopenharmony_ci} 109cb93a386Sopenharmony_ci 110cb93a386Sopenharmony_ci////////////////////////////////////////////////////////////////////// 111cb93a386Sopenharmony_ci 112cb93a386Sopenharmony_civoid Sample::onSizeChange() {} 113cb93a386Sopenharmony_ci 114cb93a386Sopenharmony_ciSample::Click* Sample::onFindClickHandler(SkScalar x, SkScalar y, skui::ModifierKey modi) { 115cb93a386Sopenharmony_ci return nullptr; 116cb93a386Sopenharmony_ci} 117cb93a386Sopenharmony_ci 118cb93a386Sopenharmony_cibool Sample::onClick(Click*) { 119cb93a386Sopenharmony_ci return false; 120cb93a386Sopenharmony_ci} 121cb93a386Sopenharmony_ci 122cb93a386Sopenharmony_civoid Sample::onDrawBackground(SkCanvas* canvas) { 123cb93a386Sopenharmony_ci canvas->drawColor(fBGColor); 124cb93a386Sopenharmony_ci} 125cb93a386Sopenharmony_ci 126cb93a386Sopenharmony_ci// need to explicitly declare this, or we get some weird infinite loop llist 127cb93a386Sopenharmony_citemplate SampleRegistry* SampleRegistry::gHead; 128