00001 #ifndef SkLayerDrawLooper_DEFINED 00002 #define SkLayerDrawLooper_DEFINED 00003 00004 #include "SkDrawLooper.h" 00005 00006 struct SkPoint; 00007 00008 class SkLayerDrawLooper : public SkDrawLooper { 00009 public: 00010 SkLayerDrawLooper(); 00011 virtual ~SkLayerDrawLooper(); 00012 00017 SkPaint* addLayer(SkScalar dx, SkScalar dy); 00018 00021 SkPaint* addLayer() { 00022 return this->addLayer(0, 0); 00023 } 00024 00025 // overrides from SkDrawLooper 00026 virtual void init(SkCanvas*, SkPaint*); 00027 virtual bool next(); 00028 virtual void restore(); 00029 00030 // must be public for Registrar :( 00031 static SkFlattenable* CreateProc(SkFlattenableReadBuffer& buffer) { 00032 return SkNEW_ARGS(SkLayerDrawLooper, (buffer)); 00033 } 00034 00035 protected: 00036 SkLayerDrawLooper(SkFlattenableReadBuffer&); 00037 00038 // overrides from SkFlattenable 00039 virtual void flatten(SkFlattenableWriteBuffer& ); 00040 virtual Factory getFactory() { return CreateProc; } 00041 00042 private: 00043 struct Rec { 00044 Rec* fNext; 00045 SkPaint fPaint; 00046 SkPoint fOffset; 00047 00048 static Rec* Reverse(Rec*); 00049 }; 00050 Rec* fRecs; 00051 int fCount; 00052 00053 struct Iter { 00054 SkPaint fSavedPaint; 00055 SkPaint* fPaint; 00056 SkCanvas* fCanvas; 00057 Rec* fRec; 00058 }; 00059 Iter fIter; 00060 00061 class MyRegistrar : public SkFlattenable::Registrar { 00062 public: 00063 MyRegistrar(); 00064 }; 00065 00066 typedef SkDrawLooper INHERITED; 00067 }; 00068 00069 00070 #endif