14e56772432825e174b8f9a3370235381482a8f51robertphillips/*
24e56772432825e174b8f9a3370235381482a8f51robertphillips * Copyright 2015 Google Inc.
34e56772432825e174b8f9a3370235381482a8f51robertphillips *
44e56772432825e174b8f9a3370235381482a8f51robertphillips * Use of this source code is governed by a BSD-style license that can be
54e56772432825e174b8f9a3370235381482a8f51robertphillips * found in the LICENSE file.
64e56772432825e174b8f9a3370235381482a8f51robertphillips */
74e56772432825e174b8f9a3370235381482a8f51robertphillips
84e56772432825e174b8f9a3370235381482a8f51robertphillips#include "gm.h"
933d2055e594177b27360f84e0631b26d74a55a9bMike Klein#include "sk_tool_utils.h"
104e56772432825e174b8f9a3370235381482a8f51robertphillips#include "SkBlurMaskFilter.h"
11ebfce6d9b42198e04288a15953f40c395a7b6139Mike Reed#include "SkClipOpPriv.h"
124e56772432825e174b8f9a3370235381482a8f51robertphillips#include "SkColorFilter.h"
134e56772432825e174b8f9a3370235381482a8f51robertphillips#include "SkPaint.h"
144e56772432825e174b8f9a3370235381482a8f51robertphillips#include "SkRRect.h"
154e56772432825e174b8f9a3370235381482a8f51robertphillips
164e56772432825e174b8f9a3370235381482a8f51robertphillipsnamespace skiagm {
174e56772432825e174b8f9a3370235381482a8f51robertphillips
184e56772432825e174b8f9a3370235381482a8f51robertphillips// This GM reproduces the precision artifacts seen in crbug.com/560651.
194e56772432825e174b8f9a3370235381482a8f51robertphillips// It draws a largish blurred circle with its center clipped out.
204e56772432825e174b8f9a3370235381482a8f51robertphillipsclass BlurredClippedCircleGM : public GM {
214e56772432825e174b8f9a3370235381482a8f51robertphillipspublic:
224e56772432825e174b8f9a3370235381482a8f51robertphillips    BlurredClippedCircleGM() {
234e56772432825e174b8f9a3370235381482a8f51robertphillips        this->setBGColor(sk_tool_utils::color_to_565(0xFFCCCCCC));
244e56772432825e174b8f9a3370235381482a8f51robertphillips    }
254e56772432825e174b8f9a3370235381482a8f51robertphillips
264e56772432825e174b8f9a3370235381482a8f51robertphillipsprotected:
274e56772432825e174b8f9a3370235381482a8f51robertphillips
284e56772432825e174b8f9a3370235381482a8f51robertphillips    SkString onShortName() override {
294e56772432825e174b8f9a3370235381482a8f51robertphillips        return SkString("blurredclippedcircle");
304e56772432825e174b8f9a3370235381482a8f51robertphillips    }
314e56772432825e174b8f9a3370235381482a8f51robertphillips
324e56772432825e174b8f9a3370235381482a8f51robertphillips    SkISize onISize() override {
334e56772432825e174b8f9a3370235381482a8f51robertphillips        return SkISize::Make(kWidth, kHeight);
344e56772432825e174b8f9a3370235381482a8f51robertphillips    }
354e56772432825e174b8f9a3370235381482a8f51robertphillips
364e56772432825e174b8f9a3370235381482a8f51robertphillips    void onDraw(SkCanvas* canvas) override {
374e56772432825e174b8f9a3370235381482a8f51robertphillips        SkPaint whitePaint;
384e56772432825e174b8f9a3370235381482a8f51robertphillips        whitePaint.setColor(SK_ColorWHITE);
39374772bd61951f01bf84fe17bf53d8867681c9aereed        whitePaint.setBlendMode(SkBlendMode::kSrc);
404e56772432825e174b8f9a3370235381482a8f51robertphillips        whitePaint.setAntiAlias(true);
414e56772432825e174b8f9a3370235381482a8f51robertphillips
424e56772432825e174b8f9a3370235381482a8f51robertphillips        // This scale exercises precision limits in the circle blur effect (crbug.com/560651)
43dbfd7ab10883f173f5c1b653a233e18dc6142002mtklein        constexpr float kScale = 2.0f;
444e56772432825e174b8f9a3370235381482a8f51robertphillips        canvas->scale(kScale, kScale);
454e56772432825e174b8f9a3370235381482a8f51robertphillips
464e56772432825e174b8f9a3370235381482a8f51robertphillips        canvas->save();
474e56772432825e174b8f9a3370235381482a8f51robertphillips            SkRect clipRect1 = SkRect::MakeLTRB(0, 0,
484e56772432825e174b8f9a3370235381482a8f51robertphillips                                                SkIntToScalar(kWidth), SkIntToScalar(kHeight));
494e56772432825e174b8f9a3370235381482a8f51robertphillips
5073603f3c52ffd89fe9d035be827b566a0e7d3b79reed            canvas->clipRect(clipRect1);
514e56772432825e174b8f9a3370235381482a8f51robertphillips
524e56772432825e174b8f9a3370235381482a8f51robertphillips            canvas->save();
534e56772432825e174b8f9a3370235381482a8f51robertphillips
5473603f3c52ffd89fe9d035be827b566a0e7d3b79reed                canvas->clipRect(clipRect1);
554e56772432825e174b8f9a3370235381482a8f51robertphillips                canvas->drawRect(clipRect1, whitePaint);
564e56772432825e174b8f9a3370235381482a8f51robertphillips
574e56772432825e174b8f9a3370235381482a8f51robertphillips                canvas->save();
584e56772432825e174b8f9a3370235381482a8f51robertphillips
594e56772432825e174b8f9a3370235381482a8f51robertphillips                    SkRect clipRect2 = SkRect::MakeLTRB(8, 8, 288, 288);
604e56772432825e174b8f9a3370235381482a8f51robertphillips                    SkRRect clipRRect = SkRRect::MakeOval(clipRect2);
61c1f7774e8d327e3c98b4094c9c01d26e27013f71Mike Reed                    canvas->clipRRect(clipRRect, kDifference_SkClipOp, true);
624e56772432825e174b8f9a3370235381482a8f51robertphillips
634e56772432825e174b8f9a3370235381482a8f51robertphillips                    SkRect r = SkRect::MakeLTRB(4, 4, 292, 292);
644e56772432825e174b8f9a3370235381482a8f51robertphillips                    SkRRect rr = SkRRect::MakeOval(r);
654e56772432825e174b8f9a3370235381482a8f51robertphillips
664e56772432825e174b8f9a3370235381482a8f51robertphillips                    SkPaint paint;
674e56772432825e174b8f9a3370235381482a8f51robertphillips
68efdfd51b68a300d5c6e28743fe0344ca05d1cec9reed                    paint.setMaskFilter(SkBlurMaskFilter::Make(
694e56772432825e174b8f9a3370235381482a8f51robertphillips                                            kNormal_SkBlurStyle,
704e56772432825e174b8f9a3370235381482a8f51robertphillips                                            1.366025f,
71efdfd51b68a300d5c6e28743fe0344ca05d1cec9reed                                            SkBlurMaskFilter::kHighQuality_BlurFlag));
72d053ce9c54d4e5937a142278359e5a4cde18095ereed                    paint.setColorFilter(SkColorFilter::MakeModeFilter(
734e56772432825e174b8f9a3370235381482a8f51robertphillips                                             SK_ColorRED,
747d954ad797176afedb9262fdea4507d0fc60eb9dMike Reed                                             SkBlendMode::kSrcIn));
754e56772432825e174b8f9a3370235381482a8f51robertphillips                    paint.setAntiAlias(true);
764e56772432825e174b8f9a3370235381482a8f51robertphillips
774e56772432825e174b8f9a3370235381482a8f51robertphillips                    canvas->drawRRect(rr, paint);
784e56772432825e174b8f9a3370235381482a8f51robertphillips
794e56772432825e174b8f9a3370235381482a8f51robertphillips                canvas->restore();
804e56772432825e174b8f9a3370235381482a8f51robertphillips            canvas->restore();
814e56772432825e174b8f9a3370235381482a8f51robertphillips        canvas->restore();
824e56772432825e174b8f9a3370235381482a8f51robertphillips    }
834e56772432825e174b8f9a3370235381482a8f51robertphillips
844e56772432825e174b8f9a3370235381482a8f51robertphillipsprivate:
85dbfd7ab10883f173f5c1b653a233e18dc6142002mtklein    static constexpr int kWidth = 1164;
86dbfd7ab10883f173f5c1b653a233e18dc6142002mtklein    static constexpr int kHeight = 802;
874e56772432825e174b8f9a3370235381482a8f51robertphillips
884e56772432825e174b8f9a3370235381482a8f51robertphillips    typedef GM INHERITED;
894e56772432825e174b8f9a3370235381482a8f51robertphillips};
904e56772432825e174b8f9a3370235381482a8f51robertphillips
914e56772432825e174b8f9a3370235381482a8f51robertphillips//////////////////////////////////////////////////////////////////////////////
924e56772432825e174b8f9a3370235381482a8f51robertphillips
934e56772432825e174b8f9a3370235381482a8f51robertphillipsDEF_GM(return new BlurredClippedCircleGM;)
944e56772432825e174b8f9a3370235381482a8f51robertphillips}
95