| /* |
| * Copyright 2016 Google Inc. |
| * |
| * Use of this source code is governed by a BSD-style license that can be |
| * found in the LICENSE file. |
| */ |
| |
| #include "include/core/SkCanvas.h" |
| #include "include/core/SkString.h" |
| #include "samplecode/Sample.h" |
| |
| #if SK_SUPPORT_GPU |
| # include "include/gpu/GrContext.h" |
| #else |
| class GrContext; |
| #endif |
| |
| ////////////////////////////////////////////////////////////////////////////// |
| |
| void Sample::setSize(SkScalar width, SkScalar height) { |
| width = SkMaxScalar(0, width); |
| height = SkMaxScalar(0, height); |
| |
| if (fWidth != width || fHeight != height) |
| { |
| fWidth = width; |
| fHeight = height; |
| this->onSizeChange(); |
| } |
| } |
| |
| void Sample::draw(SkCanvas* canvas) { |
| if (fWidth && fHeight) { |
| SkRect r; |
| r.set(0, 0, fWidth, fHeight); |
| if (canvas->quickReject(r)) { |
| return; |
| } |
| |
| SkAutoCanvasRestore as(canvas, true); |
| int sc = canvas->save(); |
| |
| if (!fHaveCalledOnceBeforeDraw) { |
| fHaveCalledOnceBeforeDraw = true; |
| this->onOnceBeforeDraw(); |
| } |
| this->onDrawBackground(canvas); |
| |
| SkAutoCanvasRestore acr(canvas, true); |
| this->onDrawContent(canvas); |
| #if SK_SUPPORT_GPU |
| // Ensure the GrContext doesn't combine GrDrawOps across draw loops. |
| if (GrContext* context = canvas->getGrContext()) { |
| context->flush(); |
| } |
| #endif |
| |
| canvas->restoreToCount(sc); |
| } |
| } |
| |
| //////////////////////////////////////////////////////////////////////////// |
| |
| bool Sample::mouse(SkPoint point, InputState clickState, ModifierKey modifierKeys) { |
| switch (clickState) { |
| case InputState::kDown: |
| fClick = nullptr; |
| if (point.x() < 0 || point.y() < 0 || point.x() >= fWidth || point.y() >= fHeight) { |
| return false; |
| } |
| fClick.reset(this->onFindClickHandler(point.x(), point.y(), modifierKeys)); |
| if (!fClick) { |
| return false; |
| } |
| fClick->fPrev = fClick->fCurr = fClick->fOrig = point; |
| fClick->fState = InputState::kDown; |
| fClick->fModifierKeys = modifierKeys; |
| this->onClick(fClick.get()); |
| return true; |
| case InputState::kMove: |
| if (fClick) { |
| fClick->fPrev = fClick->fCurr; |
| fClick->fCurr = point; |
| fClick->fState = InputState::kMove; |
| fClick->fModifierKeys = modifierKeys; |
| return this->onClick(fClick.get()); |
| } |
| return false; |
| case InputState::kUp: |
| if (fClick) { |
| fClick->fPrev = fClick->fCurr; |
| fClick->fCurr = point; |
| fClick->fState = InputState::kUp; |
| fClick->fModifierKeys = modifierKeys; |
| bool result = this->onClick(fClick.get()); |
| fClick = nullptr; |
| return result; |
| } |
| return false; |
| } |
| SkASSERT(false); |
| return false; |
| } |
| |
| ////////////////////////////////////////////////////////////////////// |
| |
| void Sample::onSizeChange() {} |
| |
| Sample::Click* Sample::onFindClickHandler(SkScalar x, SkScalar y, ModifierKey modi) { |
| return nullptr; |
| } |
| |
| bool Sample::onClick(Click*) { |
| return false; |
| } |
| |
| void Sample::onDrawBackground(SkCanvas* canvas) { |
| canvas->drawColor(fBGColor); |
| } |
| |
| // need to explicitly declare this, or we get some weird infinite loop llist |
| template SampleRegistry* SampleRegistry::gHead; |