This change makes SkImageFilter and SkBlurImageFilter flattenable/unflattenable.
The imageblur test also needed to stop calling getDeviceSize(), since it was
returning 99999x99999 for the SkPicture case.
git-svn-id: http://skia.googlecode.com/svn/trunk@2699 2bbb7eff-a529-9590-31e7-b0007b416f81
diff --git a/gm/imageblur.cpp b/gm/imageblur.cpp
index fe9d6c2..841441e 100644
--- a/gm/imageblur.cpp
+++ b/gm/imageblur.cpp
@@ -8,6 +8,9 @@
#include "gm.h"
#include "SkBlurImageFilter.h"
+#define WIDTH 500
+#define HEIGHT 500
+
namespace skiagm {
class ImageBlurGM : public GM {
@@ -22,22 +25,19 @@
}
virtual SkISize onISize() {
- return make_isize(500, 500);
+ return make_isize(WIDTH, HEIGHT);
}
virtual void onDraw(SkCanvas* canvas) {
SkPaint paint;
paint.setImageFilter(new SkBlurImageFilter(24.0f, 0.0f))->unref();
canvas->saveLayer(NULL, &paint);
- paint.setColor(0xFFFFFFFF);
- paint.setTextSize(100);
paint.setAntiAlias(true);
const char* str = "The quick brown fox jumped over the lazy dog.";
srand(1234);
- SkISize size = canvas->getDeviceSize();
for (int i = 0; i < 25; ++i) {
- int x = rand() % size.fWidth;
- int y = rand() % size.fHeight;
+ int x = rand() % WIDTH;
+ int y = rand() % HEIGHT;
paint.setColor(rand() % 0x1000000 | 0xFF000000);
paint.setTextSize(rand() % 300);
canvas->drawText(str, strlen(str), x, y, paint);
diff --git a/include/core/SkImageFilter.h b/include/core/SkImageFilter.h
index c59b2cd..bd4e8f5 100644
--- a/include/core/SkImageFilter.h
+++ b/include/core/SkImageFilter.h
@@ -25,7 +25,7 @@
*
* If the imagefilter returns false, nothing is drawn.
*/
-class SK_API SkImageFilter : public SkRefCnt /*SkFlattenable*/ {
+class SK_API SkImageFilter : public SkFlattenable {
public:
/**
@@ -53,11 +53,13 @@
virtual bool asABlur(SkSize* sigma) const;
protected:
+ SkImageFilter() {}
+ explicit SkImageFilter(SkFlattenableReadBuffer& rb) : INHERITED(rb) {}
virtual bool onFilterImage(const SkBitmap& src, const SkMatrix&,
SkBitmap* result, SkIPoint* offset);
private:
- typedef SkRefCnt INHERITED;
+ typedef SkFlattenable INHERITED;
};
#endif
diff --git a/include/effects/SkBlurImageFilter.h b/include/effects/SkBlurImageFilter.h
index ceab31a..c9ef882 100644
--- a/include/effects/SkBlurImageFilter.h
+++ b/include/effects/SkBlurImageFilter.h
@@ -15,8 +15,16 @@
public:
SkBlurImageFilter(SkScalar sigmaX, SkScalar sigmaY);
virtual bool asABlur(SkSize* sigma) const;
+ static SkFlattenable* CreateProc(SkFlattenableReadBuffer& buffer) {
+ return SkNEW_ARGS(SkBlurImageFilter, (buffer));
+ }
+protected:
+ explicit SkBlurImageFilter(SkFlattenableReadBuffer& buffer);
+ virtual void flatten(SkFlattenableWriteBuffer& buffer);
+ virtual Factory getFactory() { return CreateProc; }
private:
SkSize fSigma;
+ typedef SkImageFilter INHERITED;
};
#endif
diff --git a/src/core/SkPaint.cpp b/src/core/SkPaint.cpp
index 2d0cfe4..e1fd85a 100644
--- a/src/core/SkPaint.cpp
+++ b/src/core/SkPaint.cpp
@@ -1592,7 +1592,8 @@
asint(this->getMaskFilter()) |
asint(this->getColorFilter()) |
asint(this->getRasterizer()) |
- asint(this->getLooper())) {
+ asint(this->getLooper()) |
+ asint(this->getImageFilter())) {
flatFlags |= kHasEffects_FlatFlag;
}
@@ -1628,6 +1629,7 @@
buffer.writeFlattenable(this->getColorFilter());
buffer.writeFlattenable(this->getRasterizer());
buffer.writeFlattenable(this->getLooper());
+ buffer.writeFlattenable(this->getImageFilter());
}
}
@@ -1677,6 +1679,7 @@
SkSafeUnref(this->setColorFilter((SkColorFilter*) buffer.readFlattenable()));
SkSafeUnref(this->setRasterizer((SkRasterizer*) buffer.readFlattenable()));
SkSafeUnref(this->setLooper((SkDrawLooper*) buffer.readFlattenable()));
+ SkSafeUnref(this->setImageFilter((SkImageFilter*) buffer.readFlattenable()));
} else {
this->setPathEffect(NULL);
this->setShader(NULL);
@@ -1685,6 +1688,7 @@
this->setColorFilter(NULL);
this->setRasterizer(NULL);
this->setLooper(NULL);
+ this->setImageFilter(NULL);
}
}
diff --git a/src/effects/SkBlurImageFilter.cpp b/src/effects/SkBlurImageFilter.cpp
index 7777f31..8971c61 100644
--- a/src/effects/SkBlurImageFilter.cpp
+++ b/src/effects/SkBlurImageFilter.cpp
@@ -7,6 +7,12 @@
#include "SkBlurImageFilter.h"
+SkBlurImageFilter::SkBlurImageFilter(SkFlattenableReadBuffer& buffer)
+ : INHERITED(buffer) {
+ fSigma.fWidth = buffer.readScalar();
+ fSigma.fHeight = buffer.readScalar();
+}
+
SkBlurImageFilter::SkBlurImageFilter(SkScalar sigmaX, SkScalar sigmaY)
: fSigma(SkSize::Make(sigmaX, sigmaY)) {
SkASSERT(sigmaX >= 0 && sigmaY >= 0);
@@ -16,3 +22,12 @@
*sigma = fSigma;
return true;
}
+
+void SkBlurImageFilter::flatten(SkFlattenableWriteBuffer& buffer) {
+ this->INHERITED::flatten(buffer);
+ buffer.writeScalar(fSigma.fWidth);
+ buffer.writeScalar(fSigma.fHeight);
+}
+
+static SkFlattenable::Registrar
+ gSrcColorFilterReg("SkBlurImageFilter", SkBlurImageFilter::CreateProc);