blurredclippedcircle.cpp 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899
  1. /*
  2. * Copyright 2015 Google Inc.
  3. *
  4. * Use of this source code is governed by a BSD-style license that can be
  5. * found in the LICENSE file.
  6. */
  7. #include "gm/gm.h"
  8. #include "include/core/SkBlendMode.h"
  9. #include "include/core/SkBlurTypes.h"
  10. #include "include/core/SkCanvas.h"
  11. #include "include/core/SkColor.h"
  12. #include "include/core/SkColorFilter.h"
  13. #include "include/core/SkMaskFilter.h"
  14. #include "include/core/SkPaint.h"
  15. #include "include/core/SkRRect.h"
  16. #include "include/core/SkRect.h"
  17. #include "include/core/SkScalar.h"
  18. #include "include/core/SkSize.h"
  19. #include "include/core/SkString.h"
  20. #include "src/core/SkClipOpPriv.h"
  21. namespace skiagm {
  22. // This GM reproduces the precision artifacts seen in crbug.com/560651.
  23. // It draws a largish blurred circle with its center clipped out.
  24. class BlurredClippedCircleGM : public GM {
  25. public:
  26. BlurredClippedCircleGM() {
  27. this->setBGColor(0xFFCCCCCC);
  28. }
  29. protected:
  30. SkString onShortName() override {
  31. return SkString("blurredclippedcircle");
  32. }
  33. SkISize onISize() override {
  34. return SkISize::Make(kWidth, kHeight);
  35. }
  36. void onDraw(SkCanvas* canvas) override {
  37. SkPaint whitePaint;
  38. whitePaint.setColor(SK_ColorWHITE);
  39. whitePaint.setBlendMode(SkBlendMode::kSrc);
  40. whitePaint.setAntiAlias(true);
  41. // This scale exercises precision limits in the circle blur effect (crbug.com/560651)
  42. constexpr float kScale = 2.0f;
  43. canvas->scale(kScale, kScale);
  44. canvas->save();
  45. SkRect clipRect1 = SkRect::MakeLTRB(0, 0,
  46. SkIntToScalar(kWidth), SkIntToScalar(kHeight));
  47. canvas->clipRect(clipRect1);
  48. canvas->save();
  49. canvas->clipRect(clipRect1);
  50. canvas->drawRect(clipRect1, whitePaint);
  51. canvas->save();
  52. SkRect clipRect2 = SkRect::MakeLTRB(8, 8, 288, 288);
  53. SkRRect clipRRect = SkRRect::MakeOval(clipRect2);
  54. canvas->clipRRect(clipRRect, kDifference_SkClipOp, true);
  55. SkRect r = SkRect::MakeLTRB(4, 4, 292, 292);
  56. SkRRect rr = SkRRect::MakeOval(r);
  57. SkPaint paint;
  58. paint.setMaskFilter(SkMaskFilter::MakeBlur(
  59. kNormal_SkBlurStyle,
  60. 1.366025f));
  61. paint.setColorFilter(SkColorFilters::Blend(SK_ColorRED,
  62. SkBlendMode::kSrcIn));
  63. paint.setAntiAlias(true);
  64. canvas->drawRRect(rr, paint);
  65. canvas->restore();
  66. canvas->restore();
  67. canvas->restore();
  68. }
  69. private:
  70. static constexpr int kWidth = 1164;
  71. static constexpr int kHeight = 802;
  72. typedef GM INHERITED;
  73. };
  74. //////////////////////////////////////////////////////////////////////////////
  75. DEF_GM(return new BlurredClippedCircleGM;)
  76. }