Index: gm/imagefiltersscaled.cpp |
diff --git a/gm/imagefiltersscaled.cpp b/gm/imagefiltersscaled.cpp |
index 46f998cc2841abb1aa98d7546501f54f9cfaa35c..4c48aec869549e68b83f8bf23bb3fd9051de388d 100644 |
--- a/gm/imagefiltersscaled.cpp |
+++ b/gm/imagefiltersscaled.cpp |
@@ -25,6 +25,25 @@ |
#define RESIZE_FACTOR SkIntToScalar(4) |
+static sk_sp<SkImage> make_gradient_circle(int width, int height) { |
+ SkScalar x = SkIntToScalar(width / 2); |
+ SkScalar y = SkIntToScalar(height / 2); |
+ SkScalar radius = SkScalarMul(SkMinScalar(x, y), SkIntToScalar(4) / SkIntToScalar(5)); |
+ sk_sp<SkSurface> surface(SkSurface::MakeRasterN32Premul(width, height)); |
+ SkCanvas* canvas = surface->getCanvas(); |
+ canvas->clear(0x00000000); |
+ SkColor colors[2]; |
+ colors[0] = SK_ColorWHITE; |
+ colors[1] = SK_ColorBLACK; |
+ SkPaint paint; |
+ paint.setShader(SkGradientShader::MakeRadial(SkPoint::Make(x, y), radius, colors, nullptr, |
+ 2, SkShader::kClamp_TileMode)); |
+ canvas->drawCircle(x, y, radius, paint); |
+ |
+ return surface->makeImageSnapshot(); |
+} |
+ |
+ |
namespace skiagm { |
class ImageFiltersScaledGM : public GM { |
@@ -46,7 +65,7 @@ protected: |
void onOnceBeforeDraw() override { |
fCheckerboard = SkImage::MakeFromBitmap( |
sk_tool_utils::create_checkerboard_bitmap(64, 64, 0xFFA0A0A0, 0xFF404040, 8)); |
- fGradientCircle = MakeGradientCircle(64, 64); |
+ fGradientCircle = make_gradient_circle(64, 64); |
} |
void onDraw(SkCanvas* canvas) override { |
@@ -54,10 +73,10 @@ protected: |
sk_sp<SkImageFilter> gradient(SkImageSource::Make(fGradientCircle)); |
sk_sp<SkImageFilter> checkerboard(SkImageSource::Make(fCheckerboard)); |
- sk_sp<SkShader> noise(SkPerlinNoiseShader::MakeFractalNoise( |
- SkDoubleToScalar(0.1), SkDoubleToScalar(0.05), 1, 0)); |
+ |
SkPaint noisePaint; |
- noisePaint.setShader(noise); |
+ noisePaint.setShader(SkPerlinNoiseShader::MakeFractalNoise(SkDoubleToScalar(0.1), |
+ SkDoubleToScalar(0.05), 1, 0)); |
SkPoint3 pointLocation = SkPoint3::Make(0, 0, SkIntToScalar(10)); |
SkPoint3 spotLocation = SkPoint3::Make(SkIntToScalar(-10), |
@@ -72,24 +91,29 @@ protected: |
SkMatrix resizeMatrix; |
resizeMatrix.setScale(RESIZE_FACTOR, RESIZE_FACTOR); |
- SkImageFilter* filters[] = { |
- SkBlurImageFilter::Make(SkIntToScalar(4), SkIntToScalar(4), nullptr).release(), |
- SkDropShadowImageFilter::Make(SkIntToScalar(5), SkIntToScalar(10), |
- SkIntToScalar(3), SkIntToScalar(3), SK_ColorYELLOW, |
- SkDropShadowImageFilter::kDrawShadowAndForeground_ShadowMode, nullptr).release(), |
- SkDisplacementMapEffect::Create(SkDisplacementMapEffect::kR_ChannelSelectorType, |
+ sk_sp<SkImageFilter> filters[] = { |
+ SkBlurImageFilter::Make(SkIntToScalar(4), SkIntToScalar(4), nullptr), |
+ SkDropShadowImageFilter::Make( |
+ SkIntToScalar(5), SkIntToScalar(10), |
+ SkIntToScalar(3), SkIntToScalar(3), SK_ColorYELLOW, |
+ SkDropShadowImageFilter::kDrawShadowAndForeground_ShadowMode, |
+ nullptr), |
+ sk_sp<SkImageFilter>(SkDisplacementMapEffect::Create( |
+ SkDisplacementMapEffect::kR_ChannelSelectorType, |
SkDisplacementMapEffect::kR_ChannelSelectorType, |
SkIntToScalar(12), |
gradient.get(), |
- checkerboard.get()), |
- SkDilateImageFilter::Make(1, 1, checkerboard).release(), |
- SkErodeImageFilter::Make(1, 1, checkerboard).release(), |
- SkOffsetImageFilter::Make(SkIntToScalar(32), 0, nullptr).release(), |
- SkImageFilter::MakeMatrixFilter(resizeMatrix, kNone_SkFilterQuality, nullptr).release(), |
- SkPaintImageFilter::Make(noisePaint).release(), |
- SkLightingImageFilter::CreatePointLitDiffuse(pointLocation, white, surfaceScale, kd), |
- SkLightingImageFilter::CreateSpotLitDiffuse(spotLocation, spotTarget, spotExponent, |
- cutoffAngle, white, surfaceScale, kd), |
+ checkerboard.get())), |
+ SkDilateImageFilter::Make(1, 1, checkerboard), |
+ SkErodeImageFilter::Make(1, 1, checkerboard), |
+ SkOffsetImageFilter::Make(SkIntToScalar(32), 0, nullptr), |
+ SkImageFilter::MakeMatrixFilter(resizeMatrix, kNone_SkFilterQuality, nullptr), |
+ SkPaintImageFilter::Make(noisePaint), |
+ SkLightingImageFilter::MakePointLitDiffuse(pointLocation, white, surfaceScale, kd, |
+ nullptr), |
+ SkLightingImageFilter::MakeSpotLitDiffuse(spotLocation, spotTarget, spotExponent, |
+ cutoffAngle, white, surfaceScale, kd, |
+ nullptr), |
}; |
SkVector scales[] = { |
@@ -128,31 +152,9 @@ protected: |
canvas->restore(); |
canvas->translate(0, r.height() * scales[j].fY + margin); |
} |
- |
- for (size_t i = 0; i < SK_ARRAY_COUNT(filters); ++i) { |
- filters[i]->unref(); |
- } |
} |
private: |
- static sk_sp<SkImage> MakeGradientCircle(int width, int height) { |
- SkScalar x = SkIntToScalar(width / 2); |
- SkScalar y = SkIntToScalar(height / 2); |
- SkScalar radius = SkScalarMul(SkMinScalar(x, y), SkIntToScalar(4) / SkIntToScalar(5)); |
- auto surface(SkSurface::MakeRasterN32Premul(width, height)); |
- SkCanvas* canvas = surface->getCanvas(); |
- canvas->clear(0x00000000); |
- SkColor colors[2]; |
- colors[0] = SK_ColorWHITE; |
- colors[1] = SK_ColorBLACK; |
- SkPaint paint; |
- paint.setShader(SkGradientShader::MakeRadial(SkPoint::Make(x, y), radius, colors, nullptr, |
- 2, SkShader::kClamp_TileMode)); |
- canvas->drawCircle(x, y, radius, paint); |
- |
- return surface->makeImageSnapshot(); |
- } |
- |
sk_sp<SkImage> fCheckerboard, fGradientCircle; |
typedef GM INHERITED; |