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