Home | History | Annotate | Download | only in views
      1 /*
      2  * Copyright 2011 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 "SkView.h"
      9 #include "SkCanvas.h"
     10 
     11 static inline uint32_t SkSetClearShift(uint32_t bits, bool cond, unsigned shift) {
     12     SkASSERT((int)cond == 0 || (int)cond == 1);
     13     return (bits & ~(1 << shift)) | ((int)cond << shift);
     14 }
     15 
     16 ////////////////////////////////////////////////////////////////////////
     17 
     18 SkView::SkView(uint32_t flags) : fFlags(SkToU8(flags)) {
     19     fWidth = fHeight = 0;
     20 }
     21 
     22 SkView::~SkView() {}
     23 
     24 void SkView::setFlags(uint32_t flags) {
     25     SkASSERT((flags & ~kAllFlagMasks) == 0);
     26     fFlags = SkToU8(flags);
     27 }
     28 
     29 void SkView::setVisibleP(bool pred) {
     30     this->setFlags(SkSetClearShift(fFlags, pred, kVisible_Shift));
     31 }
     32 
     33 void SkView::setClipToBounds(bool pred) {
     34     this->setFlags(SkSetClearShift(fFlags, !pred, kNoClip_Shift));
     35 }
     36 
     37 void SkView::setSize(SkScalar width, SkScalar height) {
     38     width = SkMaxScalar(0, width);
     39     height = SkMaxScalar(0, height);
     40 
     41     if (fWidth != width || fHeight != height)
     42     {
     43         fWidth = width;
     44         fHeight = height;
     45         this->onSizeChange();
     46     }
     47 }
     48 
     49 void SkView::draw(SkCanvas* canvas) {
     50     if (fWidth && fHeight && this->isVisible()) {
     51         SkRect    r;
     52         r.set(0, 0, fWidth, fHeight);
     53         if (this->isClipToBounds() && canvas->quickReject(r)) {
     54             return;
     55         }
     56 
     57         SkAutoCanvasRestore    as(canvas, true);
     58 
     59         if (this->isClipToBounds()) {
     60             canvas->clipRect(r);
     61         }
     62 
     63         int sc = canvas->save();
     64         this->onDraw(canvas);
     65         canvas->restoreToCount(sc);
     66     }
     67 }
     68 
     69 ////////////////////////////////////////////////////////////////////////////
     70 
     71 SkView::Click::Click(SkView* target) {
     72     SkASSERT(target);
     73     fTargetID = target->getSinkID();
     74 }
     75 
     76 SkView::Click::~Click() {}
     77 
     78 SkView::Click* SkView::findClickHandler(SkScalar x, SkScalar y, unsigned modi) {
     79     if (x < 0 || y < 0 || x >= fWidth || y >= fHeight) {
     80         return nullptr;
     81     }
     82 
     83     return this->onFindClickHandler(x, y, modi);
     84 }
     85 
     86 void SkView::DoClickDown(Click* click, int x, int y, unsigned modi) {
     87     SkASSERT(click);
     88 
     89     SkView* target = (SkView*)SkEventSink::FindSink(click->fTargetID);
     90     if (nullptr == target) {
     91         return;
     92     }
     93 
     94     click->fIOrig.set(x, y);
     95     click->fICurr = click->fIPrev = click->fIOrig;
     96 
     97     click->fOrig.iset(x, y);
     98     click->fPrev = click->fCurr = click->fOrig;
     99 
    100     click->fState = Click::kDown_State;
    101     click->fModifierKeys = modi;
    102     target->onClick(click);
    103 }
    104 
    105 void SkView::DoClickMoved(Click* click, int x, int y, unsigned modi) {
    106     SkASSERT(click);
    107 
    108     SkView* target = (SkView*)SkEventSink::FindSink(click->fTargetID);
    109     if (nullptr == target) {
    110         return;
    111     }
    112 
    113     click->fIPrev = click->fICurr;
    114     click->fICurr.set(x, y);
    115 
    116     click->fPrev = click->fCurr;
    117     click->fCurr.iset(x, y);
    118 
    119     click->fState = Click::kMoved_State;
    120     click->fModifierKeys = modi;
    121     target->onClick(click);
    122 }
    123 
    124 void SkView::DoClickUp(Click* click, int x, int y, unsigned modi) {
    125     SkASSERT(click);
    126 
    127     SkView* target = (SkView*)SkEventSink::FindSink(click->fTargetID);
    128     if (nullptr == target) {
    129         return;
    130     }
    131 
    132     click->fIPrev = click->fICurr;
    133     click->fICurr.set(x, y);
    134 
    135     click->fPrev = click->fCurr;
    136     click->fCurr.iset(x, y);
    137 
    138     click->fState = Click::kUp_State;
    139     click->fModifierKeys = modi;
    140     target->onClick(click);
    141 }
    142 
    143 //////////////////////////////////////////////////////////////////////
    144 
    145 void SkView::onDraw(SkCanvas* canvas) {}
    146 
    147 void SkView::onSizeChange() {}
    148 
    149 SkView::Click* SkView::onFindClickHandler(SkScalar x, SkScalar y, unsigned modi) {
    150     return nullptr;
    151 }
    152 
    153 bool SkView::onClick(Click*) {
    154     return false;
    155 }
    156