summaryrefslogtreecommitdiffstats
path: root/skia/effects/SkLayerDrawLooper.cpp
diff options
context:
space:
mode:
authorbrettw@google.com <brettw@google.com@0039d316-1c4b-4281-b951-d872f2087c98>2008-12-12 21:01:41 +0000
committerbrettw@google.com <brettw@google.com@0039d316-1c4b-4281-b951-d872f2087c98>2008-12-12 21:01:41 +0000
commit52e935d04c59135739c3a68fb6e19d313dc6d5ad (patch)
tree95f7ab178b045bef4456cbf92c6aa7e476becd99 /skia/effects/SkLayerDrawLooper.cpp
parent30fab79877b4bb067944b74d98346ac9bb6bfc7e (diff)
downloadchromium_src-52e935d04c59135739c3a68fb6e19d313dc6d5ad.zip
chromium_src-52e935d04c59135739c3a68fb6e19d313dc6d5ad.tar.gz
chromium_src-52e935d04c59135739c3a68fb6e19d313dc6d5ad.tar.bz2
New drop of Skia. This is up to CL 121320.
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@6925 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'skia/effects/SkLayerDrawLooper.cpp')
-rw-r--r--skia/effects/SkLayerDrawLooper.cpp130
1 files changed, 130 insertions, 0 deletions
diff --git a/skia/effects/SkLayerDrawLooper.cpp b/skia/effects/SkLayerDrawLooper.cpp
new file mode 100644
index 0000000..f2d8ba8
--- /dev/null
+++ b/skia/effects/SkLayerDrawLooper.cpp
@@ -0,0 +1,130 @@
+#include "SkCanvas.h"
+#include "SkLayerDrawLooper.h"
+#include "SkPaint.h"
+
+SkLayerDrawLooper::SkLayerDrawLooper() {
+ fRecs = NULL;
+ fCount = 0;
+}
+
+SkLayerDrawLooper::~SkLayerDrawLooper() {
+ Rec* rec = fRecs;
+ while (rec) {
+ Rec* next = rec->fNext;
+ SkDELETE(rec);
+ rec = next;
+ }
+}
+
+SkPaint* SkLayerDrawLooper::addLayer(SkScalar dx, SkScalar dy) {
+ fCount += 1;
+
+ Rec* rec = SkNEW(Rec);
+ rec->fNext = fRecs;
+ rec->fOffset.set(dx, dy);
+ fRecs = rec;
+
+ return &rec->fPaint;
+}
+
+void SkLayerDrawLooper::init(SkCanvas* canvas, SkPaint* paint) {
+ fIter.fSavedPaint = *paint;
+ fIter.fPaint = paint;
+ fIter.fCanvas = canvas;
+ fIter.fRec = fRecs;
+ canvas->save(SkCanvas::kMatrix_SaveFlag);
+}
+
+bool SkLayerDrawLooper::next() {
+ Rec* rec = fIter.fRec;
+ if (rec) {
+ *fIter.fPaint = rec->fPaint;
+ fIter.fCanvas->restore();
+ fIter.fCanvas->save(SkCanvas::kMatrix_SaveFlag);
+ fIter.fCanvas->translate(rec->fOffset.fX, rec->fOffset.fY);
+
+ fIter.fRec = rec->fNext;
+ return true;
+ }
+ return false;
+}
+
+void SkLayerDrawLooper::restore() {
+ fIter.fCanvas->restore();
+ *fIter.fPaint = fIter.fSavedPaint;
+}
+
+SkLayerDrawLooper::Rec* SkLayerDrawLooper::Rec::Reverse(Rec* head) {
+ Rec* rec = head;
+ Rec* prev = NULL;
+ while (rec) {
+ Rec* next = rec->fNext;
+ rec->fNext = prev;
+ prev = rec;
+ rec = next;
+ }
+ return prev;
+}
+
+///////////////////////////////////////////////////////////////////////////////
+
+void SkLayerDrawLooper::flatten(SkFlattenableWriteBuffer& buffer) {
+ this->INHERITED::flatten(buffer);
+
+#ifdef SK_DEBUG
+ {
+ Rec* rec = fRecs;
+ int count = 0;
+ while (rec) {
+ rec = rec->fNext;
+ count += 1;
+ }
+ SkASSERT(count == fCount);
+ }
+#endif
+
+ buffer.writeInt(fCount);
+
+ Rec* rec = fRecs;
+ for (int i = 0; i < fCount; i++) {
+ buffer.writeScalar(rec->fOffset.fX);
+ buffer.writeScalar(rec->fOffset.fY);
+ rec->fPaint.flatten(buffer);
+ rec = rec->fNext;
+ }
+}
+
+SkLayerDrawLooper::SkLayerDrawLooper(SkFlattenableReadBuffer& buffer)
+ : INHERITED(buffer) {
+ fRecs = NULL;
+ fCount = 0;
+
+ int count = buffer.readInt();
+
+ for (int i = 0; i < count; i++) {
+ SkScalar dx = buffer.readScalar();
+ SkScalar dy = buffer.readScalar();
+ this->addLayer(dx, dy)->unflatten(buffer);
+ }
+ SkASSERT(count == fCount);
+
+ // we're in reverse order, so fix it now
+ fRecs = Rec::Reverse(fRecs);
+
+#ifdef SK_DEBUG
+ {
+ Rec* rec = fRecs;
+ int n = 0;
+ while (rec) {
+ rec = rec->fNext;
+ n += 1;
+ }
+ SkASSERT(count == n);
+ }
+#endif
+}
+
+///////////////////////////////////////////////////////////////////////////////
+
+static SkFlattenable::Registrar gReg("SkLayerDrawLooper",
+ SkLayerDrawLooper::CreateProc);