| Index: tests/ImageFilterTest.cpp
|
| diff --git a/tests/ImageFilterTest.cpp b/tests/ImageFilterTest.cpp
|
| index 48e86ddbb0b1eb271e64db7aca651241392617b7..36aa590b7466e926e4bd8823d9fd67bda8ea3542 100644
|
| --- a/tests/ImageFilterTest.cpp
|
| +++ b/tests/ImageFilterTest.cpp
|
| @@ -17,6 +17,7 @@
|
| #include "SkDisplacementMapEffect.h"
|
| #include "SkDropShadowImageFilter.h"
|
| #include "SkFlattenableBuffers.h"
|
| +#include "SkFlattenableSerialization.h"
|
| #include "SkGradientShader.h"
|
| #include "SkLightingImageFilter.h"
|
| #include "SkMatrixConvolutionImageFilter.h"
|
| @@ -25,6 +26,7 @@
|
| #include "SkMorphologyImageFilter.h"
|
| #include "SkOffsetImageFilter.h"
|
| #include "SkPicture.h"
|
| +#include "SkPictureImageFilter.h"
|
| #include "SkPictureRecorder.h"
|
| #include "SkRect.h"
|
| #include "SkTileImageFilter.h"
|
| @@ -481,6 +483,66 @@ DEF_TEST(ImageFilterMatrixTest, reporter) {
|
| canvas.drawPicture(*picture);
|
| }
|
|
|
| +DEF_TEST(ImageFilterPictureImageFilterTest, reporter) {
|
| +
|
| + SkRTreeFactory factory;
|
| + SkPictureRecorder recorder;
|
| + SkCanvas* recordingCanvas = recorder.beginRecording(1, 1, &factory, 0);
|
| +
|
| + // Create an SkPicture which simply draws a green 1x1 rectangle.
|
| + SkPaint greenPaint;
|
| + greenPaint.setColor(SK_ColorGREEN);
|
| + recordingCanvas->drawRect(SkRect::Make(SkIRect::MakeWH(1, 1)), greenPaint);
|
| + SkAutoTUnref<SkPicture> picture(recorder.endRecording());
|
| +
|
| + // Wrap that SkPicture in an SkPictureImageFilter.
|
| + SkAutoTUnref<SkImageFilter> imageFilter(
|
| + SkPictureImageFilter::Create(picture.get()));
|
| +
|
| + // Check that SkPictureImageFilter successfully serializes its contained
|
| + // SkPicture when not in cross-process mode.
|
| + SkPaint paint;
|
| + paint.setImageFilter(imageFilter.get());
|
| + SkPictureRecorder outerRecorder;
|
| + SkCanvas* outerCanvas = outerRecorder.beginRecording(1, 1, &factory, 0);
|
| + SkPaint redPaintWithFilter;
|
| + redPaintWithFilter.setColor(SK_ColorRED);
|
| + redPaintWithFilter.setImageFilter(imageFilter.get());
|
| + outerCanvas->drawRect(SkRect::Make(SkIRect::MakeWH(1, 1)), redPaintWithFilter);
|
| + SkAutoTUnref<SkPicture> outerPicture(outerRecorder.endRecording());
|
| +
|
| + SkBitmap bitmap;
|
| + bitmap.allocN32Pixels(1, 1);
|
| + SkBitmapDevice device(bitmap);
|
| + SkCanvas canvas(&device);
|
| +
|
| + // The result here should be green, since the filter
|
| + canvas.clear(0x0);
|
| + canvas.drawPicture(*outerPicture);
|
| + uint32_t pixel = *bitmap.getAddr32(0, 0);
|
| + REPORTER_ASSERT(reporter, pixel == SK_ColorGREEN);
|
| +
|
| + // Check that, for now, SkPictureImageFilter does not serialize or
|
| + // deserialize its contained picture when the filter is serialized
|
| + // cross-process. Do this by "laundering" it through SkValidatingReadBuffer.
|
| + SkAutoTUnref<SkData> data(SkValidatingSerializeFlattenable(imageFilter.get()));
|
| + SkFlattenable* flattenable = SkValidatingDeserializeFlattenable(
|
| + data->data(), data->size(), SkImageFilter::GetFlattenableType());
|
| + SkImageFilter* unflattenedFilter = static_cast<SkImageFilter*>(flattenable);
|
| +
|
| + redPaintWithFilter.setImageFilter(unflattenedFilter);
|
| + SkPictureRecorder crossProcessRecorder;
|
| + SkCanvas* crossProcessCanvas = crossProcessRecorder.beginRecording(1, 1, &factory, 0);
|
| + crossProcessCanvas->drawRect(SkRect::Make(SkIRect::MakeWH(1, 1)), redPaintWithFilter);
|
| + SkAutoTUnref<SkPicture> crossProcessPicture(crossProcessRecorder.endRecording());
|
| +
|
| + canvas.clear(SK_ColorBLUE);
|
| + canvas.drawPicture(*crossProcessPicture);
|
| + pixel = *bitmap.getAddr32(0, 0);
|
| + // The result here should be the canvas background (blue), since the filter draws nothing.
|
| + REPORTER_ASSERT(reporter, pixel == SK_ColorBLUE);
|
| +}
|
| +
|
| DEF_TEST(ImageFilterEmptySaveLayerTest, reporter) {
|
|
|
| // Even when there's an empty saveLayer()/restore(), ensure that an image
|
|
|