blob: 6aeefd888682336cad5db8582fa0ffd2f9529be1 [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);
44 return true;
reed@android.com8a1c16f2008-12-17 15:59:43 +000045}
46
47SkLayerDrawLooper::Rec* SkLayerDrawLooper::Rec::Reverse(Rec* head) {
48 Rec* rec = head;
49 Rec* prev = NULL;
50 while (rec) {
51 Rec* next = rec->fNext;
52 rec->fNext = prev;
53 prev = rec;
54 rec = next;
55 }
56 return prev;
57}
58
59///////////////////////////////////////////////////////////////////////////////
60
61void SkLayerDrawLooper::flatten(SkFlattenableWriteBuffer& buffer) {
62 this->INHERITED::flatten(buffer);
63
64#ifdef SK_DEBUG
65 {
66 Rec* rec = fRecs;
67 int count = 0;
68 while (rec) {
69 rec = rec->fNext;
70 count += 1;
71 }
72 SkASSERT(count == fCount);
73 }
74#endif
75
76 buffer.writeInt(fCount);
77
78 Rec* rec = fRecs;
79 for (int i = 0; i < fCount; i++) {
80 buffer.writeScalar(rec->fOffset.fX);
81 buffer.writeScalar(rec->fOffset.fY);
82 rec->fPaint.flatten(buffer);
83 rec = rec->fNext;
84 }
85}
86
87SkLayerDrawLooper::SkLayerDrawLooper(SkFlattenableReadBuffer& buffer)
88 : INHERITED(buffer) {
89 fRecs = NULL;
90 fCount = 0;
91
92 int count = buffer.readInt();
93
94 for (int i = 0; i < count; i++) {
95 SkScalar dx = buffer.readScalar();
96 SkScalar dy = buffer.readScalar();
97 this->addLayer(dx, dy)->unflatten(buffer);
98 }
99 SkASSERT(count == fCount);
100
101 // we're in reverse order, so fix it now
102 fRecs = Rec::Reverse(fRecs);
103
104#ifdef SK_DEBUG
105 {
106 Rec* rec = fRecs;
107 int n = 0;
108 while (rec) {
109 rec = rec->fNext;
110 n += 1;
111 }
112 SkASSERT(count == n);
113 }
114#endif
115}
116
117///////////////////////////////////////////////////////////////////////////////
118
119static SkFlattenable::Registrar gReg("SkLayerDrawLooper",
120 SkLayerDrawLooper::CreateProc);