OLD | NEW |
1 /* | 1 /* |
2 * Copyright 2013 Google Inc. | 2 * Copyright 2013 Google Inc. |
3 * | 3 * |
4 * Use of this source code is governed by a BSD-style license that can be | 4 * Use of this source code is governed by a BSD-style license that can be |
5 * found in the LICENSE file. | 5 * found in the LICENSE file. |
6 */ | 6 */ |
7 | 7 |
8 #include "SkBitmap.h" | 8 #include "SkBitmap.h" |
9 #include "SkBitmapDevice.h" | 9 #include "SkBitmapDevice.h" |
10 #include "SkBlurImageFilter.h" | 10 #include "SkBlurImageFilter.h" |
(...skipping 88 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
99 SkBitmap bitmap; | 99 SkBitmap bitmap; |
100 bitmap.allocN32Pixels(width, height); | 100 bitmap.allocN32Pixels(width, height); |
101 SkCanvas canvas(bitmap); | 101 SkCanvas canvas(bitmap); |
102 draw_gradient_circle(&canvas, width, height); | 102 draw_gradient_circle(&canvas, width, height); |
103 return bitmap; | 103 return bitmap; |
104 } | 104 } |
105 | 105 |
106 class FilterList { | 106 class FilterList { |
107 public: | 107 public: |
108 FilterList(SkImageFilter* input = nullptr, const SkImageFilter::CropRect* cr
opRect = nullptr) { | 108 FilterList(SkImageFilter* input = nullptr, const SkImageFilter::CropRect* cr
opRect = nullptr) { |
109 auto cf(SkColorFilter::MakeModeFilter(SK_ColorRED, SkXfermode::kSrcIn_Mo
de)); | |
110 SkPoint3 location = SkPoint3::Make(0, 0, SK_Scalar1); | 109 SkPoint3 location = SkPoint3::Make(0, 0, SK_Scalar1); |
111 SkScalar kernel[9] = { | 110 SkScalar kernel[9] = { |
112 SkIntToScalar( 1), SkIntToScalar( 1), SkIntToScalar( 1), | 111 SkIntToScalar( 1), SkIntToScalar( 1), SkIntToScalar( 1), |
113 SkIntToScalar( 1), SkIntToScalar(-7), SkIntToScalar( 1), | 112 SkIntToScalar( 1), SkIntToScalar(-7), SkIntToScalar( 1), |
114 SkIntToScalar( 1), SkIntToScalar( 1), SkIntToScalar( 1), | 113 SkIntToScalar( 1), SkIntToScalar( 1), SkIntToScalar( 1), |
115 }; | 114 }; |
116 const SkISize kernelSize = SkISize::Make(3, 3); | 115 const SkISize kernelSize = SkISize::Make(3, 3); |
117 const SkScalar gain = SK_Scalar1, bias = 0; | 116 const SkScalar gain = SK_Scalar1, bias = 0; |
118 const SkScalar five = SkIntToScalar(5); | 117 const SkScalar five = SkIntToScalar(5); |
119 | 118 |
120 sk_sp<SkImage> gradientImage(SkImage::MakeFromBitmap(make_gradient_circl
e(64, 64))); | |
121 sk_sp<SkImageFilter> gradientSource(SkImageSource::Make(std::move(gradie
ntImage))); | |
122 sk_sp<SkImageFilter> blur(SkBlurImageFilter::Create(five, five, input)); | |
123 SkMatrix matrix; | 119 SkMatrix matrix; |
124 | 120 |
125 matrix.setTranslate(SK_Scalar1, SK_Scalar1); | 121 matrix.setTranslate(SK_Scalar1, SK_Scalar1); |
126 matrix.postRotate(SkIntToScalar(45), SK_Scalar1, SK_Scalar1); | 122 matrix.postRotate(SkIntToScalar(45), SK_Scalar1, SK_Scalar1); |
127 | 123 |
128 SkRTreeFactory factory; | 124 { |
129 SkPictureRecorder recorder; | 125 sk_sp<SkColorFilter> cf(SkColorFilter::MakeModeFilter(SK_ColorRED, |
130 SkCanvas* recordingCanvas = recorder.beginRecording(64, 64, &factory, 0)
; | 126 SkXfermode::kS
rcIn_Mode)); |
131 | 127 |
132 SkPaint greenPaint; | 128 this->addFilter("color filter", |
133 greenPaint.setColor(SK_ColorGREEN); | 129 SkColorFilterImageFilter::Create(cf.get(), input, cropRect)); |
134 recordingCanvas->drawRect(SkRect::Make(SkIRect::MakeXYWH(10, 10, 30, 20)
), greenPaint); | 130 } |
135 sk_sp<SkPicture> picture(recorder.finishRecordingAsPicture()); | |
136 sk_sp<SkImageFilter> pictureFilter(SkPictureImageFilter::Make(picture)); | |
137 sk_sp<SkShader> shader(SkPerlinNoiseShader::MakeTurbulence(SK_Scalar1, S
K_Scalar1, 1, 0)); | |
138 | 131 |
139 SkPaint paint; | 132 { |
140 paint.setShader(shader); | 133 sk_sp<SkImage> gradientImage(SkImage::MakeFromBitmap(make_gradient_c
ircle(64, 64))); |
141 sk_sp<SkImageFilter> paintFilter(SkPaintImageFilter::Make(paint)); | 134 sk_sp<SkImageFilter> gradientSource(SkImageSource::Make(std::move(gr
adientImage))); |
142 | 135 |
143 sk_sp<SkShader> greenColorShader(SkShader::MakeColorShader(SK_ColorGREEN
)); | 136 this->addFilter("displacement map", SkDisplacementMapEffect::Create( |
144 SkPaint greenColorShaderPaint; | 137 SkDisplacementMapEffect::kR_ChannelSelectorType, |
145 greenColorShaderPaint.setShader(greenColorShader); | 138 SkDisplacementMapEffect::kB_ChannelSelectorType, |
146 SkImageFilter::CropRect leftSideCropRect(SkRect::MakeXYWH(0, 0, 32, 64))
; | 139 20.0f, gradientSource.get(), input, cropRect)); |
147 sk_sp<SkImageFilter> paintFilterLeft(SkPaintImageFilter::Make(greenColor
ShaderPaint, | 140 } |
148 &leftSideC
ropRect)); | |
149 SkImageFilter::CropRect rightSideCropRect(SkRect::MakeXYWH(32, 0, 32, 64
)); | |
150 sk_sp<SkImageFilter> paintFilterRight(SkPaintImageFilter::Make(greenColo
rShaderPaint, | |
151 &rightSid
eCropRect)); | |
152 | 141 |
153 this->addFilter("color filter", | 142 this->addFilter("blur", SkBlurImageFilter::Make(SK_Scalar1, |
154 SkColorFilterImageFilter::Create(cf.get(), input, cropRect)); | 143 SK_Scalar1, |
155 this->addFilter("displacement map", SkDisplacementMapEffect::Create( | 144 sk_ref_sp<SkImageFilter>
(input), |
156 SkDisplacementMapEffect::kR_ChannelSelectorType, | 145 cropRect).release()); |
157 SkDisplacementMapEffect::kB_ChannelSelectorType, | |
158 20.0f, gradientSource.get(), input, cropRect)); | |
159 this->addFilter("blur", SkBlurImageFilter::Create(SK_Scalar1, SK_Scalar1
, input, cropRect)); | |
160 this->addFilter("drop shadow", SkDropShadowImageFilter::Create( | 146 this->addFilter("drop shadow", SkDropShadowImageFilter::Create( |
161 SK_Scalar1, SK_Scalar1, SK_Scalar1, SK_Scalar1, SK_ColorGREEN, | 147 SK_Scalar1, SK_Scalar1, SK_Scalar1, SK_Scalar1, SK_ColorGREEN, |
162 SkDropShadowImageFilter::kDrawShadowAndForeground_ShadowMode,
input, cropRect)); | 148 SkDropShadowImageFilter::kDrawShadowAndForeground_ShadowMode,
input, cropRect)); |
163 this->addFilter("diffuse lighting", SkLightingImageFilter::CreatePointLi
tDiffuse( | 149 this->addFilter("diffuse lighting", SkLightingImageFilter::CreatePointLi
tDiffuse( |
164 location, SK_ColorGREEN, 0, 0, input, cropRect)); | 150 location, SK_ColorGREEN, 0, 0, input, cropRect)); |
165 this->addFilter("specular lighting", | 151 this->addFilter("specular lighting", |
166 SkLightingImageFilter::CreatePointLitSpecular(location, SK_Col
orGREEN, 0, 0, 0, | 152 SkLightingImageFilter::CreatePointLitSpecular(location, SK_Col
orGREEN, 0, 0, 0, |
167 input, cropRect)
); | 153 input, cropRect)
); |
168 this->addFilter("matrix convolution", | 154 this->addFilter("matrix convolution", |
169 SkMatrixConvolutionImageFilter::Create( | 155 SkMatrixConvolutionImageFilter::Create( |
170 kernelSize, kernel, gain, bias, SkIPoint::Make(1, 1), | 156 kernelSize, kernel, gain, bias, SkIPoint::Make(1, 1), |
171 SkMatrixConvolutionImageFilter::kRepeat_TileMode, false, i
nput, cropRect)); | 157 SkMatrixConvolutionImageFilter::kRepeat_TileMode, false, i
nput, cropRect)); |
172 this->addFilter("merge", SkMergeImageFilter::Make(sk_ref_sp<SkImageFilte
r>(input), | 158 this->addFilter("merge", SkMergeImageFilter::Make(sk_ref_sp<SkImageFilte
r>(input), |
173 sk_ref_sp<SkImageFilte
r>(input), | 159 sk_ref_sp<SkImageFilte
r>(input), |
174 SkXfermode::kSrcOver_M
ode, | 160 SkXfermode::kSrcOver_M
ode, |
175 cropRect).release()); | 161 cropRect).release()); |
176 this->addFilter("merge with disjoint inputs", SkMergeImageFilter::Make( | 162 { |
| 163 SkPaint greenColorShaderPaint; |
| 164 greenColorShaderPaint.setShader(SkShader::MakeColorShader(SK_ColorGR
EEN)); |
| 165 |
| 166 SkImageFilter::CropRect leftSideCropRect(SkRect::MakeXYWH(0, 0, 32,
64)); |
| 167 sk_sp<SkImageFilter> paintFilterLeft(SkPaintImageFilter::Make(greenC
olorShaderPaint, |
| 168 &leftS
ideCropRect)); |
| 169 SkImageFilter::CropRect rightSideCropRect(SkRect::MakeXYWH(32, 0, 32
, 64)); |
| 170 sk_sp<SkImageFilter> paintFilterRight(SkPaintImageFilter::Make(green
ColorShaderPaint, |
| 171 &righ
tSideCropRect)); |
| 172 |
| 173 |
| 174 this->addFilter("merge with disjoint inputs", SkMergeImageFilter::Ma
ke( |
177 std::move(paintFilterLeft), std::move(paintFilterRight), | 175 std::move(paintFilterLeft), std::move(paintFilterRight), |
178 SkXfermode::kSrcOver_Mode, cropRect).release()); | 176 SkXfermode::kSrcOver_Mode, cropRect).release()); |
| 177 } |
| 178 |
179 this->addFilter("offset", | 179 this->addFilter("offset", |
180 SkOffsetImageFilter::Make(SK_Scalar1, SK_Scalar1, | 180 SkOffsetImageFilter::Make(SK_Scalar1, SK_Scalar1, |
181 sk_ref_sp<SkImageFilter>(input
), | 181 sk_ref_sp<SkImageFilter>(input
), |
182 cropRect).release()); | 182 cropRect).release()); |
183 this->addFilter("dilate", SkDilateImageFilter::Create(3, 2, input, cropR
ect)); | 183 this->addFilter("dilate", SkDilateImageFilter::Create(3, 2, input, cropR
ect)); |
184 this->addFilter("erode", SkErodeImageFilter::Create(2, 3, input, cropRec
t)); | 184 this->addFilter("erode", SkErodeImageFilter::Create(2, 3, input, cropRec
t)); |
185 this->addFilter("tile", SkTileImageFilter::Create( | 185 this->addFilter("tile", SkTileImageFilter::Create( |
186 SkRect::MakeXYWH(0, 0, 50, 50), | 186 SkRect::MakeXYWH(0, 0, 50, 50), |
187 cropRect ? cropRect->rect() : SkRect::MakeXYWH(0, 0, 100, 100), | 187 cropRect ? cropRect->rect() : SkRect::MakeXYWH(0, 0, 100, 100), |
188 input)); | 188 input)); |
189 if (!cropRect) { | 189 if (!cropRect) { |
190 this->addFilter("matrix", SkImageFilter::CreateMatrixFilter( | 190 this->addFilter("matrix", SkImageFilter::CreateMatrixFilter( |
191 matrix, kLow_SkFilterQuality, input)); | 191 matrix, kLow_SkFilterQuality, input)); |
192 } | 192 } |
193 this->addFilter("blur and offset", | 193 |
194 SkOffsetImageFilter::Make(five, five, blur, | 194 { |
195 cropRect).release()); | 195 sk_sp<SkImageFilter> blur(SkBlurImageFilter::Make(five, five, |
196 this->addFilter("picture and blur", SkBlurImageFilter::Create( | 196 sk_ref_sp<SkImageF
ilter>(input))); |
197 five, five, pictureFilter.get(), cropRect)); | 197 |
198 this->addFilter("paint and blur", SkBlurImageFilter::Create( | 198 this->addFilter("blur and offset", SkOffsetImageFilter::Make(five, f
ive, |
199 five, five, paintFilter.get(), cropRect)); | 199 std::mo
ve(blur), |
| 200 cropRec
t).release()); |
| 201 } |
| 202 { |
| 203 SkRTreeFactory factory; |
| 204 SkPictureRecorder recorder; |
| 205 SkCanvas* recordingCanvas = recorder.beginRecording(64, 64, &factory
, 0); |
| 206 |
| 207 SkPaint greenPaint; |
| 208 greenPaint.setColor(SK_ColorGREEN); |
| 209 recordingCanvas->drawRect(SkRect::Make(SkIRect::MakeXYWH(10, 10, 30,
20)), greenPaint); |
| 210 sk_sp<SkPicture> picture(recorder.finishRecordingAsPicture()); |
| 211 sk_sp<SkImageFilter> pictureFilter(SkPictureImageFilter::Make(std::m
ove(picture))); |
| 212 |
| 213 this->addFilter("picture and blur", SkBlurImageFilter::Make(five, fi
ve, |
| 214 std::mov
e(pictureFilter), |
| 215 cropRect
).release()); |
| 216 } |
| 217 { |
| 218 SkPaint paint; |
| 219 paint.setShader(SkPerlinNoiseShader::MakeTurbulence(SK_Scalar1, SK_S
calar1, 1, 0)); |
| 220 sk_sp<SkImageFilter> paintFilter(SkPaintImageFilter::Make(paint)); |
| 221 |
| 222 this->addFilter("paint and blur", SkBlurImageFilter::Make(five, five
, |
| 223 std::move(
paintFilter), |
| 224 cropRect).
release()); |
| 225 } |
200 this->addFilter("xfermode", SkXfermodeImageFilter::Make( | 226 this->addFilter("xfermode", SkXfermodeImageFilter::Make( |
201 SkXfermode::Make(SkXfermode::kSrc_Mode), input, input, cropRect).rel
ease()); | 227 SkXfermode::Make(SkXfermode::kSrc_Mode), input, input, cropRect).rel
ease()); |
202 } | 228 } |
203 int count() const { return fFilters.count(); } | 229 int count() const { return fFilters.count(); } |
204 SkImageFilter* getFilter(int index) const { return fFilters[index].fFilter.g
et(); } | 230 SkImageFilter* getFilter(int index) const { return fFilters[index].fFilter.g
et(); } |
205 const char* getName(int index) const { return fFilters[index].fName; } | 231 const char* getName(int index) const { return fFilters[index].fName; } |
206 private: | 232 private: |
207 struct Filter { | 233 struct Filter { |
208 Filter() : fName(nullptr), fFilter(nullptr) {} | 234 Filter() : fName(nullptr), fFilter(nullptr) {} |
209 Filter(const char* name, SkImageFilter* filter) : fName(name), fFilter(f
ilter) {} | 235 Filter(const char* name, SkImageFilter* filter) : fName(name), fFilter(f
ilter) {} |
(...skipping 260 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
470 } | 496 } |
471 | 497 |
472 static void test_negative_blur_sigma(SkImageFilter::Proxy* proxy, | 498 static void test_negative_blur_sigma(SkImageFilter::Proxy* proxy, |
473 skiatest::Reporter* reporter, | 499 skiatest::Reporter* reporter, |
474 GrContext* context) { | 500 GrContext* context) { |
475 // Check that SkBlurImageFilter will accept a negative sigma, either in | 501 // Check that SkBlurImageFilter will accept a negative sigma, either in |
476 // the given arguments or after CTM application. | 502 // the given arguments or after CTM application. |
477 const int width = 32, height = 32; | 503 const int width = 32, height = 32; |
478 const SkScalar five = SkIntToScalar(5); | 504 const SkScalar five = SkIntToScalar(5); |
479 | 505 |
480 SkAutoTUnref<SkImageFilter> positiveFilter(SkBlurImageFilter::Create(five, f
ive)); | 506 sk_sp<SkImageFilter> positiveFilter(SkBlurImageFilter::Make(five, five, null
ptr)); |
481 SkAutoTUnref<SkImageFilter> negativeFilter(SkBlurImageFilter::Create(-five,
five)); | 507 sk_sp<SkImageFilter> negativeFilter(SkBlurImageFilter::Make(-five, five, nul
lptr)); |
482 | 508 |
483 SkBitmap gradient = make_gradient_circle(width, height); | 509 SkBitmap gradient = make_gradient_circle(width, height); |
484 sk_sp<SkSpecialImage> imgSrc(SkSpecialImage::MakeFromRaster(proxy, | 510 sk_sp<SkSpecialImage> imgSrc(SkSpecialImage::MakeFromRaster(proxy, |
485 SkIRect::MakeWH(
width, height), | 511 SkIRect::MakeWH(
width, height), |
486 gradient)); | 512 gradient)); |
487 | 513 |
488 SkIPoint offset; | 514 SkIPoint offset; |
489 SkImageFilter::Context ctx(SkMatrix::I(), SkIRect::MakeWH(32, 32), nullptr); | 515 SkImageFilter::Context ctx(SkMatrix::I(), SkIRect::MakeWH(32, 32), nullptr); |
490 | 516 |
491 sk_sp<SkSpecialImage> positiveResult1(positiveFilter->filterImage(imgSrc.get
(), ctx, &offset)); | 517 sk_sp<SkSpecialImage> positiveResult1(positiveFilter->filterImage(imgSrc.get
(), ctx, &offset)); |
(...skipping 100 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
592 run_gpu_test(reporter, context, 100, test_negative_blur_sigma); | 618 run_gpu_test(reporter, context, 100, test_negative_blur_sigma); |
593 } | 619 } |
594 #endif | 620 #endif |
595 | 621 |
596 static void test_zero_blur_sigma(SkImageFilter::Proxy* proxy, | 622 static void test_zero_blur_sigma(SkImageFilter::Proxy* proxy, |
597 skiatest::Reporter* reporter, | 623 skiatest::Reporter* reporter, |
598 GrContext* context) { | 624 GrContext* context) { |
599 // Check that SkBlurImageFilter with a zero sigma and a non-zero srcOffset w
orks correctly. | 625 // Check that SkBlurImageFilter with a zero sigma and a non-zero srcOffset w
orks correctly. |
600 SkImageFilter::CropRect cropRect(SkRect::Make(SkIRect::MakeXYWH(5, 0, 5, 10)
)); | 626 SkImageFilter::CropRect cropRect(SkRect::Make(SkIRect::MakeXYWH(5, 0, 5, 10)
)); |
601 sk_sp<SkImageFilter> input(SkOffsetImageFilter::Make(0, 0, nullptr, &cropRec
t)); | 627 sk_sp<SkImageFilter> input(SkOffsetImageFilter::Make(0, 0, nullptr, &cropRec
t)); |
602 sk_sp<SkImageFilter> filter(SkBlurImageFilter::Create(0, 0, input.get(), &cr
opRect)); | 628 sk_sp<SkImageFilter> filter(SkBlurImageFilter::Make(0, 0, std::move(input),
&cropRect)); |
603 | 629 |
604 sk_sp<SkSpecialSurface> surf(create_empty_special_surface(context, proxy, 10
)); | 630 sk_sp<SkSpecialSurface> surf(create_empty_special_surface(context, proxy, 10
)); |
605 surf->getCanvas()->clear(SK_ColorGREEN); | 631 surf->getCanvas()->clear(SK_ColorGREEN); |
606 sk_sp<SkSpecialImage> image(surf->makeImageSnapshot()); | 632 sk_sp<SkSpecialImage> image(surf->makeImageSnapshot()); |
607 | 633 |
608 SkIPoint offset; | 634 SkIPoint offset; |
609 SkImageFilter::Context ctx(SkMatrix::I(), SkIRect::MakeWH(32, 32), nullptr); | 635 SkImageFilter::Context ctx(SkMatrix::I(), SkIRect::MakeWH(32, 32), nullptr); |
610 | 636 |
611 sk_sp<SkSpecialImage> result(filter->filterImage(image.get(), ctx, &offset))
; | 637 sk_sp<SkSpecialImage> result(filter->filterImage(image.get(), ctx, &offset))
; |
612 REPORTER_ASSERT(reporter, offset.fX == 5 && offset.fY == 0); | 638 REPORTER_ASSERT(reporter, offset.fX == 5 && offset.fY == 0); |
(...skipping 122 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
735 | 761 |
736 for (int y = 0; y < height; y++) { | 762 for (int y = 0; y < height; y++) { |
737 int diffs = memcmp(result1.getAddr32(0, y), result2.getAddr32(0, y), res
ult1.rowBytes()); | 763 int diffs = memcmp(result1.getAddr32(0, y), result2.getAddr32(0, y), res
ult1.rowBytes()); |
738 REPORTER_ASSERT(reporter, !diffs); | 764 REPORTER_ASSERT(reporter, !diffs); |
739 if (diffs) { | 765 if (diffs) { |
740 break; | 766 break; |
741 } | 767 } |
742 } | 768 } |
743 } | 769 } |
744 | 770 |
745 static SkImageFilter* makeBlur(SkImageFilter* input = nullptr) { | 771 static sk_sp<SkImageFilter> make_blur(sk_sp<SkImageFilter> input) { |
746 return SkBlurImageFilter::Create(SK_Scalar1, SK_Scalar1, input); | 772 return SkBlurImageFilter::Make(SK_Scalar1, SK_Scalar1, std::move(input)); |
747 } | 773 } |
748 | 774 |
749 static SkImageFilter* makeDropShadow(SkImageFilter* input = nullptr) { | 775 static sk_sp<SkImageFilter> make_drop_shadow(sk_sp<SkImageFilter> input) { |
750 return SkDropShadowImageFilter::Create( | 776 return sk_sp<SkImageFilter>(SkDropShadowImageFilter::Create( |
751 SkIntToScalar(100), SkIntToScalar(100), | 777 SkIntToScalar(100), SkIntToScalar(100), |
752 SkIntToScalar(10), SkIntToScalar(10), | 778 SkIntToScalar(10), SkIntToScalar(10), |
753 SK_ColorBLUE, SkDropShadowImageFilter::kDrawShadowAndForeground_ShadowMo
de, | 779 SK_ColorBLUE, SkDropShadowImageFilter::kDrawShadowAndForeground_ShadowMo
de, |
754 input, nullptr); | 780 input.get(), nullptr)); |
755 } | 781 } |
756 | 782 |
757 DEF_TEST(ImageFilterBlurThenShadowBounds, reporter) { | 783 DEF_TEST(ImageFilterBlurThenShadowBounds, reporter) { |
758 SkAutoTUnref<SkImageFilter> filter1(makeBlur()); | 784 sk_sp<SkImageFilter> filter1(make_blur(nullptr)); |
759 SkAutoTUnref<SkImageFilter> filter2(makeDropShadow(filter1.get())); | 785 sk_sp<SkImageFilter> filter2(make_drop_shadow(std::move(filter1))); |
760 | 786 |
761 SkIRect bounds = SkIRect::MakeXYWH(0, 0, 100, 100); | 787 SkIRect bounds = SkIRect::MakeXYWH(0, 0, 100, 100); |
762 SkIRect expectedBounds = SkIRect::MakeXYWH(-133, -133, 236, 236); | 788 SkIRect expectedBounds = SkIRect::MakeXYWH(-133, -133, 236, 236); |
763 bounds = filter2->filterBounds(bounds, SkMatrix::I()); | 789 bounds = filter2->filterBounds(bounds, SkMatrix::I()); |
764 | 790 |
765 REPORTER_ASSERT(reporter, bounds == expectedBounds); | 791 REPORTER_ASSERT(reporter, bounds == expectedBounds); |
766 } | 792 } |
767 | 793 |
768 DEF_TEST(ImageFilterShadowThenBlurBounds, reporter) { | 794 DEF_TEST(ImageFilterShadowThenBlurBounds, reporter) { |
769 SkAutoTUnref<SkImageFilter> filter1(makeDropShadow()); | 795 sk_sp<SkImageFilter> filter1(make_drop_shadow(nullptr)); |
770 SkAutoTUnref<SkImageFilter> filter2(makeBlur(filter1.get())); | 796 sk_sp<SkImageFilter> filter2(make_blur(std::move(filter1))); |
771 | 797 |
772 SkIRect bounds = SkIRect::MakeXYWH(0, 0, 100, 100); | 798 SkIRect bounds = SkIRect::MakeXYWH(0, 0, 100, 100); |
773 SkIRect expectedBounds = SkIRect::MakeXYWH(-133, -133, 236, 236); | 799 SkIRect expectedBounds = SkIRect::MakeXYWH(-133, -133, 236, 236); |
774 bounds = filter2->filterBounds(bounds, SkMatrix::I()); | 800 bounds = filter2->filterBounds(bounds, SkMatrix::I()); |
775 | 801 |
776 REPORTER_ASSERT(reporter, bounds == expectedBounds); | 802 REPORTER_ASSERT(reporter, bounds == expectedBounds); |
777 } | 803 } |
778 | 804 |
779 DEF_TEST(ImageFilterDilateThenBlurBounds, reporter) { | 805 DEF_TEST(ImageFilterDilateThenBlurBounds, reporter) { |
780 SkAutoTUnref<SkImageFilter> filter1(SkDilateImageFilter::Create(2, 2)); | 806 sk_sp<SkImageFilter> filter1(SkDilateImageFilter::Create(2, 2)); |
781 SkAutoTUnref<SkImageFilter> filter2(makeDropShadow(filter1.get())); | 807 sk_sp<SkImageFilter> filter2(make_drop_shadow(std::move(filter1))); |
782 | 808 |
783 SkIRect bounds = SkIRect::MakeXYWH(0, 0, 100, 100); | 809 SkIRect bounds = SkIRect::MakeXYWH(0, 0, 100, 100); |
784 SkIRect expectedBounds = SkIRect::MakeXYWH(-132, -132, 234, 234); | 810 SkIRect expectedBounds = SkIRect::MakeXYWH(-132, -132, 234, 234); |
785 bounds = filter2->filterBounds(bounds, SkMatrix::I()); | 811 bounds = filter2->filterBounds(bounds, SkMatrix::I()); |
786 | 812 |
787 REPORTER_ASSERT(reporter, bounds == expectedBounds); | 813 REPORTER_ASSERT(reporter, bounds == expectedBounds); |
788 } | 814 } |
789 | 815 |
790 DEF_TEST(ImageFilterComposedBlurFastBounds, reporter) { | 816 DEF_TEST(ImageFilterComposedBlurFastBounds, reporter) { |
791 sk_sp<SkImageFilter> filter1(makeBlur()); | 817 sk_sp<SkImageFilter> filter1(make_blur(nullptr)); |
792 sk_sp<SkImageFilter> filter2(makeBlur()); | 818 sk_sp<SkImageFilter> filter2(make_blur(nullptr)); |
793 sk_sp<SkImageFilter> composedFilter(SkComposeImageFilter::Make(std::move(fil
ter1), | 819 sk_sp<SkImageFilter> composedFilter(SkComposeImageFilter::Make(std::move(fil
ter1), |
794 std::move(fil
ter2))); | 820 std::move(fil
ter2))); |
795 | 821 |
796 SkRect boundsSrc = SkRect::MakeWH(SkIntToScalar(100), SkIntToScalar(100)); | 822 SkRect boundsSrc = SkRect::MakeWH(SkIntToScalar(100), SkIntToScalar(100)); |
797 SkRect expectedBounds = SkRect::MakeXYWH( | 823 SkRect expectedBounds = SkRect::MakeXYWH( |
798 SkIntToScalar(-6), SkIntToScalar(-6), SkIntToScalar(112), SkIntToScalar(
112)); | 824 SkIntToScalar(-6), SkIntToScalar(-6), SkIntToScalar(112), SkIntToScalar(
112)); |
799 SkRect boundsDst = composedFilter->computeFastBounds(boundsSrc); | 825 SkRect boundsDst = composedFilter->computeFastBounds(boundsSrc); |
800 | 826 |
801 REPORTER_ASSERT(reporter, boundsDst == expectedBounds); | 827 REPORTER_ASSERT(reporter, boundsDst == expectedBounds); |
802 } | 828 } |
(...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
847 run_raster_test(reporter, 100, test_imagefilter_merge_result_size); | 873 run_raster_test(reporter, 100, test_imagefilter_merge_result_size); |
848 } | 874 } |
849 | 875 |
850 #if SK_SUPPORT_GPU | 876 #if SK_SUPPORT_GPU |
851 DEF_GPUTEST_FOR_NATIVE_CONTEXT(ImageFilterMergeResultSize_Gpu, reporter, context
) { | 877 DEF_GPUTEST_FOR_NATIVE_CONTEXT(ImageFilterMergeResultSize_Gpu, reporter, context
) { |
852 run_gpu_test(reporter, context, 100, test_imagefilter_merge_result_size); | 878 run_gpu_test(reporter, context, 100, test_imagefilter_merge_result_size); |
853 } | 879 } |
854 #endif | 880 #endif |
855 | 881 |
856 static void draw_blurred_rect(SkCanvas* canvas) { | 882 static void draw_blurred_rect(SkCanvas* canvas) { |
857 SkAutoTUnref<SkImageFilter> filter(SkBlurImageFilter::Create(SkIntToScalar(8
), 0)); | |
858 SkPaint filterPaint; | 883 SkPaint filterPaint; |
859 filterPaint.setColor(SK_ColorWHITE); | 884 filterPaint.setColor(SK_ColorWHITE); |
860 filterPaint.setImageFilter(filter); | 885 filterPaint.setImageFilter(SkBlurImageFilter::Make(SkIntToScalar(8), 0, null
ptr)); |
861 canvas->saveLayer(nullptr, &filterPaint); | 886 canvas->saveLayer(nullptr, &filterPaint); |
862 SkPaint whitePaint; | 887 SkPaint whitePaint; |
863 whitePaint.setColor(SK_ColorWHITE); | 888 whitePaint.setColor(SK_ColorWHITE); |
864 canvas->drawRect(SkRect::Make(SkIRect::MakeWH(4, 4)), whitePaint); | 889 canvas->drawRect(SkRect::Make(SkIRect::MakeWH(4, 4)), whitePaint); |
865 canvas->restore(); | 890 canvas->restore(); |
866 } | 891 } |
867 | 892 |
868 static void draw_picture_clipped(SkCanvas* canvas, const SkRect& clipRect, const
SkPicture* picture) { | 893 static void draw_picture_clipped(SkCanvas* canvas, const SkRect& clipRect, const
SkPicture* picture) { |
869 canvas->save(); | 894 canvas->save(); |
870 canvas->clipRect(clipRect); | 895 canvas->clipRect(clipRect); |
(...skipping 294 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1165 pixel = *bitmap.getAddr32(0, 0); | 1190 pixel = *bitmap.getAddr32(0, 0); |
1166 REPORTER_ASSERT(reporter, pixel == SK_ColorGREEN); | 1191 REPORTER_ASSERT(reporter, pixel == SK_ColorGREEN); |
1167 } | 1192 } |
1168 | 1193 |
1169 static void test_huge_blur(SkCanvas* canvas, skiatest::Reporter* reporter) { | 1194 static void test_huge_blur(SkCanvas* canvas, skiatest::Reporter* reporter) { |
1170 SkBitmap bitmap; | 1195 SkBitmap bitmap; |
1171 bitmap.allocN32Pixels(100, 100); | 1196 bitmap.allocN32Pixels(100, 100); |
1172 bitmap.eraseARGB(0, 0, 0, 0); | 1197 bitmap.eraseARGB(0, 0, 0, 0); |
1173 | 1198 |
1174 // Check that a blur with an insane radius does not crash or assert. | 1199 // Check that a blur with an insane radius does not crash or assert. |
1175 SkAutoTUnref<SkImageFilter> blur(SkBlurImageFilter::Create(SkIntToScalar(1<<
30), SkIntToScalar(1<<30))); | |
1176 | |
1177 SkPaint paint; | 1200 SkPaint paint; |
1178 paint.setImageFilter(blur); | 1201 paint.setImageFilter(SkBlurImageFilter::Make(SkIntToScalar(1<<30), |
| 1202 SkIntToScalar(1<<30), |
| 1203 nullptr)); |
1179 canvas->drawBitmap(bitmap, 0, 0, &paint); | 1204 canvas->drawBitmap(bitmap, 0, 0, &paint); |
1180 } | 1205 } |
1181 | 1206 |
1182 DEF_TEST(HugeBlurImageFilter, reporter) { | 1207 DEF_TEST(HugeBlurImageFilter, reporter) { |
1183 SkBitmap temp; | 1208 SkBitmap temp; |
1184 temp.allocN32Pixels(100, 100); | 1209 temp.allocN32Pixels(100, 100); |
1185 SkCanvas canvas(temp); | 1210 SkCanvas canvas(temp); |
1186 test_huge_blur(&canvas, reporter); | 1211 test_huge_blur(&canvas, reporter); |
1187 } | 1212 } |
1188 | 1213 |
(...skipping 148 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1337 test_xfermode_cropped_input(&canvas, reporter); | 1362 test_xfermode_cropped_input(&canvas, reporter); |
1338 } | 1363 } |
1339 | 1364 |
1340 static void test_composed_imagefilter_offset(SkImageFilter::Proxy* proxy, | 1365 static void test_composed_imagefilter_offset(SkImageFilter::Proxy* proxy, |
1341 skiatest::Reporter* reporter, | 1366 skiatest::Reporter* reporter, |
1342 GrContext* context) { | 1367 GrContext* context) { |
1343 sk_sp<SkSpecialImage> srcImg(create_empty_special_image(context, proxy, 100)
); | 1368 sk_sp<SkSpecialImage> srcImg(create_empty_special_image(context, proxy, 100)
); |
1344 | 1369 |
1345 SkImageFilter::CropRect cropRect(SkRect::MakeXYWH(1, 0, 20, 20)); | 1370 SkImageFilter::CropRect cropRect(SkRect::MakeXYWH(1, 0, 20, 20)); |
1346 sk_sp<SkImageFilter> offsetFilter(SkOffsetImageFilter::Make(0, 0, nullptr, &
cropRect)); | 1371 sk_sp<SkImageFilter> offsetFilter(SkOffsetImageFilter::Make(0, 0, nullptr, &
cropRect)); |
1347 sk_sp<SkImageFilter> blurFilter(SkBlurImageFilter::Create(SK_Scalar1, SK_Sca
lar1, | 1372 sk_sp<SkImageFilter> blurFilter(SkBlurImageFilter::Make(SK_Scalar1, SK_Scala
r1, |
1348 nullptr, &cropRect
)); | 1373 nullptr, &cropRect))
; |
1349 sk_sp<SkImageFilter> composedFilter(SkComposeImageFilter::Make(std::move(blu
rFilter), | 1374 sk_sp<SkImageFilter> composedFilter(SkComposeImageFilter::Make(std::move(blu
rFilter), |
1350 std::move(off
setFilter))); | 1375 std::move(off
setFilter))); |
1351 SkIPoint offset; | 1376 SkIPoint offset; |
1352 SkImageFilter::Context ctx(SkMatrix::I(), SkIRect::MakeWH(100, 100), nullptr
); | 1377 SkImageFilter::Context ctx(SkMatrix::I(), SkIRect::MakeWH(100, 100), nullptr
); |
1353 | 1378 |
1354 sk_sp<SkSpecialImage> resultImg(composedFilter->filterImage(srcImg.get(), ct
x, &offset)); | 1379 sk_sp<SkSpecialImage> resultImg(composedFilter->filterImage(srcImg.get(), ct
x, &offset)); |
1355 REPORTER_ASSERT(reporter, resultImg); | 1380 REPORTER_ASSERT(reporter, resultImg); |
1356 REPORTER_ASSERT(reporter, offset.fX == 1 && offset.fY == 0); | 1381 REPORTER_ASSERT(reporter, offset.fX == 1 && offset.fY == 0); |
1357 } | 1382 } |
1358 | 1383 |
(...skipping 81 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1440 } | 1465 } |
1441 #endif | 1466 #endif |
1442 | 1467 |
1443 DEF_TEST(ImageFilterCanComputeFastBounds, reporter) { | 1468 DEF_TEST(ImageFilterCanComputeFastBounds, reporter) { |
1444 | 1469 |
1445 SkPoint3 location = SkPoint3::Make(0, 0, SK_Scalar1); | 1470 SkPoint3 location = SkPoint3::Make(0, 0, SK_Scalar1); |
1446 SkAutoTUnref<SkImageFilter> lighting(SkLightingImageFilter::CreatePointLitDi
ffuse( | 1471 SkAutoTUnref<SkImageFilter> lighting(SkLightingImageFilter::CreatePointLitDi
ffuse( |
1447 location, SK_ColorGREEN, 0, 0)); | 1472 location, SK_ColorGREEN, 0, 0)); |
1448 REPORTER_ASSERT(reporter, !lighting->canComputeFastBounds()); | 1473 REPORTER_ASSERT(reporter, !lighting->canComputeFastBounds()); |
1449 | 1474 |
1450 SkAutoTUnref<SkImageFilter> gray(make_grayscale(nullptr, nullptr)); | |
1451 REPORTER_ASSERT(reporter, gray->canComputeFastBounds()); | |
1452 { | 1475 { |
1453 SkColorFilter* grayCF; | 1476 sk_sp<SkImageFilter> gray(make_grayscale(nullptr, nullptr)); |
1454 REPORTER_ASSERT(reporter, gray->asAColorFilter(&grayCF)); | 1477 REPORTER_ASSERT(reporter, gray->canComputeFastBounds()); |
1455 REPORTER_ASSERT(reporter, !grayCF->affectsTransparentBlack()); | 1478 { |
1456 grayCF->unref(); | 1479 SkColorFilter* grayCF; |
| 1480 REPORTER_ASSERT(reporter, gray->asAColorFilter(&grayCF)); |
| 1481 REPORTER_ASSERT(reporter, !grayCF->affectsTransparentBlack()); |
| 1482 grayCF->unref(); |
| 1483 } |
| 1484 REPORTER_ASSERT(reporter, gray->canComputeFastBounds()); |
| 1485 |
| 1486 sk_sp<SkImageFilter> grayBlur(SkBlurImageFilter::Make(SK_Scalar1, SK_Sca
lar1, |
| 1487 std::move(gray))); |
| 1488 REPORTER_ASSERT(reporter, grayBlur->canComputeFastBounds()); |
1457 } | 1489 } |
1458 REPORTER_ASSERT(reporter, gray->canComputeFastBounds()); | |
1459 | 1490 |
1460 SkAutoTUnref<SkImageFilter> grayBlur(SkBlurImageFilter::Create(SK_Scalar1, S
K_Scalar1, gray.get())); | 1491 { |
1461 REPORTER_ASSERT(reporter, grayBlur->canComputeFastBounds()); | 1492 SkScalar greenMatrix[20] = { 0, 0, 0, 0, 0, |
| 1493 0, 0, 0, 0, 1, |
| 1494 0, 0, 0, 0, 0, |
| 1495 0, 0, 0, 0, 1 }; |
| 1496 sk_sp<SkColorFilter> greenCF(SkColorFilter::MakeMatrixFilterRowMajor255(
greenMatrix)); |
| 1497 sk_sp<SkImageFilter> green(SkColorFilterImageFilter::Create(greenCF.get(
))); |
1462 | 1498 |
1463 SkScalar greenMatrix[20] = { 0, 0, 0, 0, 0, | 1499 REPORTER_ASSERT(reporter, greenCF->affectsTransparentBlack()); |
1464 0, 0, 0, 0, 1, | 1500 REPORTER_ASSERT(reporter, !green->canComputeFastBounds()); |
1465 0, 0, 0, 0, 0, | |
1466 0, 0, 0, 0, 1 }; | |
1467 auto greenCF(SkColorFilter::MakeMatrixFilterRowMajor255(greenMatrix)); | |
1468 SkAutoTUnref<SkImageFilter> green(SkColorFilterImageFilter::Create(greenCF.g
et())); | |
1469 | 1501 |
1470 REPORTER_ASSERT(reporter, greenCF->affectsTransparentBlack()); | 1502 sk_sp<SkImageFilter> greenBlur(SkBlurImageFilter::Make(SK_Scalar1, SK_Sc
alar1, |
1471 REPORTER_ASSERT(reporter, !green->canComputeFastBounds()); | 1503 std::move(green))
); |
1472 | 1504 REPORTER_ASSERT(reporter, !greenBlur->canComputeFastBounds()); |
1473 SkAutoTUnref<SkImageFilter> greenBlur(SkBlurImageFilter::Create(SK_Scalar1,
SK_Scalar1, green.get())); | 1505 } |
1474 REPORTER_ASSERT(reporter, !greenBlur->canComputeFastBounds()); | |
1475 | 1506 |
1476 uint8_t allOne[256], identity[256]; | 1507 uint8_t allOne[256], identity[256]; |
1477 for (int i = 0; i < 256; ++i) { | 1508 for (int i = 0; i < 256; ++i) { |
1478 identity[i] = i; | 1509 identity[i] = i; |
1479 allOne[i] = 255; | 1510 allOne[i] = 255; |
1480 } | 1511 } |
1481 | 1512 |
1482 auto identityCF(SkTableColorFilter::MakeARGB(identity, identity, identity, a
llOne)); | 1513 auto identityCF(SkTableColorFilter::MakeARGB(identity, identity, identity, a
llOne)); |
1483 SkAutoTUnref<SkImageFilter> identityFilter(SkColorFilterImageFilter::Create(
identityCF.get())); | 1514 SkAutoTUnref<SkImageFilter> identityFilter(SkColorFilterImageFilter::Create(
identityCF.get())); |
1484 REPORTER_ASSERT(reporter, !identityCF->affectsTransparentBlack()); | 1515 REPORTER_ASSERT(reporter, !identityCF->affectsTransparentBlack()); |
(...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1538 ERRORF(reporter, "Failed to create large image."); | 1569 ERRORF(reporter, "Failed to create large image."); |
1539 return; | 1570 return; |
1540 } | 1571 } |
1541 | 1572 |
1542 sk_sp<SkImageFilter> largeSource(SkImageSource::Make(std::move(largeImage)))
; | 1573 sk_sp<SkImageFilter> largeSource(SkImageSource::Make(std::move(largeImage)))
; |
1543 if (!largeSource) { | 1574 if (!largeSource) { |
1544 ERRORF(reporter, "Failed to create large SkImageSource."); | 1575 ERRORF(reporter, "Failed to create large SkImageSource."); |
1545 return; | 1576 return; |
1546 } | 1577 } |
1547 | 1578 |
1548 sk_sp<SkImageFilter> blur(SkBlurImageFilter::Create(10.f, 10.f, largeSource.
get())); | 1579 sk_sp<SkImageFilter> blur(SkBlurImageFilter::Make(10.f, 10.f, std::move(larg
eSource))); |
1549 if (!blur) { | 1580 if (!blur) { |
1550 ERRORF(reporter, "Failed to create SkBlurImageFilter."); | 1581 ERRORF(reporter, "Failed to create SkBlurImageFilter."); |
1551 return; | 1582 return; |
1552 } | 1583 } |
1553 | 1584 |
1554 SkPaint paint; | 1585 SkPaint paint; |
1555 paint.setImageFilter(std::move(blur)); | 1586 paint.setImageFilter(std::move(blur)); |
1556 | 1587 |
1557 // This should not crash (http://crbug.com/570479). | 1588 // This should not crash (http://crbug.com/570479). |
1558 canvas->drawRect(SkRect::MakeIWH(largeW, largeH), paint); | 1589 canvas->drawRect(SkRect::MakeIWH(largeW, largeH), paint); |
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1592 | 1623 |
1593 test_xfermode_cropped_input(&canvas, reporter); | 1624 test_xfermode_cropped_input(&canvas, reporter); |
1594 } | 1625 } |
1595 | 1626 |
1596 DEF_GPUTEST_FOR_ALL_CONTEXTS(BlurLargeImage_Gpu, reporter, context) { | 1627 DEF_GPUTEST_FOR_ALL_CONTEXTS(BlurLargeImage_Gpu, reporter, context) { |
1597 auto surface(SkSurface::MakeRenderTarget(context, SkBudgeted::kYes, | 1628 auto surface(SkSurface::MakeRenderTarget(context, SkBudgeted::kYes, |
1598 SkImageInfo::MakeN32Premul(100, 100
))); | 1629 SkImageInfo::MakeN32Premul(100, 100
))); |
1599 test_large_blur_input(reporter, surface->getCanvas()); | 1630 test_large_blur_input(reporter, surface->getCanvas()); |
1600 } | 1631 } |
1601 #endif | 1632 #endif |
OLD | NEW |