| Index: gm/blurredclippedcircle.cpp
|
| diff --git a/gm/blurredclippedcircle.cpp b/gm/blurredclippedcircle.cpp
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..d1d374c7d44a3a40cf00bbb0a2a51f07935d6acc
|
| --- /dev/null
|
| +++ b/gm/blurredclippedcircle.cpp
|
| @@ -0,0 +1,92 @@
|
| +/*
|
| + * 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.h"
|
| +#include "SkBlurMaskFilter.h"
|
| +#include "SkColorFilter.h"
|
| +#include "SkPaint.h"
|
| +#include "SkRRect.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(sk_tool_utils::color_to_565(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.setXfermode(SkXfermode::Create(SkXfermode::kSrc_Mode))->unref();
|
| + whitePaint.setAntiAlias(true);
|
| +
|
| + // This scale exercises precision limits in the circle blur effect (crbug.com/560651)
|
| + static const float kScale = 2.0f;
|
| + canvas->scale(kScale, kScale);
|
| +
|
| + canvas->save();
|
| + SkRect clipRect1 = SkRect::MakeLTRB(0, 0,
|
| + SkIntToScalar(kWidth), SkIntToScalar(kHeight));
|
| +
|
| + canvas->clipRect(clipRect1, SkRegion::kIntersect_Op, false);
|
| +
|
| + canvas->save();
|
| +
|
| + canvas->clipRect(clipRect1, SkRegion::kIntersect_Op, false);
|
| + canvas->drawRect(clipRect1, whitePaint);
|
| +
|
| + canvas->save();
|
| +
|
| + SkRect clipRect2 = SkRect::MakeLTRB(8, 8, 288, 288);
|
| + SkRRect clipRRect = SkRRect::MakeOval(clipRect2);
|
| + canvas->clipRRect(clipRRect, SkRegion::kDifference_Op, true);
|
| +
|
| + SkRect r = SkRect::MakeLTRB(4, 4, 292, 292);
|
| + SkRRect rr = SkRRect::MakeOval(r);
|
| +
|
| + SkPaint paint;
|
| +
|
| + paint.setMaskFilter(SkBlurMaskFilter::Create(
|
| + kNormal_SkBlurStyle,
|
| + 1.366025f,
|
| + SkBlurMaskFilter::kHighQuality_BlurFlag))->unref();
|
| + paint.setColorFilter(SkColorFilter::CreateModeFilter(
|
| + SK_ColorRED,
|
| + SkXfermode::kSrcIn_Mode))->unref();
|
| + paint.setAntiAlias(true);
|
| +
|
| + canvas->drawRRect(rr, paint);
|
| +
|
| + canvas->restore();
|
| + canvas->restore();
|
| + canvas->restore();
|
| + }
|
| +
|
| +private:
|
| + static const int kWidth = 1164;
|
| + static const int kHeight = 802;
|
| +
|
| + typedef GM INHERITED;
|
| +};
|
| +
|
| +//////////////////////////////////////////////////////////////////////////////
|
| +
|
| +DEF_GM(return new BlurredClippedCircleGM;)
|
| +}
|
|
|