123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899 |
- /*
- * Copyright 2015 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/SkPaint.h"
- #include "include/core/SkRRect.h"
- #include "include/core/SkRect.h"
- #include "include/core/SkScalar.h"
- #include "include/core/SkSize.h"
- #include "include/core/SkString.h"
- #include "src/core/SkClipOpPriv.h"
- namespace skiagm {
- // This GM reproduces the precision artifacts seen in crbug.com/560651.
- // It draws a largish blurred circle with its center clipped out.
- class BlurredClippedCircleGM : public GM {
- public:
- BlurredClippedCircleGM() {
- this->setBGColor(0xFFCCCCCC);
- }
- protected:
- SkString onShortName() override {
- return SkString("blurredclippedcircle");
- }
- SkISize onISize() override {
- return SkISize::Make(kWidth, kHeight);
- }
- void onDraw(SkCanvas* canvas) override {
- SkPaint whitePaint;
- whitePaint.setColor(SK_ColorWHITE);
- whitePaint.setBlendMode(SkBlendMode::kSrc);
- whitePaint.setAntiAlias(true);
- // This scale exercises precision limits in the circle blur effect (crbug.com/560651)
- constexpr float kScale = 2.0f;
- canvas->scale(kScale, kScale);
- canvas->save();
- SkRect clipRect1 = SkRect::MakeLTRB(0, 0,
- SkIntToScalar(kWidth), SkIntToScalar(kHeight));
- canvas->clipRect(clipRect1);
- canvas->save();
- canvas->clipRect(clipRect1);
- canvas->drawRect(clipRect1, whitePaint);
- canvas->save();
- SkRect clipRect2 = SkRect::MakeLTRB(8, 8, 288, 288);
- SkRRect clipRRect = SkRRect::MakeOval(clipRect2);
- canvas->clipRRect(clipRRect, kDifference_SkClipOp, true);
- SkRect r = SkRect::MakeLTRB(4, 4, 292, 292);
- SkRRect rr = SkRRect::MakeOval(r);
- SkPaint paint;
- paint.setMaskFilter(SkMaskFilter::MakeBlur(
- kNormal_SkBlurStyle,
- 1.366025f));
- paint.setColorFilter(SkColorFilters::Blend(SK_ColorRED,
- SkBlendMode::kSrcIn));
- paint.setAntiAlias(true);
- canvas->drawRRect(rr, paint);
- canvas->restore();
- canvas->restore();
- canvas->restore();
- }
- private:
- static constexpr int kWidth = 1164;
- static constexpr int kHeight = 802;
- typedef GM INHERITED;
- };
- //////////////////////////////////////////////////////////////////////////////
- DEF_GM(return new BlurredClippedCircleGM;)
- }
|