Chromium Code Reviews| 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(pictur e)); | |
|
f(malita)
2016/04/03 16:47:50
nit: std::move(picture)
robertphillips
2016/04/03 20:18:00
Done.
| |
| 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 |