• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 #include "SkDrawing.h"
2 #include "SkCanvas.h"
3 
SkDrawing()4 SkDrawing::SkDrawing() {
5     fMatrix.reset();
6     fParent = fFirstChild = fNextSibling = fPrevSibling = NULL;
7 }
8 
~SkDrawing()9 SkDrawing::~SkDrawing() {
10     this->detachAllChildren();
11 }
12 
13 ///////////////////////////////////////////////////////////////////////////////
14 
resetMatrix()15 void SkDrawing::resetMatrix() {
16     fMatrix.reset();
17 }
18 
getMatrix(SkMatrix * matrix) const19 void SkDrawing::getMatrix(SkMatrix* matrix) const {
20     if (matrix) {
21         *matrix = fMatrix;
22     }
23 }
24 
setMatrix(const SkMatrix & matrix)25 void SkDrawing::setMatrix(const SkMatrix& matrix) {
26     if (fMatrix != matrix) {
27         this->inval();
28         fMatrix = matrix;
29         this->inval();
30     }
31 }
32 
draw(SkCanvas * canvas)33 void 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()49 void 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)74 SkDrawing* 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)100 SkDrawing* 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()126 void SkDrawing::detachAllChildren() {
127 	while (fFirstChild) {
128 		fFirstChild->detachFromParent();
129     }
130 }
131 
132 ///////////////////////////////////////////////////////////////////////////////
133 
B2FIter(const SkDrawing * parent)134 SkDrawing::B2FIter::B2FIter(const SkDrawing* parent) {
135 	fFirstChild = parent ? parent->fFirstChild : NULL;
136 	fChild = fFirstChild;
137 }
138 
next()139 SkDrawing*	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