| Index: src/views/SkView.cpp
|
| diff --git a/src/views/SkView.cpp b/src/views/SkView.cpp
|
| index ec75d610aaf6ec24f69bdb99c5b45943e1f96456..9e8182b16a9b0f21b642478f0e82a032f877f368 100644
|
| --- a/src/views/SkView.cpp
|
| +++ b/src/views/SkView.cpp
|
| @@ -1,17 +1,21 @@
|
| -
|
| /*
|
| * 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))
|
| -{
|
| +SkView::SkView(uint32_t flags) : fFlags(SkToU8(flags)) {
|
| fWidth = fHeight = 0;
|
| fLoc.set(0, 0);
|
| fParent = fFirstChild = fNextSibling = fPrevSibling = nullptr;
|
| @@ -19,13 +23,11 @@ SkView::SkView(uint32_t flags) : fFlags(SkToU8(flags))
|
| fContainsFocus = 0;
|
| }
|
|
|
| -SkView::~SkView()
|
| -{
|
| +SkView::~SkView() {
|
| this->detachAllChildren();
|
| }
|
|
|
| -void SkView::setFlags(uint32_t flags)
|
| -{
|
| +void SkView::setFlags(uint32_t flags) {
|
| SkASSERT((flags & ~kAllFlagMasks) == 0);
|
|
|
| uint32_t diff = fFlags ^ flags;
|
| @@ -35,24 +37,20 @@ void SkView::setFlags(uint32_t flags)
|
|
|
| fFlags = SkToU8(flags);
|
|
|
| - if (diff & kVisible_Mask)
|
| - {
|
| + if (diff & kVisible_Mask) {
|
| this->inval(nullptr);
|
| }
|
| }
|
|
|
| -void SkView::setVisibleP(bool pred)
|
| -{
|
| +void SkView::setVisibleP(bool pred) {
|
| this->setFlags(SkSetClearShift(fFlags, pred, kVisible_Shift));
|
| }
|
|
|
| -void SkView::setEnabledP(bool pred)
|
| -{
|
| +void SkView::setEnabledP(bool pred) {
|
| this->setFlags(SkSetClearShift(fFlags, pred, kEnabled_Shift));
|
| }
|
|
|
| -void SkView::setFocusableP(bool pred)
|
| -{
|
| +void SkView::setFocusableP(bool pred) {
|
| this->setFlags(SkSetClearShift(fFlags, pred, kFocusable_Shift));
|
| }
|
|
|
| @@ -60,8 +58,7 @@ void SkView::setClipToBounds(bool pred) {
|
| this->setFlags(SkSetClearShift(fFlags, !pred, kNoClip_Shift));
|
| }
|
|
|
| -void SkView::setSize(SkScalar width, SkScalar height)
|
| -{
|
| +void SkView::setSize(SkScalar width, SkScalar height) {
|
| width = SkMaxScalar(0, width);
|
| height = SkMaxScalar(0, height);
|
|
|
| @@ -76,38 +73,31 @@ void SkView::setSize(SkScalar width, SkScalar height)
|
| }
|
| }
|
|
|
| -void SkView::setLoc(SkScalar x, SkScalar y)
|
| -{
|
| - if (fLoc.fX != x || fLoc.fY != y)
|
| - {
|
| +void SkView::setLoc(SkScalar x, SkScalar y) {
|
| + if (fLoc.fX != x || fLoc.fY != y) {
|
| this->inval(nullptr);
|
| fLoc.set(x, y);
|
| this->inval(nullptr);
|
| }
|
| }
|
|
|
| -void SkView::offset(SkScalar dx, SkScalar dy)
|
| -{
|
| +void SkView::offset(SkScalar dx, SkScalar dy) {
|
| if (dx || dy)
|
| this->setLoc(fLoc.fX + dx, fLoc.fY + dy);
|
| }
|
|
|
| -void SkView::setLocalMatrix(const SkMatrix& matrix)
|
| -{
|
| +void SkView::setLocalMatrix(const SkMatrix& matrix) {
|
| this->inval(nullptr);
|
| fMatrix = matrix;
|
| this->inval(nullptr);
|
| }
|
|
|
| -void SkView::draw(SkCanvas* canvas)
|
| -{
|
| - if (fWidth && fHeight && this->isVisible())
|
| - {
|
| +void SkView::draw(SkCanvas* canvas) {
|
| + if (fWidth && fHeight && this->isVisible()) {
|
| SkRect r;
|
| r.set(fLoc.fX, fLoc.fY, fLoc.fX + fWidth, fLoc.fY + fHeight);
|
| - if (this->isClipToBounds() &&
|
| - canvas->quickReject(r)) {
|
| - return;
|
| + if (this->isClipToBounds() && canvas->quickReject(r)) {
|
| + return;
|
| }
|
|
|
| SkAutoCanvasRestore as(canvas, true);
|
| @@ -178,84 +168,79 @@ void SkView::inval(SkRect* rect) {
|
|
|
| ////////////////////////////////////////////////////////////////////////////
|
|
|
| -bool SkView::setFocusView(SkView* fv)
|
| -{
|
| +bool SkView::setFocusView(SkView* fv) {
|
| SkView* view = this;
|
|
|
| do {
|
| - if (view->onSetFocusView(fv))
|
| + if (view->onSetFocusView(fv)) {
|
| return true;
|
| + }
|
| } while ((view = view->fParent) != nullptr);
|
| return false;
|
| }
|
|
|
| -SkView* SkView::getFocusView() const
|
| -{
|
| - SkView* focus = nullptr;
|
| - const SkView* view = this;
|
| +SkView* SkView::getFocusView() const {
|
| + SkView* focus = nullptr;
|
| + const SkView* view = this;
|
| do {
|
| - if (view->onGetFocusView(&focus))
|
| + if (view->onGetFocusView(&focus)) {
|
| break;
|
| + }
|
| } while ((view = view->fParent) != nullptr);
|
| return focus;
|
| }
|
|
|
| -bool SkView::hasFocus() const
|
| -{
|
| +bool SkView::hasFocus() const {
|
| return this == this->getFocusView();
|
| }
|
|
|
| -bool SkView::acceptFocus()
|
| -{
|
| +bool SkView::acceptFocus() {
|
| return this->isFocusable() && this->setFocusView(this);
|
| }
|
|
|
| /*
|
| Try to give focus to this view, or its children
|
| */
|
| -SkView* SkView::acceptFocus(FocusDirection dir)
|
| -{
|
| - if (dir == kNext_FocusDirection)
|
| - {
|
| - if (this->acceptFocus())
|
| +SkView* SkView::acceptFocus(FocusDirection dir) {
|
| + if (dir == kNext_FocusDirection) {
|
| + if (this->acceptFocus()) {
|
| return this;
|
| -
|
| + }
|
| B2FIter iter(this);
|
| SkView* child, *focus;
|
| - while ((child = iter.next()) != nullptr)
|
| - if ((focus = child->acceptFocus(dir)) != nullptr)
|
| + while ((child = iter.next()) != nullptr) {
|
| + if ((focus = child->acceptFocus(dir)) != nullptr) {
|
| return focus;
|
| - }
|
| - else // prev
|
| - {
|
| + }
|
| + }
|
| + } else { // prev
|
| F2BIter iter(this);
|
| SkView* child, *focus;
|
| - while ((child = iter.next()) != nullptr)
|
| - if ((focus = child->acceptFocus(dir)) != nullptr)
|
| + while ((child = iter.next()) != nullptr) {
|
| + if ((focus = child->acceptFocus(dir)) != nullptr) {
|
| return focus;
|
| -
|
| - if (this->acceptFocus())
|
| + }
|
| + }
|
| + if (this->acceptFocus()) {
|
| return this;
|
| + }
|
| }
|
| -
|
| return nullptr;
|
| }
|
|
|
| -SkView* SkView::moveFocus(FocusDirection dir)
|
| -{
|
| +SkView* SkView::moveFocus(FocusDirection dir) {
|
| SkView* focus = this->getFocusView();
|
|
|
| - if (focus == nullptr)
|
| - { // start with the root
|
| + if (focus == nullptr) { // start with the root
|
| focus = this;
|
| - while (focus->fParent)
|
| + while (focus->fParent) {
|
| focus = focus->fParent;
|
| + }
|
| }
|
|
|
| - SkView* child, *parent;
|
| + SkView* child, *parent;
|
|
|
| - if (dir == kNext_FocusDirection)
|
| - {
|
| + if (dir == kNext_FocusDirection) {
|
| parent = focus;
|
| child = focus->fFirstChild;
|
| if (child)
|
| @@ -264,8 +249,7 @@ SkView* SkView::moveFocus(FocusDirection dir)
|
| goto NEXT_SIB;
|
|
|
| do {
|
| - while (child != parent->fFirstChild)
|
| - {
|
| + while (child != parent->fFirstChild) {
|
| FIRST_CHILD:
|
| if ((focus = child->acceptFocus(dir)) != nullptr)
|
| return focus;
|
| @@ -275,26 +259,22 @@ SkView* SkView::moveFocus(FocusDirection dir)
|
| child = parent->fNextSibling;
|
| parent = parent->fParent;
|
| } while (parent != nullptr);
|
| - }
|
| - else // prevfocus
|
| - {
|
| + } else { // prevfocus
|
| parent = focus->fParent;
|
| - if (parent == nullptr) // we're the root
|
| + if (parent == nullptr) { // we're the root
|
| return focus->acceptFocus(dir);
|
| - else
|
| - {
|
| + } else {
|
| child = focus;
|
| - while (parent)
|
| - {
|
| - while (child != parent->fFirstChild)
|
| - {
|
| + while (parent) {
|
| + while (child != parent->fFirstChild) {
|
| child = child->fPrevSibling;
|
| - if ((focus = child->acceptFocus(dir)) != nullptr)
|
| + if ((focus = child->acceptFocus(dir)) != nullptr) {
|
| return focus;
|
| + }
|
| }
|
| - if (parent->acceptFocus())
|
| + if (parent->acceptFocus()) {
|
| return parent;
|
| -
|
| + }
|
| child = parent;
|
| parent = parent->fParent;
|
| }
|
| @@ -303,15 +283,13 @@ SkView* SkView::moveFocus(FocusDirection dir)
|
| return nullptr;
|
| }
|
|
|
| -void SkView::onFocusChange(bool gainFocusP)
|
| -{
|
| +void SkView::onFocusChange(bool gainFocusP) {
|
| this->inval(nullptr);
|
| }
|
|
|
| ////////////////////////////////////////////////////////////////////////////
|
|
|
| -SkView::Click::Click(SkView* target)
|
| -{
|
| +SkView::Click::Click(SkView* target) {
|
| SkASSERT(target);
|
| fTargetID = target->getSinkID();
|
| fType = nullptr;
|
| @@ -319,49 +297,43 @@ SkView::Click::Click(SkView* target)
|
| fOwner = nullptr;
|
| }
|
|
|
| -SkView::Click::~Click()
|
| -{
|
| +SkView::Click::~Click() {
|
| this->resetType();
|
| }
|
|
|
| -void SkView::Click::resetType()
|
| -{
|
| - if (fWeOwnTheType)
|
| - {
|
| +void SkView::Click::resetType() {
|
| + if (fWeOwnTheType) {
|
| sk_free(fType);
|
| fWeOwnTheType = false;
|
| }
|
| fType = nullptr;
|
| }
|
|
|
| -bool SkView::Click::isType(const char type[]) const
|
| -{
|
| +bool SkView::Click::isType(const char type[]) const {
|
| const char* t = fType;
|
|
|
| - if (type == t)
|
| + if (type == t) {
|
| return true;
|
| -
|
| - if (type == nullptr)
|
| + }
|
| + if (type == nullptr) {
|
| type = "";
|
| - if (t == nullptr)
|
| + }
|
| + if (t == nullptr) {
|
| t = "";
|
| + }
|
| return !strcmp(t, type);
|
| }
|
|
|
| -void SkView::Click::setType(const char type[])
|
| -{
|
| +void SkView::Click::setType(const char type[]) {
|
| this->resetType();
|
| fType = (char*)type;
|
| }
|
|
|
| -void SkView::Click::copyType(const char type[])
|
| -{
|
| - if (fType != type)
|
| - {
|
| +void SkView::Click::copyType(const char type[]) {
|
| + if (fType != type) {
|
| this->resetType();
|
| - if (type)
|
| - {
|
| - size_t len = strlen(type) + 1;
|
| + if (type) {
|
| + size_t len = strlen(type) + 1;
|
| fType = (char*)sk_malloc_throw(len);
|
| memcpy(fType, type, len);
|
| fWeOwnTheType = true;
|
| @@ -400,8 +372,7 @@ SkView::Click* SkView::findClickHandler(SkScalar x, SkScalar y, unsigned modi) {
|
| return this->onFindClickHandler(x, y, modi);
|
| }
|
|
|
| -void SkView::DoClickDown(Click* click, int x, int y, unsigned modi)
|
| -{
|
| +void SkView::DoClickDown(Click* click, int x, int y, unsigned modi) {
|
| SkASSERT(click);
|
|
|
| SkView* target = (SkView*)SkEventSink::FindSink(click->fTargetID);
|
| @@ -424,8 +395,7 @@ void SkView::DoClickDown(Click* click, int x, int y, unsigned modi)
|
| target->onClick(click);
|
| }
|
|
|
| -void SkView::DoClickMoved(Click* click, int x, int y, unsigned modi)
|
| -{
|
| +void SkView::DoClickMoved(Click* click, int x, int y, unsigned modi) {
|
| SkASSERT(click);
|
|
|
| SkView* target = (SkView*)SkEventSink::FindSink(click->fTargetID);
|
| @@ -448,8 +418,7 @@ void SkView::DoClickMoved(Click* click, int x, int y, unsigned modi)
|
| target->onClick(click);
|
| }
|
|
|
| -void SkView::DoClickUp(Click* click, int x, int y, unsigned modi)
|
| -{
|
| +void SkView::DoClickUp(Click* click, int x, int y, unsigned modi) {
|
| SkASSERT(click);
|
|
|
| SkView* target = (SkView*)SkEventSink::FindSink(click->fTargetID);
|
| @@ -637,8 +606,8 @@ void SkView::localToGlobal(SkMatrix* matrix) const {
|
| }
|
| }
|
| }
|
| -bool SkView::globalToLocal(SkScalar x, SkScalar y, SkPoint* local) const
|
| -{
|
| +
|
| +bool SkView::globalToLocal(SkScalar x, SkScalar y, SkPoint* local) const {
|
| SkASSERT(this);
|
|
|
| if (local) {
|
| @@ -684,9 +653,11 @@ void SkView::onInflate(const SkDOM& dom, const SkDOM::Node* node) {
|
|
|
| bool b;
|
| uint32_t flags = this->getFlags();
|
| - for (unsigned i = 0; i < SK_ARRAY_COUNT(gFlagNames); i++)
|
| - if (dom.findBool(node, gFlagNames[i], &b))
|
| + for (unsigned i = 0; i < SK_ARRAY_COUNT(gFlagNames); i++) {
|
| + if (dom.findBool(node, gFlagNames[i], &b)) {
|
| flags = SkSetClearShift(flags, b, i);
|
| + }
|
| + }
|
| this->setFlags(flags);
|
| }
|
|
|
| @@ -788,20 +759,19 @@ void SkView::validate() const {
|
| }
|
| }
|
|
|
| -static inline void show_if_nonzero(const char name[], SkScalar value)
|
| -{
|
| - if (value)
|
| +static inline void show_if_nonzero(const char name[], SkScalar value) {
|
| + if (value) {
|
| SkDebugf("%s=\"%g\"", name, value/65536.);
|
| + }
|
| }
|
|
|
| -static void tab(int level)
|
| -{
|
| - for (int i = 0; i < level; i++)
|
| +static void tab(int level) {
|
| + for (int i = 0; i < level; i++) {
|
| SkDebugf(" ");
|
| + }
|
| }
|
|
|
| -static void dumpview(const SkView* view, int level, bool recurse)
|
| -{
|
| +static void dumpview(const SkView* view, int level, bool recurse) {
|
| tab(level);
|
|
|
| SkDebugf("<view");
|
| @@ -810,37 +780,32 @@ static void dumpview(const SkView* view, int level, bool recurse)
|
| show_if_nonzero(" width", view->width());
|
| show_if_nonzero(" height", view->height());
|
|
|
| - if (recurse)
|
| - {
|
| + if (recurse) {
|
| SkView::B2FIter iter(view);
|
| SkView* child;
|
| bool noChildren = true;
|
|
|
| - while ((child = iter.next()) != nullptr)
|
| - {
|
| - if (noChildren)
|
| + while ((child = iter.next()) != nullptr) {
|
| + if (noChildren) {
|
| SkDebugf(">\n");
|
| + }
|
| noChildren = false;
|
| dumpview(child, level + 1, true);
|
| }
|
|
|
| - if (!noChildren)
|
| - {
|
| + if (!noChildren) {
|
| tab(level);
|
| SkDebugf("</view>\n");
|
| - }
|
| - else
|
| + } else {
|
| goto ONELINER;
|
| - }
|
| - else
|
| - {
|
| + }
|
| + } else {
|
| ONELINER:
|
| SkDebugf(" />\n");
|
| }
|
| }
|
|
|
| -void SkView::dump(bool recurse) const
|
| -{
|
| +void SkView::dump(bool recurse) const {
|
| dumpview(this, 0, recurse);
|
| }
|
|
|
|
|