1 #include "SkDrawing.h" 2 #include "SkCanvas.h" 3 SkDrawing()4SkDrawing::SkDrawing() { 5 fMatrix.reset(); 6 fParent = fFirstChild = fNextSibling = fPrevSibling = NULL; 7 } 8 ~SkDrawing()9SkDrawing::~SkDrawing() { 10 this->detachAllChildren(); 11 } 12 13 /////////////////////////////////////////////////////////////////////////////// 14 resetMatrix()15void SkDrawing::resetMatrix() { 16 fMatrix.reset(); 17 } 18 getMatrix(SkMatrix * matrix) const19void SkDrawing::getMatrix(SkMatrix* matrix) const { 20 if (matrix) { 21 *matrix = fMatrix; 22 } 23 } 24 setMatrix(const SkMatrix & matrix)25void SkDrawing::setMatrix(const SkMatrix& matrix) { 26 if (fMatrix != matrix) { 27 this->inval(); 28 fMatrix = matrix; 29 this->inval(); 30 } 31 } 32 draw(SkCanvas * canvas)33void SkDrawing::draw(SkCanvas* canvas) { 34 SkAutoCanvasRestore ar(canvas, false); 35 canvas->save(SkCanvas::kMatrix_SaveFlag); 36 canvas->concat(fMatrix); 37 38 this->onDraw(canvas); 39 40 B2FIter iter(this); 41 SkDrawing* child; 42 while ((child = iter.next()) != NULL) { 43 child->draw(canvas); 44 } 45 } 46 47 /////////////////////////////////////////////////////////////////////////////// 48 detachFromParent()49void SkDrawing::detachFromParent() { 50 SkDrawing* parent = fParent; 51 52 if (NULL == parent) { 53 return; 54 } 55 56 this->inval(); 57 58 SkDrawing* next = NULL; 59 60 if (fNextSibling != this) { // do we have any siblings 61 fNextSibling->fPrevSibling = fPrevSibling; 62 fPrevSibling->fNextSibling = fNextSibling; 63 next = fNextSibling; 64 } 65 66 if (fParent->fFirstChild == this) { 67 fParent->fFirstChild = next; 68 } 69 70 fParent = fNextSibling = fPrevSibling = NULL; 71 this->unref(); 72 } 73 attachChildToBack(SkDrawing * child)74SkDrawing* SkDrawing::attachChildToBack(SkDrawing* child) { 75 SkASSERT(child != this); 76 77 if (child == NULL || fFirstChild == child) { 78 return child; 79 } 80 81 child->ref(); 82 child->detachFromParent(); 83 84 if (fFirstChild == NULL) { 85 child->fNextSibling = child; 86 child->fPrevSibling = child; 87 } else { 88 child->fNextSibling = fFirstChild; 89 child->fPrevSibling = fFirstChild->fPrevSibling; 90 fFirstChild->fPrevSibling->fNextSibling = child; 91 fFirstChild->fPrevSibling = child; 92 } 93 94 fFirstChild = child; 95 child->fParent = this; 96 child->inval(); 97 return child; 98 } 99 attachChildToFront(SkDrawing * child)100SkDrawing* SkDrawing::attachChildToFront(SkDrawing* child) { 101 SkASSERT(child != this); 102 103 if (child == NULL || fFirstChild && fFirstChild->fPrevSibling == child) { 104 return child; 105 } 106 107 child->ref(); 108 child->detachFromParent(); 109 110 if (fFirstChild == NULL) { 111 fFirstChild = child; 112 child->fNextSibling = child; 113 child->fPrevSibling = child; 114 } else { 115 child->fNextSibling = fFirstChild; 116 child->fPrevSibling = fFirstChild->fPrevSibling; 117 fFirstChild->fPrevSibling->fNextSibling = child; 118 fFirstChild->fPrevSibling = child; 119 } 120 121 child->fParent = this; 122 child->inval(); 123 return child; 124 } 125 detachAllChildren()126void SkDrawing::detachAllChildren() { 127 while (fFirstChild) { 128 fFirstChild->detachFromParent(); 129 } 130 } 131 132 /////////////////////////////////////////////////////////////////////////////// 133 B2FIter(const SkDrawing * parent)134SkDrawing::B2FIter::B2FIter(const SkDrawing* parent) { 135 fFirstChild = parent ? parent->fFirstChild : NULL; 136 fChild = fFirstChild; 137 } 138 next()139SkDrawing* SkDrawing::B2FIter::next() { 140 SkDrawing* curr = fChild; 141 142 if (fChild) { 143 SkDrawing* next = fChild->fNextSibling; 144 if (next == fFirstChild) { 145 next = NULL; 146 } 147 fChild = next; 148 } 149 return curr; 150 } 151 152 153