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 125 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
136 SkBitmap make_gradient_circle(int width, int height) { | 136 SkBitmap make_gradient_circle(int width, int height) { |
137 SkBitmap bitmap; | 137 SkBitmap bitmap; |
138 bitmap.allocN32Pixels(width, height); | 138 bitmap.allocN32Pixels(width, height); |
139 SkCanvas canvas(bitmap); | 139 SkCanvas canvas(bitmap); |
140 draw_gradient_circle(&canvas, width, height); | 140 draw_gradient_circle(&canvas, width, height); |
141 return bitmap; | 141 return bitmap; |
142 } | 142 } |
143 | 143 |
144 class FilterList { | 144 class FilterList { |
145 public: | 145 public: |
146 FilterList(SkImageFilter* input = nullptr, const SkImageFilter::CropRect* cr
opRect = nullptr) { | 146 FilterList(sk_sp<SkImageFilter> input, const SkImageFilter::CropRect* cropRe
ct = nullptr) { |
147 SkPoint3 location = SkPoint3::Make(0, 0, SK_Scalar1); | 147 SkPoint3 location = SkPoint3::Make(0, 0, SK_Scalar1); |
148 SkScalar kernel[9] = { | 148 SkScalar kernel[9] = { |
149 SkIntToScalar( 1), SkIntToScalar( 1), SkIntToScalar( 1), | 149 SkIntToScalar( 1), SkIntToScalar( 1), SkIntToScalar( 1), |
150 SkIntToScalar( 1), SkIntToScalar(-7), SkIntToScalar( 1), | 150 SkIntToScalar( 1), SkIntToScalar(-7), SkIntToScalar( 1), |
151 SkIntToScalar( 1), SkIntToScalar( 1), SkIntToScalar( 1), | 151 SkIntToScalar( 1), SkIntToScalar( 1), SkIntToScalar( 1), |
152 }; | 152 }; |
153 const SkISize kernelSize = SkISize::Make(3, 3); | 153 const SkISize kernelSize = SkISize::Make(3, 3); |
154 const SkScalar gain = SK_Scalar1, bias = 0; | 154 const SkScalar gain = SK_Scalar1, bias = 0; |
155 const SkScalar five = SkIntToScalar(5); | 155 const SkScalar five = SkIntToScalar(5); |
156 | 156 |
157 SkMatrix matrix; | 157 SkMatrix matrix; |
158 | 158 |
159 matrix.setTranslate(SK_Scalar1, SK_Scalar1); | 159 matrix.setTranslate(SK_Scalar1, SK_Scalar1); |
160 matrix.postRotate(SkIntToScalar(45), SK_Scalar1, SK_Scalar1); | 160 matrix.postRotate(SkIntToScalar(45), SK_Scalar1, SK_Scalar1); |
161 | 161 |
162 { | 162 { |
163 sk_sp<SkColorFilter> cf(SkColorFilter::MakeModeFilter(SK_ColorRED, | 163 sk_sp<SkColorFilter> cf(SkColorFilter::MakeModeFilter(SK_ColorRED, |
164 SkXfermode::kS
rcIn_Mode)); | 164 SkXfermode::kS
rcIn_Mode)); |
165 | 165 |
166 this->addFilter("color filter", | 166 this->addFilter("color filter", |
167 SkColorFilterImageFilter::Create(cf.get(), input, cropRect)); | 167 SkColorFilterImageFilter::Create(cf.get(), input.get(), cropRect
)); |
168 } | 168 } |
169 | 169 |
170 { | 170 { |
171 sk_sp<SkImage> gradientImage(SkImage::MakeFromBitmap(make_gradient_c
ircle(64, 64))); | 171 sk_sp<SkImage> gradientImage(SkImage::MakeFromBitmap(make_gradient_c
ircle(64, 64))); |
172 sk_sp<SkImageFilter> gradientSource(SkImageSource::Make(std::move(gr
adientImage))); | 172 sk_sp<SkImageFilter> gradientSource(SkImageSource::Make(std::move(gr
adientImage))); |
173 | 173 |
174 this->addFilter("displacement map", SkDisplacementMapEffect::Create( | 174 this->addFilter("displacement map", SkDisplacementMapEffect::Create( |
175 SkDisplacementMapEffect::kR_ChannelSelectorType, | 175 SkDisplacementMapEffect::kR_ChannelSelectorType, |
176 SkDisplacementMapEffect::kB_ChannelSelectorType, | 176 SkDisplacementMapEffect::kB_ChannelSelectorType, |
177 20.0f, gradientSource.get(), input, cropRect)); | 177 20.0f, gradientSource.get(), input.get(), cropRect)); |
178 } | 178 } |
179 | 179 |
180 this->addFilter("blur", SkBlurImageFilter::Make(SK_Scalar1, | 180 this->addFilter("blur", SkBlurImageFilter::Make(SK_Scalar1, |
181 SK_Scalar1, | 181 SK_Scalar1, |
182 sk_ref_sp<SkImageFilter>
(input), | 182 input, |
183 cropRect).release()); | 183 cropRect).release()); |
184 this->addFilter("drop shadow", SkDropShadowImageFilter::Create( | 184 this->addFilter("drop shadow", SkDropShadowImageFilter::Create( |
185 SK_Scalar1, SK_Scalar1, SK_Scalar1, SK_Scalar1, SK_ColorGREEN, | 185 SK_Scalar1, SK_Scalar1, SK_Scalar1, SK_Scalar1, SK_ColorGREEN, |
186 SkDropShadowImageFilter::kDrawShadowAndForeground_ShadowMode,
input, cropRect)); | 186 SkDropShadowImageFilter::kDrawShadowAndForeground_ShadowMode, |
| 187 input.get(), cropRect)); |
187 this->addFilter("diffuse lighting", SkLightingImageFilter::CreatePointLi
tDiffuse( | 188 this->addFilter("diffuse lighting", SkLightingImageFilter::CreatePointLi
tDiffuse( |
188 location, SK_ColorGREEN, 0, 0, input, cropRect)); | 189 location, SK_ColorGREEN, 0, 0, input.get(), cropRect)); |
189 this->addFilter("specular lighting", | 190 this->addFilter("specular lighting", |
190 SkLightingImageFilter::CreatePointLitSpecular(location, SK_Col
orGREEN, 0, 0, 0, | 191 SkLightingImageFilter::CreatePointLitSpecular(location, SK_Col
orGREEN, 0, 0, 0, |
191 input, cropRect)
); | 192 input.get(), cro
pRect)); |
192 this->addFilter("matrix convolution", | 193 this->addFilter("matrix convolution", |
193 SkMatrixConvolutionImageFilter::Create( | 194 SkMatrixConvolutionImageFilter::Create( |
194 kernelSize, kernel, gain, bias, SkIPoint::Make(1, 1), | 195 kernelSize, kernel, gain, bias, SkIPoint::Make(1, 1), |
195 SkMatrixConvolutionImageFilter::kRepeat_TileMode, false, i
nput, cropRect)); | 196 SkMatrixConvolutionImageFilter::kRepeat_TileMode, false, |
196 this->addFilter("merge", SkMergeImageFilter::Make(sk_ref_sp<SkImageFilte
r>(input), | 197 input.get(), cropRect)); |
197 sk_ref_sp<SkImageFilte
r>(input), | 198 this->addFilter("merge", SkMergeImageFilter::Make(input, input, |
198 SkXfermode::kSrcOver_M
ode, | 199 SkXfermode::kSrcOver_M
ode, |
199 cropRect).release()); | 200 cropRect).release()); |
200 { | 201 { |
201 SkPaint greenColorShaderPaint; | 202 SkPaint greenColorShaderPaint; |
202 greenColorShaderPaint.setShader(SkShader::MakeColorShader(SK_ColorGR
EEN)); | 203 greenColorShaderPaint.setShader(SkShader::MakeColorShader(SK_ColorGR
EEN)); |
203 | 204 |
204 SkImageFilter::CropRect leftSideCropRect(SkRect::MakeXYWH(0, 0, 32,
64)); | 205 SkImageFilter::CropRect leftSideCropRect(SkRect::MakeXYWH(0, 0, 32,
64)); |
205 sk_sp<SkImageFilter> paintFilterLeft(SkPaintImageFilter::Make(greenC
olorShaderPaint, | 206 sk_sp<SkImageFilter> paintFilterLeft(SkPaintImageFilter::Make(greenC
olorShaderPaint, |
206 &leftS
ideCropRect)); | 207 &leftS
ideCropRect)); |
207 SkImageFilter::CropRect rightSideCropRect(SkRect::MakeXYWH(32, 0, 32
, 64)); | 208 SkImageFilter::CropRect rightSideCropRect(SkRect::MakeXYWH(32, 0, 32
, 64)); |
208 sk_sp<SkImageFilter> paintFilterRight(SkPaintImageFilter::Make(green
ColorShaderPaint, | 209 sk_sp<SkImageFilter> paintFilterRight(SkPaintImageFilter::Make(green
ColorShaderPaint, |
209 &righ
tSideCropRect)); | 210 &righ
tSideCropRect)); |
210 | 211 |
211 | 212 |
212 this->addFilter("merge with disjoint inputs", SkMergeImageFilter::Ma
ke( | 213 this->addFilter("merge with disjoint inputs", SkMergeImageFilter::Ma
ke( |
213 std::move(paintFilterLeft), std::move(paintFilterRight), | 214 std::move(paintFilterLeft), std::move(paintFilterRight), |
214 SkXfermode::kSrcOver_Mode, cropRect).release()); | 215 SkXfermode::kSrcOver_Mode, cropRect).release()); |
215 } | 216 } |
216 | 217 |
217 this->addFilter("offset", | 218 this->addFilter("offset", |
218 SkOffsetImageFilter::Make(SK_Scalar1, SK_Scalar1, | 219 SkOffsetImageFilter::Make(SK_Scalar1, SK_Scalar1, input, |
219 sk_ref_sp<SkImageFilter>(input
), | |
220 cropRect).release()); | 220 cropRect).release()); |
221 this->addFilter("dilate", SkDilateImageFilter::Create(3, 2, input, cropR
ect)); | 221 this->addFilter("dilate", SkDilateImageFilter::Make(3, 2, input, cropRec
t).release()); |
222 this->addFilter("erode", SkErodeImageFilter::Create(2, 3, input, cropRec
t)); | 222 this->addFilter("erode", SkErodeImageFilter::Make(2, 3, input, cropRect)
.release()); |
223 this->addFilter("tile", SkTileImageFilter::Create( | 223 this->addFilter("tile", SkTileImageFilter::Create( |
224 SkRect::MakeXYWH(0, 0, 50, 50), | 224 SkRect::MakeXYWH(0, 0, 50, 50), |
225 cropRect ? cropRect->rect() : SkRect::MakeXYWH(0, 0, 100, 100), | 225 cropRect ? cropRect->rect() : SkRect::MakeXYWH(0, 0, 100, 100), |
226 input)); | 226 input.get())); |
227 if (!cropRect) { | 227 if (!cropRect) { |
228 this->addFilter("matrix", SkImageFilter::CreateMatrixFilter( | 228 this->addFilter("matrix", SkImageFilter::CreateMatrixFilter( |
229 matrix, kLow_SkFilterQuality, input)); | 229 matrix, kLow_SkFilterQuality, input.get())); |
230 } | 230 } |
231 | 231 |
232 { | 232 { |
233 sk_sp<SkImageFilter> blur(SkBlurImageFilter::Make(five, five, | 233 sk_sp<SkImageFilter> blur(SkBlurImageFilter::Make(five, five, input)
); |
234 sk_ref_sp<SkImageF
ilter>(input))); | |
235 | 234 |
236 this->addFilter("blur and offset", SkOffsetImageFilter::Make(five, f
ive, | 235 this->addFilter("blur and offset", SkOffsetImageFilter::Make(five, f
ive, |
237 std::mo
ve(blur), | 236 std::mo
ve(blur), |
238 cropRec
t).release()); | 237 cropRec
t).release()); |
239 } | 238 } |
240 { | 239 { |
241 SkRTreeFactory factory; | 240 SkRTreeFactory factory; |
242 SkPictureRecorder recorder; | 241 SkPictureRecorder recorder; |
243 SkCanvas* recordingCanvas = recorder.beginRecording(64, 64, &factory
, 0); | 242 SkCanvas* recordingCanvas = recorder.beginRecording(64, 64, &factory
, 0); |
244 | 243 |
(...skipping 10 matching lines...) Expand all Loading... |
255 { | 254 { |
256 SkPaint paint; | 255 SkPaint paint; |
257 paint.setShader(SkPerlinNoiseShader::MakeTurbulence(SK_Scalar1, SK_S
calar1, 1, 0)); | 256 paint.setShader(SkPerlinNoiseShader::MakeTurbulence(SK_Scalar1, SK_S
calar1, 1, 0)); |
258 sk_sp<SkImageFilter> paintFilter(SkPaintImageFilter::Make(paint)); | 257 sk_sp<SkImageFilter> paintFilter(SkPaintImageFilter::Make(paint)); |
259 | 258 |
260 this->addFilter("paint and blur", SkBlurImageFilter::Make(five, five
, | 259 this->addFilter("paint and blur", SkBlurImageFilter::Make(five, five
, |
261 std::move(
paintFilter), | 260 std::move(
paintFilter), |
262 cropRect).
release()); | 261 cropRect).
release()); |
263 } | 262 } |
264 this->addFilter("xfermode", SkXfermodeImageFilter::Make( | 263 this->addFilter("xfermode", SkXfermodeImageFilter::Make( |
265 SkXfermode::Make(SkXfermode::kSrc_Mode), input, input, cropRect).rel
ease()); | 264 SkXfermode::Make(SkXfermode::kSrc_Mode), input.get(), input.get(), |
| 265 cropRect).release()); |
266 } | 266 } |
267 int count() const { return fFilters.count(); } | 267 int count() const { return fFilters.count(); } |
268 SkImageFilter* getFilter(int index) const { return fFilters[index].fFilter.g
et(); } | 268 SkImageFilter* getFilter(int index) const { return fFilters[index].fFilter.g
et(); } |
269 const char* getName(int index) const { return fFilters[index].fName; } | 269 const char* getName(int index) const { return fFilters[index].fName; } |
270 private: | 270 private: |
271 struct Filter { | 271 struct Filter { |
272 Filter() : fName(nullptr), fFilter(nullptr) {} | 272 Filter() : fName(nullptr), fFilter(nullptr) {} |
273 Filter(const char* name, SkImageFilter* filter) : fName(name), fFilter(f
ilter) {} | 273 Filter(const char* name, SkImageFilter* filter) : fName(name), fFilter(f
ilter) {} |
274 const char* fName; | 274 const char* fName; |
275 sk_sp<SkImageFilter> fFilter; | 275 sk_sp<SkImageFilter> fFilter; |
(...skipping 236 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
512 skiatest::Reporter* reporter, | 512 skiatest::Reporter* reporter, |
513 GrContext* context) { | 513 GrContext* context) { |
514 // Check that all filters offset to their absolute crop rect, | 514 // Check that all filters offset to their absolute crop rect, |
515 // unaffected by the input crop rect. | 515 // unaffected by the input crop rect. |
516 // Tests pass by not asserting. | 516 // Tests pass by not asserting. |
517 sk_sp<SkSpecialImage> srcImg(create_empty_special_image(context, proxy, 100)
); | 517 sk_sp<SkSpecialImage> srcImg(create_empty_special_image(context, proxy, 100)
); |
518 SkASSERT(srcImg); | 518 SkASSERT(srcImg); |
519 | 519 |
520 SkImageFilter::CropRect inputCropRect(SkRect::MakeXYWH(8, 13, 80, 80)); | 520 SkImageFilter::CropRect inputCropRect(SkRect::MakeXYWH(8, 13, 80, 80)); |
521 SkImageFilter::CropRect cropRect(SkRect::MakeXYWH(20, 30, 60, 60)); | 521 SkImageFilter::CropRect cropRect(SkRect::MakeXYWH(20, 30, 60, 60)); |
522 SkAutoTUnref<SkImageFilter> input(make_grayscale(nullptr, &inputCropRect)); | 522 sk_sp<SkImageFilter> input(make_grayscale(nullptr, &inputCropRect)); |
523 | 523 |
524 FilterList filters(input.get(), &cropRect); | 524 FilterList filters(input, &cropRect); |
525 | 525 |
526 for (int i = 0; i < filters.count(); ++i) { | 526 for (int i = 0; i < filters.count(); ++i) { |
527 SkImageFilter* filter = filters.getFilter(i); | 527 SkImageFilter* filter = filters.getFilter(i); |
528 SkIPoint offset; | 528 SkIPoint offset; |
529 SkImageFilter::Context ctx(SkMatrix::I(), SkIRect::MakeWH(100, 100), nul
lptr); | 529 SkImageFilter::Context ctx(SkMatrix::I(), SkIRect::MakeWH(100, 100), nul
lptr); |
530 sk_sp<SkSpecialImage> resultImg(filter->filterImage(srcImg.get(), ctx, &
offset)); | 530 sk_sp<SkSpecialImage> resultImg(filter->filterImage(srcImg.get(), ctx, &
offset)); |
531 REPORTER_ASSERT_MESSAGE(reporter, resultImg, filters.getName(i)); | 531 REPORTER_ASSERT_MESSAGE(reporter, resultImg, filters.getName(i)); |
532 REPORTER_ASSERT_MESSAGE(reporter, offset.fX == 20 && offset.fY == 30, fi
lters.getName(i)); | 532 REPORTER_ASSERT_MESSAGE(reporter, offset.fX == 20 && offset.fY == 30, fi
lters.getName(i)); |
533 } | 533 } |
534 } | 534 } |
(...skipping 200 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
735 DEF_GPUTEST_FOR_NATIVE_CONTEXT(ImageFilterFailAffectsTransparentBlack_Gpu, repor
ter, context) { | 735 DEF_GPUTEST_FOR_NATIVE_CONTEXT(ImageFilterFailAffectsTransparentBlack_Gpu, repor
ter, context) { |
736 run_gpu_test(reporter, context, 100, test_fail_affects_transparent_black); | 736 run_gpu_test(reporter, context, 100, test_fail_affects_transparent_black); |
737 } | 737 } |
738 #endif | 738 #endif |
739 | 739 |
740 DEF_TEST(ImageFilterDrawTiled, reporter) { | 740 DEF_TEST(ImageFilterDrawTiled, reporter) { |
741 // Check that all filters when drawn tiled (with subsequent clip rects) exac
tly | 741 // Check that all filters when drawn tiled (with subsequent clip rects) exac
tly |
742 // match the same filters drawn with a single full-canvas bitmap draw. | 742 // match the same filters drawn with a single full-canvas bitmap draw. |
743 // Tests pass by not asserting. | 743 // Tests pass by not asserting. |
744 | 744 |
745 FilterList filters; | 745 FilterList filters(nullptr); |
746 | 746 |
747 SkBitmap untiledResult, tiledResult; | 747 SkBitmap untiledResult, tiledResult; |
748 const int width = 64, height = 64; | 748 const int width = 64, height = 64; |
749 untiledResult.allocN32Pixels(width, height); | 749 untiledResult.allocN32Pixels(width, height); |
750 tiledResult.allocN32Pixels(width, height); | 750 tiledResult.allocN32Pixels(width, height); |
751 SkCanvas tiledCanvas(tiledResult); | 751 SkCanvas tiledCanvas(tiledResult); |
752 SkCanvas untiledCanvas(untiledResult); | 752 SkCanvas untiledCanvas(untiledResult); |
753 int tileSize = 8; | 753 int tileSize = 8; |
754 | 754 |
755 for (int scale = 1; scale <= 2; ++scale) { | 755 for (int scale = 1; scale <= 2; ++scale) { |
(...skipping 112 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
868 sk_sp<SkImageFilter> filter2(make_blur(std::move(filter1))); | 868 sk_sp<SkImageFilter> filter2(make_blur(std::move(filter1))); |
869 | 869 |
870 SkIRect bounds = SkIRect::MakeXYWH(0, 0, 100, 100); | 870 SkIRect bounds = SkIRect::MakeXYWH(0, 0, 100, 100); |
871 SkIRect expectedBounds = SkIRect::MakeXYWH(-133, -133, 236, 236); | 871 SkIRect expectedBounds = SkIRect::MakeXYWH(-133, -133, 236, 236); |
872 bounds = filter2->filterBounds(bounds, SkMatrix::I()); | 872 bounds = filter2->filterBounds(bounds, SkMatrix::I()); |
873 | 873 |
874 REPORTER_ASSERT(reporter, bounds == expectedBounds); | 874 REPORTER_ASSERT(reporter, bounds == expectedBounds); |
875 } | 875 } |
876 | 876 |
877 DEF_TEST(ImageFilterDilateThenBlurBounds, reporter) { | 877 DEF_TEST(ImageFilterDilateThenBlurBounds, reporter) { |
878 sk_sp<SkImageFilter> filter1(SkDilateImageFilter::Create(2, 2)); | 878 sk_sp<SkImageFilter> filter1(SkDilateImageFilter::Make(2, 2, nullptr)); |
879 sk_sp<SkImageFilter> filter2(make_drop_shadow(std::move(filter1))); | 879 sk_sp<SkImageFilter> filter2(make_drop_shadow(std::move(filter1))); |
880 | 880 |
881 SkIRect bounds = SkIRect::MakeXYWH(0, 0, 100, 100); | 881 SkIRect bounds = SkIRect::MakeXYWH(0, 0, 100, 100); |
882 SkIRect expectedBounds = SkIRect::MakeXYWH(-132, -132, 234, 234); | 882 SkIRect expectedBounds = SkIRect::MakeXYWH(-132, -132, 234, 234); |
883 bounds = filter2->filterBounds(bounds, SkMatrix::I()); | 883 bounds = filter2->filterBounds(bounds, SkMatrix::I()); |
884 | 884 |
885 REPORTER_ASSERT(reporter, bounds == expectedBounds); | 885 REPORTER_ASSERT(reporter, bounds == expectedBounds); |
886 } | 886 } |
887 | 887 |
888 DEF_TEST(ImageFilterComposedBlurFastBounds, reporter) { | 888 DEF_TEST(ImageFilterComposedBlurFastBounds, reporter) { |
(...skipping 804 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1693 | 1693 |
1694 test_xfermode_cropped_input(&canvas, reporter); | 1694 test_xfermode_cropped_input(&canvas, reporter); |
1695 } | 1695 } |
1696 | 1696 |
1697 DEF_GPUTEST_FOR_ALL_CONTEXTS(BlurLargeImage_Gpu, reporter, context) { | 1697 DEF_GPUTEST_FOR_ALL_CONTEXTS(BlurLargeImage_Gpu, reporter, context) { |
1698 auto surface(SkSurface::MakeRenderTarget(context, SkBudgeted::kYes, | 1698 auto surface(SkSurface::MakeRenderTarget(context, SkBudgeted::kYes, |
1699 SkImageInfo::MakeN32Premul(100, 100
))); | 1699 SkImageInfo::MakeN32Premul(100, 100
))); |
1700 test_large_blur_input(reporter, surface->getCanvas()); | 1700 test_large_blur_input(reporter, surface->getCanvas()); |
1701 } | 1701 } |
1702 #endif | 1702 #endif |
OLD | NEW |