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 87 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
98 SkBitmap make_gradient_circle(int width, int height) { | 98 SkBitmap make_gradient_circle(int width, int height) { |
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(sk_sp<SkImageFilter> input, const SkImageFilter::CropRect* cropRe
ct = nullptr) { |
109 SkPoint3 location = SkPoint3::Make(0, 0, SK_Scalar1); | 109 SkPoint3 location = SkPoint3::Make(0, 0, SK_Scalar1); |
110 SkScalar kernel[9] = { | 110 SkScalar kernel[9] = { |
111 SkIntToScalar( 1), SkIntToScalar( 1), SkIntToScalar( 1), | 111 SkIntToScalar( 1), SkIntToScalar( 1), SkIntToScalar( 1), |
112 SkIntToScalar( 1), SkIntToScalar(-7), SkIntToScalar( 1), | 112 SkIntToScalar( 1), SkIntToScalar(-7), SkIntToScalar( 1), |
113 SkIntToScalar( 1), SkIntToScalar( 1), SkIntToScalar( 1), | 113 SkIntToScalar( 1), SkIntToScalar( 1), SkIntToScalar( 1), |
114 }; | 114 }; |
115 const SkISize kernelSize = SkISize::Make(3, 3); | 115 const SkISize kernelSize = SkISize::Make(3, 3); |
116 const SkScalar gain = SK_Scalar1, bias = 0; | 116 const SkScalar gain = SK_Scalar1, bias = 0; |
117 const SkScalar five = SkIntToScalar(5); | 117 const SkScalar five = SkIntToScalar(5); |
118 | 118 |
119 SkMatrix matrix; | 119 SkMatrix matrix; |
120 | 120 |
121 matrix.setTranslate(SK_Scalar1, SK_Scalar1); | 121 matrix.setTranslate(SK_Scalar1, SK_Scalar1); |
122 matrix.postRotate(SkIntToScalar(45), SK_Scalar1, SK_Scalar1); | 122 matrix.postRotate(SkIntToScalar(45), SK_Scalar1, SK_Scalar1); |
123 | 123 |
124 { | 124 { |
125 sk_sp<SkColorFilter> cf(SkColorFilter::MakeModeFilter(SK_ColorRED, | 125 sk_sp<SkColorFilter> cf(SkColorFilter::MakeModeFilter(SK_ColorRED, |
126 SkXfermode::kS
rcIn_Mode)); | 126 SkXfermode::kS
rcIn_Mode)); |
127 | 127 |
128 this->addFilter("color filter", | 128 this->addFilter("color filter", |
129 SkColorFilterImageFilter::Create(cf.get(), input, cropRect)); | 129 SkColorFilterImageFilter::Create(cf.get(), input.get(), cropRect
)); |
130 } | 130 } |
131 | 131 |
132 { | 132 { |
133 sk_sp<SkImage> gradientImage(SkImage::MakeFromBitmap(make_gradient_c
ircle(64, 64))); | 133 sk_sp<SkImage> gradientImage(SkImage::MakeFromBitmap(make_gradient_c
ircle(64, 64))); |
134 sk_sp<SkImageFilter> gradientSource(SkImageSource::Make(std::move(gr
adientImage))); | 134 sk_sp<SkImageFilter> gradientSource(SkImageSource::Make(std::move(gr
adientImage))); |
135 | 135 |
136 this->addFilter("displacement map", SkDisplacementMapEffect::Create( | 136 this->addFilter("displacement map", SkDisplacementMapEffect::Create( |
137 SkDisplacementMapEffect::kR_ChannelSelectorType, | 137 SkDisplacementMapEffect::kR_ChannelSelectorType, |
138 SkDisplacementMapEffect::kB_ChannelSelectorType, | 138 SkDisplacementMapEffect::kB_ChannelSelectorType, |
139 20.0f, gradientSource.get(), input, cropRect)); | 139 20.0f, gradientSource.get(), input.get(), cropRect)); |
140 } | 140 } |
141 | 141 |
142 this->addFilter("blur", SkBlurImageFilter::Make(SK_Scalar1, | 142 this->addFilter("blur", SkBlurImageFilter::Make(SK_Scalar1, |
143 SK_Scalar1, | 143 SK_Scalar1, |
144 sk_ref_sp<SkImageFilter>
(input), | 144 input, |
145 cropRect).release()); | 145 cropRect).release()); |
146 this->addFilter("drop shadow", SkDropShadowImageFilter::Create( | 146 this->addFilter("drop shadow", SkDropShadowImageFilter::Create( |
147 SK_Scalar1, SK_Scalar1, SK_Scalar1, SK_Scalar1, SK_ColorGREEN, | 147 SK_Scalar1, SK_Scalar1, SK_Scalar1, SK_Scalar1, SK_ColorGREEN, |
148 SkDropShadowImageFilter::kDrawShadowAndForeground_ShadowMode,
input, cropRect)); | 148 SkDropShadowImageFilter::kDrawShadowAndForeground_ShadowMode, |
| 149 input.get(), cropRect)); |
149 this->addFilter("diffuse lighting", SkLightingImageFilter::CreatePointLi
tDiffuse( | 150 this->addFilter("diffuse lighting", SkLightingImageFilter::CreatePointLi
tDiffuse( |
150 location, SK_ColorGREEN, 0, 0, input, cropRect)); | 151 location, SK_ColorGREEN, 0, 0, input.get(), cropRect)); |
151 this->addFilter("specular lighting", | 152 this->addFilter("specular lighting", |
152 SkLightingImageFilter::CreatePointLitSpecular(location, SK_Col
orGREEN, 0, 0, 0, | 153 SkLightingImageFilter::CreatePointLitSpecular(location, SK_Col
orGREEN, 0, 0, 0, |
153 input, cropRect)
); | 154 input.get(), cro
pRect)); |
154 this->addFilter("matrix convolution", | 155 this->addFilter("matrix convolution", |
155 SkMatrixConvolutionImageFilter::Create( | 156 SkMatrixConvolutionImageFilter::Create( |
156 kernelSize, kernel, gain, bias, SkIPoint::Make(1, 1), | 157 kernelSize, kernel, gain, bias, SkIPoint::Make(1, 1), |
157 SkMatrixConvolutionImageFilter::kRepeat_TileMode, false, i
nput, cropRect)); | 158 SkMatrixConvolutionImageFilter::kRepeat_TileMode, false, |
158 this->addFilter("merge", SkMergeImageFilter::Make(sk_ref_sp<SkImageFilte
r>(input), | 159 input.get(), cropRect)); |
159 sk_ref_sp<SkImageFilte
r>(input), | 160 this->addFilter("merge", SkMergeImageFilter::Make(input, input, |
160 SkXfermode::kSrcOver_M
ode, | 161 SkXfermode::kSrcOver_M
ode, |
161 cropRect).release()); | 162 cropRect).release()); |
162 { | 163 { |
163 SkPaint greenColorShaderPaint; | 164 SkPaint greenColorShaderPaint; |
164 greenColorShaderPaint.setShader(SkShader::MakeColorShader(SK_ColorGR
EEN)); | 165 greenColorShaderPaint.setShader(SkShader::MakeColorShader(SK_ColorGR
EEN)); |
165 | 166 |
166 SkImageFilter::CropRect leftSideCropRect(SkRect::MakeXYWH(0, 0, 32,
64)); | 167 SkImageFilter::CropRect leftSideCropRect(SkRect::MakeXYWH(0, 0, 32,
64)); |
167 sk_sp<SkImageFilter> paintFilterLeft(SkPaintImageFilter::Make(greenC
olorShaderPaint, | 168 sk_sp<SkImageFilter> paintFilterLeft(SkPaintImageFilter::Make(greenC
olorShaderPaint, |
168 &leftS
ideCropRect)); | 169 &leftS
ideCropRect)); |
169 SkImageFilter::CropRect rightSideCropRect(SkRect::MakeXYWH(32, 0, 32
, 64)); | 170 SkImageFilter::CropRect rightSideCropRect(SkRect::MakeXYWH(32, 0, 32
, 64)); |
170 sk_sp<SkImageFilter> paintFilterRight(SkPaintImageFilter::Make(green
ColorShaderPaint, | 171 sk_sp<SkImageFilter> paintFilterRight(SkPaintImageFilter::Make(green
ColorShaderPaint, |
171 &righ
tSideCropRect)); | 172 &righ
tSideCropRect)); |
172 | 173 |
173 | 174 |
174 this->addFilter("merge with disjoint inputs", SkMergeImageFilter::Ma
ke( | 175 this->addFilter("merge with disjoint inputs", SkMergeImageFilter::Ma
ke( |
175 std::move(paintFilterLeft), std::move(paintFilterRight), | 176 std::move(paintFilterLeft), std::move(paintFilterRight), |
176 SkXfermode::kSrcOver_Mode, cropRect).release()); | 177 SkXfermode::kSrcOver_Mode, cropRect).release()); |
177 } | 178 } |
178 | 179 |
179 this->addFilter("offset", | 180 this->addFilter("offset", |
180 SkOffsetImageFilter::Make(SK_Scalar1, SK_Scalar1, | 181 SkOffsetImageFilter::Make(SK_Scalar1, SK_Scalar1, 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::Make(3, 2, input, cropRec
t).release()); |
184 this->addFilter("erode", SkErodeImageFilter::Create(2, 3, input, cropRec
t)); | 184 this->addFilter("erode", SkErodeImageFilter::Make(2, 3, input, cropRect)
.release()); |
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.get())); |
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.get())); |
192 } | 192 } |
193 | 193 |
194 { | 194 { |
195 sk_sp<SkImageFilter> blur(SkBlurImageFilter::Make(five, five, | 195 sk_sp<SkImageFilter> blur(SkBlurImageFilter::Make(five, five, input)
); |
196 sk_ref_sp<SkImageF
ilter>(input))); | |
197 | 196 |
198 this->addFilter("blur and offset", SkOffsetImageFilter::Make(five, f
ive, | 197 this->addFilter("blur and offset", SkOffsetImageFilter::Make(five, f
ive, |
199 std::mo
ve(blur), | 198 std::mo
ve(blur), |
200 cropRec
t).release()); | 199 cropRec
t).release()); |
201 } | 200 } |
202 { | 201 { |
203 SkRTreeFactory factory; | 202 SkRTreeFactory factory; |
204 SkPictureRecorder recorder; | 203 SkPictureRecorder recorder; |
205 SkCanvas* recordingCanvas = recorder.beginRecording(64, 64, &factory
, 0); | 204 SkCanvas* recordingCanvas = recorder.beginRecording(64, 64, &factory
, 0); |
206 | 205 |
(...skipping 10 matching lines...) Expand all Loading... |
217 { | 216 { |
218 SkPaint paint; | 217 SkPaint paint; |
219 paint.setShader(SkPerlinNoiseShader::MakeTurbulence(SK_Scalar1, SK_S
calar1, 1, 0)); | 218 paint.setShader(SkPerlinNoiseShader::MakeTurbulence(SK_Scalar1, SK_S
calar1, 1, 0)); |
220 sk_sp<SkImageFilter> paintFilter(SkPaintImageFilter::Make(paint)); | 219 sk_sp<SkImageFilter> paintFilter(SkPaintImageFilter::Make(paint)); |
221 | 220 |
222 this->addFilter("paint and blur", SkBlurImageFilter::Make(five, five
, | 221 this->addFilter("paint and blur", SkBlurImageFilter::Make(five, five
, |
223 std::move(
paintFilter), | 222 std::move(
paintFilter), |
224 cropRect).
release()); | 223 cropRect).
release()); |
225 } | 224 } |
226 this->addFilter("xfermode", SkXfermodeImageFilter::Make( | 225 this->addFilter("xfermode", SkXfermodeImageFilter::Make( |
227 SkXfermode::Make(SkXfermode::kSrc_Mode), input, input, cropRect).rel
ease()); | 226 SkXfermode::Make(SkXfermode::kSrc_Mode), input.get(), input.get(), |
| 227 cropRect).release()); |
228 } | 228 } |
229 int count() const { return fFilters.count(); } | 229 int count() const { return fFilters.count(); } |
230 SkImageFilter* getFilter(int index) const { return fFilters[index].fFilter.g
et(); } | 230 SkImageFilter* getFilter(int index) const { return fFilters[index].fFilter.g
et(); } |
231 const char* getName(int index) const { return fFilters[index].fName; } | 231 const char* getName(int index) const { return fFilters[index].fName; } |
232 private: | 232 private: |
233 struct Filter { | 233 struct Filter { |
234 Filter() : fName(nullptr), fFilter(nullptr) {} | 234 Filter() : fName(nullptr), fFilter(nullptr) {} |
235 Filter(const char* name, SkImageFilter* filter) : fName(name), fFilter(f
ilter) {} | 235 Filter(const char* name, SkImageFilter* filter) : fName(name), fFilter(f
ilter) {} |
236 const char* fName; | 236 const char* fName; |
237 sk_sp<SkImageFilter> fFilter; | 237 sk_sp<SkImageFilter> fFilter; |
(...skipping 236 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
474 skiatest::Reporter* reporter, | 474 skiatest::Reporter* reporter, |
475 GrContext* context) { | 475 GrContext* context) { |
476 // Check that all filters offset to their absolute crop rect, | 476 // Check that all filters offset to their absolute crop rect, |
477 // unaffected by the input crop rect. | 477 // unaffected by the input crop rect. |
478 // Tests pass by not asserting. | 478 // Tests pass by not asserting. |
479 sk_sp<SkSpecialImage> srcImg(create_empty_special_image(context, proxy, 100)
); | 479 sk_sp<SkSpecialImage> srcImg(create_empty_special_image(context, proxy, 100)
); |
480 SkASSERT(srcImg); | 480 SkASSERT(srcImg); |
481 | 481 |
482 SkImageFilter::CropRect inputCropRect(SkRect::MakeXYWH(8, 13, 80, 80)); | 482 SkImageFilter::CropRect inputCropRect(SkRect::MakeXYWH(8, 13, 80, 80)); |
483 SkImageFilter::CropRect cropRect(SkRect::MakeXYWH(20, 30, 60, 60)); | 483 SkImageFilter::CropRect cropRect(SkRect::MakeXYWH(20, 30, 60, 60)); |
484 SkAutoTUnref<SkImageFilter> input(make_grayscale(nullptr, &inputCropRect)); | 484 sk_sp<SkImageFilter> input(make_grayscale(nullptr, &inputCropRect)); |
485 | 485 |
486 FilterList filters(input.get(), &cropRect); | 486 FilterList filters(input, &cropRect); |
487 | 487 |
488 for (int i = 0; i < filters.count(); ++i) { | 488 for (int i = 0; i < filters.count(); ++i) { |
489 SkImageFilter* filter = filters.getFilter(i); | 489 SkImageFilter* filter = filters.getFilter(i); |
490 SkIPoint offset; | 490 SkIPoint offset; |
491 SkImageFilter::Context ctx(SkMatrix::I(), SkIRect::MakeWH(100, 100), nul
lptr); | 491 SkImageFilter::Context ctx(SkMatrix::I(), SkIRect::MakeWH(100, 100), nul
lptr); |
492 sk_sp<SkSpecialImage> resultImg(filter->filterImage(srcImg.get(), ctx, &
offset)); | 492 sk_sp<SkSpecialImage> resultImg(filter->filterImage(srcImg.get(), ctx, &
offset)); |
493 REPORTER_ASSERT_MESSAGE(reporter, resultImg, filters.getName(i)); | 493 REPORTER_ASSERT_MESSAGE(reporter, resultImg, filters.getName(i)); |
494 REPORTER_ASSERT_MESSAGE(reporter, offset.fX == 20 && offset.fY == 30, fi
lters.getName(i)); | 494 REPORTER_ASSERT_MESSAGE(reporter, offset.fX == 20 && offset.fY == 30, fi
lters.getName(i)); |
495 } | 495 } |
496 } | 496 } |
(...skipping 166 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
663 DEF_GPUTEST_FOR_NATIVE_CONTEXT(TestZeroBlurSigma_Gpu, reporter, context) { | 663 DEF_GPUTEST_FOR_NATIVE_CONTEXT(TestZeroBlurSigma_Gpu, reporter, context) { |
664 run_gpu_test(reporter, context, 100, test_zero_blur_sigma); | 664 run_gpu_test(reporter, context, 100, test_zero_blur_sigma); |
665 } | 665 } |
666 #endif | 666 #endif |
667 | 667 |
668 DEF_TEST(ImageFilterDrawTiled, reporter) { | 668 DEF_TEST(ImageFilterDrawTiled, reporter) { |
669 // Check that all filters when drawn tiled (with subsequent clip rects) exac
tly | 669 // Check that all filters when drawn tiled (with subsequent clip rects) exac
tly |
670 // match the same filters drawn with a single full-canvas bitmap draw. | 670 // match the same filters drawn with a single full-canvas bitmap draw. |
671 // Tests pass by not asserting. | 671 // Tests pass by not asserting. |
672 | 672 |
673 FilterList filters; | 673 FilterList filters(nullptr); |
674 | 674 |
675 SkBitmap untiledResult, tiledResult; | 675 SkBitmap untiledResult, tiledResult; |
676 const int width = 64, height = 64; | 676 const int width = 64, height = 64; |
677 untiledResult.allocN32Pixels(width, height); | 677 untiledResult.allocN32Pixels(width, height); |
678 tiledResult.allocN32Pixels(width, height); | 678 tiledResult.allocN32Pixels(width, height); |
679 SkCanvas tiledCanvas(tiledResult); | 679 SkCanvas tiledCanvas(tiledResult); |
680 SkCanvas untiledCanvas(untiledResult); | 680 SkCanvas untiledCanvas(untiledResult); |
681 int tileSize = 8; | 681 int tileSize = 8; |
682 | 682 |
683 for (int scale = 1; scale <= 2; ++scale) { | 683 for (int scale = 1; scale <= 2; ++scale) { |
(...skipping 112 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
796 sk_sp<SkImageFilter> filter2(make_blur(std::move(filter1))); | 796 sk_sp<SkImageFilter> filter2(make_blur(std::move(filter1))); |
797 | 797 |
798 SkIRect bounds = SkIRect::MakeXYWH(0, 0, 100, 100); | 798 SkIRect bounds = SkIRect::MakeXYWH(0, 0, 100, 100); |
799 SkIRect expectedBounds = SkIRect::MakeXYWH(-133, -133, 236, 236); | 799 SkIRect expectedBounds = SkIRect::MakeXYWH(-133, -133, 236, 236); |
800 bounds = filter2->filterBounds(bounds, SkMatrix::I()); | 800 bounds = filter2->filterBounds(bounds, SkMatrix::I()); |
801 | 801 |
802 REPORTER_ASSERT(reporter, bounds == expectedBounds); | 802 REPORTER_ASSERT(reporter, bounds == expectedBounds); |
803 } | 803 } |
804 | 804 |
805 DEF_TEST(ImageFilterDilateThenBlurBounds, reporter) { | 805 DEF_TEST(ImageFilterDilateThenBlurBounds, reporter) { |
806 sk_sp<SkImageFilter> filter1(SkDilateImageFilter::Create(2, 2)); | 806 sk_sp<SkImageFilter> filter1(SkDilateImageFilter::Make(2, 2, nullptr)); |
807 sk_sp<SkImageFilter> filter2(make_drop_shadow(std::move(filter1))); | 807 sk_sp<SkImageFilter> filter2(make_drop_shadow(std::move(filter1))); |
808 | 808 |
809 SkIRect bounds = SkIRect::MakeXYWH(0, 0, 100, 100); | 809 SkIRect bounds = SkIRect::MakeXYWH(0, 0, 100, 100); |
810 SkIRect expectedBounds = SkIRect::MakeXYWH(-132, -132, 234, 234); | 810 SkIRect expectedBounds = SkIRect::MakeXYWH(-132, -132, 234, 234); |
811 bounds = filter2->filterBounds(bounds, SkMatrix::I()); | 811 bounds = filter2->filterBounds(bounds, SkMatrix::I()); |
812 | 812 |
813 REPORTER_ASSERT(reporter, bounds == expectedBounds); | 813 REPORTER_ASSERT(reporter, bounds == expectedBounds); |
814 } | 814 } |
815 | 815 |
816 DEF_TEST(ImageFilterComposedBlurFastBounds, reporter) { | 816 DEF_TEST(ImageFilterComposedBlurFastBounds, reporter) { |
(...skipping 806 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1623 | 1623 |
1624 test_xfermode_cropped_input(&canvas, reporter); | 1624 test_xfermode_cropped_input(&canvas, reporter); |
1625 } | 1625 } |
1626 | 1626 |
1627 DEF_GPUTEST_FOR_ALL_CONTEXTS(BlurLargeImage_Gpu, reporter, context) { | 1627 DEF_GPUTEST_FOR_ALL_CONTEXTS(BlurLargeImage_Gpu, reporter, context) { |
1628 auto surface(SkSurface::MakeRenderTarget(context, SkBudgeted::kYes, | 1628 auto surface(SkSurface::MakeRenderTarget(context, SkBudgeted::kYes, |
1629 SkImageInfo::MakeN32Premul(100, 100
))); | 1629 SkImageInfo::MakeN32Premul(100, 100
))); |
1630 test_large_blur_input(reporter, surface->getCanvas()); | 1630 test_large_blur_input(reporter, surface->getCanvas()); |
1631 } | 1631 } |
1632 #endif | 1632 #endif |
OLD | NEW |