1 #include "SkCanvas.h" 2 #include "SkLayerDrawLooper.h" 3 #include "SkPaint.h" 4 SkLayerDrawLooper()5SkLayerDrawLooper::SkLayerDrawLooper() { 6 fRecs = NULL; 7 fCount = 0; 8 } 9 ~SkLayerDrawLooper()10SkLayerDrawLooper::~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)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 init(SkCanvas * canvas,SkPaint * paint)30void 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()38bool 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()52void SkLayerDrawLooper::restore() { 53 fIter.fCanvas->restore(); 54 *fIter.fPaint = fIter.fSavedPaint; 55 } 56 Reverse(Rec * head)57SkLayerDrawLooper::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)71void 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)97SkLayerDrawLooper::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