OLD | NEW |
| (Empty) |
1 #include "SkCanvas.h" | |
2 #include "SkLayerDrawLooper.h" | |
3 #include "SkPaint.h" | |
4 | |
5 SkLayerDrawLooper::SkLayerDrawLooper() { | |
6 fRecs = NULL; | |
7 fCount = 0; | |
8 } | |
9 | |
10 SkLayerDrawLooper::~SkLayerDrawLooper() { | |
11 Rec* rec = fRecs; | |
12 while (rec) { | |
13 Rec* next = rec->fNext; | |
14 SkDELETE(rec); | |
15 rec = next; | |
16 } | |
17 } | |
18 | |
19 SkPaint* SkLayerDrawLooper::addLayer(SkScalar dx, SkScalar dy) { | |
20 fCount += 1; | |
21 | |
22 Rec* rec = SkNEW(Rec); | |
23 rec->fNext = fRecs; | |
24 rec->fOffset.set(dx, dy); | |
25 fRecs = rec; | |
26 | |
27 return &rec->fPaint; | |
28 } | |
29 | |
30 void SkLayerDrawLooper::init(SkCanvas* canvas, SkPaint* paint) { | |
31 fIter.fSavedPaint = *paint; | |
32 fIter.fPaint = paint; | |
33 fIter.fCanvas = canvas; | |
34 fIter.fRec = fRecs; | |
35 canvas->save(SkCanvas::kMatrix_SaveFlag); | |
36 } | |
37 | |
38 bool SkLayerDrawLooper::next() { | |
39 Rec* rec = fIter.fRec; | |
40 if (rec) { | |
41 *fIter.fPaint = rec->fPaint; | |
42 fIter.fCanvas->restore(); | |
43 fIter.fCanvas->save(SkCanvas::kMatrix_SaveFlag); | |
44 fIter.fCanvas->translate(rec->fOffset.fX, rec->fOffset.fY); | |
45 | |
46 fIter.fRec = rec->fNext; | |
47 return true; | |
48 } | |
49 return false; | |
50 } | |
51 | |
52 void SkLayerDrawLooper::restore() { | |
53 fIter.fCanvas->restore(); | |
54 *fIter.fPaint = fIter.fSavedPaint; | |
55 } | |
56 | |
57 SkLayerDrawLooper::Rec* SkLayerDrawLooper::Rec::Reverse(Rec* head) { | |
58 Rec* rec = head; | |
59 Rec* prev = NULL; | |
60 while (rec) { | |
61 Rec* next = rec->fNext; | |
62 rec->fNext = prev; | |
63 prev = rec; | |
64 rec = next; | |
65 } | |
66 return prev; | |
67 } | |
68 | |
69 /////////////////////////////////////////////////////////////////////////////// | |
70 | |
71 void SkLayerDrawLooper::flatten(SkFlattenableWriteBuffer& buffer) { | |
72 this->INHERITED::flatten(buffer); | |
73 | |
74 #ifdef SK_DEBUG | |
75 { | |
76 Rec* rec = fRecs; | |
77 int count = 0; | |
78 while (rec) { | |
79 rec = rec->fNext; | |
80 count += 1; | |
81 } | |
82 SkASSERT(count == fCount); | |
83 } | |
84 #endif | |
85 | |
86 buffer.writeInt(fCount); | |
87 | |
88 Rec* rec = fRecs; | |
89 for (int i = 0; i < fCount; i++) { | |
90 buffer.writeScalar(rec->fOffset.fX); | |
91 buffer.writeScalar(rec->fOffset.fY); | |
92 rec->fPaint.flatten(buffer); | |
93 rec = rec->fNext; | |
94 } | |
95 } | |
96 | |
97 SkLayerDrawLooper::SkLayerDrawLooper(SkFlattenableReadBuffer& buffer) | |
98 : INHERITED(buffer) { | |
99 fRecs = NULL; | |
100 fCount = 0; | |
101 | |
102 int count = buffer.readInt(); | |
103 | |
104 for (int i = 0; i < count; i++) { | |
105 SkScalar dx = buffer.readScalar(); | |
106 SkScalar dy = buffer.readScalar(); | |
107 this->addLayer(dx, dy)->unflatten(buffer); | |
108 } | |
109 SkASSERT(count == fCount); | |
110 | |
111 // we're in reverse order, so fix it now | |
112 fRecs = Rec::Reverse(fRecs); | |
113 | |
114 #ifdef SK_DEBUG | |
115 { | |
116 Rec* rec = fRecs; | |
117 int n = 0; | |
118 while (rec) { | |
119 rec = rec->fNext; | |
120 n += 1; | |
121 } | |
122 SkASSERT(count == n); | |
123 } | |
124 #endif | |
125 } | |
126 | |
127 /////////////////////////////////////////////////////////////////////////////// | |
128 | |
129 static SkFlattenable::Registrar gReg("SkLayerDrawLooper", | |
130 SkLayerDrawLooper::CreateProc); | |
OLD | NEW |