summaryrefslogtreecommitdiffstats
path: root/skia/effects/SkBlurDrawLooper.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'skia/effects/SkBlurDrawLooper.cpp')
-rw-r--r--skia/effects/SkBlurDrawLooper.cpp86
1 files changed, 86 insertions, 0 deletions
diff --git a/skia/effects/SkBlurDrawLooper.cpp b/skia/effects/SkBlurDrawLooper.cpp
new file mode 100644
index 0000000..61b69eb
--- /dev/null
+++ b/skia/effects/SkBlurDrawLooper.cpp
@@ -0,0 +1,86 @@
+#include "SkBlurDrawLooper.h"
+#include "SkBlurMaskFilter.h"
+#include "SkCanvas.h"
+#include "SkPaint.h"
+#include "SkMaskFilter.h"
+
+SkBlurDrawLooper::SkBlurDrawLooper(SkScalar radius, SkScalar dx, SkScalar dy,
+ SkColor color)
+ : fDx(dx), fDy(dy), fBlurColor(color)
+{
+ if (radius > 0)
+ fBlur = SkBlurMaskFilter::Create(radius,
+ SkBlurMaskFilter::kNormal_BlurStyle);
+ else
+ fBlur = NULL;
+}
+
+SkBlurDrawLooper::SkBlurDrawLooper(SkFlattenableReadBuffer& buffer)
+{
+ fDx = buffer.readScalar();
+ fDy = buffer.readScalar();
+ fBlurColor = buffer.readU32();
+ fBlur = static_cast<SkMaskFilter*>(buffer.readFlattenable());
+}
+
+SkBlurDrawLooper::~SkBlurDrawLooper()
+{
+ fBlur->safeUnref();
+}
+
+void SkBlurDrawLooper::flatten(SkFlattenableWriteBuffer& buffer)
+{
+ buffer.writeScalar(fDx);
+ buffer.writeScalar(fDy);
+ buffer.write32(fBlurColor);
+ buffer.writeFlattenable(fBlur);
+}
+
+void SkBlurDrawLooper::init(SkCanvas* canvas, SkPaint* paint)
+{
+ // we do nothing if a maskfilter is already installed
+ if (paint->getMaskFilter() != NULL)
+ fState = kDone;
+ else
+ {
+ fState = kBeforeEdge;
+ fPaint = paint;
+ fCanvas = canvas;
+ fSaveCount = canvas->getSaveCount();
+ }
+}
+
+bool SkBlurDrawLooper::next()
+{
+ switch (fState) {
+ case kBeforeEdge:
+ fSavedColor = fPaint->getColor();
+ fPaint->setColor(fBlurColor);
+ fPaint->setMaskFilter(fBlur);
+ fCanvas->save(SkCanvas::kMatrix_SaveFlag);
+ fCanvas->translate(fDx, fDy);
+ fState = kAfterEdge;
+ return true;
+ case kAfterEdge:
+ fPaint->setColor(fSavedColor);
+ fPaint->setMaskFilter(NULL);
+ fCanvas->restore(); // to remove the translate we did earlier
+ fState = kDone;
+ return true;
+ default:
+ SkASSERT(kDone == fState);
+ return false;
+ }
+}
+
+void SkBlurDrawLooper::restore()
+{
+ if (kAfterEdge == fState)
+ {
+ fPaint->setColor(fSavedColor);
+ fPaint->setMaskFilter(NULL);
+ fCanvas->restore(); // to remove the translate we did earlier
+ fState = kDone;
+ }
+}
+