| /* |
| * Copyright 2011 Google Inc. |
| * |
| * Use of this source code is governed by a BSD-style license that can be |
| * found in the LICENSE file. |
| */ |
| |
| #include "SkView.h" |
| #include "SkCanvas.h" |
| |
| static inline uint32_t SkSetClearShift(uint32_t bits, bool cond, unsigned shift) { |
| SkASSERT((int)cond == 0 || (int)cond == 1); |
| return (bits & ~(1 << shift)) | ((int)cond << shift); |
| } |
| |
| //////////////////////////////////////////////////////////////////////// |
| |
| SkView::SkView(uint32_t flags) : fFlags(SkToU8(flags)) { |
| fWidth = fHeight = 0; |
| } |
| |
| SkView::~SkView() {} |
| |
| void SkView::setFlags(uint32_t flags) { |
| SkASSERT((flags & ~kAllFlagMasks) == 0); |
| fFlags = SkToU8(flags); |
| } |
| |
| void SkView::setVisibleP(bool pred) { |
| this->setFlags(SkSetClearShift(fFlags, pred, kVisible_Shift)); |
| } |
| |
| void SkView::setClipToBounds(bool pred) { |
| this->setFlags(SkSetClearShift(fFlags, !pred, kNoClip_Shift)); |
| } |
| |
| void SkView::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 SkView::draw(SkCanvas* canvas) { |
| if (fWidth && fHeight && this->isVisible()) { |
| SkRect r; |
| r.set(0, 0, fWidth, fHeight); |
| if (this->isClipToBounds() && canvas->quickReject(r)) { |
| return; |
| } |
| |
| SkAutoCanvasRestore as(canvas, true); |
| |
| if (this->isClipToBounds()) { |
| canvas->clipRect(r); |
| } |
| |
| int sc = canvas->save(); |
| this->onDraw(canvas); |
| canvas->restoreToCount(sc); |
| } |
| } |
| |
| //////////////////////////////////////////////////////////////////////////// |
| |
| SkView::Click::Click(SkView* target) { |
| SkASSERT(target); |
| fTargetID = target->getSinkID(); |
| } |
| |
| SkView::Click::~Click() {} |
| |
| SkView::Click* SkView::findClickHandler(SkScalar x, SkScalar y, unsigned modi) { |
| if (x < 0 || y < 0 || x >= fWidth || y >= fHeight) { |
| return nullptr; |
| } |
| |
| return this->onFindClickHandler(x, y, modi); |
| } |
| |
| void SkView::DoClickDown(Click* click, int x, int y, unsigned modi) { |
| SkASSERT(click); |
| |
| SkView* target = (SkView*)SkEventSink::FindSink(click->fTargetID); |
| if (nullptr == target) { |
| return; |
| } |
| |
| click->fIOrig.set(x, y); |
| click->fICurr = click->fIPrev = click->fIOrig; |
| |
| click->fOrig.iset(x, y); |
| click->fPrev = click->fCurr = click->fOrig; |
| |
| click->fState = Click::kDown_State; |
| click->fModifierKeys = modi; |
| target->onClick(click); |
| } |
| |
| void SkView::DoClickMoved(Click* click, int x, int y, unsigned modi) { |
| SkASSERT(click); |
| |
| SkView* target = (SkView*)SkEventSink::FindSink(click->fTargetID); |
| if (nullptr == target) { |
| return; |
| } |
| |
| click->fIPrev = click->fICurr; |
| click->fICurr.set(x, y); |
| |
| click->fPrev = click->fCurr; |
| click->fCurr.iset(x, y); |
| |
| click->fState = Click::kMoved_State; |
| click->fModifierKeys = modi; |
| target->onClick(click); |
| } |
| |
| void SkView::DoClickUp(Click* click, int x, int y, unsigned modi) { |
| SkASSERT(click); |
| |
| SkView* target = (SkView*)SkEventSink::FindSink(click->fTargetID); |
| if (nullptr == target) { |
| return; |
| } |
| |
| click->fIPrev = click->fICurr; |
| click->fICurr.set(x, y); |
| |
| click->fPrev = click->fCurr; |
| click->fCurr.iset(x, y); |
| |
| click->fState = Click::kUp_State; |
| click->fModifierKeys = modi; |
| target->onClick(click); |
| } |
| |
| ////////////////////////////////////////////////////////////////////// |
| |
| void SkView::onDraw(SkCanvas* canvas) {} |
| |
| void SkView::onSizeChange() {} |
| |
| SkView::Click* SkView::onFindClickHandler(SkScalar x, SkScalar y, unsigned modi) { |
| return nullptr; |
| } |
| |
| bool SkView::onClick(Click*) { |
| return false; |
| } |