| /* |
| * Copyright 2013 Google Inc. |
| * |
| * Use of this source code is governed by a BSD-style license that can be |
| * found in the LICENSE file. |
| */ |
| |
| #include "gm/gm.h" |
| #include "include/core/SkBlendMode.h" |
| #include "include/core/SkBlurTypes.h" |
| #include "include/core/SkCanvas.h" |
| #include "include/core/SkColor.h" |
| #include "include/core/SkColorFilter.h" |
| #include "include/core/SkMaskFilter.h" |
| #include "include/core/SkMatrix.h" |
| #include "include/core/SkPaint.h" |
| #include "include/core/SkPoint.h" |
| #include "include/core/SkRRect.h" |
| #include "include/core/SkRect.h" |
| #include "include/core/SkRefCnt.h" |
| #include "include/core/SkScalar.h" |
| #include "include/core/SkShader.h" |
| #include "include/core/SkSize.h" |
| #include "include/core/SkString.h" |
| #include "include/core/SkTileMode.h" |
| #include "include/core/SkTypes.h" |
| #include "include/effects/SkGradientShader.h" |
| #include "src/core/SkBlurMask.h" |
| |
| /* |
| * Spits out an arbitrary gradient to test blur with shader on paint |
| */ |
| static sk_sp<SkShader> MakeRadial() { |
| SkPoint pts[2] = { |
| { 0, 0 }, |
| { SkIntToScalar(100), SkIntToScalar(100) } |
| }; |
| SkTileMode tm = SkTileMode::kClamp; |
| const SkColor colors[] = { SK_ColorRED, SK_ColorGREEN, }; |
| const SkScalar pos[] = { SK_Scalar1/4, SK_Scalar1*3/4 }; |
| SkMatrix scale; |
| scale.setScale(0.5f, 0.5f); |
| scale.postTranslate(5.f, 5.f); |
| SkPoint center0, center1; |
| center0.set(SkScalarAve(pts[0].fX, pts[1].fX), |
| SkScalarAve(pts[0].fY, pts[1].fY)); |
| center1.set(SkScalarInterp(pts[0].fX, pts[1].fX, SkIntToScalar(3)/5), |
| SkScalarInterp(pts[0].fY, pts[1].fY, SkIntToScalar(1)/4)); |
| return SkGradientShader::MakeTwoPointConical(center1, (pts[1].fX - pts[0].fX) / 7, |
| center0, (pts[1].fX - pts[0].fX) / 2, |
| colors, pos, std::size(colors), tm, |
| 0, &scale); |
| } |
| |
| // Simpler blurred RR test cases where all the radii are the same. |
| class SimpleBlurRoundRectGM : public skiagm::GM { |
| SkString onShortName() override { return SkString("simpleblurroundrect"); } |
| |
| SkISize onISize() override { return {1000, 500}; } |
| |
| bool runAsBench() const override { return true; } |
| |
| void onDraw(SkCanvas* canvas) override { |
| canvas->scale(1.5f, 1.5f); |
| canvas->translate(50,50); |
| |
| const float blurRadii[] = { 1,5,10,20 }; |
| const int cornerRadii[] = { 1,5,10,20 }; |
| const SkRect r = SkRect::MakeWH(SkIntToScalar(25), SkIntToScalar(25)); |
| for (size_t i = 0; i < std::size(blurRadii); ++i) { |
| SkAutoCanvasRestore autoRestore(canvas, true); |
| canvas->translate(0, (r.height() + SkIntToScalar(50)) * i); |
| for (size_t j = 0; j < std::size(cornerRadii); ++j) { |
| for (int k = 0; k <= 1; k++) { |
| SkPaint paint; |
| paint.setColor(SK_ColorBLACK); |
| paint.setMaskFilter(SkMaskFilter::MakeBlur(kNormal_SkBlurStyle, |
| SkBlurMask::ConvertRadiusToSigma(SkIntToScalar(blurRadii[i])))); |
| |
| bool useRadial = SkToBool(k); |
| if (useRadial) { |
| paint.setShader(MakeRadial()); |
| } |
| |
| SkRRect rrect; |
| rrect.setRectXY(r, SkIntToScalar(cornerRadii[j]), |
| SkIntToScalar(cornerRadii[j])); |
| canvas->drawRRect(rrect, paint); |
| canvas->translate(r.width() + SkIntToScalar(50), 0); |
| } |
| } |
| } |
| } |
| }; |
| |
| // Create one with dimensions/rounded corners based on the skp |
| // |
| // TODO(scroggo): Disabled in an attempt to rememdy |
| // https://code.google.com/p/skia/issues/detail?id=1801 ('Win7 Test bots all failing GenerateGMs: |
| // ran wrong number of tests') |
| //DEF_GM(return new BlurRoundRectGM(600, 5514, 6);) |
| |
| DEF_GM(return new SimpleBlurRoundRectGM();) |
| |
| // From crbug.com/1138810 |
| DEF_SIMPLE_GM(blur_large_rrects, canvas, 300, 300) { |
| SkPaint paint; |
| paint.setMaskFilter(SkMaskFilter::MakeBlur(kNormal_SkBlurStyle, 20.f)); |
| |
| auto rect = SkRect::MakeLTRB(5.f, -20000.f, 240.f, 25.f); |
| SkRRect rrect = SkRRect::MakeRectXY(rect, 40.f, 40.f); |
| for (int i = 0; i < 4; ++i) { |
| SkColor4f color{(i & 1) ? 1.f : 0.f, |
| (i & 2) ? 1.f : 0.f, |
| (i < 2) ? 1.f : 0.f, |
| 1.f}; |
| paint.setColor(color); |
| canvas->drawRRect(rrect, paint); |
| canvas->rotate(90.f, 150.f, 150.f); |
| } |
| } |