• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 #include "SkCanvas.h"
2 #include "SkLayerDrawLooper.h"
3 #include "SkPaint.h"
4 
SkLayerDrawLooper()5 SkLayerDrawLooper::SkLayerDrawLooper() {
6     fRecs = NULL;
7     fCount = 0;
8 }
9 
~SkLayerDrawLooper()10 SkLayerDrawLooper::~SkLayerDrawLooper() {
11     Rec* rec = fRecs;
12     while (rec) {
13         Rec* next = rec->fNext;
14         SkDELETE(rec);
15         rec = next;
16     }
17 }
18 
addLayer(SkScalar dx,SkScalar dy)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 
init(SkCanvas * canvas,SkPaint * paint)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 
next()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 
restore()52 void SkLayerDrawLooper::restore() {
53     fIter.fCanvas->restore();
54     *fIter.fPaint = fIter.fSavedPaint;
55 }
56 
Reverse(Rec * head)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 
flatten(SkFlattenableWriteBuffer & buffer)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 
SkLayerDrawLooper(SkFlattenableReadBuffer & buffer)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);
131