SkLayerDrawLooper.cpp revision 4e2b3d3fb1288c6dc0f3ea1c0aa4a0d7c603bd7b
1#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
30void SkLayerDrawLooper::init(SkCanvas* canvas) {
31    fCurrRec = fRecs;
32    canvas->save(SkCanvas::kMatrix_SaveFlag);
33}
34
35bool SkLayerDrawLooper::next(SkCanvas* canvas, SkPaint* paint) {
36    canvas->restore();
37    if (NULL == fCurrRec) {
38        return false;
39    }
40
41    *paint = fCurrRec->fPaint;
42    canvas->save(SkCanvas::kMatrix_SaveFlag);
43    canvas->translate(fCurrRec->fOffset.fX, fCurrRec->fOffset.fY);
44    return true;
45}
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);
121