Index: tests/ImageFilterTest.cpp |
diff --git a/tests/ImageFilterTest.cpp b/tests/ImageFilterTest.cpp |
index cfba1fa87df55fcde08f13dbc47f538dd3241159..4c8ddc6657ff0d23f47bdd8cb04eabeef0664daf 100644 |
--- a/tests/ImageFilterTest.cpp |
+++ b/tests/ImageFilterTest.cpp |
@@ -19,6 +19,7 @@ |
#include "SkFlattenableBuffers.h" |
#include "SkLightingImageFilter.h" |
#include "SkMatrixConvolutionImageFilter.h" |
+#include "SkMatrixImageFilter.h" |
#include "SkMergeImageFilter.h" |
#include "SkMorphologyImageFilter.h" |
#include "SkOffsetImageFilter.h" |
@@ -363,6 +364,57 @@ static void test_xfermode_cropped_input(SkBaseDevice* device, skiatest::Reporter |
REPORTER_ASSERT(reporter, pixel == SK_ColorGREEN); |
} |
+DEF_TEST(ImageFilterNestedSaveLayer, reporter) { |
+ SkBitmap temp; |
+ temp.allocN32Pixels(50, 50); |
+ SkBitmapDevice device(temp); |
+ SkCanvas canvas(&device); |
+ canvas.clear(0x0); |
+ |
+ SkBitmap bitmap; |
+ bitmap.allocN32Pixels(10, 10); |
+ bitmap.eraseColor(SK_ColorGREEN); |
+ |
+ SkMatrix matrix; |
+ matrix.setScale(SkIntToScalar(2), SkIntToScalar(2)); |
+ matrix.postTranslate(SkIntToScalar(-20), SkIntToScalar(-20)); |
+ SkAutoTUnref<SkImageFilter> matrixFilter( |
+ SkMatrixImageFilter::Create(matrix, SkPaint::kLow_FilterLevel)); |
+ |
+ // Test that saveLayer() with a filter nested inside another saveLayer() applies the |
+ // correct offset to the filter matrix. |
+ SkRect bounds1 = SkRect::MakeXYWH(10, 10, 30, 30); |
+ canvas.saveLayer(&bounds1, NULL); |
+ SkPaint filterPaint; |
+ filterPaint.setImageFilter(matrixFilter); |
+ SkRect bounds2 = SkRect::MakeXYWH(20, 20, 10, 10); |
+ canvas.saveLayer(&bounds2, &filterPaint); |
+ SkPaint greenPaint; |
+ greenPaint.setColor(SK_ColorGREEN); |
+ canvas.drawRect(bounds2, greenPaint); |
+ canvas.restore(); |
+ canvas.restore(); |
+ SkPaint strokePaint; |
+ strokePaint.setStyle(SkPaint::kStroke_Style); |
+ strokePaint.setColor(SK_ColorRED); |
+ |
+ SkImageInfo info = SkImageInfo::MakeN32Premul(1, 1); |
+ uint32_t pixel; |
+ canvas.readPixels(info, &pixel, 4, 25, 25); |
+ REPORTER_ASSERT(reporter, pixel == SK_ColorGREEN); |
+ |
+ // Test that drawSprite() with a filter nested inside a saveLayer() applies the |
+ // correct offset to the filter matrix. |
+ canvas.clear(0x0); |
+ canvas.readPixels(info, &pixel, 4, 25, 25); |
+ canvas.saveLayer(&bounds1, NULL); |
+ canvas.drawSprite(bitmap, 20, 20, &filterPaint); |
+ canvas.restore(); |
+ |
+ canvas.readPixels(info, &pixel, 4, 25, 25); |
+ REPORTER_ASSERT(reporter, pixel == SK_ColorGREEN); |
+} |
+ |
DEF_TEST(XfermodeImageFilterCroppedInput, reporter) { |
SkBitmap temp; |
temp.allocN32Pixels(100, 100); |