blob: 32b56d694822d255feb24808826329e1ccd5ce46 [file] [log] [blame]
reed@android.com8a1c16f2008-12-17 15:59:43 +00001#include "SkCanvas.h"
2#include "SkLayerDrawLooper.h"
3#include "SkPaint.h"
4
5SkLayerDrawLooper::SkLayerDrawLooper() {
6 fRecs = NULL;
7 fCount = 0;
8}
9
10SkLayerDrawLooper::~SkLayerDrawLooper() {
11 Rec* rec = fRecs;
12 while (rec) {
13 Rec* next = rec->fNext;
14 SkDELETE(rec);
15 rec = next;
16 }
17}
18
19SkPaint* 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
reed@google.com4e2b3d32011-04-07 14:18:59 +000030void SkLayerDrawLooper::init(SkCanvas* canvas) {
31 fCurrRec = fRecs;
reed@android.com8a1c16f2008-12-17 15:59:43 +000032 canvas->save(SkCanvas::kMatrix_SaveFlag);
33}
34
reed@google.com4e2b3d32011-04-07 14:18:59 +000035bool SkLayerDrawLooper::next(SkCanvas* canvas, SkPaint* paint) {
36 canvas->restore();
37 if (NULL == fCurrRec) {
38 return false;
reed@android.com8a1c16f2008-12-17 15:59:43 +000039 }
reed@android.com8a1c16f2008-12-17 15:59:43 +000040
reed@google.com4e2b3d32011-04-07 14:18:59 +000041 *paint = fCurrRec->fPaint;
42 canvas->save(SkCanvas::kMatrix_SaveFlag);
43 canvas->translate(fCurrRec->fOffset.fX, fCurrRec->fOffset.fY);
mike@reedtribe.orge5d0def2011-04-08 00:53:48 +000044 fCurrRec = fCurrRec->fNext;
45
reed@google.com4e2b3d32011-04-07 14:18:59 +000046 return true;
reed@android.com8a1c16f2008-12-17 15:59:43 +000047}
48
49SkLayerDrawLooper::Rec* SkLayerDrawLooper::Rec::Reverse(Rec* head) {
50 Rec* rec = head;
51 Rec* prev = NULL;
52 while (rec) {
53 Rec* next = rec->fNext;
54 rec->fNext = prev;
55 prev = rec;
56 rec = next;
57 }
58 return prev;
59}
60
61///////////////////////////////////////////////////////////////////////////////
62
63void SkLayerDrawLooper::flatten(SkFlattenableWriteBuffer& buffer) {
64 this->INHERITED::flatten(buffer);
65
66#ifdef SK_DEBUG
67 {
68 Rec* rec = fRecs;
69 int count = 0;
70 while (rec) {
71 rec = rec->fNext;
72 count += 1;
73 }
74 SkASSERT(count == fCount);
75 }
76#endif
77
78 buffer.writeInt(fCount);
79
80 Rec* rec = fRecs;
81 for (int i = 0; i < fCount; i++) {
82 buffer.writeScalar(rec->fOffset.fX);
83 buffer.writeScalar(rec->fOffset.fY);
84 rec->fPaint.flatten(buffer);
85 rec = rec->fNext;
86 }
87}
88
89SkLayerDrawLooper::SkLayerDrawLooper(SkFlattenableReadBuffer& buffer)
90 : INHERITED(buffer) {
91 fRecs = NULL;
92 fCount = 0;
93
94 int count = buffer.readInt();
95
96 for (int i = 0; i < count; i++) {
97 SkScalar dx = buffer.readScalar();
98 SkScalar dy = buffer.readScalar();
99 this->addLayer(dx, dy)->unflatten(buffer);
100 }
101 SkASSERT(count == fCount);
102
103 // we're in reverse order, so fix it now
104 fRecs = Rec::Reverse(fRecs);
105
106#ifdef SK_DEBUG
107 {
108 Rec* rec = fRecs;
109 int n = 0;
110 while (rec) {
111 rec = rec->fNext;
112 n += 1;
113 }
114 SkASSERT(count == n);
115 }
116#endif
117}
118
119///////////////////////////////////////////////////////////////////////////////
120
121static SkFlattenable::Registrar gReg("SkLayerDrawLooper",
122 SkLayerDrawLooper::CreateProc);