aboutsummaryrefslogtreecommitdiffhomepage
path: root/gm/blurredclippedcircle.cpp
blob: 495d16a3c2482eb2503c7ca017302481ddaefd42 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
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::Make(SkXfermode::kSrc_Mode));
        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::Make(
                                            kNormal_SkBlurStyle,
                                            1.366025f,
                                            SkBlurMaskFilter::kHighQuality_BlurFlag));
                    paint.setColorFilter(SkColorFilter::MakeModeFilter(
                                             SK_ColorRED,
                                             SkXfermode::kSrcIn_Mode));
                    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;)
}